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)
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, 'Вы отписались от уведомлений об изменении кармы в этом чате.')
def cmd_help(message): text = [ 'Я - бот, который считает карму в чатах Telegram', '', 'Список моих команд:', '/like - "Лайкнуть" сообщение', '/bad - "Дизлайкнуть" сообщение', '/stat - Отобразить статистику пользователя', '/messages - Статистика сообщений в диалоге', '/top - Топ пользователей по карме', '/subscribe - Подписаться на обновления об изменениях кармы', '/unsubscribe - Отписаться от обновлений об изменении кармы', '', 'Так же для изменения кармы можно использовать символы "++" и "--" а так же смайлы "🍪, 💩, 👍🏻, 👎🏻"', 'Бем больше повтора символов в сообщении, тем на большую сумму будут изменена карма!' ] bot.reply_to(message, '\n'.join(text))
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)
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)
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, 'Вы подписались на уведомления об изменениях кармы в этом диалоге')
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)
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)
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)
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)
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)
def cmd_ahelp(message): text = [ '', ] bot.reply_to(message, '\n'.join(text))
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
def cant_send_private(message, locale=None): bot.reply_to(message, _('can not sent private message', locale=locale))