Ejemplo n.º 1
0
def cmd_core_stat(message):
    try:
        if is_private(message) or not sender_is_admin(message.chat.id,
                                                      message.from_user.id):
            return None
        typing(message)

        karma_objects = Karma.objects(chat=message.chat.id)
        transactions = 0
        users = []
        canceled = 0
        canceled_amount = 0
        amount = 0

        for karma in karma_objects:
            transactions += 1
            amount += karma.amount
            if karma.to_user not in users:
                users.append(karma.to_user)
            if karma.from_user not in users:
                users.append(karma.from_user)
            if karma.rollback:
                canceled += 1
                canceled_amount += karma.amount

        bot.reply_to(
            message, 'Транзакций: {} (отменено: {}, активно: {})\n'
            'Пользователей: {}\n'
            'Карма в чате: {} (отменено {}, активно {})\n'.format(
                transactions, canceled, transactions - canceled, len(users),
                amount, canceled_amount, amount - canceled_amount))
    except:
        crash_message(message)
Ejemplo n.º 2
0
def cmd_admin_unsubscribe(message):
    if message.location == 'private':
        return None

    if AdminSubscribe.is_subscribed(message.chat.id, message.from_user.id):
        AdminSubscribe.unsubscribe(message.chat.id, message.chat.id)
        bot.reply_to(
            message,
            'Вы отписались от уведомлений об изменении кармы в этом чате.')
Ejemplo n.º 3
0
def cmd_help(message):
    text = [
        'Я - бот, который считает карму в чатах Telegram', '',
        'Список моих команд:', '/like - "Лайкнуть" сообщение',
        '/bad - "Дизлайкнуть" сообщение',
        '/stat - Отобразить статистику пользователя',
        '/messages - Статистика сообщений в диалоге',
        '/top - Топ пользователей по карме',
        '/subscribe - Подписаться на обновления об изменениях кармы',
        '/unsubscribe - Отписаться от обновлений об изменении кармы', '',
        'Так же для изменения кармы можно использовать символы "++" и "--" а так же смайлы "🍪, 💩, 👍🏻, 👎🏻"',
        'Бем больше повтора символов в сообщении, тем на большую сумму будут изменена карма!'
    ]
    bot.reply_to(message, '\n'.join(text))
Ejemplo n.º 4
0
def cmd_statistic(message):
    try:
        typing(message)
        if bool(message.reply_to_message):
            user = message.reply_to_message.from_user
        else:
            user = message.from_user
        karma = get_cached_user_karma(user.id, message.chat.id)

        # TODO: translate
        bot.reply_to(
            message, 'Статистика пользователя {user}:\nКарма: {karma}'.format(
                user=get_username_or_name(user), karma=karma))
    except:
        crash_message(message)
Ejemplo n.º 5
0
def cmd_fix_messages(message):
    """
    Add field 'is_command' to Messages document.
    :param message:
    :return:
    """
    try:
        if not message.from_user.id == ROOT_UID:
            return

        messages = Messages.objects.all()
        messages.update(set__is_command=False)
        log.info('Fixed {} messages.'.format(len(messages)))
        bot.reply_to(message, 'Fixed {} messages.'.format(len(messages)))
    except:
        crash_message(message)
Ejemplo n.º 6
0
def cmd_admin_subscribe(message):
    if message.location == 'private':
        return None

    if not sender_is_admin(message.chat.id, message.from_user.id):
        return None

    if AdminSubscribe.is_subscribed(message.chat.id, message.from_user.id):
        return bot.reply_to(
            message,
            'Вы уже подписаны на уведомления об обновлениях кармы в этом диалоге'
        )

    AdminSubscribe.subscribe(message.chat.id, message.from_user.id)
    bot.reply_to(
        message,
        'Вы подписались на уведомления об изменениях кармы в этом диалоге')
Ejemplo n.º 7
0
def cmd_unsubscribe(message):
    try:
        user_objects = Dialogs.objects(index=message.from_user.id)
        if len(user_objects) > 0:
            user = user_objects[0]
        else:
            user = Dialogs(index=message.from_user.id)
            user.save()
        if user.subscribe:
            user.subscribe = False
            user.save()
            bot.reply_to(message,
                         'Вы отписались от уведомлений об изменении кармы.')
        else:
            bot.reply_to(message,
                         'Вы не подписаны на уведомления об изменении кармы.')
    except:
        crash_message(message)
Ejemplo n.º 8
0
def cmd_reset_chat(message):
    try:
        typing(message)
        if is_private(message) or not sender_is_admin(message.chat.id,
                                                      message.from_user.id):
            return None

        reset = reset_chat_karma(message.chat)
        if reset:
            bot.reply_to(
                message,
                get_num_ending(
                    reset,
                    ('Отменена {} транзакция.', 'Отменено {} транзакции.',
                     'Отменено {} транзакций.')).format(reset))
        else:
            bot.reply_to(message, 'Нечего отменять.')
    except:
        crash_message(message)
Ejemplo n.º 9
0
def cmd_subscribe(message):
    try:
        user_objects = Dialogs.objects(index=message.from_user.id)
        if len(user_objects) > 0:
            user = user_objects[0]
        else:
            user = Dialogs(index=message.from_user.id)

        if not user.subscribe:
            user.subscribe = True
            user.save()
            try:
                bot.send_message(
                    message.from_user.id,
                    'Теперь Вам будут приходить уведомления об изменении кармы.'
                )
                if message.location != 'private':
                    bot.reply_to(
                        message,
                        'Теперь Вам будут приходить уведомления об изменении кармы.'
                    )
            except:
                bot.reply_to(message, 'Сначала напиши мне в ЛС.')
        else:
            bot.reply_to(
                message, 'Вы уже подписаны на уведомления об изменении кармы.')
    except:
        crash_message(message)
