/
Moonwind
/
Learningfiles
Обзор
Документация
Войти
/
Moonwind
/
Learningfiles
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
FreeToDobot.py
191 строка
8 KB
Moonwind
update FreeToDobot.py
28 авг 2024, 14:35
28 авг 2024, 14:35
c301912
Код
Авторство
О чём код?
import json import telebot from datetime import datetime import re # Токен вашего бота token = '7340599274:AAGdBm9q69PdP9-JutfaD51y7pnj7Ft2j-0' bot = telebot.TeleBot(token) # Словарь для хранения задач по пользователям todos = {} DATA_FILE = 'tasks.json' user_states = {} # Функция загрузки задач из файла def load_tasks(): global todos try: with open(DATA_FILE, 'r', encoding='utf-8') as f: todos = json.load(f) except FileNotFoundError: todos = {} # Функция сохранения задач в файл def save_tasks(): with open(DATA_FILE, 'w', encoding='utf-8') as f: json.dump(todos, f, ensure_ascii=False, indent=4) # Загрузка задач при старте бота load_tasks() # Установка командного меню bot.set_my_commands([ telebot.types.BotCommand("/help", "Список доступных команд"), telebot.types.BotCommand("/todo", "Добавить задачу"), telebot.types.BotCommand("/print", "Показать задачи на дату"), telebot.types.BotCommand("/print_today", "Показать задачи на сегодня"), telebot.types.BotCommand("/remove", "Удалить задачу") ]) # Команда для вывода доступных команд @bot.message_handler(commands=['help']) def help(message): help_message = ''' Список доступных команд: /print - Напечатать все задачи на заданную дату (можно указать несколько дат через пробел) /print_today - Напечатать все задачи на сегодня /todo - Добавить задачу /remove - Удалить задачу /help - Напечатать help ''' bot.send_message(message.chat.id, help_message) # Команда для добавления задачи @bot.message_handler(commands=['todo']) def todo_start(message): bot.send_message(message.chat.id, "Введите дату задачи в формате DD.MM.YYYY") user_states[message.chat.id] = {'state': 'waiting_for_date'} @bot.message_handler(func=lambda message: user_states.get(message.chat.id, {}).get('state') == 'waiting_for_date') def get_task_date(message): if not is_valid_date(message.text): bot.send_message(message.chat.id, "Некорректная дата. Попробуйте еще раз.") return user_states[message.chat.id]['date'] = message.text bot.send_message(message.chat.id, "Введите задачу") user_states[message.chat.id]['state'] = 'waiting_for_task' @bot.message_handler(func=lambda message: user_states.get(message.chat.id, {}).get('state') == 'waiting_for_task') def get_task_text(message): if len(message.text) < 3: bot.send_message(message.chat.id, "Задача должна содержать минимум 3 символа. Попробуйте еще раз.") return date = user_states[message.chat.id]['date'] task = message.text add_todo_for_user(message.from_user.id, date, task) bot.send_message(message.chat.id, f'Задача "{task}" добавлена на дату {date}') save_tasks() user_states.pop(message.chat.id, None) # Команда для печати задач на указанные даты @bot.message_handler(commands=['print']) def print_tasks(message): bot.send_message(message.chat.id, "Введите дату(ы) в формате DD.MM.YYYY (можно указать несколько через пробел)") user_states[message.chat.id] = {'state': 'waiting_for_print_dates'} @bot.message_handler(func=lambda message: user_states.get(message.chat.id, {}).get('state') == 'waiting_for_print_dates') def handle_print_dates(message): dates = message.text.split() tasks_output = "" user_id = message.from_user.id for date in dates: if not is_valid_date(date): tasks_output += f"Ошибка: дата {date} некорректна.\n" continue if user_id in todos and date in todos[user_id]: tasks_output += f"Задачи на {date}:\n" for task in todos[user_id][date]: tasks_output += f'✅ {task}\n' tasks_output += "\n" else: tasks_output += f'На дату {date} задач нет.\n\n' bot.send_message(message.chat.id, tasks_output.strip()) user_states.pop(message.chat.id, None) # Команда для печати задач на сегодня @bot.message_handler(commands=['print_today']) def print_today(message): today = datetime.now().strftime("%d.%m.%Y") user_id = message.from_user.id if user_id in todos and today in todos[user_id]: tasks = "Задачи на сегодня:\n" for task in todos[user_id][today]: tasks += f'✅ {task}\n' else: tasks = 'На сегодня задач нет.' bot.send_message(message.chat.id, tasks) # Команда для удаления задачи @bot.message_handler(commands=['remove']) def remove_task(message): bot.send_message(message.chat.id, "Введите дату задачи, которую хотите удалить (формат DD.MM.YYYY)") user_states[message.chat.id] = {'state': 'waiting_for_remove_date'} @bot.message_handler(func=lambda message: user_states.get(message.chat.id, {}).get('state') == 'waiting_for_remove_date') def get_remove_task_date(message): if not is_valid_date(message.text): bot.send_message(message.chat.id, "Некорректная дата. Попробуйте еще раз.") return user_states[message.chat.id]['date'] = message.text bot.send_message(message.chat.id, "Введите текст задачи, которую хотите удалить") user_states[message.chat.id]['state'] = 'waiting_for_remove_task' @bot.message_handler(func=lambda message: user_states.get(message.chat.id, {}).get('state') == 'waiting_for_remove_task') def get_remove_task_text(message): task = message.text date = user_states[message.chat.id]['date'] user_id = message.from_user.id if user_id in todos and date in todos[user_id]: try: todos[user_id][date].remove(task) if not todos[user_id][date]: del todos[user_id][date] bot.send_message(message.chat.id, f'Задача "{task}" удалена с даты {date}') except ValueError: bot.send_message(message.chat.id, f'Задачи "{task}" нет на дату {date}') else: bot.send_message(message.chat.id, f'На дату {date} задач нет.') save_tasks() user_states.pop(message.chat.id, None) # Проверка корректности даты def is_valid_date(date_text): if not re.match(r"^\d{2}\.\d{2}\.\d{4}$", date_text): return False day, month, year = map(int, date_text.split('.')) current_year = datetime.now().year if year < current_year: return False if month < 1 or month > 12: return False try: datetime(year, month, day) except ValueError: return False return True # Добавление задачи пользователю def add_todo_for_user(user_id, date, task): date = date.lower() if user_id in todos: if date in todos[user_id]: todos[user_id][date].append(task) else: todos[user_id][date] = [task] else: todos[user_id] = {date: [task]} # Запуск бота bot.polling(none_stop=True)