Exemplo n.º 1
0
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()
Exemplo n.º 2
0
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()
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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")
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
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")