diff --git a/BotCode/__init__.py b/BotCode/__init__.py index 767674c..37e429e 100644 --- a/BotCode/__init__.py +++ b/BotCode/__init__.py @@ -3,5 +3,5 @@ from .keyboards import * from .routers import * -from .time import * +from .timer import * from .inline import * diff --git a/BotCode/keyboards/__init__.py b/BotCode/keyboards/__init__.py index 945b9d5..1c92ca7 100644 --- a/BotCode/keyboards/__init__.py +++ b/BotCode/keyboards/__init__.py @@ -2,19 +2,18 @@ # Инициализация пакета keyboards, для работы с клавиатурами from aiogram import Router -from .start_kb import router as start_kb_router -from .help_kb import router as help_kb_router -from .more_kb import router as more_kb_router - +from .inline_kb import router as inline_kb_router +from .reply_kb import router as reply_kb_router +from .inline_kb import * +from .reply_kb import * # Объявление роутера и настройка экспорта модулей -__all__ = ("router",) +__all__ = ("router", "inline_kb", "reply_kb",) router = Router(name="kb_router") # Список подключаемых роутеров сверху-вниз router.include_routers( - start_kb_router, - help_kb_router, - more_kb_router, + inline_kb_router, + reply_kb_router, ) diff --git a/BotCode/keyboards/inline_kb/__init__.py b/BotCode/keyboards/inline_kb/__init__.py new file mode 100644 index 0000000..1ce98a7 --- /dev/null +++ b/BotCode/keyboards/inline_kb/__init__.py @@ -0,0 +1,14 @@ +# BotCode/keyboards/__init__.py +# Инициализация пакета keyboards, для работы с клавиатурами + +from aiogram import Router +from .actor_kb import * +from .randnum_kb import * + +# Объявление роутера и настройка экспорта модулей +__all__ = ("router", "actor_kb", "ButtonInl") +router = Router(name="inline_kb_router") + + +# Список подключаемых роутеров сверху-вниз +# router.include_routers() diff --git a/BotCode/keyboards/inline_kb/actor_kb.py b/BotCode/keyboards/inline_kb/actor_kb.py new file mode 100644 index 0000000..6d0dce2 --- /dev/null +++ b/BotCode/keyboards/inline_kb/actor_kb.py @@ -0,0 +1,54 @@ +# BotCode/keyboards/start_kb.py +# Создания клавиатуры на команду: /start + +from aiogram import Router +from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton +from aiogram.utils.keyboard import InlineKeyboardBuilder + +# Создание роутера и настройка экспорта +__all__ = ("router", "get_actor_kb", "kb_text", "ButtonInl",) +kb_text = "ActorKb" +router = Router(name="actor_kb_router") + + +# Класс с параметрами кнопок +class ButtonInl: + tg_chn = "Канал в тг!" + tg_chn_url = "https://t.me/adeptusfiziks" + + tg_chat = "Чатик в тг)" + tg_chat_url = "https://t.me/+T8mzbb_StRpiNDdi" + + web_text = "Веселая игра скачать" + web_url = "https://gamejolt.com/games/UndertaleYellow/136925" + + random_site = "Рандомный сайт" + random_site_cbd = "random_site_cbd" + + random_num_dice = "Рандомное число" + random_num_dice_cbd = "random_num_dice_cbd" + + random_num_modal = "Рандомный виджет" + random_num_modal_cdb = "random_num_modal_cdb" + + + +# Функция создания клавиатуры на команду: /actor +def get_actor_kb() -> InlineKeyboardMarkup: + # Создаем билдер клавиатуры + builder = InlineKeyboardBuilder() + + # Добавляем кнопки, группируя их по строкам + builder.button(text=ButtonInl.tg_chn, url=ButtonInl.tg_chn_url) + builder.button(text=ButtonInl.tg_chat, url=ButtonInl.tg_chat_url) + + builder.button(text=ButtonInl.web_text, url=ButtonInl.web_url) + builder.button(text=ButtonInl.random_site, callback_data=ButtonInl.random_site_cbd) + builder.button(text=ButtonInl.random_num_dice, callback_data=ButtonInl.random_num_dice_cbd) + builder.button(text=ButtonInl.random_num_modal, callback_data=ButtonInl.random_num_modal_cdb) + + builder.adjust(2, 1) + + return builder.as_markup() + + diff --git a/BotCode/keyboards/inline_kb/randnum_kb.py b/BotCode/keyboards/inline_kb/randnum_kb.py new file mode 100644 index 0000000..fc21754 --- /dev/null +++ b/BotCode/keyboards/inline_kb/randnum_kb.py @@ -0,0 +1,27 @@ +# BotCode/keyboards/start_kb.py +# Создания клавиатуры на команду: /start + +from aiogram import Router +from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton +from aiogram.utils.keyboard import InlineKeyboardBuilder + +# Создание роутера и настройка экспорта +__all__ = ("router", "get_randnum_kb", "kb_text", "ButtonInl",) +kb_text = "RandNumKb" +router = Router(name="actor_kb_router") + + +# Класс с параметрами кнопок +class ButtonInl: + mark_cbd = "mark_cbd" + + +# Функция создания клавиатуры на команду: /actor +def get_randnum_kb(text_msg="Получить ответ") -> InlineKeyboardMarkup: + # Создаем билдер клавиатуры + builder = InlineKeyboardBuilder() + + # Добавляем кнопки, группируя их по строкам + builder.button(text=text_msg, callback_data=ButtonInl.mark_cbd) + + return builder.as_markup() diff --git a/BotCode/keyboards/reply_kb/__init__.py b/BotCode/keyboards/reply_kb/__init__.py new file mode 100644 index 0000000..2a26cee --- /dev/null +++ b/BotCode/keyboards/reply_kb/__init__.py @@ -0,0 +1,20 @@ +# BotCode/keyboards/__init__.py +# Инициализация пакета keyboards, для работы с клавиатурами + +from aiogram import Router +from .start_kb import router as start_kb_router +from .help_kb import router as help_kb_router +from .more_kb import router as more_kb_router + + +# Объявление роутера и настройка экспорта модулей +__all__ = ("router",) +router = Router(name="reply_kb_router") + + +# Список подключаемых роутеров сверху-вниз +router.include_routers( + start_kb_router, + help_kb_router, + more_kb_router, +) diff --git a/BotCode/keyboards/help_kb.py b/BotCode/keyboards/reply_kb/help_kb.py similarity index 100% rename from BotCode/keyboards/help_kb.py rename to BotCode/keyboards/reply_kb/help_kb.py diff --git a/BotCode/keyboards/more_kb.py b/BotCode/keyboards/reply_kb/more_kb.py similarity index 100% rename from BotCode/keyboards/more_kb.py rename to BotCode/keyboards/reply_kb/more_kb.py diff --git a/BotCode/keyboards/start_kb.py b/BotCode/keyboards/reply_kb/start_kb.py similarity index 100% rename from BotCode/keyboards/start_kb.py rename to BotCode/keyboards/reply_kb/start_kb.py diff --git a/BotCode/routers/__init__.py b/BotCode/routers/__init__.py index b55d749..6b00bff 100644 --- a/BotCode/routers/__init__.py +++ b/BotCode/routers/__init__.py @@ -3,6 +3,7 @@ # Пакет старых файлов отключен!! from aiogram import Router +from .callback_handlers import router as callback_handlers_router from .commands.bot_command import set_commands from .administration import router as admin_head_router from .commands import router as commands_head_router @@ -17,6 +18,7 @@ router = Router(name="main_router") # Список подключаемых роутеров сверху-вниз router.include_routers( +callback_handlers_router, admin_head_router, commands_head_router, downloads_head_router, diff --git a/BotCode/routers/callback_handlers/__init__.py b/BotCode/routers/callback_handlers/__init__.py new file mode 100644 index 0000000..9e8ad49 --- /dev/null +++ b/BotCode/routers/callback_handlers/__init__.py @@ -0,0 +1,13 @@ +from aiogram import Router + +from .actor_kb_cb import router as actor_kb_cb_router +from .randnum_kb_cb import router as randnum_kb_cb_router + +__all__ = ("router", ) +router = Router(name="callback_handlers") + +# Список подключаемых роутеров сверху-вниз +router.include_routers( + actor_kb_cb_router, + randnum_kb_cb_router, +) diff --git a/BotCode/routers/callback_handlers/actor_kb_cb.py b/BotCode/routers/callback_handlers/actor_kb_cb.py new file mode 100644 index 0000000..6011d7a --- /dev/null +++ b/BotCode/routers/callback_handlers/actor_kb_cb.py @@ -0,0 +1,30 @@ +from random import randint + +from aiogram import Router, F +from aiogram.types import CallbackQuery +from keyboards.inline_kb.actor_kb import ButtonInl + +router = Router(name="actor_kb_cb_router") + +@router.callback_query(F.data == ButtonInl.random_site_cbd) +async def random_site_cb(callback_query: CallbackQuery): + bot_me = await callback_query.bot.me() + await callback_query.answer( + url=f"t.me/{bot_me.username}?start={randint(1, 500)}" + ) + + +@router.callback_query(F.data == ButtonInl.random_num_dice_cbd) +async def random_num_dice_cb(callback_query: CallbackQuery): + await callback_query.answer( + text = f"Твое рандомное число: {randint(1, 21)}", + cache_time=1, + ) + + +@router.callback_query(F.data == ButtonInl.random_num_modal_cdb) +async def random_num_dice_modal_cb(callback_query: CallbackQuery): + await callback_query.answer( + text = f"Членов в жопе у Степана: {randint(1, 2200)}", + show_alert=True, + ) \ No newline at end of file diff --git a/BotCode/routers/callback_handlers/randnum_kb_cb.py b/BotCode/routers/callback_handlers/randnum_kb_cb.py new file mode 100644 index 0000000..cad88b2 --- /dev/null +++ b/BotCode/routers/callback_handlers/randnum_kb_cb.py @@ -0,0 +1,26 @@ +from random import randint + +from aiogram import Router, F +from aiogram.types import CallbackQuery +from keyboards.inline_kb.randnum_kb import ButtonInl, get_randnum_kb + +router = Router(name="randnum_kb_cb_router") + +@router.callback_query(F.data == ButtonInl.mark_cbd) +async def random_site_cb(callback_query: CallbackQuery): + await callback_query.answer() + + # Новый текст и клавиатура + new_text = f"Какая оценка у тебя будет сегодня: {randint(1, 5)}" + new_reply_markup = get_randnum_kb("Получить ответ от Таро") + + # Текущий текст и клавиатура + current_text = callback_query.message.text + current_reply_markup = callback_query.message.reply_markup + + # Проверяем, отличаются ли текст и клавиатура + if current_text != new_text or current_reply_markup != new_reply_markup: + await callback_query.message.edit_text( + text=new_text, + reply_markup=new_reply_markup, + ) diff --git a/BotCode/routers/commands/user_cmd/__init__.py b/BotCode/routers/commands/user_cmd/__init__.py index aa77b3a..2fa3d1d 100644 --- a/BotCode/routers/commands/user_cmd/__init__.py +++ b/BotCode/routers/commands/user_cmd/__init__.py @@ -7,6 +7,8 @@ from .help_cmd import router as help_router from .more_cmd import router as more_router from .exit_cmd import router as exit_router from .start_time_cmd import router as start_time_router +from .actor_cmd import router as actor_router +from .randnum_cmd import router as randnum_router # Объявление роутера и настройка экспорта модулей @@ -20,6 +22,8 @@ router.include_routers( help_router, more_router, exit_router, + actor_router, + randnum_router, ) diff --git a/BotCode/routers/commands/user_cmd/actor_cmd.py b/BotCode/routers/commands/user_cmd/actor_cmd.py new file mode 100644 index 0000000..140a83b --- /dev/null +++ b/BotCode/routers/commands/user_cmd/actor_cmd.py @@ -0,0 +1,41 @@ +# BotCode/routers/commands/user_cmd/actor_cmd.py +# разработка + +from aiogram import Router, types, F +from aiogram.filters import Command +from BotLibrary import * +from keyboards.inline_kb.actor_kb import get_actor_kb + +# Создание роутера и настройка экспорта модулей +__all__ = ("router", "cmd_actor", "log_type",) +router = Router(name="actor_router") +log_type = "Actor" + + +# Список ключевых слов для команды +keywords = ["actor", "фсещк",] + + +# Обработчик команды /actor +@router.message(Command(*keywords, prefix=BotEdit.prefixs, ignore_case=True)) +@router.message(F.text.lower().in_(keywords)) +async def cmd_actor(message: types.Message): + try: + # Вывод сообщения пользователю + text = f"использовал(а) команду /{log_type.lower()}" + markup = get_actor_kb() + + await message.reply( + text="Всякое разное для тебя", + reply_markup=markup, + ) + + + # Активация логгера + await cmd_logginger(message, log_type, text) + return text + + # Проверка на ошибку и ее логирование + except Exception as e: + text_error = await error_cmd_logginger(message, log_type, e) + return text_error diff --git a/BotCode/routers/commands/user_cmd/help_cmd.py b/BotCode/routers/commands/user_cmd/help_cmd.py index 9178837..27e0742 100644 --- a/BotCode/routers/commands/user_cmd/help_cmd.py +++ b/BotCode/routers/commands/user_cmd/help_cmd.py @@ -4,7 +4,7 @@ from aiogram import Router, types, F from aiogram.filters import Command from BotLibrary import * -from BotCode.keyboards.help_kb import get_help_kb +from keyboards.reply_kb.help_kb import get_help_kb # Создание роутера и экспорта модулей __all__ = ("router", "cmd_help", "log_type",) diff --git a/BotCode/routers/commands/user_cmd/more_cmd.py b/BotCode/routers/commands/user_cmd/more_cmd.py index 6ffbaef..ed917e3 100644 --- a/BotCode/routers/commands/user_cmd/more_cmd.py +++ b/BotCode/routers/commands/user_cmd/more_cmd.py @@ -4,7 +4,7 @@ from aiogram import Router, types, F from aiogram.filters import Command from BotLibrary import * -from BotCode.keyboards.more_kb import get_more_kb +from keyboards.reply_kb.more_kb import get_more_kb # Создание роутера и экспорта модулей __all__ = ("router", "cmd_start", "log_type",) diff --git a/BotCode/routers/commands/user_cmd/randnum_cmd.py b/BotCode/routers/commands/user_cmd/randnum_cmd.py new file mode 100644 index 0000000..ec10b68 --- /dev/null +++ b/BotCode/routers/commands/user_cmd/randnum_cmd.py @@ -0,0 +1,30 @@ +# BotCode/routers/commands/user_cmd/randnum_cmd.py +# Работа с командой /randnum, для рандомного числа с редактированием сообщения + +from aiogram import Router, types, F +from aiogram.filters import Command +from BotLibrary import * +from keyboards.inline_kb.randnum_kb import get_randnum_kb + +# Создание роутера и экспорта модулей +__all__ = ("router", "cmd_randnum", "log_type",) +router = Router(name="randnum_router") +log_type = "Randnum" + +# Список ключевых слов для команды +keywords = ["кфтвтгь", "randnum",] + + +# Хэндлер на команду /randnum +@router.message(Command(*keywords, prefix=BotEdit.prefixs, ignore_case=True)) +@router.message(F.text.lower().in_(keywords)) +async def cmd_randnum(message: types.Message): + text = "Работа с рандомом оценок!" + await message.reply( + text="Вы хотите узнать вашу оценку на сегодня?!", + reply_markup=get_randnum_kb("Хочу: ТЫК"), + ) + + # Активация логгера + await cmd_logginger(message, log_type, text) + return text diff --git a/BotCode/routers/commands/user_cmd/start_cmd.py b/BotCode/routers/commands/user_cmd/start_cmd.py index a44ef7e..a4d73f5 100644 --- a/BotCode/routers/commands/user_cmd/start_cmd.py +++ b/BotCode/routers/commands/user_cmd/start_cmd.py @@ -2,9 +2,9 @@ # Работа с командой /start, для запуска бота from aiogram import Router, types, F -from aiogram.filters import Command +from aiogram.filters import Command, CommandStart from BotLibrary import * -from BotCode.keyboards.start_kb import get_start_kb +from keyboards.reply_kb.start_kb import get_start_kb # Создание роутера и настройка экспорта модулей __all__ = ("router", "cmd_start", "log_type",) @@ -19,12 +19,15 @@ keywords = ["start", "старт", "запуск", "пуск", "on", "вкл", " # Обработчик команды /start @router.message(Command(*keywords, prefix=BotEdit.prefixs, ignore_case=True)) @router.message(F.text.lower().in_(keywords)) +@router.message(CommandStart()) async def cmd_start(message: types.Message): try: # Вывод сообщения пользователю text = f"использовал(а) команду /{log_type.lower()}" await message.reply(text=f"Стартовый бот!", reply_markup=get_start_kb()) + print(f"Текст запроса: {repr(message.text)}") + # Активация логгера await cmd_logginger(message, log_type, text) return text diff --git a/BotCode/routers/common/__init__.py b/BotCode/routers/common/__init__.py index ae847df..29d9f4a 100644 --- a/BotCode/routers/common/__init__.py +++ b/BotCode/routers/common/__init__.py @@ -3,6 +3,7 @@ from aiogram import Router from .messages import router as common_message_router +from .phrase import router as phrase_message_router # Объявление роутера и настройка экспорта модулей @@ -12,8 +13,8 @@ router = Router(name="users_head_router") # Список подключаемых роутеров сверху-вниз router.include_routers( - common_message_router, + phrase_message_router, ) # Идет самым последним, если другие роутеры не сработали -# router.include_router(common_message_router) +router.include_router(common_message_router) diff --git a/BotCode/routers/common/messages.py b/BotCode/routers/common/messages.py index ecd1bc7..521c70b 100644 --- a/BotCode/routers/common/messages.py +++ b/BotCode/routers/common/messages.py @@ -3,82 +3,14 @@ # А также нескольких определенных сообщений (Перенести в иной файл!!!) from BotLibrary import * -from aiogram import Router, types, F -from aiogram.types import ReplyKeyboardRemove +from aiogram import Router, types -from BotCode.keyboards.start_kb import ButtonText from ..downloads.download_avatar_all import download_avatar # Настройка экспорта модулей и роутера __all__ = ("router",) router = Router(name="common_message_router") - -# Ответ бота на кнопку или сообщение: "Привет!" -@router.message(F.text.lower() == ButtonText.Hello.lower()) -async def bye(message: types.Message): - log_type = "Start_Button" - text_message = f"Привет, я бот. А ты кто?" - name = find_chat_id(message) - message_type = types_message(message) - - await message.reply( - text=text_message, - ) - - await common_msg_logginger(message, name, message_type, log_type) - return text_message - - -# Ответ бота на кнопку или сообщение: "Помощь!" -@router.message(F.text.lower() == ButtonText.Help.lower()) -async def help_message(message: types.Message): - log_type = "Help_Button" - text_message = f"Привет, я надеюсь помогу тебе... Лучше напиши /help.." - name = find_chat_id(message) - message_type = types_message(message) - - await message.reply( - text=text_message, - ) - - await common_msg_logginger(message, name, message_type, log_type) - return text_message - - -# Ответ бота на кнопку или сообщение: "Пока-пока!" -@router.message(F.text.lower() == ButtonText.Bye.lower()) -async def bye_message(message: types.Message): - log_type = "Messages" - text_message = f"Надеюсь скоро увидимся! Захочешь поговорить нажми на /start!" - name = find_chat_id(message) - message_type = types_message(message) - - await message.reply( - text=text_message, - reply_markup=ReplyKeyboardRemove(), - ) - - await common_msg_logginger(message, name, message_type, log_type) - return text_message - - -# Ответ бота на сообщение: "Кошмар" -@router.message(F.text.lower() == "кошмар") -async def scary_message(message: types.Message): - log_type = "Messages" - text_message = f"Кошмар, тот еще!" - name = find_chat_id(message) - message_type = types_message(message) - - await message.reply( - text=text_message, - ) - - await common_msg_logginger(message, name, message_type, log_type) - return text_message - - # Хэндлер на все сообщения и записывает данные @router.message() async def handle_all_messages(message: types.Message): diff --git a/BotCode/routers/common/phrase.py b/BotCode/routers/common/phrase.py new file mode 100644 index 0000000..91027ab --- /dev/null +++ b/BotCode/routers/common/phrase.py @@ -0,0 +1,75 @@ +from aiogram import Router, types, F +from aiogram.types import ReplyKeyboardRemove + +from BotLibrary import find_chat_id, types_message, common_msg_logginger +from keyboards.reply_kb.start_kb import ButtonText + +# Настройка экспорта модулей и роутера +__all__ = ("router",) +router = Router(name="phrase_message_router") + + +# Ответ бота на кнопку или сообщение: "Привет!" +@router.message(F.text.lower() == ButtonText.Hello.lower()) +async def hello_message(message: types.Message): + log_type = "Start_Button" + text_message = f"Привет, я бот. А ты кто?" + name = find_chat_id(message) + message_type = types_message(message) + + await message.reply( + text=text_message, + ) + + await common_msg_logginger(message, name, message_type, log_type) + return text_message + + + +# Ответ бота на кнопку или сообщение: "Помощь!" +@router.message(F.text.lower() == ButtonText.Help.lower()) +async def help_message(message: types.Message): + log_type = "Help_Button" + text_message = f"Привет, я надеюсь помогу тебе... Лучше напиши /help.." + name = find_chat_id(message) + message_type = types_message(message) + + await message.reply( + text=text_message, + ) + + await common_msg_logginger(message, name, message_type, log_type) + return text_message + + +# Ответ бота на кнопку или сообщение: "Пока-пока!" +@router.message(F.text.lower() == ButtonText.Bye.lower()) +async def bye_message(message: types.Message): + log_type = "Messages" + text_message = f"Надеюсь скоро увидимся! Захочешь поговорить нажми на /start!" + name = find_chat_id(message) + message_type = types_message(message) + + await message.reply( + text=text_message, + reply_markup=ReplyKeyboardRemove(), + ) + + await common_msg_logginger(message, name, message_type, log_type) + return text_message + + +# Ответ бота на сообщение: "Кошмар" +@router.message(F.text.lower() == "кошмар") +async def scary_message(message: types.Message): + log_type = "Messages" + text_message = f"Кошмар, тот еще!" + name = find_chat_id(message) + message_type = types_message(message) + + await message.reply( + text=text_message, + ) + + await common_msg_logginger(message, name, message_type, log_type) + return text_message diff --git a/BotCode/time/__init__.py b/BotCode/time/__init__.py deleted file mode 100644 index d25556f..0000000 --- a/BotCode/time/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# BotCode/time/__init__.py -# Инициализация пакета time, для временных операций (в разработке) diff --git a/BotCode/timer/__init__.py b/BotCode/timer/__init__.py new file mode 100644 index 0000000..d52c60d --- /dev/null +++ b/BotCode/timer/__init__.py @@ -0,0 +1,2 @@ +# BotCode/timer/__init__.py +# Инициализация пакета timer, для временных операций (в разработке) diff --git a/BotLibrary/analitics/start_info_out.py b/BotLibrary/analitics/start_info_out.py index d2e782e..1b8facf 100644 --- a/BotLibrary/analitics/start_info_out.py +++ b/BotLibrary/analitics/start_info_out.py @@ -3,7 +3,7 @@ # Логирование стартов бота в bot_start.log from datetime import datetime -from time import sleep +from timer import sleep from loguru import logger from config import ImportantPath, BotVariables diff --git a/BotLibrary/config.py b/BotLibrary/config.py index 163ac36..5fc510b 100644 --- a/BotLibrary/config.py +++ b/BotLibrary/config.py @@ -27,12 +27,12 @@ class LogsSet: max_size = "500 MB" # Шаблон логов для обычного логгера - info_text = ("{time:YYYY-MM-DD HH:mm:ss} | " + info_text = ("{timer:YYYY-MM-DD HH:mm:ss} | " "PRIMO-{extra[log_type]} | " "{extra[user]} | {message}") # Шаблон логов для логгера-ошибок - error_text = ("{time:YYYY-MM-DD HH:mm:ss} | ERROR-{extra[log_type]} | " + error_text = ("{timer:YYYY-MM-DD HH:mm:ss} | ERROR-{extra[log_type]} | " "{extra[user]} | {message}") diff --git a/BotLibrary/library/decorator.py b/BotLibrary/library/decorator.py index 9718128..de1817f 100644 --- a/BotLibrary/library/decorator.py +++ b/BotLibrary/library/decorator.py @@ -4,7 +4,6 @@ from art import * from colorama import * from termcolor import * -import cowsay # Подключение ANSI в стандартное Windows_cmd just_fix_windows_console() diff --git a/BotLibrary/library/time.py b/BotLibrary/library/time.py new file mode 100644 index 0000000..e69de29