Example #1
0
 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)
Example #2
0
    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)
Example #3
0
    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, "⛔️")
Example #4
0
    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")
Example #5
0
 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")  # Вывод ошибки пользователю
Example #6
0
 def delete_mess(message):
     chatid = str(message.chat.id)
     dictt = gdata.load()
     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)
Example #7
0
    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)
Example #8
0
    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")
Example #9
0
    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)
Example #10
0
 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)
Example #11
0
    def ch_r(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:
                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)
Example #12
0
 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)
Example #13
0
 def to_query(query):
     try:
         data = gdata.load()
         user_id = str(query.from_user.id)
         chat_id = str(query.message.chat.id)
         admins = [
             str(member.user.id)
             for member in bot.get_chat_administrators(chat_id)
         ]
         # print(user_id, admins)
         if user_id in admins or data[chat_id]["can_del"]:
             m_id = query.data[3:]
             bot.delete_message(query.message.chat.id, m_id)
             bot.delete_message(query.message.chat.id,
                                query.message.message_id)
         else:
             bot.answer_callback_query(query.id,
                                       "Вы не админ",
                                       show_alert=True)
     except:
         bot.answer_callback_query(query.id,
                                   "Сообщение вызова удалено",
                                   show_alert=True)
Example #14
0
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)  # Задержка процесса для уменьшения загруженности
Example #15
0
 def to_spoiler(query):
     data = gdata.load()
     bot.answer_callback_query(query.id,
                               data["spoilers"][query.data],
                               show_alert=True)
Example #16
0
    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