diff --git a/app/__init__.py b/app/__init__.py index e69de29..2b3c21e 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -0,0 +1 @@ +from .commands import service diff --git a/app/bot.py b/app/bot.py index c5e9ce4..639af99 100644 --- a/app/bot.py +++ b/app/bot.py @@ -1,17 +1,15 @@ import shelve -from datetime import datetime as dt + from flask import request, abort import threading from time import sleep from . import stan -from . import reminder -from . import reloader from . import report -from . import get from . import rules -from .helpers import get_me, represent_as_get, detect_args + +from .helpers import represent_as_get, detect_args from .filters import * from .config import * @@ -107,30 +105,6 @@ def translate_layout(message): bot.send_message(message.chat.id, message.reply_to_message.text.translate(ENG_RUS_TABLE)) -@bot.message_handler(commands=['me']) -def command_me(message): - """ Send info about user and chat id [Service]. """ - bot.send_message(message.chat.id, get_me(message)) - - -@bot.message_handler(commands=['remind']) -def remind_manually(message): - """ Remind holidays manually. """ - args = message.text.split() - if len(args) > 1: - try: - today = dt.strptime(args[1], "%m-%d-%Y") - except ValueError as ve: - bot.send_message(message.chat.id, f"Не удалось разобрать дату!\n{ve}") - else: - reminder.remind(message.chat.id, today) - else: - bot.send_message(message.chat.id, f"Формат даты: MM-DD-YYYY\n\n" - f"Примеры:\n" - f"/remind 09-12-2024\n" - f"/remind 09-13-2022") - - @bot.message_handler(commands=['quote']) def stan_speak(message): bot.send_message(message.chat.id, stan.speak(0)) @@ -196,48 +170,11 @@ def google_it(message: types.Message): send_or_reply(message, f'Ищем «{query}» в Гугле...', reply_markup=markup) -@bot.message_handler(func=is_nongrata) -def tease_nongrata(message: types.Message): - """ Reply to non grata mentions. """ - bot.reply_to(message, f'у нас тут таких не любят') - - -""" - [ INLINE ] -""" - - -@bot.inline_handler(lambda query: True) -def default_query(inline_query): - """ Inline the Zen of Python. """ - zen = [] - for id_p, phrase in enumerate(ZEN): - q = inline_query.query.casefold() - if phrase.casefold().startswith(q) or ' ' + q in phrase.casefold(): - zen.append(types.InlineQueryResultArticle( - f"{id_p}", f'The Zen of Python #{id_p + 1}', types.InputTextMessageContent( - f"{phrase}"), description=phrase)) - - bot.answer_inline_query(inline_query.id, zen, cache_time=1200) - - """ [ ADMIN PANEL ] """ -@bot.message_handler(func=is_admin, commands=['ip']) -def get_ip(message): - bot.send_message(message.chat.id, get.my_ip()) - - -@bot.message_handler(func=is_admin, commands=['reload']) -def send_stats(message): - logging.warning('Reloading...') - reloader.reload_modules() - bot.send_message(message.chat.id, 'Reloaded successfully') - - @bot.message_handler(func=is_admin, commands=['ddel']) def delete_user(message: types.Message): if message.reply_to_message: @@ -265,58 +202,27 @@ def unban_user(message: types.Message): logging.warning(f'[UNBAN (M)] {user_id}') -@bot.message_handler(func=is_admin, commands=['jobs']) -def list_jobs(message): - """ List all the jobs in schedule. """ - bot.send_message(ADMIN_ID, reminder.print_get_jobs()) +""" + [ INLINE ] +""" -@bot.message_handler(func=is_white, commands=['add']) -def add_stan_quote(message): - if message.reply_to_message and message.reply_to_message.text: - with open('Stan.txt', 'a', encoding='utf8') as stan_quotes: - if message.reply_to_message.text not in (i.rstrip() for i in open('Stan.txt', 'r', encoding='utf8')): - stan_quotes.write(message.reply_to_message.text.replace('\n', ' ') + '\n') - bot.send_message(message.chat.id, - '✅ Добавил\n └ ' + message.reply_to_message.text.replace("\n", - " ") + '') - else: - bot.send_message(message.chat.id, - f'⛔️ Не добавил, есть токое\n └ {message.reply_to_message.text}') +@bot.inline_handler(lambda query: True) +def default_query(inline_query): + """ Inline the Zen of Python. """ + zen = [] + for id_p, phrase in enumerate(ZEN): + q = inline_query.query.casefold() + if phrase.casefold().startswith(q) or ' ' + q in phrase.casefold(): + zen.append(types.InlineQueryResultArticle( + f"{id_p}", f'The Zen of Python #{id_p + 1}', types.InputTextMessageContent( + f"{phrase}"), description=phrase)) - -@bot.message_handler(func=is_white, commands=['remove']) -def remove_stan_quote(message): - if message.reply_to_message and message.reply_to_message.text: - if message.reply_to_message.text in (i.rstrip() for i in open('Stan.txt', 'r', encoding='utf8')): - quotes = list(open('Stan.txt', 'r', encoding='utf8')) - with open('Stan.txt', 'w', encoding='utf8') as stan_quotes: - quotes.remove(message.reply_to_message.text + '\n') - stan_quotes.writelines(quotes) - bot.send_message(message.chat.id, f'✅ Удалил\n └ {message.reply_to_message.text}') - else: - bot.send_message(message.chat.id, f'⛔️ Нет такого\n └ {message.reply_to_message.text}') - - -@bot.message_handler(func=is_admin, commands=['stats']) -def send_stats(message: types.Message): - if len(message.text.split()) == 1: - rep = report.create_report_text(message.chat.id) - if rep: - bot.send_message(message.chat.id, rep) - else: - bot.send_message(message.chat.id, report.create_report_text(message.text.split()[-1])) - - -@bot.message_handler(func=is_admin, commands=['reset_stats'], chat_types=['supergroup', 'group']) -def send_stats(message: types.Message): - logging.warning('reset_stats') - report.reset_report_stats(message.chat.id) - bot.send_message(message.chat.id, report.reset_report_stats(message.chat.id)) + bot.answer_inline_query(inline_query.id, zen, cache_time=1200) """ - [ MAIN MESSAGE HANDLER ] + [ COUNTER ] """ @@ -354,7 +260,7 @@ def handle_msg(message: types.Message): @app.route(f"/bot{TOKEN}/", methods=['POST']) -def bot_webhook(): +def webhook(): """ Parse POST requests from Telegram. """ if request.headers.get('content-type') == 'application/json': json_string = request.get_data().decode('utf-8') diff --git a/app/commands/get.py b/app/commands/get.py new file mode 100644 index 0000000..cf5c8f7 --- /dev/null +++ b/app/commands/get.py @@ -0,0 +1,25 @@ +from urllib.request import urlopen + + +def my_ip(): + ip_service = 'https://icanhazip.com' + ip = urlopen(ip_service, ) + return ip.read().decode('utf-8') + + +def me(message): + msg = f"Telegram ID: {message.from_user.id}\n\ + ├ Is bot: {message.from_user.is_bot}\n\ + ├ First name: {message.from_user.first_name}\n" + if message.from_user.last_name: + msg += f" ├ Last name: {message.from_user.last_name}\n" + if message.from_user.username: + msg += f" ├ Username: {message.from_user.username}\n" + msg += f" ├ Language code: {message.from_user.language_code}\n" + if message.from_user.is_premium is True: + msg += f" ├ Is Premium: ⭐️\n" + else: + msg += f" ├ Is Premium: No\n" + msg += f" ├ Chat ID: {message.chat.id}" + + return msg diff --git a/app/commands/service.py b/app/commands/service.py new file mode 100644 index 0000000..7f817c9 --- /dev/null +++ b/app/commands/service.py @@ -0,0 +1,70 @@ +""" Service commands for Admin purposes. """ + +import logging +from datetime import datetime as dt +from ..config import bot, ADMIN_ID, types +from .. import reminder +from .. import reloader +from .. import report +from ..filters import is_admin +from .get import me, my_ip + + +@bot.message_handler(commands=['me']) +def command_me(message): + """ Send info about user and chat id [Service]. """ + bot.send_message(message.chat.id, me(message)) + + +@bot.message_handler(func=is_admin, commands=['ip']) +def get_ip(message): + bot.send_message(message.chat.id, my_ip()) + + +@bot.message_handler(commands=['remind']) +def remind_manually(message): + """ Remind holidays manually. """ + args = message.text.split() + if len(args) > 1: + try: + today = dt.strptime(args[1], "%m-%d-%Y") + except ValueError as ve: + bot.send_message(message.chat.id, f"Не удалось разобрать дату!\n{ve}") + else: + reminder.remind(message.chat.id, today) + else: + bot.send_message(message.chat.id, f"Формат даты: MM-DD-YYYY\n\n" + f"Примеры:\n" + f"/remind 09-12-2024\n" + f"/remind 09-13-2022") + + +@bot.message_handler(func=is_admin, commands=['jobs']) +def list_jobs(message): + """ List all the jobs in schedule. """ + bot.send_message(ADMIN_ID, reminder.print_get_jobs()) + + +@bot.message_handler(func=is_admin, commands=['stats']) +def send_stats(message: types.Message): + if len(message.text.split()) == 1: + rep = report.create_report_text(message.chat.id) + if rep: + bot.send_message(message.chat.id, rep) + else: + bot.send_message(message.chat.id, report.create_report_text(message.text.split()[-1])) + + +@bot.message_handler(func=is_admin, commands=['reset_stats'], chat_types=['supergroup', 'group']) +def send_stats(message: types.Message): + logging.warning('reset_stats') + report.reset_report_stats(message.chat.id) + bot.send_message(message.chat.id, report.reset_report_stats(message.chat.id)) + + +@bot.message_handler(func=is_admin, commands=['reload']) +def send_stats(message): + logging.warning('Reloading...') + reloader.reload_modules() + logging.warning('Reloaded!!!') + bot.send_message(message.chat.id, 'Reloaded successfully') diff --git a/app/config.py b/app/config.py index 1405a24..cd73c7b 100644 --- a/app/config.py +++ b/app/config.py @@ -8,7 +8,7 @@ from dotenv import load_dotenv logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s', datefmt='%Y.%m.%d %H:%M:%S') logging.critical('STAN STARTED!') -logger.setLevel(logging.DEBUG) +logger.setLevel(logging.INFO) load_dotenv() TOKEN = os.environ.get('LUTZPYBOT', 'Token not in ENVIRON') diff --git a/app/get.py b/app/get.py deleted file mode 100644 index fa8b51c..0000000 --- a/app/get.py +++ /dev/null @@ -1,7 +0,0 @@ -from urllib.request import urlopen - - -def my_ip(): - ip_service = 'https://icanhazip.com' - ip = urlopen(ip_service, ) - return ip.read().decode('utf-8') diff --git a/app/helpers.py b/app/helpers.py index 38b223d..962dc39 100644 --- a/app/helpers.py +++ b/app/helpers.py @@ -3,24 +3,6 @@ from urllib import parse from telebot import types -def get_me(message): - msg = f"Telegram ID: {message.from_user.id}\n\ - ├ Is bot: {message.from_user.is_bot}\n\ - ├ First name: {message.from_user.first_name}\n" - if message.from_user.last_name: - msg += f" ├ Last name: {message.from_user.last_name}\n" - if message.from_user.username: - msg += f" ├ Username: {message.from_user.username}\n" - msg += f" ├ Language code: {message.from_user.language_code}\n" - if message.from_user.is_premium is True: - msg += f" ├ Is Premium: ⭐️\n" - else: - msg += f" ├ Is Premium: No\n" - msg += f" ├ Chat ID: {message.chat.id}" - - return msg - - def represent_as_get(message: types.Message): return parse.quote_plus(detect_args(message)) diff --git a/app/reloader.py b/app/reloader.py index 26046eb..40b3b26 100644 --- a/app/reloader.py +++ b/app/reloader.py @@ -3,7 +3,7 @@ from importlib import reload from . import bot from . import filters from . import config -from . import get +from .commands import get, service from . import helpers from . import report from . import rules @@ -14,6 +14,7 @@ def reload_modules(): reload(bot) reload(filters) reload(get) + reload(service) reload(config) reload(helpers) reload(report) diff --git a/app/reminder.py b/app/reminder.py index cd40d20..9f03c5d 100644 --- a/app/reminder.py +++ b/app/reminder.py @@ -9,9 +9,6 @@ from .config import PYTHONCHATRU, bot from . import report -# https://core.telegram.org/bots/api Telegram Bot API - - def scheduler(): while True: run_pending() diff --git a/app/stan.py b/app/stan.py index 2bf142a..04b3fb3 100644 --- a/app/stan.py +++ b/app/stan.py @@ -1,8 +1,43 @@ """ Stan quote generator. """ import random +from .config import bot, types +from .filters import is_white, is_nongrata def speak(chance_of): number = random.randint(0, chance_of) if number == 0: return random.choice([i.rstrip() for i in open('Stan.txt', 'r', encoding='utf8') if i]) + + +@bot.message_handler(func=is_white, commands=['add']) +def add_stan_quote(message): + if message.reply_to_message and message.reply_to_message.text: + with open('Stan.txt', 'a', encoding='utf8') as stan_quotes: + if message.reply_to_message.text not in (i.rstrip() for i in open('Stan.txt', 'r', encoding='utf8')): + stan_quotes.write(message.reply_to_message.text.replace('\n', ' ') + '\n') + bot.send_message(message.chat.id, + '✅ Добавил\n └ ' + message.reply_to_message.text.replace("\n", + " ") + '') + else: + bot.send_message(message.chat.id, + f'⛔️ Не добавил, есть токое\n └ {message.reply_to_message.text}') + + +@bot.message_handler(func=is_white, commands=['remove']) +def remove_stan_quote(message): + if message.reply_to_message and message.reply_to_message.text: + if message.reply_to_message.text in (i.rstrip() for i in open('Stan.txt', 'r', encoding='utf8')): + quotes = list(open('Stan.txt', 'r', encoding='utf8')) + with open('Stan.txt', 'w', encoding='utf8') as stan_quotes: + quotes.remove(message.reply_to_message.text + '\n') + stan_quotes.writelines(quotes) + bot.send_message(message.chat.id, f'✅ Удалил\n └ {message.reply_to_message.text}') + else: + bot.send_message(message.chat.id, f'⛔️ Нет такого\n └ {message.reply_to_message.text}') + + +@bot.message_handler(func=is_nongrata) +def tease_nongrata(message: types.Message): + """ Reply to non grata mentions. """ + bot.reply_to(message, f'у нас тут таких не любят')