def new_item_handler(message): try: task_name = message.text.replace('/new_item ', '') except: task_name = None if task_name == '/new_item': bot.send_message(message.chat.id, 'Как называется новая задача?') change_user_state(message.from_user.id, 'new_item') return tasks = get_tasks(message.from_user.id) summary = task_name if summary == None: summary = message.caption.replace('/new_item ', '') media = None ct = message.content_type if ct != 'text': media = (ct, eval('message.' + ct)[0].file_id) # summary: str, isDone: bool, media: tuple, creation_date: str, completion_date: str, message_id: str tasks.append([ summary, False, media, str(datetime.datetime.now())[:-7], None, message.message_id ]) n = len(tasks) save_tasks(tasks, message.from_user.id) bot.send_message(message.chat.id, 'Задача номер ' + str(n - 1) + ' успешно добавлена!', parse_mode='html')
def delete_handler(message): '''Удалить задачу по номеру''' task_number = message.text.replace('/delete ', '') if task_number == '/delete': bot.send_message(message.chat.id, 'Какой номер у задачи, которую нужно удалить?') change_user_state(message.from_user.id, 'delete') return task_number = int(task_number) tasks = get_tasks(message.from_user.id) try: deleted = tasks.pop(task_number) except: bot.send_message( message.chat.id, 'Задачи с таким номером нет! /all для просмотра всех задач.') return save_tasks(tasks, message.from_user.id) bot.send_message(message.chat.id, 'Задача ``` ' + deleted[0] + '``` успешно удалена!', parse_mode='markdown')
def undone_handler(message): '''Вернуть (к несделанным) задачу по номеру''' task_number = message.text.replace('/undone ', '') if task_number == '/undone': bot.send_message(message.chat.id, 'Какой номер у задачи, которую нужно вернуть?') change_user_state(message.from_user.id, 'undone') return task_number = int(task_number) tasks = get_tasks(message.from_user.id) tasks[task_number][1] = False tasks[task_number][4] = None save_tasks(tasks, message.from_user.id) bot.send_message(message.chat.id, 'Задача ``` ' + tasks[task_number][0] + '``` успешно возвращена!', parse_mode='markdown')
def import_handler(message): '''Ввод задач из файла''' if message.text == '/import': bot.send_message( message.chat.id, 'Отправьте файл с задачами (если файл сохранён с помощью pickle, то у файла должно быть .pickle)' ) change_user_state(message.from_user.id, 'import') return task_file = bot.get_file(message.document.file_id) f = bot.download_file(task_file.file_path) import_file_name = 'users/[import_file] ' + message.document.file_name with open(import_file_name, 'wb') as w: w.write(f) if import_file_name.endswith('.pickle'): with open(import_file_name, 'rb') as imf: new_tasks = pickle.load(imf) keyboard = types.InlineKeyboardMarkup() callback_button_yes = types.InlineKeyboardButton( text='Да', callback_data='import_yes:' + import_file_name) callback_button_no = types.InlineKeyboardButton( text='Нет', callback_data='import_no') callback_button_replace = types.InlineKeyboardButton( text='Заменить', callback_data='import_replace:' + import_file_name) keyboard.row(callback_button_yes, callback_button_no) keyboard.add(callback_button_replace) bot.send_message(message.chat.id, task_list_to_str(new_tasks), parse_mode='html') bot.send_message(message.chat.id, 'Добавить эти задачи к текущим?', reply_markup=keyboard)
def done_handler(message): '''Зачеркнуть задачу по номеру''' task_number = message.text.replace('/done ', '') if task_number == '/done': bot.send_message(message.chat.id, 'Какой номер у задачи, которую нужно зачеркнуть?') change_user_state(message.from_user.id, 'done') return task_number = int(task_number) tasks = get_tasks(message.from_user.id) tasks[task_number][1] = True tasks[task_number][4] = str(datetime.datetime.now())[:-7] save_tasks(tasks, message.from_user.id) bot.send_message(message.chat.id, 'Задача ``` ' + tasks[task_number][0] + '``` успешно зачёркнута!', parse_mode='markdown')
def show_task_handler(message, replace=False, task_number=None, user_id=None): '''Показывает сообщение с картинкой (даже если картинка не была прикреплена); эта функция вызывается также с помощью кнопки, поэтому ей нужно знать task_number и user_id''' if type(task_number) != int: task_number = message.text.replace('/show_task ', '') if task_number == '/show_task': bot.send_message(message.chat.id, 'Какой номер у задачи, которую мне нужно показать?') change_user_state(message.from_user.id, 'show_task') return task_number = int(task_number) if user_id == None: user_id = message.from_user.id tasks = get_tasks(user_id) task = tasks[task_number] task_text = str( task_number) + ') ' + task[0] + '\n\n🕰 Добавлена: ' + task[3] if task[1]: task_text += '\n✅ Выполнена: ' + task[4] if task[2]: content_type, file_id = task[2] if replace: showed_task = eval( f'bot.edit_message_media(types.InputMedia{content_type.capitalize()}(file_id, caption=task_text), message.chat.id, message.message_id)' ) else: showed_task = eval( f'bot.send_{content_type}(message.chat.id, {content_type}={repr(file_id)}, caption={repr(task_text)})' ) else: if replace: try: showed_task = bot.edit_message_media( types.InputMediaPhoto(emptyPhoto, caption=task_text), message.chat.id, message.message_id) except: showed_task = bot.edit_message_caption(task_text + '`!`', message.chat.id, message.message_id, parse_mode='markdown') else: showed_task = bot.send_photo(message.chat.id, emptyPhoto, task_text) message_id = ':' + str(showed_task.message_id) chat_id = ':' + str(showed_task.chat.id) user_id = ':' + str(user_id) next_number = (task_number + 1) % len(tasks) prev_number = (task_number - 1) % len(tasks) keyboard = types.InlineKeyboardMarkup() callback_button_next = types.InlineKeyboardButton( text='>>', callback_data='show:' + str(next_number) + message_id + chat_id + user_id) callback_button_previous = types.InlineKeyboardButton( text='<<', callback_data='show:' + str(prev_number) + message_id + chat_id + user_id) callback_button_done = types.InlineKeyboardButton( text='✅', callback_data='done:' + str(task_number) + message_id + chat_id + user_id) callback_button_link = types.InlineKeyboardButton( text='Показать сообщение', callback_data='reply:' + str(task[5]) + chat_id + ':.') keyboard.row(callback_button_previous, callback_button_done, callback_button_next) keyboard.add(callback_button_link) bot.edit_message_reply_markup(showed_task.chat.id, showed_task.message_id, reply_markup=keyboard)