def change_karma(user, chat, result): """ Функция для изменения значения кармы пользователя :param user: пользователь, которому нужно изменить карму :param chat: чат, в котором находится пользователь :param result: на сколько нужно изменить карму """ selected_user = KarmaUser.select().where((KarmaUser.chatid == chat.id) & (KarmaUser.userid == user.id)) if not selected_user: insert_user(user, chat) # 'user_name' состоит из имени и фамилии. Но разные пользователь по разному # подходят к заполнению этих полей и могут не указать имя или фамилию. # А если имя или фамилия отсутствуют, то обращение к ним # возвращает 'None', а не пустую строку. С 'user_nick' та же ситуация. user_name = (user.first_name or "") + " " + (user.last_name or "") user_nick = user.username or "" main_log.info(f"Updating karma for user with name: {user_name} and " + f"id:{user.id}, and in chat:{chat.title or ''} and " + f"id:{chat.id}. Karma changed at result") update_user = KarmaUser.update( karma=(KarmaUser.karma + result), user_name=user_name, user_nick=user_nick).where((KarmaUser.userid == user.id) & (KarmaUser.chatid == chat.id)) update_user.execute()
def insert_user(user, chat): """ Функция для добавления нового пользователя :param user: данные добавляемого пользователя :param chat: чат, в котором находится пользователь TODO Хотелось бы избавиться от этой функции """ # 'user_name' состоит из имени и фамилии. Но разные пользователь по разному # подходят к заполнению этих полей и могут не указать имя или фамилию. # А если имя или фамилия отсутствуют, то обращение к ним # возвращает 'None', а не пустую строку. С 'user_nick' та же ситуация. user_name = (user.first_name or "") + " " + (user.last_name or "") user_nick = user.username or "" main_log.info(f"Inserting new user with name: {user_name} and " f"id:{user.id}, and in chat:{chat.title or ''} and " f"id:{chat.id}") new_user = KarmaUser.create(userid=user.id, chatid=chat.id, karma=0, user_name=user_name, user_nick=user_nick, is_freezed=False) new_user.save()
def is_karma_freezed(msg): """ Функция для проверки индивидуальной блокировки кармы. :param msg: Объект собщения, из которого берутся id чата и пользователей :return: True если у кого-то из учасников заморожена карма. Иначе False. """ # Выборка пользователей, связаных с сообщением. banned_request = KarmaUser.select().where( (KarmaUser.chatid == msg.chat.id) & ((KarmaUser.userid == msg.from_user.id) | (KarmaUser.userid == msg.reply_to_message.from_user.id))) # У выбраных пользователей проверяется статус заморозки for req in banned_request: if req.is_freezed: name = "" if not req.user_name.isspace(): name = req.user_name.strip() else: name = req.user_nick.strip() # Сообщение, у кого именно заморожена карма reply_text = f"Юзер: {name}.\nСтатус кармы: Заморожена." bot.send_message(msg.chat.id, reply_text) return True return False
def reputation(msg, text): """ TODO """ # Если сообщение большое, то прервать выполнение функции if len(text) > 100: return # Если карму не пытаются изменить, то прервать выполнение функции how_much_changed = is_karma_changing(text) if not how_much_changed: return # При попытке поднять карму самому себе прервать выполнение функции if msg.from_user.id == msg.reply_to_message.from_user.id: bot.send_message(msg.chat.id, "Нельзя изменять карму самому себе.") return # Ограничение на изменение кармы для пользователя во временной промежуток if is_karma_abuse(msg): return if is_karma_freezed(msg): return bot.send_chat_action(msg.chat.id, "typing") # Если значение кармы все же можно изменить: изменяем result = sum(how_much_changed) if result != 0: Limitation.create(timer=pw.SQL("current_timestamp"), userid=msg.from_user.id, chatid=msg.chat.id) change_karma(msg.reply_to_message.from_user, msg.chat, result) if result > 0: res = "повышена" elif result < 0: res = "понижена" else: res = "не изменена" user = KarmaUser.select().where( (KarmaUser.userid == msg.reply_to_message.from_user.id) & (KarmaUser.chatid == msg.chat.id)).get() if not user.user_name.isspace(): name = user.user_name.strip() else: name = user.user_nick.strip() now_karma = f"Карма {res}.\nТекущая карма для {name}: <b>{user.karma}</b>." bot.send_message(msg.chat.id, now_karma, parse_mode="HTML")
def select_user(user, chat): """ Функция для извлечения данных о пользователе :param user: пользователь, данные которого необходимы :param chat: чат, в котором находится пользователь TODO Хотелось бы избавиться от этой функции """ main_log.info(f"Select user with id:{user.id} and chat:{chat.id}") selected_user = KarmaUser.select().where( (KarmaUser.userid == user.id) & (KarmaUser.chatid == chat.id)).get() return selected_user
def freeze_me(msg): """ Функция, которая используется для заморозки значения кармы. Заморозка происходит для пользователя, вызвавшего функцию. Заморозка означает отключение возможности смены кармы для пользователя, и запрет на смену кармы другим пользователям :param msg: Объект сообщения-команды """ user = select_user(msg.from_user, msg.chat) freeze = True if msg.text[1:9] == "freezeme" else False result = "" if not user: insert_user(msg.from_user, msg.chat) user = select_user(msg.from_user, msg.chat) if user.is_freezed != freeze: result += "Статус изменен. " KarmaUser.update(is_freezed=(not user.is_freezed)).where( (KarmaUser.userid == msg.from_user.id) & (KarmaUser.chatid == msg.chat.id)).execute() result += f"Текущий статус: карма {'за' if freeze else 'раз'}морожена." bot.reply_to(msg, result)
def top_bad(msg): """ Функция которая выводит список пользователей с найменьшим значением кармы :param msg: Объект сообщения-команды """ selected_user = KarmaUser.select() \ .where((KarmaUser.karma < 0) & (KarmaUser.chatid == msg.chat.id)) \ .order_by(KarmaUser.karma.asc()) \ .limit(10) top_mess = "Топ ругаемых:\n" for i, user in enumerate(selected_user): if user.user_name: name = user.user_name.strip() else: name = user.user_nick.strip() top_mess += f"*{i+1}*. {name}, ({user.karma} раз)\n" if not selected_user: top_mess = "Никто еще не заслужил быть в этом списке." bot.send_message(msg.chat.id, top_mess, parse_mode="Markdown")