예제 #1
0
def unwarn(message, person, parameters_dictionary: dict):
    """Снимает с участника предупреждение"""
    database = Database()
    unwarns = parameters_dictionary['value']
    chat = database.get('chats', ('id', message.chat.id))
    system = chat['system']
    value = database.get('members', ('id', person.id),
                         ('system', system))['warns'] - unwarns
    if value >= 0:
        database.change(value, 'warns', 'members', ('id', person.id),
                        ('system', system))
        adm_place = admin_place(message, database)
        if adm_place:
            text = "#warns\n\n"
            text += "Пользователь {} потерял(а) {} варн(а) и их стало {}\n".format(
                person_info_in_html(person), unwarns, value)
            text += "Варн(ы) снят(ы) пользователем {}\n".format(
                person_info_in_html(message.from_user))
            if 'comment' in parameters_dictionary.keys():
                text += "Комментарий: {}".format(
                    parameters_dictionary['comment'])
            send(adm_place, text, parse_mode='HTML')
        reply(message, "Варн(ы) снят(ы). Теперь их {}".format(value))
        if 3 - unwarns <= value < 3:
            chat_configs = get_system_configs(system)
            unban_user(person)
            database.change(chat_configs['ranks'][1], 'rank', 'members',
                            ('id', person.id), ('system', system))
    else:
        reply(message,
              "Нельзя сделать отрицательное количество предупреждений")
예제 #2
0
def warn(message, person, parameters_dictionary):
    """Даёт участнику предупреждение"""
    database = Database()
    warns = parameters_dictionary['value']
    chat = database.get('chats', ('id', message.chat.id))
    system = chat['system']
    value = database.get('members', ('id', person.id),
                         ('system', system))['warns'] + warns
    database.change(value, 'warns', 'members', ('id', person.id),
                    ('system', system))
    reply(message, "Варн(ы) выдан(ы). Теперь их {}".format(value))
    adm_place = admin_place(message, database)
    if adm_place:
        send(adm_place,
             "Пользователь {} получил(а) {} варн(а) и их стало {}".format(
                 person_info_in_html(person), warns, value),
             parse_mode='HTML')
    blowout = database.get('channels', ('name', 'Проколы'))['id']
    how_many = 10  # Сколько пересылает сообщений
    end_forwarding = message.reply_to_message.message_id
    start_forwarding = end_forwarding - how_many
    send(blowout,
         "В чате {} случилось нарушение участником {} Прысылаю {} сообщений".
         format(chat_info_in_html(message.chat), person_info_in_html(person),
                how_many),
         parse_mode='HTML')
    for msg_id in range(start_forwarding, end_forwarding + 1):
        forward(blowout, message.chat.id, msg_id)
    if value >= 3:
        ban(message, person)
예제 #3
0
def cooldown(message, command, timeout=3600):
    """Checks if the function is ready to be used again"""
    if message.chat.id > 0:  # Command is used in PM's
        return True
    database = Database()
    # Получаем наименование необходимой команды
    entry = database.get('cooldown', ('person_id', message.from_user.id),
                         ('command', command), ('chat_id', message.chat.id))
    if not entry:  # Чел впервые пользуется коммандой
        database.append(
            (message.from_user.id, command, message.chat.id, message.date),
            'cooldown')

        return True
    # Чел уже пользовался командой
    time_passed = message.date - entry['time']
    if time_passed < timeout:  # Кулдаун не прошёл
        seconds = timeout - time_passed
        minutes = seconds // 60
        seconds %= 60
        answer = "Воу, придержи коней, ковбой. Ты сможешь воспользоваться этой командой только "
        answer += f"через {minutes} минут и {seconds} секунд 🤠"
        reply(message, answer)

        return False
    # Кулдаун прошёл
    database.change(message.date, 'time', 'cooldown',
                    ('person_id', message.from_user.id), ('command', command),
                    ('chat_id', message.chat.id))
    return True
예제 #4
0
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))
예제 #5
0
def new_adapt_option(message, vote_id):
    """Send option to De'Max to check if it's adequate"""
    LOG.log(str(message.from_user.id) + ": new_adapt_option invoked")
    send(CREATOR_ID,
         "[{}, '{}']".format(vote_id, message.text),
         reply_markup=ADAPT_ADEQUATE_KEYBOARD)
    reply(message, "Ваше мнение выслано на проверку")
