import shelve from flask import request, abort from . import stan from . import rules from .helpers import represent_as_get, detect_args, update_stats from .filters import * from .config import * """ [ ANTISPAM ] """ @bot.edited_message_handler(func=in_spam_list) @bot.message_handler(func=in_spam_list) def moderate_messages(message: types.Message): """ Ban user and delete their message. """ logging.warning(f'[BAN] {message.from_user.id} {message.from_user.username} - {message.text}') bot.delete_message(message.chat.id, message.id) bot.ban_chat_member(message.chat.id, message.from_user.id) with shelve.open(f'{DATA}{message.chat.id}') as s: s['Banned'] += 1 @bot.message_handler(func=in_caption_spam_list, content_types=['video']) def catch_videos(message: types.Message): """Catch offensive videos""" logging.warning(f'[BAN] {message.from_user.id} {message.from_user.first_name} - {message.video.file_name}') bot.delete_message(message.chat.id, message.id) bot.ban_chat_member(message.chat.id, message.from_user.id) with shelve.open(f'{DATA}{message.chat.id}') as s: s['Banned'] += 1 @bot.edited_message_handler(func=in_delete_list) @bot.message_handler(func=in_delete_list) def delete_message(message: types.Message): """ Delete unwanted message. """ bot.delete_message(message.chat.id, message.id) with shelve.open(f'{DATA}{message.chat.id}') as s: s['Deleted'] += 1 """ [ COMMANDS ] """ @bot.message_handler(commands=['start', 'links', 'ссылки']) def start(message: types.Message): """ What to begin with. """ log_msg = f'[START] {message.from_user.id} {message.from_user.first_name}' logging.warning(log_msg) markup = types.InlineKeyboardMarkup([[RULES], [FAQ], [LIB]], 1) send_or_reply(message, "Начни с прочтения", reply_markup=markup) @bot.message_handler(commands=['rules', 'rule', 'r', 'правила', 'правило', 'п']) def send_rules(message): markup = types.InlineKeyboardMarkup([[RULES]], 1) args = message.text.split() if len(args) > 1 and args[-1].isdigit() and 0 < int(args[-1]): send_or_reply(message, f'Правило {args[-1]}\n{rules.fetch_rule(args[-1])}', reply_markup=markup) else: send_or_reply(message, '...', reply_markup=markup) @bot.message_handler(commands=['faq', 'чзв']) def send_faq(message): markup = types.InlineKeyboardMarkup([[FAQ]], 1) send_or_reply(message, '...', reply_markup=markup) @bot.message_handler(commands=['lib', 'library', 'books', 'книги', 'библиотека']) def send_lib(message): markup = types.InlineKeyboardMarkup([[LIB]], 1) send_or_reply(message, '...', reply_markup=markup) @bot.message_handler(commands=['lutz', 'лутц']) def send_lutz(message): bot.send_document(message.chat.id, document='BQACAgQAAxkBAAPBYsWJG9Ml0fPrnbU9UyzTQiQSuHkAAjkDAAIstCxSkuRbXAlcqeQpBA', caption="вот, не позорься") @bot.message_handler(commands=['bdmtss']) def send_bdmtss_audio(message): bot.send_voice(message.chat.id, 'AwACAgIAAxkBAAIJrWOg2WUvLwrf7ahyJxQHB8_nqllwAAL5JQAC2_IJSbhfQIO5YnVmLAQ') @bot.message_handler(commands=['tr']) def translate_layout(message): if message.reply_to_message and message.reply_to_message.text: if message.reply_to_message.text[0] in RUS: bot.send_message(message.chat.id, message.reply_to_message.text.translate(RUS_ENG_TABLE)) else: bot.send_message(message.chat.id, message.reply_to_message.text.translate(ENG_RUS_TABLE)) @bot.message_handler(commands=['quote']) def stan_speak(message): bot.send_message(message.chat.id, stan.speak(0)) @bot.message_handler(commands=['tsya', 'тся', 'ться']) def send_tsya(message: types.Message): markup = types.InlineKeyboardMarkup() markup.add(types.InlineKeyboardButton('🧑🏼‍🎓 Читать правило', url='https://tsya.ru/'), row_width=1) send_or_reply(message, '-тся и -ться в глаголах', reply_markup=markup) @bot.message_handler(commands=['nometa']) def send_nometa(message: types.Message): markup = types.InlineKeyboardMarkup() markup.add(types.InlineKeyboardButton('❓ nometa.xyz', url='https://nometa.xyz/ru.html'), row_width=1) send_or_reply(message, """Не задавай мета-вопросов вроде: «Можно задать вопрос?» «Кто-нибудь пользовался .. ?» «Привет, мне нужна помощь по .. !» Просто спроси сразу! И чем лучше объяснишь проблему, тем вероятнее получишь помощь.""", reply_markup=markup) @bot.message_handler(commands=['neprivet', 'непривет']) def send_neprivet(message: types.Message): markup = types.InlineKeyboardMarkup() markup.add(types.InlineKeyboardButton('👋 Непривет', url='https://neprivet.com/'), row_width=1) send_or_reply(message, 'Пожалуйста, не пишите просто «Привет» в чате.', reply_markup=markup) @bot.message_handler(commands=['nojob']) def send_nojob(message): logging.warning('Sent no job') answer = """Мы здесь не для того, чтобы за тебя решать задачи. Здесь помогают по конкретным вопросам в ТВОЁМ коде, поэтому тебе нужно показать код, который ты написал сам и объяснить где и почему застрял... всё просто. 🤷🏼️""" send_or_reply(message, answer) @bot.message_handler(commands=['nobot']) def nobot(message: types.Message): answer = """Внимание: Телеграм бот не должен быть твоим первым проектом на Python. Пожалуйста, изучи основы Python, работу с модулями, основы веб-технологий, асинхронное программирование и отладку до начала работы с Телеграм ботами. Существует много ресурсов для этого в интернете.""" send_or_reply(message, answer) @bot.message_handler(commands=['nogui']) def nogui(message: types.Message): answer = """Внимание: GUI приложение не должно быть твоим первым проектом на Python. Пожалуйста, изучи основы Python, работу с модулями, циклы событий и отладку до начала работы с какими-либо GUI-фреймворками. Существует много ресурсов для этого в интернете.""" send_or_reply(message, answer) @bot.message_handler(commands=['g']) def google_it(message: types.Message): """ Google it! """ query = f'{detect_args(message)}' get_query = 'https://www.google.com/search?q=' + represent_as_get(message) markup = types.InlineKeyboardMarkup() markup.add(types.InlineKeyboardButton('🔍 Google Поиск', url=get_query), row_width=1) send_or_reply(message, f'Ищем «{query}»...', reply_markup=markup) """ [ ADMIN PANEL ] """ @bot.message_handler(func=is_admin, commands=['ddel']) def delete_user(message: types.Message): if message.reply_to_message: bot.delete_message(message.chat.id, message.id) bot.delete_message(message.chat.id, message.reply_to_message.id) logging.warning( f'[DEL (M)] {message.reply_to_message.from_user.id} {message.reply_to_message.from_user.first_name} - {message.reply_to_message.text}') @bot.message_handler(func=is_admin, commands=['bban']) def ban_user(message: types.Message): if message.reply_to_message: bot.delete_message(message.chat.id, message.id) bot.delete_message(message.chat.id, message.reply_to_message.id) bot.ban_chat_member(message.chat.id, message.reply_to_message.from_user.id) logging.warning( f'[BAN (M)] {message.reply_to_message.from_user.id} {message.reply_to_message.from_user.first_name} - {message.reply_to_message.text}') @bot.message_handler(func=is_admin, commands=['unban_id']) def unban_user(message: types.Message): if message.text.split()[-1].isdigit(): user_id = int(message.text.split()[-1]) bot.unban_chat_member(PYTHONCHATRU, user_id) logging.warning(f'[UNBAN (M)] {user_id}') """ [ 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) """ [ COUNTER ] """ @bot.message_handler(content_types=['text', 'sticker', 'photo', 'animation', 'video', 'audio', 'document'], chat_types=['supergroup', 'group']) def handle_msg(message: types.Message): """ Count messages, Stan. """ update_stats(message) stan.act(message) """ [ WEBHOOK ] """ @app.route(f"/bot{TOKEN}/", methods=['POST']) def webhook(): """ Parse POST requests from Telegram. """ if request.headers.get('content-type') == 'application/json': json_string = request.get_data().decode('utf-8') update = types.Update.de_json(json_string) bot.process_new_updates([update]) return '' else: abort(403)