def admins(message):
    """@-mention all admins"""
    database = Database()
    chat = database.get('chats', ('id', message.chat.id))
    system = chat['system']
    chat_config = get_system_configs(system)
    boss = chat_config['commands']['boss']
    ranks = chat_config['ranks']
    admins_username = []
    if isinstance(boss, list):
        all_ranks = ranks[ranks.index(boss[0]):ranks.index(boss[1]) + 1]
        for rank in all_ranks:
            admins_username += [
                '@' + x['username']
                for x in database.get_many('members', ('rank',
                                                       rank), ('system',
                                                               system))
            ]
    elif isinstance(boss, str):
        admins_id = [
            admin['id']
            for admin in database.get_many('appointments', ('appointment',
                                                            boss))
        ]
        admins_username = [
            '@' + database.get('members', ('id', admin),
                               ('system', system))['username']
            for admin in admins_id
        ]
    reply(message, 'Вызываю сюда админов: ' + ', '.join(admins_username))
Beispiel #2
0
def send_short_top(message, language, format_string, start='', sort_key=lambda x: True):
    """Send a short version of a top for non-admins"""
    database = Database()
    # Declaring variables
    system = database.get('chats', ('id', message.chat.id))['system']
    formating_dict = {'m_emo': get_system_configs(system)['money_emoji'],
                      'bot_money': database.get('systems', ('id', system))['money']}
    text = start.format(**formating_dict)
    members = database.get_many('members', ('system', system))
    members = list(filter(lambda x: sort_key(x) != 0, members))
    members.sort(key=sort_key, reverse=True)
    person_index = 0
    for person_index in range(1, len(members) + 1):
        if members[person_index - 1]['id'] == message.from_user.id:
            break
    # Main loop
    for index in range(1, len(members) + 1):
        member = members[index - 1]
        p_link = link_text_wrapper(html_cleaner(member["nickname"]), f't.me/{member["username"]}')
        formating_dict.update(member)
        formating_dict.update({'index': index, 'p_link': p_link, 'day': member['day_birthday']})
        if '{month}' in format_string:
            formating_dict['month'] = MONTHS_GENITIVE[member['month_birthday'] - 1][language]
        if index <= 5 or abs(index - person_index) <= 2:
            text += format_string.format(**formating_dict)
        elif '.\n.\n.\n' not in text and person_index >= 9:
            text += '.\n.\n.\n'
    if text:
        send(message.chat.id, text, parse_mode='HTML')
    else:
        reply(message, "Ничего нет!")
Beispiel #3
0
def anon_message(message):
    """Send an anonymous message to an admin place"""
    database = Database(to_log=False)
    systems = [x['system'] for x in database.get_many('members', ('id', message.from_user.id))]
    system = None
    system_specification_length = 0
    if len(systems) == 1:
        system = systems[0]
    elif message.text.split()[1].isdecimal():
        system = message.text.split()[1]
        system_specification_length += len(system) + 1
    else:
        data = get_systems_json()
        text = "Вижу вы сидите в нескольких чатах. " \
               "Чтобы уточнить, в какой админосостав отправлять сообщение, " \
               "оформите вашу команду так:\n\n/anon <номер системы> <ваше послание>.\n\n " \
               "Вот список систем:\n"
        names = [f"{sys} — {data[sys]['name']}" for sys in systems]
        reply(message, text + '\n'.join(names))
    if system:
        system_entry = database.get('systems', ('id', system))
        if system_entry:
            if system_entry['admin_place']:
                anon_message_text = ' '.join(message.text.split()[1:])
                sent = send(system_entry['admin_place'],
                            "#anon\n\n" + anon_message_text[system_specification_length:])
                if sent:
                    reply(message, "Сообщение успешно отправлено. Спасибо за ваше мнение!")
                else:
                    reply(message, "Произошла ошибка!")
            else:
                reply(message, "У этой системы админосостав не отмечен")
        else:
            reply(message, "Этой системы не существует!")
