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, "Нельзя сделать отрицательное количество предупреждений")
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)
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
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))
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, "Ваше мнение выслано на проверку")
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, "Этой системы не существует!")
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
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, "Это команда только для моего босса")
def reset_test(message, person): database = Database() database.remove("basic_logic_tested", ("id", person.id)) reply( message, "Предудыщий результат удалён. Пользователь {} может попробовать ещё". format(person.id))
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
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
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)
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, "Ничего нет!")
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, "У этого сообщения нет текста")
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, "У этого сообщения нет текста")
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, "Чат успешно удалён")
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
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))
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, "Этот человек уже модератор хранилища")
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))
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, "Этот человек и так не модератор хранилища")
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))
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, "У этого сообщения нет текста")
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 ''
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, "Эта команда предназначена для лички")
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, "Эта команда только для моего хозяина")
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, "После команды введите название валюты")
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, "Эта команда только для моего хозяина")
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 — " "номером месяца")
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)