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