Beispiel #4
0
def send_me(message, person):
    """Присылает человеку его запись в БД"""
    LOG.log(str(message.from_user.id) + ": send_me invoked")
    database = Database()
    system = database.get('chats', ('id', message.chat.id))['system']
    chat_config = get_system_configs(system)
    money_name = chat_config['money_name']
    money_name_word = get_word_object(money_name, 'ru')
    member_update(system, person)  # Update person's messages, nickname and username
    person_entry = get_person(message, person, system, database, system_configs=chat_config)
    appointments = [x['appointment'] for x in
                    database.get_many('appointments', ('id', person.id), ('system', system))]
    messages_here = 0
    if database.get('messages', ('person_id', person.id), ('chat_id', message.chat.id)):
        messages_here = database.get('messages', ('person_id', person.id),
                                     ('chat_id', message.chat.id))['messages']
    msg = 'ID: {}\n'.format(person_entry['id'])
    msg += 'Юзернейм: {}\n'.format(person_entry['username'])
    msg += 'Никнейм: {}\n'.format(person_entry['nickname'])
    msg += 'Ранг: {}\n'.format(person_entry['rank'])
    msg += 'Кол-во сообщений в этом чате: {}\n'.format(messages_here)
    if person_entry['messages']:
        msg += 'Кол-во сообщений во всей системе: {}\n'.format(person_entry['messages'])
    msg += 'Кол-во предупреждений: {}\n'.format(person_entry['warns'])
    if chat_config['money']:
        msg += 'Кол-во {}: {}\n'.format(money_name_word.genitive_plural(),
                                        person_entry['money'])
    if appointments:
        msg += 'Должности: ' + ', '.join(appointments)
    reply(message, msg)
Beispiel #5
0
def unban_user(person):
    """Remove ban from user"""
    database = Database()
    chats_to_unban = database.get_many('chats', ('violators_ban', 2))
    for chat in chats_to_unban:
        member = get_member(chat['id'], person.id)
        if member and member.status in ('left', 'kicked'):
            unban(chat['id'], person.id)
Beispiel #6
0
def update_all_members(message):
    """Updates all the messages, usernames and nicknames"""
    sent = reply(message, "Начинаю обновление...")
    database = Database(to_log=False)
    chat = database.get('chats', ('id', message.chat.id))
    system = chat['system']
    members = list(database.get_many('members', ('system', system)))
    system_update = SystemUpdate(message.chat.id, system, members, sent)
    system_update.start()
Beispiel #7
0
def chats(message):
    """Get list of chats"""
    database = Database()
    chats_list = database.get_many('chats', ('type', 'public'))

    # Получаем имена и ссылки нужных нам чатиков
    chats_names = [chat['name'] for chat in chats_list]
    chats_links = ['@' + chat['link'] for chat in chats_list]

    # Генерируем текст для отображение имен и ссылок вместе
    text = '\n'.join([f'{key}: {value}' for key, value in zip(chats_names, chats_links)])
    reply(message, text)
Beispiel #8
0
def money_reset(message):
    """Take all users' money to a system fund"""
    database = Database()
    system = database.get('chats', ('id', message.chat.id))['system']
    system_money = database.get('systems', ('id', system))['money']
    members = database.get_many('members', ('system', system))

    # Get the amount of money of chat members
    members_money = sum([member['money'] for member in members])
    if system_money != 'inf':
        database.increase(members_money, 'money', 'systems', ('id', system))
    database.change(0, 'money', 'members', ('system', system))
    reply(message, "OK")
