diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..2f5bdf0
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+* text=auto eol=lf
+*.db binary
diff --git a/code/base.py b/code/base.py
index 378c060..eed83d0 100644
--- a/code/base.py
+++ b/code/base.py
@@ -1,4 +1,4 @@
-TOKEN = "token from BotFather"
-
-ID_BOT = **********
-TEX_GROUP = "-*********"
+TOKEN = "token from BotFather"
+
+ID_BOT = **********
+TEX_GROUP = "-*********"
diff --git a/code/bot.py b/code/bot.py
index e1065df..6fc4398 100644
--- a/code/bot.py
+++ b/code/bot.py
@@ -1,436 +1,436 @@
-import logging, asyncio, random, pymorphy2
-import base, pars, sql, os
-import datetime as dt
-
-from aiogram import Bot, Dispatcher, executor, types
-
-# log level
-logging.basicConfig(level=logging.INFO)
-morph = pymorphy2.MorphAnalyzer()
-
-# bot init
-bot = Bot(token=base.TOKEN)
-dp = Dispatcher(bot)
-
-# create now.db
-file = open('../db/now.db', 'w+')
-file.close()
-
-# 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')
-
-
-@dp.message_handler(commands="start")
-async def start(message: types.Message):
- if 0 < int(message.chat.id):
- await message.answer("Ghdbtn", 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):
- if 0 < int(message.chat.id):
- await message.answer("*Инструкция использования:*\n\n"
- "*/eat* - с помощью этой команды вы можете заказать питание\n"
- "*/today* - команда выдающая меню на сегодня\n"
- "*/tomorrow* - команда выдающая меню на завтра\n\n"
- "*/add_group* - команда выдающая меню на завтра\n"
- "*/del_group* - команда выдающая меню на завтра\n", types.ParseMode.MARKDOWN)
- else:
- await message.answer("*Инструкция использования:*\n\n"
- "*/eat* - с помощью этой команды вы можете заказать питание\n"
- "*/today* - команда выдающая меню на сегодня\n"
- "*/tomorrow* - команда выдающая меню на завтра\n", types.ParseMode.MARKDOWN)
-
-
-@dp.message_handler(commands="stat")
-async def stat(message: types.Message):
- if 0 > int(message.chat.id):
- group_id = message.chat.id
- if du.group_exists(group_id):
- group_id = du.get_group_id(group_id)
- if db.main_group_exists(group_id):
- overall = db.stat_group(group_id)
- all_users = dg.stat_all_users(group_id)
-
- z = [[user[1], user[0]] for user in all_users if user[1] != 0]
- o = [[user[2], user[0]] for user in all_users if user[2] != 0]
- p = [[user[3], user[0]] for user in all_users if user[3] != 0]
-
- txt = f"Всего было сделано заказов - {sum(overall)}\n"
- line = morph.parse('заказ')[0]
-
- lst = [[f"\n\t* Завтраков - {str(overall[0])}\n", z], [f"\n\t* Обедов - {str(overall[1])}\n", o],
- [f"\n\t* Полдников - {str(overall[2])}\n", p]]
- for i in lst:
- txt = txt + i[0]
- if i[1]:
- for n, j in enumerate(i[1][:3]):
- txt = txt + "\t\t\t" + str(n + 1) + ". " + j[1] + " " + str(j[0]) + " " + line.make_agree_with_number(j[0]).word + "\n"
-
- await message.answer(txt, types.ParseMode.HTML)
- else:
- await message.answer("Ваша группа не зарегистрирована!")
- else:
- await message.answer("Ваша группа не зарегистрирована!")
-
-
-@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):
- user_id = call.from_user.id
- if du.user_exists(user_id):
- user_id = du.get_user_id(user_id)
- else:
- du.add_user(user_id)
- user_id = du.get_user_id(user_id)
-
- if db.check_group_inproc(group_id):
- if not dn.check_user(group_id, user_id):
- flag = True
- else:
- await call.message.answer(f"{call.from_user.first_name}, вы уже сделали заказ! Отмените его с "
- f"помощью кнопки отмены!")
- flag = False
- else:
- dn.created_group(group_id)
- db.add_group(group_id)
- flag = True
-
- if flag:
- for i in str(call.data):
- db.upd_stat_group(group_id, i, 1)
- dg.upd_stat_user(group_id, user_id, i, 1)
-
- ids = db.get_spec_group(group_id)
- msg1 = 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)
-
- msg2 = await call.message.answer(text=f'{call.from_user.first_name}, всё принято, вы заказили - '
- f'*{"и".join(et[call.data].split("/"))}*',
- parse_mode=types.ParseMode.MARKDOWN)
-
- dn.add_user(group_id, user_id, msg2.message_id, msg1.message_id, str(call.data))
- else:
- await call.message.answer('Вы должны через личные сообщения зарегистрировать этот чат у бота вместе с '
- 'дополнительным для отправки списка!')
- else:
- await call.message.answer('Вы должны через личные сообщения зарегистрировать этот чат у бота вместе с '
- 'дополнительным для отправки списка!')
-
-
-@dp.callback_query_handler(text=["cnl"])
-async def cnl(call: types.CallbackQuery):
- user_id = du.get_user_id(call.from_user.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.from_user.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))
- db.del_group(str(ids))
- await call.message.answer('Всё успешно удалено!')
- else:
- await call.message.answer("У вас нет связки групп для их удаления!")
-
-
-@dp.callback_query_handler(text=["cancel"])
-async def cancel(call: types.CallbackQuery):
- group_id = call.message.chat.id
- if du.group_exists(group_id):
- main_group_id = group_id
- group_id = du.get_group_id(group_id)
- if db.main_group_exists(group_id):
- user_id = call.from_user.id
- if du.user_exists(user_id):
- user_id = du.get_user_id(user_id)
- else:
- du.add_user(user_id)
- user_id = du.get_user_id(user_id)
-
- if db.check_group_inproc(group_id):
- if dn.check_user(group_id, user_id):
- ord_id = dn.get_ord_id(group_id, user_id)
-
- for i in ord_id:
- db.upd_stat_group(group_id, i, -1)
- dg.upd_stat_user(group_id, user_id, i, -1)
-
- ids = db.get_spec_group(group_id)
- set_group_id = str(du.get_first_group_id(ids))
-
- main, sett = dn.get_message(group_id, user_id)
- await bot.delete_message(chat_id=main_group_id, message_id=main)
- await bot.delete_message(chat_id=set_group_id, message_id=sett)
-
- dn.del_user(group_id, user_id)
- await call.message.answer(f"{call.from_user.first_name}, ваш заказ отменён!")
- else:
- await call.message.answer(f"{call.from_user.first_name}, у вас нет заказа!")
- else:
- await call.message.answer(f"{call.from_user.first_name}, у вас нет заказа!")
- else:
- await call.message.answer('Вы ещё не можете использовать бота, завершите процедуру регистрации!')
- else:
- await call.message.answer('Вы должны через личные сообщения зарегистрировать этот чат у бота вместе с '
- 'дополнительным для отправки списка!')
-
-
-# ТРЕКЕР НОВЫХ ПОЛЬЗОВАТЕЛЕЙ
-@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):
- dg.update_name(user_id, message.from_user.first_name, group_id)
- 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 == 6:
- 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)
- db.reset_proc()
-
- os.remove('../db/now.db')
- fle = open('../db/now.db', 'w+')
- fle.close()
-
-
-if __name__ == '__main__':
- loop = asyncio.get_event_loop()
- loop.create_task(time(600)) # ПРОВЕРКА КАЖДЫЕ 10 МИНУТ
- executor.start_polling(dp, skip_updates=True)
+import logging, asyncio, random, pymorphy2
+import base, pars, sql, os
+import datetime as dt
+
+from aiogram import Bot, Dispatcher, executor, types
+
+# log level
+logging.basicConfig(level=logging.INFO)
+morph = pymorphy2.MorphAnalyzer()
+
+# bot init
+bot = Bot(token=base.TOKEN)
+dp = Dispatcher(bot)
+
+# create now.db
+file = open('../db/now.db', 'w+')
+file.close()
+
+# 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')
+
+
+@dp.message_handler(commands="start")
+async def start(message: types.Message):
+ if 0 < int(message.chat.id):
+ await message.answer("Ghdbtn", 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):
+ if 0 < int(message.chat.id):
+ await message.answer("*Инструкция использования:*\n\n"
+ "*/eat* - с помощью этой команды вы можете заказать питание\n"
+ "*/today* - команда выдающая меню на сегодня\n"
+ "*/tomorrow* - команда выдающая меню на завтра\n\n"
+ "*/add_group* - команда выдающая меню на завтра\n"
+ "*/del_group* - команда выдающая меню на завтра\n", types.ParseMode.MARKDOWN)
+ else:
+ await message.answer("*Инструкция использования:*\n\n"
+ "*/eat* - с помощью этой команды вы можете заказать питание\n"
+ "*/today* - команда выдающая меню на сегодня\n"
+ "*/tomorrow* - команда выдающая меню на завтра\n", types.ParseMode.MARKDOWN)
+
+
+@dp.message_handler(commands="stat")
+async def stat(message: types.Message):
+ if 0 > int(message.chat.id):
+ group_id = message.chat.id
+ if du.group_exists(group_id):
+ group_id = du.get_group_id(group_id)
+ if db.main_group_exists(group_id):
+ overall = db.stat_group(group_id)
+ all_users = dg.stat_all_users(group_id)
+
+ z = [[user[1], user[0]] for user in all_users if user[1] != 0]
+ o = [[user[2], user[0]] for user in all_users if user[2] != 0]
+ p = [[user[3], user[0]] for user in all_users if user[3] != 0]
+
+ txt = f"Всего было сделано заказов - {sum(overall)}\n"
+ line = morph.parse('заказ')[0]
+
+ lst = [[f"\n\t* Завтраков - {str(overall[0])}\n", z], [f"\n\t* Обедов - {str(overall[1])}\n", o],
+ [f"\n\t* Полдников - {str(overall[2])}\n", p]]
+ for i in lst:
+ txt = txt + i[0]
+ if i[1]:
+ for n, j in enumerate(i[1][:3]):
+ txt = txt + "\t\t\t" + str(n + 1) + ". " + j[1] + " " + str(j[0]) + " " + line.make_agree_with_number(j[0]).word + "\n"
+
+ await message.answer(txt, types.ParseMode.HTML)
+ else:
+ await message.answer("Ваша группа не зарегистрирована!")
+ else:
+ await message.answer("Ваша группа не зарегистрирована!")
+
+
+@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):
+ user_id = call.from_user.id
+ if du.user_exists(user_id):
+ user_id = du.get_user_id(user_id)
+ else:
+ du.add_user(user_id)
+ user_id = du.get_user_id(user_id)
+
+ if db.check_group_inproc(group_id):
+ if not dn.check_user(group_id, user_id):
+ flag = True
+ else:
+ await call.message.answer(f"{call.from_user.first_name}, вы уже сделали заказ! Отмените его с "
+ f"помощью кнопки отмены!")
+ flag = False
+ else:
+ dn.created_group(group_id)
+ db.add_group(group_id)
+ flag = True
+
+ if flag:
+ for i in str(call.data):
+ db.upd_stat_group(group_id, i, 1)
+ dg.upd_stat_user(group_id, user_id, i, 1)
+
+ ids = db.get_spec_group(group_id)
+ msg1 = 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)
+
+ msg2 = await call.message.answer(text=f'{call.from_user.first_name}, всё принято, вы заказили - '
+ f'*{"и".join(et[call.data].split("/"))}*',
+ parse_mode=types.ParseMode.MARKDOWN)
+
+ dn.add_user(group_id, user_id, msg2.message_id, msg1.message_id, str(call.data))
+ else:
+ await call.message.answer('Вы должны через личные сообщения зарегистрировать этот чат у бота вместе с '
+ 'дополнительным для отправки списка!')
+ else:
+ await call.message.answer('Вы должны через личные сообщения зарегистрировать этот чат у бота вместе с '
+ 'дополнительным для отправки списка!')
+
+
+@dp.callback_query_handler(text=["cnl"])
+async def cnl(call: types.CallbackQuery):
+ user_id = du.get_user_id(call.from_user.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.from_user.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))
+ db.del_group(str(ids))
+ await call.message.answer('Всё успешно удалено!')
+ else:
+ await call.message.answer("У вас нет связки групп для их удаления!")
+
+
+@dp.callback_query_handler(text=["cancel"])
+async def cancel(call: types.CallbackQuery):
+ group_id = call.message.chat.id
+ if du.group_exists(group_id):
+ main_group_id = group_id
+ group_id = du.get_group_id(group_id)
+ if db.main_group_exists(group_id):
+ user_id = call.from_user.id
+ if du.user_exists(user_id):
+ user_id = du.get_user_id(user_id)
+ else:
+ du.add_user(user_id)
+ user_id = du.get_user_id(user_id)
+
+ if db.check_group_inproc(group_id):
+ if dn.check_user(group_id, user_id):
+ ord_id = dn.get_ord_id(group_id, user_id)
+
+ for i in ord_id:
+ db.upd_stat_group(group_id, i, -1)
+ dg.upd_stat_user(group_id, user_id, i, -1)
+
+ ids = db.get_spec_group(group_id)
+ set_group_id = str(du.get_first_group_id(ids))
+
+ main, sett = dn.get_message(group_id, user_id)
+ await bot.delete_message(chat_id=main_group_id, message_id=main)
+ await bot.delete_message(chat_id=set_group_id, message_id=sett)
+
+ dn.del_user(group_id, user_id)
+ await call.message.answer(f"{call.from_user.first_name}, ваш заказ отменён!")
+ else:
+ await call.message.answer(f"{call.from_user.first_name}, у вас нет заказа!")
+ else:
+ await call.message.answer(f"{call.from_user.first_name}, у вас нет заказа!")
+ else:
+ await call.message.answer('Вы ещё не можете использовать бота, завершите процедуру регистрации!')
+ else:
+ await call.message.answer('Вы должны через личные сообщения зарегистрировать этот чат у бота вместе с '
+ 'дополнительным для отправки списка!')
+
+
+# ТРЕКЕР НОВЫХ ПОЛЬЗОВАТЕЛЕЙ
+@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):
+ dg.update_name(user_id, message.from_user.first_name, group_id)
+ 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 == 6:
+ 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)
+ db.reset_proc()
+
+ os.remove('../db/now.db')
+ fle = open('../db/now.db', 'w+')
+ fle.close()
+
+
+if __name__ == '__main__':
+ loop = asyncio.get_event_loop()
+ loop.create_task(time(600)) # ПРОВЕРКА КАЖДЫЕ 10 МИНУТ
+ executor.start_polling(dp, skip_updates=True)
diff --git a/code/pars.py b/code/pars.py
index b9e5263..559db44 100644
--- a/code/pars.py
+++ b/code/pars.py
@@ -1,52 +1,52 @@
-import requests as req
-import datetime as dt
-import openpyxl, os, re
-
-
-def eating(day):
- if day == 0:
- wkd = dt.datetime.today().weekday()
- else:
- wkd = (dt.date.today() + dt.timedelta(days=1)).weekday()
-
- if wkd != 6:
- flag = False
- try:
- if day == 0:
- eat = f"https://www.school01.ru/food/{str(dt.date.today())}-sm.xlsx"
- else:
- eat = f"https://www.school01.ru/food/{str(dt.date.today() + dt.timedelta(days=1))}-sm.xlsx"
-
- file, xls = open("school_food.xlsx", "wb"), req.get(eat)
- file.write(xls.content)
- file.close()
-
- excel_file = openpyxl.load_workbook('school_food.xlsx')
- employees_sheet = excel_file[excel_file.sheetnames[0]]
-
- food = {employees_sheet["A4"].value: [], employees_sheet["A12"].value: []}
- food_info = [[employees_sheet["A4"].value, 4, 8], [employees_sheet["A12"].value, 12, 9]]
-
- flag = True
-
- if employees_sheet["A22"].value is not None:
- food[employees_sheet["A22"].value] = []
- food_info.append([employees_sheet["A22"].value, 21, 2])
-
- for j in food_info:
- for i in range(j[2]):
- if employees_sheet[f"D{j[1] + i}"].value is None:
- continue
-
- gramm = str(int(eval(str(employees_sheet[f"E{j[1] + i}"].value).strip())))
- kkal = str(eval("".join(str(employees_sheet[f"J{j[1] + i}"].value).split()).replace(",", ".", 1)))
-
- food[j[0]].append([employees_sheet[f"D{j[1] + i}"].value, [gramm, kkal]])
-
- os.remove("school_food.xlsx")
-
- return [True, food]
- except Exception as e:
- return [False, flag, wkd, repr(e)]
- else:
- return [False, False, wkd]
+import requests as req
+import datetime as dt
+import openpyxl, os, re
+
+
+def eating(day):
+ if day == 0:
+ wkd = dt.datetime.today().weekday()
+ else:
+ wkd = (dt.date.today() + dt.timedelta(days=1)).weekday()
+
+ if wkd != 6:
+ flag = False
+ try:
+ if day == 0:
+ eat = f"https://www.school01.ru/food/{str(dt.date.today())}-sm.xlsx"
+ else:
+ eat = f"https://www.school01.ru/food/{str(dt.date.today() + dt.timedelta(days=1))}-sm.xlsx"
+
+ file, xls = open("school_food.xlsx", "wb"), req.get(eat)
+ file.write(xls.content)
+ file.close()
+
+ excel_file = openpyxl.load_workbook('school_food.xlsx')
+ employees_sheet = excel_file[excel_file.sheetnames[0]]
+
+ food = {employees_sheet["A4"].value: [], employees_sheet["A12"].value: []}
+ food_info = [[employees_sheet["A4"].value, 4, 8], [employees_sheet["A12"].value, 12, 9]]
+
+ flag = True
+
+ if employees_sheet["A22"].value is not None:
+ food[employees_sheet["A22"].value] = []
+ food_info.append([employees_sheet["A22"].value, 21, 2])
+
+ for j in food_info:
+ for i in range(j[2]):
+ if employees_sheet[f"D{j[1] + i}"].value is None:
+ continue
+
+ gramm = str(int(eval(str(employees_sheet[f"E{j[1] + i}"].value).strip())))
+ kkal = str(eval("".join(str(employees_sheet[f"J{j[1] + i}"].value).split()).replace(",", ".", 1)))
+
+ food[j[0]].append([employees_sheet[f"D{j[1] + i}"].value, [gramm, kkal]])
+
+ os.remove("school_food.xlsx")
+
+ return [True, food]
+ except Exception as e:
+ return [False, flag, wkd, repr(e)]
+ else:
+ return [False, False, wkd]