def on_spoiler_channel(message): if message.text.startswith("/s"): name, text = gen_spoiler(message.text) if name is None: bot.reply_to( message, "Неправильный формат.\nПравильный:\n/spoiler (название фильма/книги и т.п.) текст спойлера" ) return 0 message_id = str(message.message_id) chat_id = str(message.chat.id) data = gdata.load() if not ("spoilers" in data): data.update({"spoilers": {}}) gdata.update(data) data = gdata.load() data["spoilers"].update({"sp" + chat_id + message_id: text}) gdata.update(data) markup = telebot.types.InlineKeyboardMarkup() btn1 = telebot.types.InlineKeyboardButton("Показать", callback_data="sp" + chat_id + message_id) markup.row(btn1) bot.send_message(chat_id, f"Спойлер '{name}'", reply_markup=markup) bot.delete_message(message.chat.id, message.message_id)
def add_date(message): try: # отделение и запись в отдельные переменные времена начала и конца комчаса: arr = list(map(str, message.text.split(" - "))) time1 = datetime.strptime(arr[0], timeStamp).strftime(timeStamp) time2 = datetime.strptime(arr[1], timeStamp).strftime(timeStamp) # ------------------------------------------------------------------------ dictt = gdata.load() chatid = str(message.chat.id) dictt[chatid][3] = [time1, time2] # сохранение дат начала и конца комчаса dictt[chatid][1] = True poll = telebot.types.Poll("🛡Включить ли комендантский час с " + str(time1) + " по " + str(time2) + "?🛡") # создание объекта класса Poll # Добавление вариантов ответа в poll: poll.add("Да") poll.add("Нет") # ---------------------------------- dictt[chatid][2] = str( bot.send_poll(chatid, poll).message_id ) # отправка poll в группу и сохранение message_id отправленного голосования dictt[chatid][5] = time.time( ) # сохранение времени отправки для будущего определения конца голосования gdata.update(dictt) except: # вылов ValueError, в случае если пользователь ввел время не по формату. bot.reply_to(message, "❌*Неверный формат времени.*❌", parse_mode="Markdown") # Вывод ошибки пользователю
def chmode(query): try: chat_id = str(query.message.chat.id) user_id = str(query.from_user.id) admin_id = str(query.message.reply_to_message.from_user.id) admins = [ str(member.user.id) for member in bot.get_chat_administrators(chat_id) ] mode_ch = int(query.data[6:]) data = gdata.load() if user_id == admin_id: data[chat_id]["mode"] = mode_ch gdata.update(data) out_text_arr = [ "Теперь бот не будет реагировать на агрессию (но он все еще учитывает сообщения для 'Топа токсиков')", "Теперь бот, если посчитает сообщение агрессивным, отправит предупрежение, \ и пользователи смогут удалить сообщение (рекомендуется)", "Теперь бот будет втихую удалять сообщения с агрессией" ] bot.answer_callback_query(query.id, out_text_arr[mode_ch], show_alert=True) markup = telebot.types.InlineKeyboardMarkup() func = lambda mode: mode == data[chat_id]["mode"] mark1 = lambda mode: ">" if func(mode) else "" mark2 = lambda mode: "<" if func(mode) else "" btn1 = telebot.types.InlineKeyboardButton( f"{mark1(0)} Выключен {mark2(0)}", callback_data="chmode0") btn2 = telebot.types.InlineKeyboardButton( f"{mark1(1)} Обычный {mark2(1)}", callback_data="chmode1") btn3 = telebot.types.InlineKeyboardButton( f"{mark1(2)} Тихий {mark2(2)}", callback_data="chmode2") btn4 = telebot.types.InlineKeyboardButton(f"↩️", callback_data="back") markup.row(btn1) markup.row(btn2) markup.row(btn3) markup.row(btn4) bot.edit_message_text(chat_id=chat_id, message_id=query.message.message_id, text="*Изменение режима*", parse_mode="Markdown") bot.edit_message_reply_markup( chat_id=chat_id, message_id=query.message.message_id, reply_markup=markup) else: bot.answer_callback_query(query.id, "Эту панель настроек вызвали не вы", show_alert=True) except AttributeError: bot.answer_callback_query(query.id, "Сообщение вызова удалено", show_alert=True)
def c_c(query): try: chat_id = str(query.message.chat.id) user_id = str(query.from_user.id) admin_id = str(query.message.reply_to_message.from_user.id) admins = [ str(member.user.id) for member in bot.get_chat_administrators(chat_id) ] val = float(query.data[3:]) data = gdata.load() if user_id == admin_id: data[chat_id]["value"] = val gdata.update(data) markup = telebot.types.InlineKeyboardMarkup() func = lambda mode: mode == data[chat_id]["value"] mark1 = lambda mode: ">" if func(mode) else "" mark2 = lambda mode: "<" if func(mode) else "" val = 1 btn = telebot.types.InlineKeyboardButton( f"{mark1(val)} {str(val)} {mark2(val)}", callback_data=f"c_c{str(val)}") markup.row(btn) for i in range(0, 5): val = round(0.95 - i / 10, 2) btn = telebot.types.InlineKeyboardButton( f"{mark1(val)} {str(val)} {mark2(val)}", callback_data=f"c_c{str(val)}") markup.row(btn) btn4 = telebot.types.InlineKeyboardButton(f"↩️", callback_data="back") markup.row(btn4) bot.edit_message_text( chat_id=chat_id, message_id=query.message.message_id, text= "*Изменение чувствительности*\n\n_Чем больше чувствительность - тем на менее агрессивные сообщения будет реагировать бот_", parse_mode="Markdown") bot.edit_message_reply_markup( chat_id=chat_id, message_id=query.message.message_id, reply_markup=markup) else: bot.answer_callback_query(query.id, "Эту панель настроек вызвали не вы", show_alert=True) except AttributeError: bot.answer_callback_query(query.id, "Сообщение вызова удалено", show_alert=True)
def on_spoiler(message): name, text = gen_spoiler(message.text) if name is None: bot.reply_to( message, "Неправильный формат.\nПравильный:\n/spoiler (название фильма/книги и т.п.) текст спойлера" ) return 0 message_id = str(message.message_id) chat_id = str(message.chat.id) user_id = str(message.from_user.id) if user_id not in ['1442103439', '777000', '1087968824']: data = gdata.load() if not (chat_id in data): data.update({ chat_id: { "users": {}, "mode": 1, "value": 0.85, "can_del": True } }) gdata.update(data) data = gdata.load() if not (user_id in data[chat_id]["users"]): data[chat_id]["users"].update({ user_id: { "limit": None, "score": 0, "first_name": message.from_user.first_name, "last_name": message.from_user.last_name, "id": user_id, "count": 1 } }) gdata.update(data) data = gdata.load() if not ("spoilers" in data): data.update({"spoilers": {}}) gdata.update(data) data = gdata.load() data["spoilers"].update({"sp" + chat_id + message_id: text}) gdata.update(data) markup = telebot.types.InlineKeyboardMarkup() btn1 = telebot.types.InlineKeyboardButton("Показать", callback_data="sp" + chat_id + message_id) markup.row(btn1) if message.reply_to_message is not None: bot.reply_to( message.reply_to_message, f"{message.from_user.first_name}: Спойлер '{name}'", reply_markup=markup) else: bot.send_message( chat_id, f"{message.from_user.first_name}: Спойлер '{name}'", reply_markup=markup) bot.delete_message(message.chat.id, message.message_id)
def on_settings(message): chat_id = str(message.chat.id) user_id = str(message.from_user.id) data = gdata.load() if not (chat_id in data): data.update({ chat_id: { "users": {}, "mode": 1, "value": 0.85, "can_del": True } }) gdata.update(data) data = gdata.load() if not (user_id in data[chat_id]["users"]): data[chat_id]["users"].update({ user_id: { "limit": None, "score": 0, "first_name": message.from_user.first_name, "last_name": message.from_user.last_name, "id": user_id, "count": 1 } }) gdata.update(data) admins = [ str(member.user.id) for member in bot.get_chat_administrators(chat_id) ] if user_id in admins: markup = telebot.types.InlineKeyboardMarkup() btn1 = telebot.types.InlineKeyboardButton( f"Все" if data[chat_id]["can_del"] else f"Только админы", callback_data="ch_c_all") btn2 = telebot.types.InlineKeyboardButton("Режим", callback_data="ch_r") btn3 = telebot.types.InlineKeyboardButton("Чувствительность", callback_data="h_c") markup.row(btn1) markup.row(btn2) markup.row(btn3) bot.reply_to( message, "*Настройки бота:*\n\n_Кто может удалять токсичные сообщения?_", reply_markup=markup, parse_mode="Markdown")
def echo(message): dictt = gdata.load() chatid = str( message.chat.id) # вынесение id чата в отдельную переменную if not (chatid in dictt): dictt.update({ chatid: [False, False, None, None, False, 999999999999999] }) # занесение группы в базу бота если ее там нет if dictt[chatid][0]: bot.delete_message( message.chat.id, message.message_id ) # удаление сообщения если идет комендантский час else: if not (dictt[chatid][0]): if dictt[chatid][1] or dictt[chatid][4]: markup = telebot.types.InlineKeyboardMarkup( ) # инициализация markup'а для создания inline кнопок if not (dictt[chatid][4]): btn = telebot.types.InlineKeyboardButton( "Показать", url="t.me/c/" + str(chatid[4:]) + "/" + str(dictt[chatid][2]) ) # создание кнопки и указание url сообщения с голосованием markup.row( btn ) # расстановка копок по рядам для вывода. В данном случае одной кнопки в единственный ряд. bot.reply_to( message, "❌*Голосование на начало комендантского часа уже создано!*❌", reply_markup=markup, parse_mode="Markdown") else: bot.reply_to(message, "🔒*Комендантский час начнется в* `" + str(dictt[chatid][3][0]) + "`.🔒", parse_mode="Markdown") else: msg = bot.reply_to( message, "*Введите время начала и конца комендантского часа.*🕐\nФормат:\n`HH:MM DD.MM.YYYY` - `HH:MM DD.MM.YYYY`", parse_mode="Markdown") bot.register_next_step_handler( msg, add_date ) # вылов ответного сообщения пользователя. Указывается сообщение, на которое надо ответить и функция, исполняемая при ответе gdata.update(dictt)
def on_top(message): chat_id = str(message.chat.id) user_id = str(message.from_user.id) data = gdata.load() if not (chat_id in data): data.update({ chat_id: { "users": {}, "mode": 1, "value": 0.85, "can_del": True } }) gdata.update(data) data = gdata.load() if not (user_id in data[chat_id]["users"]): data[chat_id]["users"].update({ user_id: { "limit": None, "score": 0, "first_name": message.from_user.first_name, "last_name": message.from_user.last_name, "id": user_id, "count": 1 } }) gdata.update(data) data = gdata.load() string = "*Адекватность*\n\n" users = [data[chat_id]["users"][i] for i in data[chat_id]["users"]] users = sorted(users, key=lambda user: user["score"] // data[chat_id]['users'] [str(user['id'])]['count']) # users.reverse() medals = ["🥇", "🥈", "🥉"] for i in range(len(users)): if i < 3: string += medals[i] + " " user = users[i] user_last_name = user["last_name"] if user[ "last_name"] is not None else "" string += f"_{user['first_name']} {user_last_name}_ - `{20 - (data[chat_id]['users'][str(user['id'])]['score'] // data[chat_id]['users'][str(user['id'])]['count'])}` 🍬\n" bot.reply_to(message, string, parse_mode="Markdown")
def back(query): try: chat_id = str(query.message.chat.id) user_id = str(query.from_user.id) admin_id = str(query.message.reply_to_message.from_user.id) admins = [ str(member.user.id) for member in bot.get_chat_administrators(chat_id) ] data = gdata.load() if user_id == admin_id: gdata.update(data) markup = telebot.types.InlineKeyboardMarkup() btn1 = telebot.types.InlineKeyboardButton( f"Все" if data[chat_id]["can_del"] else f"Только админы", callback_data="ch_c_all") btn2 = telebot.types.InlineKeyboardButton("Режим", callback_data="ch_r") btn3 = telebot.types.InlineKeyboardButton("Чувствительность", callback_data="h_c") markup.row(btn1) markup.row(btn2) markup.row(btn3) bot.edit_message_text( chat_id=chat_id, message_id=query.message.message_id, text= "*Настройки бота:*\n\n_Кто может удалять токсичные сообщения?_", parse_mode="Markdown") bot.edit_message_reply_markup( chat_id=chat_id, message_id=query.message.message_id, reply_markup=markup) else: bot.answer_callback_query(query.id, "Эту панель настроек вызвали не вы", show_alert=True) except AttributeError: bot.answer_callback_query(query.id, "Сообщение вызова удалено", show_alert=True)
def on_settings(message): try: chat_id = str(message.chat.id) user_id = str(message.from_user.id) data = gdata.load() if not (chat_id in data): data.update({ chat_id: { "users": {}, "mode": 1, "value": 0.85, "can_del": True } }) gdata.update(data) data = gdata.load() if not (user_id in data[chat_id]["users"]): data[chat_id]["users"].update({ user_id: { "limit": None, "score": 0, "first_name": message.from_user.first_name, "last_name": message.from_user.last_name, "id": user_id, "count": 1 } }) gdata.update(data) data = gdata.load() buser_id = str(message.reply_to_message.from_user.id) admins = [ str(member.user.id) for member in bot.get_chat_administrators(chat_id) ] flag = False if message.text[6:20] == "@saynotoxicbot": limit = float(message.text[21:]) else: limit = float(message.text[7:]) # /limit@saynotoxicbot 0.01 if len(message.text) < 8 or limit > 1 or limit < 0 or not ( user_id in admins) or buser_id in [ '1442103439', '777000', '1087968824' ] or flag: bot.reply_to(message, "⛔️") else: if limit == 0: limit = None data[chat_id]["users"][buser_id]["limit"] = limit gdata.update(data) bot.reply_to( message.reply_to_message, "Новый лимит пользователя - " + (str(limit) if limit != None else "по умолчанию")) except: bot.reply_to(message, "⛔️")
def check_send_messages(): while True: dictt = gdata.load() # считывание данных с файла "data.json" for i in dictt: # проход по всем группам в базе бота try: # начальная точка для ловли TypeError ошибки, во избежания неладок с NoneType if time.time() - dictt[i][ 5] >= WAIT_TIME: # проверка прошедшего времени с начала голосования poll = bot.stop_poll( i, dictt[i][2] ) # остановка голосования если прошло необходимое время dictt[i][5] = 9999999999999 # сброс таймера голосования if dictt[i][1] and not (dictt[i][4]): # выгрузка результатов голосования: options = poll.options yes_votes_count = options[0].voter_count no_votes_count = options[1].voter_count # -------------------------------- if yes_votes_count > no_votes_count: dictt[i][4] = True bot.send_message( i, "✔️*Голосование закончено.*✔️\n✅Комендантский час начнется в `" + str(dictt[i][3][0]) + "` и закончится в `" + str(dictt[i][3][1]) + "`.✅", reply_to_message_id=dictt[i][2], parse_mode="Markdown") dictt[i][1] = True else: bot.send_message( i, "✔️*Голосование закончено.*✔️\n❌Комендантский час _не будет начат_❌", reply_to_message_id=dictt[i][2], parse_mode="Markdown") # сброс контрольных данных голосования: dictt[i][3] = None dictt[i][1] = False # ------------------------------------ dictt[i][ 2] = None # сброс контрольных данных голосования gdata.update(dictt) # загрузка данных в "data.json" dictt = gdata.load() if dictt[i][4]: # загрузка времени и перевод в обьект класса datetime.datetime: start_time_RAW = dictt[i][3][0] start_time = datetime.strptime(start_time_RAW, timeStamp) # ------------------------------------------------------------ if nowtime() >= start_time: dictt[i][0] = True dictt[i][1] = False dictt[i][4] = None bot.send_message( i, "⛔️*Комендантский час начат!*⛔️\n🔜Он продлится до `" + str(dictt[i][3][1]) + "`.", parse_mode="Markdown") gdata.update(dictt) if dictt[i][0]: end_time_RAW = dictt[i][3][1] end_time = datetime.strptime(end_time_RAW, timeStamp) if nowtime() >= end_time: dictt[i][0] = False dictt[i][1] = False dictt[i][2] = None dictt[i][3] = None dictt[i][4] = False bot.send_message( i, "*Комендантский час окончен!*\n 🔙 🔙 🔙 🔙 🔙 🔙", parse_mode="Markdown") gdata.update(dictt) except TypeError: # Вылов TypeError в случае если контрольные данные еще не успели обновиться pass time.sleep(10) # Задержка процесса для уменьшения загруженности
def reply_message(message): chat_id = str(message.chat.id) user_id = str(message.from_user.id) if user_id not in ['1442103439', '777000', '1087968824']: data = gdata.load() if not (chat_id in data): data.update({ chat_id: { "users": {}, "mode": 1, "value": 0.85, "can_del": True } }) gdata.update(data) data = gdata.load() if not (user_id in data[chat_id]["users"]): data[chat_id]["users"].update({ user_id: { "limit": None, "score": 0, "first_name": message.from_user.first_name, "last_name": message.from_user.last_name, "id": user_id, "count": 1 } }) data[chat_id]["users"][user_id]["count"] += 1 gdata.update(data) if message.text: text = message.text elif message.caption: text = message.caption else: text = None if text is not None: text = transliterate(text) try: toxicity = get_toxicity(text) if toxicity is None: raise Exception except Exception as e: print(e) toxicity = 0 data = gdata.load() print(text, toxicity) try: print(data[chat_id]["users"][user_id]["limit"]) data[chat_id]["users"][user_id]["score"] += floor(toxicity * 100) if toxicity > (data[chat_id]["users"][user_id]["limit"] if data[chat_id]["users"][user_id]["limit"] is not None else data[chat_id]["value"]): if data[chat_id]["mode"] == 2: bot.delete_message(chat_id, message.message_id) elif data[chat_id]["mode"] == 1: markup = telebot.types.InlineKeyboardMarkup() btn = telebot.types.InlineKeyboardButton( "Delete", callback_data=f"del{str(message.message_id)}") markup.row(btn) bot.reply_to(message, f"Toxic alert", parse_mode="Markdown", reply_markup=markup) gdata.update(data) except TypeError as e: print(e) pass