def send_some_top(message,
                  language,
                  format_string,
                  start='',
                  sort_key=lambda x: True):
    """Send a full version of a top for admins"""
    database = Database()
    # Declaring variables
    sent = False
    system = database.get('chats', ('id', message.chat.id))['system']
    formating_dict = {
        'm_emo': get_system_configs(system)['money_emoji'],
        'bot_money': database.get('systems', ('id', system))['money']
    }
    text = start.format(**formating_dict)
    members = database.get_many('members', ('system', system))
    members = list(filter(lambda x: sort_key(x) != 0, members))
    members.sort(key=sort_key, reverse=True)
    if len(members) > 50:
        target_chat = message.from_user.id
    else:
        target_chat = message.chat.id
    # Main loop
    for index in range(1, len(members) + 1):
        member = members[index - 1]
        p_link = link_text_wrapper(html_cleaner(member["nickname"]),
                                   f't.me/{member["username"]}')
        formating_dict.update(member)
        formating_dict.update({
            'index': index,
            'p_link': p_link,
            'day': member['day_birthday']
        })
        if '{month}' in format_string:
            formating_dict['month'] = MONTHS_GENITIVE[member['month_birthday']
                                                      - 1][language]
        text += format_string.format(**formating_dict)
        if index % 50 == 0:
            sent = send(target_chat, text, parse_mode='HTML')
            text = ''
    sent = send(target_chat, text, parse_mode='HTML') or sent
    if len(members) > 50:
        if sent:
            reply(message, "Выслал инфу в личку")
        else:
            reply(message, "Сначала запусти меня в личных сообщениях")
    elif not sent:
        reply(message, "Ничего нет!")
Beispiel #10
0
def member_update(system, person):
    """Updates nickname, username and messages columns in database"""
    database = Database()
    chats_ids = [
        x['id'] for x in database.get_many('chats', ('messages_count',
                                                     2), ('system', system))
    ]
    msg_count = 0
    for chat_id in chats_ids:
        if feature_is_available(chat_id, system, 'messages_count'):
            msg_entry = database.get('messages', ('person_id', person.id),
                                     ('chat_id', chat_id))
            if msg_entry:
                msg_count += msg_entry['messages']
    database.change(person.username, 'username', 'members', ('id', person.id))
    database.change(person.first_name, 'nickname', 'members',
                    ('id', person.id))
    database.change(msg_count, 'messages', 'members', ('id', person.id),
                    ('system', system))
Beispiel #11
0
def money_mode_change(message):
    """Change the money mode in system. Infinite, finite or no money"""
    database = Database()

    mode = message.text.split()[0].split(sep='@')[0].split(sep='_')[-1]

    chat = database.get('chats', ('id', message.chat.id))
    system = chat['system']
    update_systems_json(system, mode == 'on', 'money')
    if mode == 'on':
        all_money = message.text.split()[-1]
        if all_money.isdecimal():
            all_money = int(all_money)
            people = list(database.get_many('members', ('system', system)))
            people = list(
                filter(lambda x: x['money'] != 0 and x['id'] != BOT_ID,
                       people))
            money = 0
            for person in people:
                money += person['money']
            all_money -= money
            if all_money < 0:
                reply(
                    message,
                    "Казна выходит отрицательная, ставлю бесконечную валюту")
                database.change('inf', 'money', 'systems', ('id', system))
            else:
                reply(
                    message,
                    f"В казне выходит {all_money} денег. Спасибо за сотрудничество!"
                )
                database.change(all_money, 'money', 'systems', ('id', system))
        else:
            database.change('inf', 'money', 'systems', ('id', system))
            reply(message, "Бесконечная валюта поставлена")
    else:
        reply(message, "Валюта выключена")