Ejemplo n.º 10
0
def cmd_pay(message):
    try:
        typing(message)
        if message.chat.type == 'private':
            return bot.reply_to(message, 'Доступно только в груповых диалогах')

        if not bool(
                message.reply_to_message
        ) or message.reply_to_message.from_user.id == message.from_user.id:
            return bot.reply_to(message, 'Нельзя переводить карму себе же.')

        amount_pos = 0
        for messageEntity in message.entities:
            if messageEntity.type == 'bot_command':
                amount_pos = messageEntity.offset + messageEntity.length
                break
        amount = message.text[amount_pos:].strip()

        if not amount.isdigit():
            return bot.reply_to(message, 'Не верная сумма перевода')

        amount = abs(int(amount))

        if amount == 0:
            return bot.reply_to(message,
                                'Сумма перевода должна біть больше нуля')

        from_user_karma = get_cached_user_karma(message.from_user.id,
                                                message.chat.id)

        if amount > from_user_karma:
            return bot.reply_to(
                message, 'Нельзя переводить больше, чем карма отправителя.')

        karma_transaction(message.chat, message.from_user,
                          message.reply_to_message.from_user, amount,
                          'transfer')
    except:
        crash_message(message)
Ejemplo n.º 11
0
def cmd_admin_pay(message):
    try:
        if is_private(message) or not sender_is_admin(message.chat.id,
                                                      message.from_user.id):
            return None

        if not bool(message.reply_to_message):
            return None

        typing(message)

        amount_pos = 0
        for messageEntity in message.entities:
            if messageEntity.type == 'bot_command':
                amount_pos = messageEntity.offset + messageEntity.length
                break
        amount = message.text[amount_pos:].strip()

        if amount.startswith('-'):
            minus = True
            amount = amount.replace('-', '')
        else:
            minus = False

        if not amount.isdigit():
            return bot.reply_to(message, 'Не верная сумма перевода')

        amount = -int(amount) if minus else int(amount)

        karma_transaction(message.chat,
                          message.from_user,
                          message.reply_to_message.from_user,
                          amount,
                          'admin transfer',
                          transfer=False)
    except:
        crash_message(message)
Ejemplo n.º 12
0
def cmd_ahelp(message):
    text = [
        '',
    ]
    bot.reply_to(message, '\n'.join(text))
Ejemplo n.º 13
0
def vote_message(message, description='', amount=1):
    # TODO: anti spam
    if bool(
            message.reply_to_message
    ) and message.reply_to_message.from_user.id != message.from_user.id:
        user_cache = get_cached_user_chat(message.from_user.id,
                                          message.chat.id)
        last_message = user_cache.get('last_message', 0)
        timeout = user_cache.get('karma_change_timeout', ANTI_FLOOD_TIMEOUT)
        warn_count = user_cache.get('karma_change_warn', 0) + 1
        update_cached_user(
            message.from_user.id, message.chat.id, {
                'last_message':
                time.time(),
                'karma_change_timeout':
                time.time() - last_message + ANTI_FLOOD_TIMEOUT * warn_count,
                'karma_change_warn':
                warn_count
            })
        if time.time() - last_message < timeout:
            log.warning(
                '#flood {user} (<code>{user_id}</code>) is flooding <b>x{count}</b>!\n'
                'Chat "{chat}" (<code>{chat_id}</code>)\n'
                'Set timeout: {timeout:.1f}'.format(
                    user=get_username_or_name(message.from_user),
                    user_id=message.from_user.id,
                    count=warn_count,
                    chat=message.chat.title,
                    chat_id=message.chat.id,
                    timeout=get_cached_user_chat(message.from_user.id,
                                                 message.chat.id).get(
                                                     'karma_change_timeout',
                                                     ANTI_FLOOD_TIMEOUT)))
            return bot.reply_to(
                message,
                _('anti spam karma {timeout:.0f}s').format(
                    timeout=timeout - (time.time() - last_message)))
        update_cached_user(message.from_user.id, message.chat.id, {
            'karma_change_timeout': ANTI_FLOOD_TIMEOUT,
            'karma_change_warn': 0
        })

        karma_transaction(message.chat,
                          message.from_user,
                          message.reply_to_message.from_user,
                          amount=amount,
                          description=bool_to_str(amount > 0, 'good message',
                                                  'bad message'),
                          transfer=False)
        user = get_dialog_object(message.reply_to_message.from_user.id)

        if user.subscribe:
            try:
                if amount > 0:
                    text = _('{user} thanked you chatting {chat}',
                             locale=user.locale)
                elif amount < 0:
                    text = _(
                        '{user} did not like your message in the chat {chat}',
                        locale=user.locale)
                else:
                    text = _(
                        'User {user} is indifferent to your message in the chat {chat}',
                        locale=user.locale)

                if len(description):
                    text += '\n' + _('Comment: {text}')
                bot.send_message(
                    message.reply_to_message.from_user.id,
                    text.format(user=get_username_or_name(message.from_user),
                                chat=get_chat_url_or_title(message),
                                text=description),
                    disable_web_page_preview=True,
                    parse_mode='markdown')
                bot.forward_message(message.reply_to_message.from_user.id,
                                    message.chat.id,
                                    message.reply_to_message.message_id,
                                    disable_notification=True)
            except:
                pass
Ejemplo n.º 14
0
def cant_send_private(message, locale=None):
    bot.reply_to(message, _('can not sent private message', locale=locale))