예제 #6
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, "Этой системы не существует!")
예제 #7
0
def rank_required(message, person, system, min_rank, loud=True):
    """Checks if person has rank required for something"""
    LOG.log("rank_required invoked from userID {}".format(
        message.from_user.id))
    database = Database()
    chat_configs = get_system_configs(system)
    ranks = chat_configs['ranks']
    you = get_person(message,
                     person,
                     system,
                     database,
                     system_configs=chat_configs)
    your_rank = you['rank']
    your_rank_n = ranks.index(your_rank)
    min_rank_n = ranks.index(min_rank)
    if your_rank_n < min_rank_n and loud:
        if isinstance(message, CallbackQuery):
            answer_callback(
                message.id,
                "Ваше звание ({}) не дотягивает до звания ({}) для жмака".
                format(your_rank, min_rank),
                show_alert=True)
        else:
            reply(
                message,
                "Ваше звание ({}) не дотягивает до необходимого ({}) для этого"
                .format(your_rank, min_rank))
    return min_rank_n <= your_rank_n
예제 #8
0
def reset_test_handler(message):
    if message.from_user.id == config_var.CREATOR_ID:
        person = config_func.Analyzer(message, value_necessary=False).return_target_person(to_self=True)
        if person:
            reset_test(message, person)
    else:
        output.reply(message, "Это команда только для моего босса")
예제 #9
0
def reset_test(message, person):
    database = Database()
    database.remove("basic_logic_tested", ("id", person.id))
    reply(
        message,
        "Предудыщий результат удалён. Пользователь {} может попробовать ещё".
        format(person.id))
예제 #10
0
def cooldown(message, command, timeout=3600, notify=True, individual=True):
    """Checks if the function is ready to be used again"""
    if message.chat.id > 0:  # Command is used in PM's
        return True
    database = Database()
    person_id = 0
    if individual:
        person_id = message.from_user.id
    entry = database.get('cooldown', ('person_id', person_id),
                         ('command', command), ('chat_id', message.chat.id))
    if not entry:  # Person uses this command for the first time
        database.append((person_id, command, message.chat.id, message.date),
                        'cooldown')
        return True
    # The command is already used
    time_passed = message.date - entry['time']
    if time_passed < timeout:  # Кулдаун не прошёл
        seconds = timeout - time_passed
        minutes = seconds // 60
        seconds %= 60
        if notify:
            if individual:
                answer = "Воу, придержи коней, ковбой. Ты сможешь воспользоваться этой командой только "
                answer += f"через {minutes} минут и {seconds} секунд 🤠"
            else:
                answer = "Воу, придержите коней, ковбои. Вы сможете воспользоваться этой командой только "
                answer += f"через {minutes} минут и {seconds} секунд 🤠"
            reply(message, answer)

        return False
    # Кулдаун прошёл
    database.change(message.date, 'time', 'cooldown', ('person_id', person_id),
                    ('command', command), ('chat_id', message.chat.id))
    return True
예제 #11
0
def check_access_to_a_storage(message,
                              storage_name,
                              is_write_mode,
                              to_check_vulgarity=True):
    """Checks if some storage can be accessed"""
    database = Database()
    storages_dict = get_storage_json()
    if storage_name in storages_dict.keys():
        storage = storages_dict[storage_name]
        if is_write_mode:
            if message.from_user.id not in storage['moders']:
                reply(
                    message,
                    "У вас отсутствует разрешение добавлять контент в это хранилище :-("
                )
                return False
            return True
        if message.chat.id > 0:
            return True
        system = database.get('chats', ('id', message.chat.id))['system']
        if to_check_vulgarity and storage['is_vulgar']:
            return loud_feature_is_available(message, message.chat.id, system,
                                             'erotic_commands')
        return loud_feature_is_available(message, message.chat.id, system,
                                         'standard_commands')
    reply(message, "Хранилища '{}' не существует".format(storage_name))
    return False
예제 #12
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)
예제 #13
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, "Ничего нет!")
예제 #14
0
def clear_echo_message(message):
    """Echo message but unparse all highlights (bold text -> <b>text</b>)"""
    target_message = get_target_message(message)
    text, entities = get_text_and_entities(target_message)
    if text:
        reply(message, entities_saver(text, entities))
    else:
        reply(message, "У этого сообщения нет текста")
예제 #15
0
def echo_message(message):
    """Echo message with saving all highlights"""
    target_message = get_target_message(message)
    text, entities = get_text_and_entities(target_message)
    if text:
        reply(message, entities_saver(text, entities), parse_mode='HTML')
    else:
        reply(message, "У этого сообщения нет текста")
예제 #16
0
def del_chat(message):
    """Removes chat from the system."""
    chat = message.chat.id
    database = Database()

    if database.get('chats', ('id', chat)):
        database.remove('chats', ('id', chat))
        reply(message, "Чат успешно удалён")
예제 #17
0
def appointment_required(message, person, system, appointment, loud=True):
    """Checks if person has appointment required for something"""
    database = Database()
    true_false = database.get("appointments", ('id', person.id),
                              ('appointment', appointment), ('system', system))
    if not true_false and loud:
        reply(message, "Вам для этого нужна должность {}".format(appointment))
    return true_false