def helper(message):
    """Предоставляет человеку список команд"""
    LOG.log(str(message.from_user.id) + ": helper invoked")
    database = Database()
    answer = '<b>Команды:</b>\n\n'
    if message.chat.id < 0:  # Command is used in chat
        system = database.get('chats', ('id', message.chat.id))['system']
        answer += '<b>Общие команды:</b>\n' \
                  '/me - Присылает вашу запись в базе данных\n' \
                  '/anon - Прислать анонимное послание в админский чат (если таковой имеется)\n' \
                  '/members - Прислать в личку перечень участников (нынешних и бывших) и их ID\n' \
                  '/messages_top - Прислать в личку топ участников по сообщениям\n' \
                  '/warns - Посмотреть, у кого сколько предупреждений\n\n'
        # Helps
        answer += '<b>Помощь и менюшки:</b>\n'
        answer += '/help - Прислать это сообщение\n'\
                  '/money_help - Финансовый режим\n'\
                  '/chat - Показать настройки в чате\n'
        if len(database.get_many(
                'chats',
            ("system", system))) > 1:  # More than 1 chat in system
            answer += '/system - Показать настройки во всей системе (по умолчанию)\n'
        answer += '\n<b>Хранилище:</b>\n'\
                  '/storages - Посмотреть список хранилищ\n'\
                  '/get [хранилище] [номер] - Получать контент из хранилища,' \
                  'если номер не указан, будет прислан случайный контент из хранилища\n'\
                  '/size [хранилище] - Получить инфо о количестве контента и модеров хранилища\n\n'
        if feature_is_available(message.chat.id, system, 'standard_commands'):
            answer += '<b>Развлекательные команды:</b>\n'
            answer += '/minet - Делает приятно\n'
            answer += '/meme - Присылает мем\n'
            answer += '/shuffle [x] [элементы через пробел] - перемешать элементы. ' \
                      'Число x необязательно, но если указано, ' \
                      'то бот оставит только x первых элементов\n\n'
        if is_suitable(message, message.from_user, 'boss', loud=False):
            answer += '<b>Базовые админские команды:</b>\n'
            answer += '/update - Пересчитывает сообщения, ' \
                      'никнеймы и юзернеймы всех участников чата\n'
            answer += '/messages [число сообщений] - ' \
                      'Изменить количество сообщений от участника в этом чате\n'
            answer += '/warn [число варнов]- Дать варн(ы) (3 варна = бан)\n'
            answer += '/unwarn [число варнов]- Снять варн(ы)\n'
            answer += '/mute [количество часов] - Запретить писать в чат\n'
            answer += '/ban - Дать бан\n'
            answer += '/kick - Кикнуть (то есть чел сразу сможет вернуться)\n'
            answer += '/guest - Снять ограничения, забрать админку\n\n'
        if is_suitable(message, message.from_user, 'uber', loud=False):
            answer += '<b>Продвинутые админские команды:</b>\n'
            answer += '/admin - Снять ограничения, дать админку\n'
            answer += '/senior_admin - Снять бан, дать продвинутую админку\n\n'
        if is_suitable(message, message.from_user, 'chat_changer', loud=False):
            answer += '<b>Настройщики чатов:</b>\n'
            answer += '/add_chat [ID системы чатов] - Добавить чат в систему чатов\n' \
                      '/set_limit [x] - Поставить кулдаун на вход. Когда кто-то заходит, ' \
                      'следующие x секунд никто не сможет зайти\n'
            answer += '/admin_place - Отметить чат как админский\n'
            answer += '/standard_greetings [текст] — Изменить приветствие для простого человека\n' \
                      '/captcha_greetings [текст] — Изменить приветствие при капче\n' \
                      '/admin_greetings [текст] — Изменить приветствие для админа\n' \
                      '/full_greetings [текст] — Изменить приветствие для полного админа\n' \
                      "<i>Вставьте в текст '{name}' без кавычек там, " \
                      "где нужно обратиться к участнику по нику</i>\n\n"

        answer += "<b>Примечание:</b> " \
                  "командами типа /me можно отвечать на сообщения других людей, " \
                  "тогда команда выполнится на выбранном человеке. " \
                  "Ещё вы можете после команды написать ID человека (можно достать " \
                  "в /members), чтобы не отвлекать его от дел :3\n\n"
        answer += f'<b><i>ID вашей системы: {system} </i></b>'
    else:  # Command is used in PM
        answer += '/help - Прислать это сообщение\n'
        answer += '/minet - Делает приятно\n'
        answer += '/drakken - Присылает арт с Доктором Драккеном\n'
        answer += '/meme - Присылает мем\n'
        answer += '/art - Присылает картину\n'
        answer += '/storages - Посмотреть список хранилищ\n'
        answer += '/get [хранилище] - Получать случайный контент из хранилища\n'
        answer += '/size [хранилище] - Получить инфо о количестве контента и модеров хранилища\n'
        answer += '/shuffle [x] [элементы через пробел] - перемешать элементы. ' \
                  'Число x необязательно, но если указано, ' \
                  'то бот оставит только x первых элементов\n\n'
        answer += 'В чате мой функционал значительно шире'

    reply(message, answer, parse_mode='HTML')