From c8fd747dd1c9759f1ee0ab70585904687a625367 Mon Sep 17 00:00:00 2001 From: kr0sh512 Date: Sat, 28 Oct 2023 16:57:13 +0300 Subject: [PATCH] intermediate code changes --- for_json.py | 51 ++++++++++++++++++++- schedules.py | 124 +++++++++++++++++++++++++++++++-------------------- 2 files changed, 126 insertions(+), 49 deletions(-) diff --git a/for_json.py b/for_json.py index 962cf50..aeaac4e 100644 --- a/for_json.py +++ b/for_json.py @@ -125,6 +125,7 @@ def check_group_in_json(number): schdl = {} with open(path_schedule, 'r', encoding='utf-8') as json_file: schdl = json.load(json_file) + return str(number) in schdl.keys() def return_infos(id): @@ -134,5 +135,53 @@ def return_infos(id): data = data[id] text = 'Выбранная группа: {}\ \nВремя напоминания до урока: {}\ - \nРазрешены ли напоминания: {}'.format(data['group'], data['timeout'], ('да' if data['allow_message'] == 'yes' else 'нет')) + \nРазрешены ли напоминания: {}'.format((data['group'] if data['group'] != 'other' else 'не выбрана'), + data['timeout'], + ('да' if data['allow_message'] == 'yes' else 'нет')) + + return text + +def get_schedule(id): + text = 'Расписание на сегодня:\n\n' + + schdl_today = {} + with open(path_schedule, 'r', encoding='utf-8') as schedule_file: + day = datetime.today().strftime('%A').lower()[:3] + + group = '' + with open(path_users, 'r', encoding='utf-8') as user_file: + group = json.load(user_file)[id]['group'] + + if (group == 'other'): + return 'У тебя не выбрана группа для рассылки сообщений' + + try: + schdl_today = json.load(schedule_file)[group][day] + except: + return 'Расписания твоей группы на сегодня нет' + + for i, lesson in schdl_today.items(): + if len(lesson["infos"].split('|')) == 2: + teacher = lesson["infos"].split('|')[0] + room = lesson["infos"].split('|')[1] + text += '•{} | {}\ + \n{}\ + \n{}'.format(i, room, lesson["name"], teacher) + + elif len(lesson["infos"].split('|')) == 4: + infos = lesson["infos"].split('|') + text += '•{}\ + \n{}\ + \n({}) {}\ + \n({}) {}'.format(i, lesson["name"], + infos[1], + infos[0], + infos[3], + infos[2]) + else: + text += '•{}\ + \n{}'.format(i, lesson["name"]) + + text += '\n\n' + return text diff --git a/schedules.py b/schedules.py index 833dc24..d327a50 100644 --- a/schedules.py +++ b/schedules.py @@ -9,37 +9,41 @@ bot = telebot.TeleBot("TOKEN_API") admin_id = '856850518' start_txt = 'Привет! Это бот, который будет кидать тебе сообщения перед нужной парой с номером кабинета/фамилией препода\ -\n\nCreated by: @Kr0sH\_512' + \n\nТы можешь настроить отправку сообщений в лс или добавить меня в группу, куда я буду присылать расписание\ +\n\nCreated by: @Kr0sH_512' @bot.message_handler(commands=['update']) def update_schedules(message): if (str(message.from_user.id) != admin_id): - bot.send_message(message.from_user.id, 'Команда доступна только администратору', parse_mode='Markdown') - else: - for_json.create_schedule_tasks() + bot.send_message(message.from_user.id, 'Команда доступна только администратору', parse_mode=ParseMode.HTML) + return + + for_json.create_schedule_tasks() return @bot.message_handler(commands=['restart']) def restart_bot(message): if (str(message.from_user.id) != admin_id): - bot.send_message(message.from_user.id, 'Команда доступна только администратору', parse_mode='Markdown') - else: - bot.send_message(admin_id, '🛑 bye', parse_mode=ParseMode.HTML) - os.execv(sys.executable, ['python'] + sys.argv) - + bot.send_message(message.from_user.id, 'Команда доступна только администратору', parse_mode=ParseMode.HTML) + return + + bot.send_message(admin_id, '🛑 bye', parse_mode=ParseMode.HTML) + os.execv(sys.executable, ['python'] + sys.argv) + return @bot.message_handler(commands=['json']) def send_json(message): if (str(message.from_user.id) != admin_id): - bot.send_message(message.from_user.id, 'Команда доступна только администратору', parse_mode='Markdown') - else: - with open(for_json.path_users, 'rb') as json_file: - bot.send_document(admin_id, json_file) - with open(for_json.path_schedule, 'rb') as json_file: - bot.send_document(admin_id, json_file) + bot.send_message(message.from_user.id, 'Команда доступна только администратору', parse_mode=ParseMode.HTML) + return + + with open(for_json.path_users, 'rb') as json_file: + bot.send_document(admin_id, json_file) + with open(for_json.path_schedule, 'rb') as json_file: + bot.send_document(admin_id, json_file) return @@ -54,8 +58,8 @@ def start(message): if len(message.text.split(' ')) != 2: bot.send_message(message.chat.id, start_txt, parse_mode='Markdown') bot.send_message(message.chat.id, 'Похоже, что этот бот добавлен в группу. Чтобы он присылал расписание в чат, \ - запустите его заново, указав вместе с /start@vmk_schedule_bot номер\_своей\_группы.\ - \nПример:\n/start@vmk_schedule_bot 102', parse_mode='Markdown') + укажите вместе с /start@vmk_schedule_bot номер своей группы.\ + \nПример:\n/start@vmk_schedule_bot 102', parse_mode=ParseMode.HTML) else: temp = message.text.split(' ')[1] @@ -70,27 +74,28 @@ def start(message): if for_json.check_group_in_json(temp): bot.send_message(message.chat.id, \ - 'Отлично! Теперь я буду присылать вам расписание {} группы'.format(temp), parse_mode='Markdown') + 'Отлично! Теперь я буду присылать вам расписание {} группы'.format(temp), parse_mode=ParseMode.HTML) else: bot.send_message(message.chat.id, 'Похоже, что расписания для этой группы ещё не существует. \ - \nРазработчик уже пинается, но можете дополнительно написать ему: @Kr0sH\_512', parse_mode='Markdown') + \nРазработчик уже пинается, но можете дополнительно написать ему: @Kr0sH_512', parse_mode=ParseMode.HTML) send_message(admin_id, '🛑 В группе {} был запрос на {} группу.\ \nid: {}'.format(message.chat.title, temp, message.chat.id)) temp = 'other' for_json.save_user(infos) else: bot.send_message(message.chat.id, 'Введено не число. Попробуйте снова.\ - \nПример:\n/start@vmk_schedule_bot 102', parse_mode='Markdown') + \nПример:\n/start@vmk_schedule_bot 102', parse_mode=ParseMode.HTML) return - bot.send_message(message.chat.id, start_txt, parse_mode='Markdown') + bot.send_message(message.chat.id, start_txt, parse_mode=ParseMode.HTML) markup = types.InlineKeyboardMarkup() markup.add(types.InlineKeyboardButton(text="102", callback_data="102")) markup.add(types.InlineKeyboardButton(text="103", callback_data="103")) markup.add(types.InlineKeyboardButton(text="105", callback_data="105")) + markup.add(types.InlineKeyboardButton(text="110", callback_data="110")) markup.add(types.InlineKeyboardButton(text="Моей группы нет в этом списке", callback_data="other")) - bot.send_message(message.chat.id, 'Пожалуйста, выбери свою группу', parse_mode='Markdown', reply_markup=markup) + bot.send_message(message.chat.id, 'Пожалуйста, выбери свою группу', parse_mode=ParseMode.HTML, reply_markup=markup) return @@ -103,6 +108,7 @@ def callback_inline(call): call.from_user.username, call.data ] + for_json.save_user(infos) if call.data == 'other': @@ -111,12 +117,12 @@ def callback_inline(call): text='Используй команду /request \ и напиши номер группы, которую хочешь добавить\ \nПосле создания расписания для твоей группы, я пришлю тебе сообщение', - parse_mode='Markdown') + parse_mode=ParseMode.HTML) else: bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text='Отлично, теперь тебе будут приходить сообщения!', - parse_mode='Markdown') + parse_mode=ParseMode.HTML) return @@ -124,35 +130,38 @@ def callback_inline(call): def help(message): help_msg = 'Мои команды:\ \n/start - используй, чтобы сменить номер группы.\ + \n/schedule - используй, чтобы получить расписание на сегодня.\ \n/info - используй, чтобы узнать твои настройки бота\ \n/pause - используй, чтобы прекратить получать сообщения от бота\ \n/thread - используй в нужном чате канала, чтобы бот отправлял сообщения именно туда\ \n/timeout - настрой время, когда бот будет присылать тебе сообщение\ \n/request - используй, чтобы отправить разработчику какой-то запрос\ \n/source - Страница бота на Github\ - \n\nИли же можно всегда написать напрямую: @Kr0sH\_512' - bot.send_message(message.chat.id, help_msg, parse_mode='Markdown') + \n\nИли же можно всегда написать напрямую: @Kr0sH_512' + + bot.send_message(message.chat.id, help_msg, parse_mode=ParseMode.HTML) + if str(message.from_user.id) == admin_id and message.from_user.id == message.chat.id: help_msg = '🛑 И команды только для админа:\ \n/restart - перезапуск бота.\ \n/update - обновление schedule задач\ \n/json - получить файл пользователей и расписания\ - \n/info id\_пользователя - узнать настройки пользователя' - bot.send_message(message.from_user.id, help_msg, parse_mode='Markdown') + \n/info id_пользователя - узнать настройки пользователя' + bot.send_message(message.from_user.id, help_msg, parse_mode=ParseMode.HTML) return @bot.message_handler(commands=['request']) def request(message): bot.send_message(message.from_user.id, 'Отправь мне сообщение и я перешлю его разработчику\ - \n(или напиши stop, чтобы отменить отправку)', parse_mode='Markdown') + \n(или напиши stop, чтобы отменить отправку)', parse_mode=ParseMode.HTML) bot.register_next_step_handler(message, send_request) return def send_request(message): if message.text == "stop" or message.text == "стоп" or message.text[0] == '/': - bot.send_message(message.from_user.id, 'Отмена отпраки', parse_mode='Markdown') + bot.send_message(message.from_user.id, 'Отмена отпраки', parse_mode=ParseMode.HTML) return infos = [ @@ -166,51 +175,63 @@ def send_request(message): for i in range(len(infos)): if type(infos[i]) == type(None): infos[i] = '' - if '_' in str(infos[i]): - infos[i] = str(infos[i]).replace('_', '\_') text = '🛑 Сообщение от {} {} (@{}):\n\n{}\nid: {}'.format(infos[1], infos[2], infos[3], infos[4], infos[0]) - bot.send_message(admin_id, text, parse_mode='Markdown') - bot.send_message(message.from_user.id, 'Ваше сообщение успешно доставлено!', parse_mode='Markdown') + bot.send_message(admin_id, text, parse_mode=ParseMode.HTML) + + bot.send_message(message.from_user.id, 'Ваше сообщение успешно доставлено!', parse_mode=ParseMode.HTML) return -@bot.message_handler(commands=['schedule']) ### На доработке +@bot.message_handler(commands=['schedule']) def send_schedule(message): - # команда для отправки всего расписания - bot.send_message(message.chat.id, 'Пожалуйста, притворись, что ты получил сейчас своё расписание на неделю\ - \n\n(Функция в разработке)', parse_mode='Markdown') + text = 'К сожалению, бот не может отправить тебе расписание твоей группы на сегодня :(' + try: + text = for_json.get_schedule(str(message.chat.id)) + except Exception as e: + bot.send_message(admin_id, + '🛑 schedule error from: {} \n\n {}'.format(message.chat.id, e), + parse_mode=ParseMode.HTML) + bot.send_message(message.chat.id, text, parse_mode=ParseMode.HTML) return @bot.message_handler(commands=['timeout']) def set_timeout(message): bot.send_message(message.chat.id, 'Пришли мне число от 1 до 60. \ - \nЭто будет количество минут, за которое я буду присылать тебе напоминание о уроке (По умолчанию: 10)', parse_mode='Markdown') + \nЭто будет количество минут, за которое я буду присылать тебе напоминание о уроке (По умолчанию: 10)', parse_mode=ParseMode.HTML) bot.register_next_step_handler(message, save_timeout) return def save_timeout(message): if message.text[0] == '/': + bot.send_message(message.chat.id, 'Изменения не были внесены', parse_mode=ParseMode.HTML) return if str(message.text).isdigit() and int(message.text) <= 60 and int(message.text) >= 1: for_json.change_user_param(str(message.chat.id), 'timeout', str(message.text)) - bot.send_message(message.chat.id, 'Хорошо, теперь ты будешь получать напоминания за {} минут до урока'.format(str(message.text)), parse_mode='Markdown') + bot.send_message(message.chat.id, + 'Хорошо, теперь ты будешь получать напоминания за {} минут до урока'.format(str(message.text)), + parse_mode=ParseMode.HTML) else: - bot.send_message(message.chat.id, 'Пожалуйста, пришли число от 1 до 60. \nПо умолчанию: 10', parse_mode='Markdown') - bot.register_next_step_handler(message, save_timeout) + bot.send_message(message.chat.id, + 'Пожалуйста, пришли число от 1 до 60. \ + \nПо умолчанию: 10', + parse_mode=ParseMode.HTML) + bot.send_message(message.chat.id, 'Изменения не были внесены', parse_mode=ParseMode.HTML) return @bot.message_handler(commands=['info']) def send_info(message): if len(message.text.split(' ')) == 2 and str(message.from_user.id) == admin_id: - bot.send_message(message.chat.id, '🛑 Окей, держи', parse_mode='Markdown') + bot.send_message(message.chat.id, '🛑 Окей, держи настройки {}'.format(message.text.split(' ')[1]), + parse_mode=ParseMode.HTML) text = for_json.return_infos(message.text.split(' ')[1]) bot.send_message(message.chat.id, text, parse_mode=ParseMode.HTML) return - bot.send_message(message.chat.id, 'Хорошо, вот твои настройки:', parse_mode='Markdown') + + bot.send_message(message.chat.id, 'Хорошо, вот твои настройки:', parse_mode=ParseMode.HTML) text = for_json.return_infos(str(message.chat.id)) bot.send_message(message.chat.id, text, parse_mode=ParseMode.HTML) @@ -218,18 +239,21 @@ def send_info(message): @bot.message_handler(commands=['source']) def send_source(message): - bot.send_message(message.chat.id, 'https://github.com/kr0sh512/Telegram-bot-schedule', parse_mode='Markdown') + bot.send_message(message.chat.id, 'https://github.com/kr0sh512/Telegram-bot-schedule', parse_mode=ParseMode.HTML) return @bot.message_handler(commands=['thread']) def change_thread(message): thread_id = '' + try: thread_id = message.reply_to_message.message_thread_id except AttributeError: thread_id = "General" + for_json.change_user_param(str(message.chat.id), 'thread', thread_id) + bot.send_message(message.chat.id, 'Хорошо, теперь я буду отправлять сообщения в этот чат', parse_mode='Markdown', message_thread_id=thread_id) @@ -238,6 +262,7 @@ def change_thread(message): @bot.message_handler(commands=['pause']) def pause_schedule(message): for_json.change_user_param(str(message.chat.id), 'allow_message', 'no') + bot.send_message(message.chat.id, 'Рассылка сообщений преращена. \ \nДля возобновления воспользуйтесь командой\n/start', parse_mode='Markdown') @@ -259,9 +284,13 @@ def send_message(id, text, thread_id='General'): try: bot.send_message(chat_id=id, text=text, parse_mode=ParseMode.HTML, message_thread_id=thread_id) except Exception as e: - print(id, e) text = '🛑 user:' + id + 'error.\n' + str(e) - bot.send_message(chat_id=admin_id, text=text, parse_mode=ParseMode.HTML, message_thread_id=thread_id) + bot.send_message(admin_id, text, parse_mode=ParseMode.HTML, message_thread_id=thread_id) + time.sleep(5) + try: + bot.send_message(chat_id=id, text=text, parse_mode=ParseMode.HTML, message_thread_id=thread_id) + except Exception as e: + print(id, e) return @@ -275,7 +304,6 @@ if __name__ == '__main__': while True: try: - # bot.polling(none_stop=True) schedule.run_pending() time.sleep(5) except Exception as e: