import logging, asyncio, random import base, pars, sql, os import datetime as dt from aiogram import Bot, Dispatcher, executor, types # log level logging.basicConfig(level=logging.INFO) # bot init bot = Bot(token=base.TOKEN) dp = Dispatcher(bot) # db init db = sql.Base('../db/base.db') du = sql.User('../db/users.db') dg = sql.Group('../db/groups.db') dn = sql.Now('../db/now.db') dn.check_group() @dp.message_handler(commands="start") async def start(message: types.Message): if 0 > int(message.chat.id): await message.answer("", types.ParseMode.MARKDOWN) # ОБНОВЛЕНИЕ АЙДИ ГРУППЫ @dp.message_handler(content_types=['migrate_to_chat_id', 'migrate_from_chat_id']) async def chat_reload(message: types.Message): if du.group_exists(message.migrate_from_chat_id): du.update_group_id(message.migrate_from_chat_id, message.migrate_to_chat_id) # КОМАНДЫ @dp.message_handler(commands="help") async def hlp(message: types.Message): await message.answer("*Инструкция использования:*\n\n" "*/eat* - с помощью этой команды вы можете заказать питание\n" "*/today* - команда выдающая меню на сегодня\n" "*/tomorrow* - команда выдающая меню на завтра\n\n" "*/add_group* - команда выдающая меню на завтра\n" "*/del_group* - команда выдающая меню на завтра\n", types.ParseMode.MARKDOWN) @dp.message_handler(commands="eat") async def eat(message: types.Message): if 0 > int(message.chat.id): keyboard1 = {"inline_keyboard": [[{"text": "Завтрак", "callback_data": "z"}, {"text": "Обед", "callback_data": "o"}, {"text": "Полдник", "callback_data": "p"}], [{"text": "Завтрак / Обед", "callback_data": "zo"}], [{"text": "Завтрак / Полдник", "callback_data": "zp"}], [{"text": "Обед / Полдник", "callback_data": "op"}], [{"text": "Завтрак / Обед / Полдник", "callback_data": "zop"}]]} await bot.send_message(chat_id=message.chat.id, text='*Это меню выбора притания!* Всё, что вам надо сделать, это лишь выбрать ' 'необходимый заказ.\n\nEсли после нажатия бот написал, что вы выбрали, то всё ' 'прошло успешно и вы можете не беспокоиться!', parse_mode=types.ParseMode.MARKDOWN, reply_markup=keyboard1) keyboard2 = {"inline_keyboard": [[{"text": "Отменить заказ", "callback_data": "cancel"}]]} await bot.send_message(chat_id=message.chat.id, text='Если вы хотите сменить заказ, то отмените действующий заказ по кнопке ниже и ' 'закажите заново!', parse_mode=types.ParseMode.MARKDOWN, reply_markup=keyboard2) else: await message.answer("Эта команда доступна к использованию *только в чатах*", types.ParseMode.MARKDOWN) @dp.message_handler(commands="del_group") async def delg(message: types.Message): if 0 < int(message.chat.id): user_id = message.from_user.id if du.user_exists(user_id): user_id = du.get_user_id(user_id) if db.user_main_exists(user_id): keyboard = {"inline_keyboard": [[{"text": "Подтвердить удаление", "callback_data": "del"}]]} await bot.send_message(chat_id=message.chat.id, text='Вы точно хотите удалить статистику и связку групп?', parse_mode=types.ParseMode.MARKDOWN, reply_markup=keyboard) else: await message.answer("У вас нет связки групп для их удаления!") else: await message.answer("У вас нет связки групп для их удаления!") else: await message.answer("Эта команда доступна к использованию *только в личном чате*", types.ParseMode.MARKDOWN) @dp.message_handler(commands="add_group") async def addg(message: types.Message): if 0 < int(message.chat.id): user_id = message.from_user.id flag = False if not du.user_exists(user_id): du.add_user(user_id) user_id = du.get_user_id(user_id) all_cods = db.all_cods() cod1 = random.randint(1000, 9999) while cod1 in all_cods[0]: cod1 = random.randint(1000, 9999) cod2 = random.randint(1000, 9999) while cod2 in all_cods[1]: cod2 = random.randint(1000, 9999) db.add_user_tranzit(user_id, cod1, cod2) await message.answer(f"Введите этот код в группе с учениками - *{str(cod1)}*, а этот в личной для " f"фиксации заказа - *{str(cod2)}*", types.ParseMode.MARKDOWN) flag = True else: user_id = du.get_user_id(user_id) if db.user_tranzit_exists(user_id): cods = db.get_cods(user_id) await message.answer(f"Введите этот код в основной группе с учениками - *{str(cods[0])}*, а этот в " f"личной для фиксации заказа - *{str(cods[1])}*", types.ParseMode.MARKDOWN) flag = True else: if not db.user_main_exists(user_id): all_cods = db.all_cods() cod1 = random.randint(1000, 9999) while cod1 in all_cods[0]: cod1 = random.randint(1000, 9999) cod2 = random.randint(1000, 9999) while cod2 in all_cods[1]: cod2 = random.randint(1000, 9999) db.add_user_tranzit(user_id, cod1, cod2) await message.answer(f"Введите этот код в группе с учениками - *{str(cod1)}*, а этот в личной для " f"фиксации заказа - *{str(cod2)}*", types.ParseMode.MARKDOWN) flag = True else: await message.answer("У вас уже есть связка группы, вам надо её удалить, прежде чем верифицировать " "новую!", types.ParseMode.MARKDOWN) if flag: keyboard = {"inline_keyboard": [[{"text": "Отменить верификацию", "callback_data": "cnl"}]]} await bot.send_message(chat_id=message.chat.id, text='*Вы можете отменить заявку* если не хотите связывать группы для сбора ' 'заказов питания!', parse_mode=types.ParseMode.MARKDOWN, reply_markup=keyboard) else: await message.answer("Эта команда доступна к использованию *только в личном чате*", types.ParseMode.MARKDOWN) @dp.message_handler(commands=["today", "tomorrow"]) async def todtom(message: types.Message): food = pars.eating(0 if "today" in message.text else 1) if food[0]: food = food[1] if "today" in message.text: et = f"Питание за {'.'.join(reversed(str(dt.date.today()).split('-')))}\n\n" else: et = f"Питание за {'.'.join(reversed(str(dt.date.today() + dt.timedelta(days=1)).split('-')))}\n\n" for j in food: et = et + "" + str(j) + ":\n" for i in food[j]: et = et + "* " + str(i[0]) + " [ " et = et + str(i[1][0]) + " г. " + str(i[1][1]) + " ккал. ]" + "\n" et = et + "\n\n" await message.answer(et, types.ParseMode.HTML) else: if food[1]: await message.answer(f"Ошибка в системе бота!\n\nОна будет в скором времени исправлена...", types.ParseMode.HTML) await bot.send_message(chat_id=base.TEX_GROUP, text=f"[ {str(dt.datetime.now())[:-10]} ] " f"=> {food[3]} (ошибка в системе)", parse_mode=types.ParseMode.HTML) else: if food[2] != 6: await message.answer(f"Нет данных по питанию!\n\nКак только данные появятся вы сможете " f"их получить этой же командой!", types.ParseMode.HTML) await bot.send_message(chat_id=base.TEX_GROUP, text=f"[ {str(dt.datetime.now())[:-10]} ] " f"=> {food[3]} (нет данных по " f"питанию)", parse_mode=types.ParseMode.HTML) else: await message.answer(f"Вы вызывете команду в воскресенье!\n\nНа что вы надеетесь?", types.ParseMode.HTML) # ИЛАЙН КЛАВИАТУРА @dp.callback_query_handler(text=["z", "o", "p", "zo", "zp", "op", "zop"]) async def var(call: types.CallbackQuery): et = {"z": "завтрак", "o": "обед", "p": "полдник", "zo": "завтрак / обед", "zp": "завтрак / полдник", "op": "обед / полдник", "zop": "завтрак / обед / полдник"} group_id = call.message.chat.id if du.group_exists(group_id): group_id = du.get_group_id(group_id) if db.main_group_exists(group_id): for i in str(call.data): db.upd_stat_group(group_id, i) ids = db.get_spec_group(group_id) await bot.send_message(chat_id=str(du.get_first_group_id(ids)), text=f'[{call.from_user.first_name}](tg://user?id={call.from_user.id}) >> ' f'*{et[call.data].title()}*', parse_mode=types.ParseMode.MARKDOWN) await call.message.answer(text=f'{call.from_user.first_name}, всё принято, вы заказили - ' f'*{"и".join(et[call.data].split("/"))}*', parse_mode=types.ParseMode.MARKDOWN) else: await call.message.answer(text=f'Вы ещё не можете использовать бота, завершите процедуру регистрации!', parse_mode=types.ParseMode.MARKDOWN) else: await call.message.answer(text=f'Вы должны через личные сообщения зарегистрировать этот чат у бота вместе с ' f'дополнительным для отправки списка!', parse_mode=types.ParseMode.MARKDOWN) @dp.callback_query_handler(text=["cnl"]) async def cnl(call: types.CallbackQuery): user_id = du.get_user_id(call.message.chat.id) if db.user_tranzit_exists(user_id): db.delete_tranzit(user_id) await call.message.answer('Заявка удалена! Если ещё захотите связать группы, то зановой вызовите ' 'команду /add_group', types.ParseMode.HTML) else: await call.message.answer('У вас нет оставленных заявок!') @dp.callback_query_handler(text=["del"]) async def ver_del(call: types.CallbackQuery): user_id = du.get_user_id(call.message.chat.id) if db.user_main_exists(user_id): ids = db.get_main_group(user_id) db.delete_main_group(user_id) dg.delete_group(str(ids)) await call.message.answer('Всё успешно удалено!') else: await call.message.answer("У вас нет связки групп для их удаления!") @dp.callback_query_handler(text=["cancel"]) async def cancel(call: types.CallbackQuery): pass # ТРЕКЕР НОВЫХ ПОЛЬЗОВАТЕЛЕЙ @dp.message_handler(content_types=["text", "audio", "document", "photo", "sticker", "video", "video_note", "voice", "location", "contact"]) async def check(message: types.Message): if 0 > int(message.chat.id): if du.user_exists(message.from_user.id): user_id = du.get_user_id(message.from_user.id) if db.user_tranzit_exists(user_id) and len(message.text) == 4: cods = db.get_cods(user_id) flag = False if not du.group_exists(message.chat.id): if message.text == str(cods[0]): du.add_group(message.chat.id) group_id = du.get_group_id(message.chat.id) db.add_main_group(user_id, group_id) flag = True elif message.text == str(cods[1]): du.add_group(message.chat.id) group_id = du.get_group_id(message.chat.id) db.add_set_group(user_id, group_id) flag = True else: group_id = du.get_group_id(message.chat.id) if not db.main_group_exists(group_id): if message.text == str(cods[0]): db.add_main_group(user_id, group_id) flag = True elif message.text == str(cods[1]): db.add_set_group(user_id, group_id) flag = True if flag and db.user_tranzit(user_id): ids = db.get_groups_ids(user_id) db.add_active_groups(user_id, ids[0], ids[1]) db.delete_tranzit(user_id) dg.created_group(ids[0]) dg.add_user(ids[0], user_id, message.from_user.first_name) else: if du.group_exists(message.chat.id): group_id = du.get_group_id(message.chat.id) if db.main_group_exists(group_id): du.add_user(message.from_user.id) user_id = du.get_user_id(message.from_user.id) dg.add_user(group_id, user_id, message.from_user.first_name) # ОТДЕЛЕНИЕ ДНЯ В ГРУППЕ async def time(wait_for): while True: await asyncio.sleep(wait_for) hour = dt.datetime.now().hour date = dt.datetime.now().day wkd = dt.datetime.today().weekday() data = db.get_day() if date != data and hour == 11: for ids in db.get_spec_groups(): group = du.get_first_group_id(ids[0]) if wkd == 5: dat = ".".join(reversed(str(dt.date.today() + dt.timedelta(days=2)).split("-"))) await bot.send_message(chat_id=group, text=f'Питание на {dat}', parse_mode=types.ParseMode.HTML) elif wkd != 6: dat = ".".join(reversed(str(dt.date.today() + dt.timedelta(days=1)).split("-"))) await bot.send_message(chat_id=group, text=f'Питание на {dat}', parse_mode=types.ParseMode.HTML) db.update_day(date) os.remove("now.db") file = open("now.db") file.close() if __name__ == '__main__': loop = asyncio.get_event_loop() loop.create_task(time(600)) # ПРОВЕРКА КАЖДЫЕ 10 МИНУТ executor.start_polling(dp, skip_updates=True)