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 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 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 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 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)
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()
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)
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, "Ничего нет!")
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))
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')