def replace_trigger(bot, update): mes = update.message if filter_is_pm(mes): return if mes.from_user.id not in get_admin_ids(bot=bot, chat_id=mes.chat_id): bot.send_message(chat_id=mes.chat_id, text="Доступ только у админов.", reply_to_message_id=mes.message_id) return text = mes.text.partition(" ")[2].lower() list_triggers = triggers_in.get(mes.chat_id) if list_triggers is None or text not in list_triggers: bot.send_message(chat_id=mes.chat_id, text="Триггер не найден", reply_to_message_id=mes.message_id) return request = "update triggers set type = %s, data_out = %s, creator = %s, date_created = %s where chat_id = %s and " \ "text_in = %s" trigger_type, data = get_message_type_and_data(mes.reply_to_message) cursor.execute(request, (trigger_type, data, mes.from_user.username or mes.from_user.id, datetime.datetime.now( tz=moscow_tz).replace(tzinfo=None), mes.chat_id, text)) bot.send_message(chat_id=mes.chat_id, text="Триггер успешно заменён!", reply_to_message_id=mes.message_id) return
def notify_guild_to_battle(bot, update): mes = update.message chat_dict = ping_by_chat_id.get(mes.chat_id) if chat_dict is None: return if mes.from_user.id not in get_admin_ids( bot, chat_id=mes.chat_id) and not check_access(mes.from_user.id): bot.send_message(chat_id=mes.chat_id, text="Доступ только у админов", parse_mode='HTML') return if mes.text.partition("@")[0].split("_")[2] == "sleeping": target_list = chat_dict.get("sleeping") else: target_list = chat_dict.get("do not ready") i = 0 response = "" for username in target_list: if i >= 4: response += "\n БИТВА!" bot.send_message(chat_id=mes.chat_id, text=response) response = "" i = 0 response += "@{0} ".format(username) i += 1 response += "\n БИТВА!" bot.send_message(chat_id=mes.chat_id, text=response)
def info_trigger(bot, update): mes = update.message if filter_is_pm(mes): return if mes.from_user.id not in get_admin_ids(bot=bot, chat_id=mes.chat_id): bot.send_message(chat_id=mes.chat_id, text="Доступ только у админов.", reply_to_message_id=mes.message_id) return text = mes.text.partition(" ")[2].lower() list_triggers = triggers_in.get(mes.chat_id) chat_id = mes.chat_id if list_triggers is None: list_triggers = [] triggers_in.update({mes.chat_id: list_triggers}) if text not in list_triggers: if text not in global_triggers_in: bot.send_message(chat_id=mes.chat_id, text="Триггер не найден", reply_to_message_id=mes.message_id) return chat_id = 0 request = "select creator, date_created from triggers where text_in = %s and chat_id = %s" cursor.execute(request, (text, chat_id)) row = cursor.fetchone() response = "<code>{}</code> — создал <code>{}</code> {}".format( text, row[0], row[1].strftime("%d/%m/%y %H:%M:%S")) bot.send_message(chat_id=mes.chat_id, text=response, parse_mode='HTML', reply_to_message_id=mes.message_id)
def triggers(bot, update): mes = update.message if filter_is_pm(mes): return if mes.from_user.id not in get_admin_ids(bot=bot, chat_id=mes.chat_id): bot.send_message(chat_id=mes.chat_id, text="Доступ только у админов.", reply_to_message_id=mes.message_id) return local = get_triggers_list(mes.chat_id) global_triggers = get_triggers_list(0) response = f"<b>Список триггеров</b>:\n<b>Локальные триггеры</b>:\n{local}\n\n" \ f"<b>Глобальные триггеры</b>:\n{global_triggers}" pattern = re.compile("(.*)\n([^\n]*$)", re.DOTALL) while len(response) > MAX_MESSAGE_LENGTH: # Если не влезает в одно сообщение # Отрезаем последнюю влезающую строку, отправляем сообщение без неё, склеиваем то, что не влезло, повторяем parse = re.match(pattern, response[:MAX_MESSAGE_LENGTH]) bot.group_send_message(chat_id=mes.chat_id, text=parse.group(1), parse_mode='HTML') response = parse.group(2) + response[MAX_MESSAGE_LENGTH:] bot.group_send_message(chat_id=mes.chat_id, text=response, parse_mode='HTML') bot.send_message_group(mes.chat_id)
def remove_trigger(bot, update): mes = update.message if filter_is_pm(mes): return if mes.from_user.id not in get_admin_ids(bot=bot, chat_id=mes.chat_id): bot.send_message(chat_id=mes.chat_id, text="Доступ только у админов.", reply_to_message_id=mes.message_id) return text = mes.text.partition(" ")[2].lower() chat_id = mes.chat_id trigger_list = triggers_in.get(mes.chat_id) if trigger_list is None or text not in trigger_list: chat_id = 0 if text in global_triggers_in: if not check_access(mes.from_user.id): bot.send_message( chat_id=mes.chat_id, text="Недостаточно прав для удаления глобального триггера", reply_to_message_id=mes.message_id) return else: bot.send_message(chat_id=mes.chat_id, text="Триггер не найден", reply_to_message_id=mes.message_id) return trigger_list = global_triggers_in trigger_list.remove(text) request = "delete from triggers where text_in = %s and chat_id = %s" cursor.execute(request, (text, chat_id)) bot.send_message(chat_id=mes.chat_id, text="Триггер успешно удалён!", reply_to_message_id=mes.message_id)
def add_trigger(bot, update): mes = update.message if filter_is_pm(mes): return if mes.from_user.id not in get_admin_ids(bot=bot, chat_id=mes.chat_id): bot.send_message(chat_id=mes.chat_id, text="Доступ только у админов.", reply_to_message_id=mes.message_id) return trigger_in = mes.text.partition(" ")[2].lower() if not mes.text.startswith("/create_global_trigger"): chat_id = mes.chat_id trigger_list = triggers_in.get(mes.chat_id) if trigger_list is None: trigger_list = [] triggers_in.update({mes.chat_id: trigger_list}) else: if mes.from_user.id != SUPER_ADMIN_ID: return chat_id = 0 trigger_list = global_triggers_in list_triggers = triggers_in.get(chat_id) if chat_id else global_triggers_in if trigger_in in list_triggers: bot.send_message(chat_id=mes.chat_id, text="Триггер уже существует!", reply_to_message_id=mes.message_id) return if mes.reply_to_message is None: bot.send_message( chat_id=mes.chat_id, text="Сообщение должно быть ответом на другое сообщение.", reply_to_message_id=mes.message_id) return trigger_type, data = get_message_type_and_data(mes.reply_to_message) request = "insert into triggers(text_in, type, data_out, chat_id, creator, date_created) VALUES (%s, %s, %s, %s, " \ "%s, %s)" cursor.execute(request, (trigger_in, trigger_type, data, chat_id, mes.from_user.username or mes.from_user.id, datetime.datetime.now(tz=moscow_tz).replace(tzinfo=None))) trigger_list.append(trigger_in) bot.send_message(chat_id=mes.chat_id, text="Триггер успешно создан!", reply_to_message_id=mes.message_id)
def mute(bot, update, args): mes = update.message if (mes.from_user.id != SUPER_ADMIN_ID) and ( mes.from_user.id not in get_admin_ids(bot, chat_id=mes.chat_id)): return if mes.reply_to_message is None: return if mes.reply_to_message.from_user.id == SUPER_ADMIN_ID: bot.send_message(chat_id=update.message.chat_id, text='Неа -__-') return if not args: return current = time.time() try: ban_for = (float(args[0]) * 60) except ValueError: bot.send_message(chat_id=update.message.chat_id, text='Неверный синтаксис') return current += ban_for try: bot.restrictChatMember(chat_id=mes.chat_id, user_id=mes.reply_to_message.from_user.id, until_date=current, permissions=ChatPermissions( can_send_other_messages=False, can_send_messages=False)) except TelegramError: bot.send_message( chat_id=update.message.chat_id, text='Ошибка. Проверьте, что бот имеет требуемые права.') return bot.send_message(chat_id=update.message.chat_id, text='Выполнено!', reply_to_message_id=update.message.message_id) return
def notify_guild_attack(bot, update): mes = update.message remaining_time = get_time_remaining_to_battle() forward_message_date = utc.localize( mes.forward_date).astimezone(tz=moscow_tz).replace(tzinfo=None) if forward_message_date - datetime.datetime.now() > datetime.timedelta( minutes=2): return 0 if remaining_time > datetime.timedelta(minutes=30): pass return 0 ready_to_battle = mes.text.count("[⚔]") + mes.text.count("[🛡]") sleeping = mes.text.count("[🛌]") + mes.text.count("[⚒]") response = "<b>{0}</b>\nГотово к битве: <b>{1}</b>\nНе готово к битве, но занято <b>{2}</b>\n" \ "Спит: <b>{3}</b>\n\nВремя до битвы: {4}\n".format(mes.text.splitlines()[0], ready_to_battle, mes.text.count("\n") - ready_to_battle - sleeping, sleeping, ":".join(str(remaining_time).partition(".")[0].split(":")[0:3])) request = "select guild_id from guilds where chat_id = %s" cursor.execute(request, (mes.chat_id, )) row = cursor.fetchone() if row is None: return guild = Guild.get_guild(guild_id=row[0]) set = guild.settings.get( "battle_notify") if guild.settings is not None else True if guild is None or set is False: return if mes.chat_id != guild.chat_id: return if mes.from_user.id not in get_admin_ids( bot, chat_id=mes.chat_id) and not check_access(mes.from_user.id): bot.send_message(chat_id=mes.chat_id, text="Доступ только у админов", parse_mode='HTML', reply_to_message_id=mes.message_id) return do_not_ready = [] sleeping = [] for string in mes.text.splitlines()[1:]: if not ("[⚔]" in string or "[🛡]" in string): nickname = string.partition("]")[2][1:] do_not_ready.append(nickname) if "[🛌]" in string or "[⚒]" in string: sleeping.append(nickname) in_dict_do_not_ready = [] in_dict_sleeping = [] ping_dict = { "do not ready": in_dict_do_not_ready, "sleeping": in_dict_sleeping } for player_id in guild.members: player = Player.get_player(player_id, notify_on_error=False) if player is None: continue db_nickname = player.nickname.partition("]")[2] if db_nickname in do_not_ready: in_dict_do_not_ready.append(player.username) if db_nickname in sleeping: in_dict_sleeping.append(player.username) ping_by_chat_id.update({mes.chat_id: ping_dict}) response += "Пингануть тех, кто спит: /notify_guild_sleeping\n" \ "Пингануть всех, кто не готов: /notify_guild_not_ready" bot.send_message(chat_id=mes.chat_id, text=response, parse_mode='HTML')