diff --git a/.gitignore b/.gitignore index 1bee03e..1af14d5 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ /testbot.py /.venv/ /.idea/ +/config.py +/.env diff --git a/bot.py b/bot.py index e65794e..81150b0 100644 --- a/bot.py +++ b/bot.py @@ -4,13 +4,17 @@ from flask import Flask, request, abort from query_log import logging from datetime import datetime as dt from os.path import exists +import os + +from config import bot, ADMIN_ID +import reminder + # https://core.telegram.org/bots/api Telegram Bot API -LUTZPYBOT = "5598132169:AAFBpUn4Us8m7StkY4yHUIcEnnJg3adPvsQ" -app = Flask(__name__) -bot = telebot.TeleBot(LUTZPYBOT) -print("LutzPyBot is working!") +app = Flask(__name__) + +print("LutzBot is running!") @bot.message_handler(commands=['rules', 'faq']) @@ -38,14 +42,14 @@ def send_lutz_command(message): @bot.message_handler(commands=['start']) def send_start_notify_admin(message): bot.send_message( - 280887861, get_me(message), parse_mode='HTML') + ADMIN_ID, get_me(message), parse_mode='HTML') logging(message) @bot.message_handler(commands=['log']) def send_log_file(message): """Get log.csv""" - if message.from_user.id == 280887861: + if message.from_user.id == ADMIN_ID: file_path = f"logs/log_{dt.now().strftime('%Y-%m')}.csv" if exists(file_path): with open(file_path, "r", encoding='utf-8') as f: @@ -63,7 +67,7 @@ def default_query(inline_query): ├ Автор: Марк Лутц └ Год: 2019""", parse_mode='HTML', - ) + ) matthes_rus = telebot.types.InlineQueryResultCachedDocument( id='45', title='📕 Изучаем Python 🇷🇺', @@ -73,7 +77,7 @@ def default_query(inline_query): ├ Автор: Эрик Мэтиз └ Год: 2020""", parse_mode='HTML', - ) + ) lutz = telebot.types.InlineQueryResultDocument( id='1', title='📕 Learning Python ⭐️', @@ -84,7 +88,7 @@ def default_query(inline_query): └ Released June 2013""", parse_mode='HTML', mime_type='application/pdf', - thumb_url='https://fk7.ru/books/OReilly.Learning.Python.5th.Edition.jpg',) + thumb_url='https://fk7.ru/books/OReilly.Learning.Python.5th.Edition.jpg', ) matthes = telebot.types.InlineQueryResultDocument( id='2', title='📕 Python Crash Course', @@ -95,7 +99,7 @@ def default_query(inline_query): └ Released 2019""", parse_mode='HTML', mime_type='application/pdf', - thumb_url='https://fk7.ru/books/PythonCrashCourse.jpg',) + thumb_url='https://fk7.ru/books/PythonCrashCourse.jpg', ) vincent = telebot.types.InlineQueryResultDocument( id='3', title='📕 Django for Beginners', @@ -106,17 +110,17 @@ def default_query(inline_query): └ Released March 2022""", parse_mode='HTML', mime_type='application/pdf', - thumb_url='https://fk7.ru/books/django_for_beginners_4_0.jpg',) + thumb_url='https://fk7.ru/books/django_for_beginners_4_0.jpg', ) bot.answer_inline_query( - inline_query.id, [lutz, matthes, lutz_rus, matthes_rus], + inline_query.id, [lutz, matthes, lutz_rus, matthes_rus], cache_time=10) @bot.message_handler(content_types=['document']) def command_me(message): - """GetMe Informer""" - if message.chat.id == 280887861: + """ GetMe Informer. """ + if message.chat.id == ADMIN_ID: bot.send_message(message.chat.id, message.document) @@ -127,7 +131,13 @@ def command_me(message): logging(message) -@app.route(f'/bot{LUTZPYBOT}/', methods=['POST']) +@bot.message_handler(commands=['remind']) +def remind_manually(): + """Remind manually""" + reminder.remind() + + +@app.route(f"/bot{os.environ.get('LUTZPYBOT', 'Token not in ENVIRON')}/", methods=['POST']) def webhook(): """Parse POST requests from Telegram""" if request.headers.get('content-type') == 'application/json': diff --git a/dates.csv b/dates.csv deleted file mode 100644 index 637129a..0000000 --- a/dates.csv +++ /dev/null @@ -1,4 +0,0 @@ -Date,Name,Description -256,День программиста ,"Число 256 выбрано потому, что это количество целых чисел, которое можно выразить с помощью одного восьмиразрядного байта, а также это максимальная степень числа 2, которая меньше количества дней в году — 365." -01-28,Международный день защиты персональных данных ,"Международный день защиты персональных данных (Data Protection Day). Это праздник был учрежден для того, чтобы пользователи сети не забывали о соблюдении правил поведения в интернете, которые помогают обезопасить их виртуальную и реальную жизнь." -09-30,День интернета,"Все началось с того, что в 1998 году московская фирма IT Infoart Stars разослала фирмам и организациям предложение поддержать инициативу, состоящую из двух пунктов: назначить 30 сентября «Днем интернета», ежегодно его праздновать и провести «перепись населения русскоязычного интернета»." diff --git a/holidays.csv b/holidays.csv new file mode 100644 index 0000000..1415dfe --- /dev/null +++ b/holidays.csv @@ -0,0 +1,9 @@ +"Date","Name","Description" +"09-13","День программиста","День программиста отмечают практически повсеместно, ведь в XXI веке важность и необходимость этой профессии понятна всем. А в России праздник даже является официальным" +"01-28","Международный день защиты персональных данных","Международный день защиты персональных данных (Data Protection Day). Это праздник был учрежден для того, чтобы пользователи сети не забывали о соблюдении правил поведения в интернете, которые помогают обезопасить их виртуальную и реальную жизнь" +"09-30","День интернета","Все началось с того, что в 1998 году московская фирма IT Infoart Stars разослала фирмам и организациям предложение поддержать инициативу, состоящую из двух пунктов: назначить 30 сентября «Днем интернета», ежегодно его праздновать и провести «перепись населения русскоязычного интернета»" +2005-07-21,"День рождения Django","Джанго — свободный фреймворк для веб-приложений на языке Python. Проект поддерживается организацией Django Software Foundation. Веб-фреймворк Django используется в сайтах Instagram, Disqus, Mozilla, The Washington Times, Pinterest, YouTube, Google и др. Авторы: американский веб-разработчик Адриан Головатый и британский программист Саймон Уиллисон" +2018-12-05,"День рождения FastAPI","FastAPI — веб-фреймворк для создания API, написанный на Python. Один из самых быстрых и популярных (после Django и Flask) веб-фреймворков, написанных на Python. Автор — колумбиец Себастьян Рамирез" +2010-04-01,"День рождения Flask","Создатель и основной автор — австрийский программист Армин Ронахер, начал работу над проектом в 2010 году" +"1991-02-20","День рождения Python","Задумка по реализации языка появилась в конце 1980-х годов, а разработка его реализации началась в 1989 году сотрудником голландского института CWI Гвидо ван Россумом. Гвидо начал разрабатывать Python на досуге, позаимствовав некоторые наработки для языка ABC" +2008-12-03,"День рождения Python 3","После длительного тестирования, вышла первая версия Python 3000 (или Python 3.0, также используется сокращение Py3k). В Python 3000 устранены многие недостатки архитектуры с максимально возможным (но не полным) сохранением совместимости со старыми версиями Python" diff --git a/query_log.py b/query_log.py index a5cd2e7..77513c9 100644 --- a/query_log.py +++ b/query_log.py @@ -9,7 +9,7 @@ def logging(message): with open(log_file_csv, 'a') as f: logs = csv.writer(f) logs.writerow(['DATE AND TIME', 'ID', 'FIRST NAME', 'USERNAME', - 'CHAT', 'LANG', 'PREMIUM', 'QUERY']) + 'CHAT', 'LANG', 'PREMIUM', 'QUERY']) with open(log_file_csv, 'a') as f: logs = csv.writer(f) @@ -17,4 +17,3 @@ def logging(message): [dt.datetime.now().strftime('%Y-%m-%d %H:%H'), message.from_user.id, message.from_user.first_name, message.from_user.username, message.chat.id, message.from_user.language_code, message.from_user.is_premium, message.text]) - diff --git a/reminder.py b/reminder.py new file mode 100644 index 0000000..4c37755 --- /dev/null +++ b/reminder.py @@ -0,0 +1,47 @@ +import schedule +import time +from threading import Thread +from datetime import datetime as dt +from config import bot +import csv +from dotenv import load_dotenv + +from config import PYTHONCHATRU +# https://core.telegram.org/bots/api Telegram Bot API + +dotenv_path = '.env' +load_dotenv(dotenv_path) + +with open('holidays.csv', newline='', encoding='utf-8') as holidays_file: + holidays = tuple(csv.reader(holidays_file)) + + +def scheduler(): + while True: + schedule.run_pending() + time.sleep(20) + + +def remind(): + """ Remind holiday. """ + today = dt.today() + for entry in holidays[1:]: + date, holiday, description = entry + if len(date) == 5 \ + and today.month == dt.strptime(date, "%m-%d").month \ + and today.day == dt.strptime(date, "%m-%d").day: + notification = f'🎉💻 Сегодня {dt.strptime(date, "%m-%d"):%d.%m}, {holiday.upper()}! \ + \n\n{description}.' + bot.send_message(PYTHONCHATRU, notification, parse_mode='HTML') # PYTHONCHATRU + elif len(date) == 10 \ + and today.month == dt.strptime(date, "%Y-%m-%d").month \ + and today.day == dt.strptime(date, "%Y-%m-%d").day: + age = today.year - dt.strptime(date, "%Y-%m-%d").year + notification = f'🎉💻 Сегодня {dt.strptime(date, "%Y-%m-%d"):%d.%m}, {holiday.upper()}! \ + \n\n{description}.\n{age} годовщина' + bot.send_message(PYTHONCHATRU, notification, parse_mode='HTML') # PYTHONCHATRU + + +schedule.every().day.at('08:00').do(remind) +Thread(target=scheduler).start() + diff --git a/requirements.txt b/requirements.txt index a2a41c7..89fd144 100644 Binary files a/requirements.txt and b/requirements.txt differ