예제 #18
0
def month_set(message, month):
    """Set the month of person's birthday"""
    database = Database()
    reply(
        message, "Ставлю человеку с ID {} месяц рождения {}".format(
            message.from_user.id, month))
    database.change(month, 'month_birthday', 'members',
                    ('id', message.from_user.id))
예제 #19
0
def add_moderator_to_storage(message, storage_name, person_id):
    """ Adds a moderator to a storage """
    storages_dict = get_storage_json()
    if person_id not in storages_dict[storage_name]['moders']:
        storages_dict[storage_name]['moders'].append(person_id)
        write_storage_json(storages_dict)
        reply(message, "ОК!")
    else:
        reply(message, "Этот человек уже модератор хранилища")
예제 #20
0
def hug(message, person):
    """For hugs"""
    if message.from_user.id == person.id:
        reply(message,
              "{} обнял(-а) себя любим(ого/ую)".format(person.first_name))
    else:
        reply(
            message, "{} обнял(-а) {}".format(message.from_user.first_name,
                                              person.first_name))
예제 #21
0
def remove_moderator_from_storage(message, storage_name, person_id):
    """ Removes a moderator from a storage """
    storages_dict = get_storage_json()
    if person_id in storages_dict[storage_name]['moders']:
        storages_dict[storage_name]['moders'].remove(person_id)
        write_storage_json(storages_dict)
        reply(message, "ОК!")
    else:
        reply(message, "Этот человек и так не модератор хранилища")
예제 #22
0
def dick_cheek_punch(message, person):
    """For punching someone's cheek with your dick"""
    if message.from_user.id == person.id:
        reply(
            message,
            "{} ударился(-ась) своей щекой об член!".format(person.first_name))
    else:
        reply(
            message, "{} ударил(-а) {} членом по щеке!".format(
                message.from_user.first_name, person.first_name))
예제 #23
0
def html_echo_message(message):
    """Echo message but parse all entities in the text (like <b>bold</b>)"""
    target_message = get_target_message(message)
    text = target_message.text
    if text:
        rep = reply(message, text, parse_mode='HTML')
        if rep is None:
            reply(message, "Не могу распарсить это сообщение")
    else:
        reply(message, "У этого сообщения нет текста")
예제 #24
0
def get_one_language(message):
    """Analyzes the language that is suitable for some situation"""
    database = Database()
    entry = database.get('languages', ('id', message.chat.id))
    if entry:
        return entry['language']
    reply(
        message, "Если вы говорите на русском, напишите '/lang Русский'\n\n"
        "If you speak English, type '/lang English'\n\n")
    return ''
예제 #25
0
def anon_message_handler(message):
    """Send anon message to admin place"""
    if message.chat.id > 0:
        if len(message.text) == 5:
            output.reply(message,
                         "После команды /anon должно следовать то, что надо отправить админам")
        else:
            standard_commands.anon_message(message)
    else:
        output.reply(message, "Эта команда предназначена для лички")
예제 #26
0
def remove_moderator_from_storage_handler(message):
    """ Removes a moderator from a storage """
    analyzer = config_func.Analyzer(message, value_necessary=False)
    person = analyzer.return_target_person(to_self=True)
    storage_name = analyzer.parameters_dictionary['comment']
    if config_func.in_mf(message, command_type=None) and person and \
            config_func.check_access_to_a_storage(message, storage_name, False):
        if message.from_user.id == config_var.CREATOR_ID:
            boss_commands.remove_moderator_from_storage(message, storage_name, person.id)
        else:
            output.reply(message, "Эта команда только для моего хозяина")
예제 #27
0
def set_money_name(message):
    """Change money's name in json"""
    database = Database()
    mode = ' '.join(message.text.split()[1:])
    chat = database.get('chats', ('id', message.chat.id))
    system = chat['system']
    if mode:
        update_systems_json(system, mode, 'money_name')
        reply(message, "OK!")
    else:
        reply(message, "После команды введите название валюты")
예제 #28
0
def create_new_vulgar_storage_handler(message):
    """ Creates new vulgar media storage """
    analyzer = config_func.Analyzer(message, value_necessary=False)
    storage_name = analyzer.parameters_dictionary['comment']
    if config_func.in_mf(message, command_type=None):
        if message.from_user.id == config_var.CREATOR_ID:
            if storage_name:
                boss_commands.create_new_storage(message, storage_name, True)
            else:
                output.reply(message, "Не хватает названия")
        else:
            output.reply(message, "Эта команда только для моего хозяина")
예제 #29
0
def month_set_handler(message):
    """Set month of person's birthday"""
    if config_func.in_mf(message, command_type=None):
        month = message.text.split()[-1]
        if month.isdecimal():
            month = int(month)
            if month and 1 <= month <= 12:
                standard_commands.month_set(message, month)
        else:
            output.reply(
                message, "Последнее слово должно быть положительным числом от 1 до 12 — "
                         "номером месяца")
예제 #30
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)