async def start_www_game_fnc(call: CallbackQuery, state: FSMContext): cur_id = call.from_user.id state = await state.get_data() host_id = state.get("game_host") #если начать игру нажал хост, то запускаем стор с его ИД if not host_id: host_id = cur_id #проставляем в сторе готовоность к началу игру, по тому кто нажал кнопку async with (dp.current_state(chat=host_id, user=host_id)).proxy() as data: for team in data["teams"]: # ищем в командах команду нашего игрока if team["host_id"] == cur_id: team["readyPlay"] = 1 #очистим предыдущие ответы db.set_answer(cur_id, 'Null') logging.info(" Перед заходом в старт игры team[readyPlay]" + str(team["readyPlay"])) break logging.info(" Перед заходом в старт игры call.message.message_id" + str(call.message.message_id)) #старт игры asyncio.ensure_future( www.show_question_fnc(call.from_user.id, call.message.message_id)) #await state.reset_state(with_data=False) await www_state.answerPlayer.set()
async def join_game_fnc(call: CallbackQuery, state: FSMContext): logging.info("зашли в join_game_fnc ") team_name = call.data data = await state.get_data() logging.info("/joinGame state присоединения к игре: " + str(data)) host_id = data["game_host"] async with (dp.current_state(chat=host_id, user=host_id)).proxy() as data: for team in data["teams"]: #как тольок нашли имя которое указал пользователь, назначаем этого пользователя хостом этой команды if team["name"] == team_name: team["host_id"] = call.from_user.id #переводим игрока в ожидание команд await www_state.readyPlay.set() asyncio.ensure_future( www.wait_teams_fnc(chat_id=call.message.chat.id, mess_id=call.message.message_id)) #await call.message.answer("Вы успешно подключились к игре! Ожидайте, игра скоро начнется") #await call.message.edit_text(text= f"Ваша команда: <b>{team_name}</b>") #отправим уведомление хосту о том, что пользователь подключился к игре await bot.send_message( chat_id=host_id, text= f"{call.from_user.full_name} ({call.from_user.username}) успешно подключился(-ась) к игре" )
async def check_support_available(support_id): state = dp.current_state(chat=support_id, user=support_id) state_str = str(await state.get_state()) if state_str == 'in_support': return else: return support_id
async def user_confirm(query: types.CallbackQuery, callback_data: dict): """ Хэндлер обрабатывающий нажатие на кнопку """ # сразу получаем все необходимые нам переменные, а именно # предмет, на который нажал пользователь subject = callback_data.get("subject") # предмет на который пользователь должен был нажать necessary_subject = callback_data.get('necessary_subject') # айди пользователя (приходит строкой, поэтому используем int) user_id = int(callback_data.get("user_id")) # и айди чата, для последнующей выдачи прав chat_id = int(query.message.chat.id) logger.debug( f'User {query.from_user.username} clicked on button: {subject}({necessary_subject}) in chat {chat_id}' ) # если на кнопку нажал не только что вошедший пользователь, говорим, чтобы не лез и игнорируем (выходим из функции). if query.from_user.id != user_id: logger.debug( f'The wrong user clicked on the button @{query.from_user.username}:{query.from_user.id}' ) return await query.answer("Эта кнопочка не для тебя", show_alert=True) # не забываем выдать юзеру необходимые права если он нажал на правильную кнопку if subject == necessary_subject: await bot.restrict_chat_member( chat_id=chat_id, user_id=user_id, permissions=user_allowed, ) logger.debug( f'Rights have been granted to the user @{query.from_user.username}:{query.from_user.id}' ) else: until_date = datetime.datetime.now() + datetime.timedelta( seconds=BAN_TIME) await bot.kick_chat_member(chat_id=chat_id, user_id=user_id, until_date=until_date) logger.debug( f'The user @{query.from_user.username}:{query.from_user.id} clicked on the wrong object ' f'and was banned until {until_date}') state = dp.current_state(user=query.from_user.id, chat=query.message.chat.id) await state.finish() logger.debug( f'User @{query.from_user.username}:{query.from_user.id} is out of the state' ) # и убираем часики await query.answer() # а также удаляем сообщение, чтобы пользователь в RO не мог получить права service_message = query.message await service_message.delete() logger.debug(f'Message {service_message.message_id} was deleted')
async def age(message: Message): s = message.text state = dp.current_state(user=message.from_user.id) if not s.isdigit(): await message.answer("Сколько лет девушке?") else: edit_age2(message.chat.id, s) await state.set_state(TestStates.all()[2]) await message.answer("Расскажите о себе и с кем хотите познакомиться")
async def name(message: Message): s = message.text state = dp.current_state(user=message.from_user.id) if len(s) > 30: await message.answer("Введите имя девушки") else: edit_name2(message.chat.id, s) await message.answer("Сколько лет девушке?") await state.set_state(TestStates.all()[8])
async def description(message: Message): s = message.text print("description") if len(s) > 999: await message.answer("Расскажите о себе и с кем хотите познакомиться") else: edit_description(message.chat.id, s) state = dp.current_state(user=message.from_user.id) await state.set_state(TestStates.all()[4]) await message.answer("Из какого вы города?")
async def location(message: Message): s = message.text print("location") if len(s) > 30: await message.answer("Из какого вы города?") else: edit_location(message.chat.id, s) state = dp.current_state(user=message.from_user.id) await state.set_state(TestStates.all()[6]) await message.answer("Отправьте мне картинку для анкеты")
async def exit_support(call: types.CallbackQuery, state: FSMContext, callback_data: dict): user_id = int(callback_data.get("user_id")) second_state = dp.current_state(user=user_id, chat=user_id) if await second_state.get_state() is not None: data_second = await second_state.get_data() second_id = data_second.get("second_id") if int(second_id) == call.from_user.id: await second_state.reset_state() await bot.send_message(user_id, "User cancel session") await call.message.edit_text("Session was ended") await state.reset_state()
async def process_setstate_command(message: types.Message): argument = message.get_args() state = dp.current_state(user=message.from_user.id) if not argument: await state.reset_state() return await message.reply("reset") if (not argument.isdigit()) or (not int(argument) < len(Media.all())): return await message.reply('invalid_key'.format(key=argument)) await state.set_state(Media.all()[int(argument)]) await message.reply('Вы готовы?', reply=False)
async def start_command(message): db.user_create(message.chat.id) # Создание открытой анкеты print(message) await bot.send_message( message.chat.id, "Здравствуй, Повелитель 👑,\n" + "Я бот, созданный для свинг знакомств \n" + "Убедительная просьба установить себе в телеграм username, иначе будут работать не все функции", reply_markup=menu() ) state = dp.current_state(user=message.from_user.id) await state.set_state(TestStates.all()[3]) await message.answer("Выберите, пара МЖ, М или Ж?", reply_markup=gender_btns())
async def on_pre_process_message(self, message: types.Message, data: dict): state = dp.current_state(chat=message.from_user.id, user=message.from_user.id) state_str = str(await state.get_state()) if state_str == "in_support": data = await state.get_data() second_id = data.get("second_id") keyboard = await cancel_support(second_id) keyboard_second_user = await cancel_support(message.from_user.id) await message.send_copy(second_id, reply_markup=keyboard) await bot.send_message(second_id, text="", reply_markup=keyboard_second_user) raise CancelHandler()
async def start_www_game_fnc(call: CallbackQuery, state: FSMContext): logging.info("Зашли в запуск старта игры для приглашенного") data = await state.get_data() logging.info("/joinGame state присоединения к игре: " + str(data)) host_id = data["game_host"] async with (dp.current_state(chat=host_id, user=host_id)).proxy() as data: for team in data["teams"]: # ищем в командах команду нашего игрока if team["host_id"] == host_id: team["readyPlay"] = 1 #переводим хоста в режим готовности к началу игры await www_state.answerPlayer.set()
async def description(message: Message): s = message.text state = dp.current_state(user=message.from_user.id) if s == "👱": edit_gender(message.chat.id, "Парень") await state.set_state(TestStates.all()[5]) await message.answer("Введите ваше имя", reply_markup=remove_keyboard()) elif s == "👩": edit_gender(message.chat.id, "Девушка") await state.set_state(TestStates.all()[5]) await message.answer("Введите ваше имя", reply_markup=remove_keyboard()) elif s == "👱👩": edit_gender(message.chat.id, "Мы пара") await state.set_state(TestStates.all()[5]) await message.answer("Введите имя парня", reply_markup=remove_keyboard()) else: await message.answer("Выберите, пара МЖ, М или Ж?", reply_markup=gender_btns())
async def name(message: Message): s = message.text state = dp.current_state(user=message.from_user.id) if is_couple(message.chat.id): if len(s) > 30: await message.answer("Введите имя парня") else: edit_name(message.chat.id, s) await message.answer("Сколько лет парню?") await state.set_state(TestStates.all()[0]) else: if len(s) > 30: await message.answer("Введите ваше имя") else: edit_name(message.chat.id, s) await state.set_state(TestStates.all()[0]) await message.answer("Сколько вам лет?")
async def age(message: Message): s = message.text state = dp.current_state(user=message.from_user.id) if is_couple(message.chat.id): print("True") if not s.isdigit(): await message.answer("Сколько лет парню?") else: edit_age(message.chat.id, s) await state.set_state(TestStates.all()[9]) await message.answer("Введите имя девушки") else: print("False") if not s.isdigit(): await message.answer("Сколько вам лет?") else: edit_age(message.chat.id, s) await state.set_state(TestStates.all()[2]) await message.answer("Расскажите о себе и с кем хотите познакомиться")
async def bot_was_restarted(call: types.CallbackQuery, state: FSMContext): """Отправка уведомления о перезагрузке бота""" users_list = await db.select_all_user_id_with_status_1() users_list_0 = await db.select_all_user_id_with_status_0() for user in users_list: await bot.send_message( chat_id=user, text='По техническим причинам бот был перезагружен. ' 'Приносим извинения за неудобства.', reply_markup=ReplyKeyboardRemove()) await bot.send_message( chat_id=user, text="Для возобновления рассылки, пожалуйста, нажмите кнопку.", reply_markup=resume_notifications) for user in users_list_0: await bot.send_message( chat_id=user, text='По техническим причинам бот был перезагружен. ' 'Приносим извинения за неудобства.', reply_markup=menu) state = dp.current_state() await state.set_state() await call.answer('Сообщения отправлены')
async def next_question_fnc(call: CallbackQuery): state = await dp.get_current().current_state().get_data() # пытаемся найти у игрока ключ с полем хоста host_id = state.get("game_host") # если такой ключ не найден, значит функцию запустил хост и смотрим в его state if not host_id: host_id = call.from_user.id i = 1 # теперь переводим игру в другой цикл, где будем показывать готовность игроков к началу игры #Т.к. пользователь нажал кнопку, проставим ему флаг готовности async with (dp.current_state(chat=host_id, user=host_id)).proxy() as data: # обновим статус по каждой команде for team in data["teams"]: if team["host_id"] == call.from_user.id: team["readyPlay"] = 1 asyncio.ensure_future( www.show_question_fnc(call.from_user.id, call.message.message_id))
async def bot_start_fnc(message: types.Message, state: FSMContext): logging.info("зашли в bot_start_fnc") #await state.reset_state() user = db.get_user_info(message) is_refereal = message.get_args() #cur_state = await state.get_data() logging.info("Инфо о пользователе из БД: " + str(user)) #logging.info("/start state текущего пользователя: " + str(cur_state)) if is_refereal: #добавим в state присоединившегося пользователя хоста игры await state.update_data(game_host=is_refereal) choose_team = InlineKeyboardMarkup() #Выведем из state хоста список команд и предложим выбрать присоединившемуся пользователю async with (dp.current_state(chat=is_refereal, user=is_refereal)).proxy() as data: logging.info("/start state хоста игры host_state: " + str(data)) for team in data["teams"]: if team["host_id"] is None: team = InlineKeyboardButton(f'{team["name"]}', callback_data=team["name"]) choose_team.add(team) await www_state.joinGame.set() await message.answer("Выберите команду", reply_markup=choose_team) return #host_state = await (dp.current_state(chat=is_refereal, user=is_refereal)).get_data() await state.reset_state() await message.answer( f"Привет, {message.from_user.full_name}! В какую игру будем играть?", reply_markup=choose_game)
async def answer_support_call(call: types.CallbackQuery, state: FSMContext, callback_data: dict): second_id = int(callback_data.get("user_id")) user_state = dp.current_state(chat=second_id, user=second_id) if str(await user_state.get_state()) != "wait_in_support": await call.message.edit_text( "Unfortunately the user has already changed his mind") return await state.set_state("in_support") await user_state.set_state("in_support") await state.update_data(second_id=second_id) keyboard = await cancel_support(second_id) keyboard_second_user = await cancel_support(call.from_user.id) await call.message.edit_text( "You in session with user\n" "Click button to end session", reply_markup=keyboard) await bot.send_message(second_id, "Support in connection!Send here your message\n" "For decline session click on button below", reply_markup=keyboard_second_user)
async def new_chat_member(message: types.Message): """ Обрабатываем вход нового пользователя """ logger.debug( f"New chat member: @{message.from_user.username}:{message.from_user.id} -> " f"{', '.join([f'@{user.username}:{user.id}' for user in message.new_chat_members])} " f'in chat "{message.chat.title}@{message.chat.username}" chat_id:{message.chat.id}' ) # Пропускаем старые запросы if message.date < datetime.datetime.now() - datetime.timedelta(minutes=1): return logger.debug('Old updates was skipped') for new_member in message.new_chat_members: try: # сразу выдаём ему права, неподтверждённого пользователя await bot.restrict_chat_member( chat_id=message.chat.id, user_id=new_member.id, permissions=new_user_added, ) logger.debug(f'User @{new_member.username}:{new_member.id} cannot send messages now') except CantRestrictSelf: return logger.debug('Can\'t restrict self') service_messages = list() # Каждому пользователю отсылаем кнопку for new_member in message.new_chat_members: generated_tuple = generate_confirm_markup(new_member.id) markup = generated_tuple[0] subject = generated_tuple[1] answer = users_entrance_generator(mention=new_member.get_mention(as_html=True), subject=subject) service_message: types.Message = await message.reply( text=answer, reply_markup=markup ) logger.debug(f'User @{new_member.username}:{new_member.id} ' f'got message {service_message.message_id} with keyboard') await storage.set_state(chat=message.chat.id, user=new_member.id, state=ConfirmUserState.IncomerUser) logger.debug(f'User @{new_member.username}:{new_member.id} in state "IncomerUser"') state = dp.current_state(user=new_member.id, chat=message.chat.id) await state.update_data(user_id=new_member.id) logger.debug(f'@{new_member.username}:{new_member.id} user data has been updated') service_messages.append(service_message) logger.debug(f'The bot waits {ENTRY_TIME} seconds ' f'for {", ".join([str(user.username) for user in message.new_chat_members])}') await asyncio.sleep(ENTRY_TIME) for new_member in message.new_chat_members: state = dp.current_state(user=new_member.id, chat=message.chat.id) data = await state.get_data() if data.get('user_id', None): logger.debug(f'User @{new_member.username}:{new_member.id} data: {data}') until_date = datetime.datetime.now() + datetime.timedelta(seconds=BAN_TIME) # Получаем информацию о пользователе и провереям не заблокировал ли его кто-то, # пока бот ожидал ответа на капчу. # asyncio так как требуются свежие данные, а не на время входа в цикл. asyncio.user = await bot.get_chat_member(chat_id=message.chat.id, user_id=new_member.id) if asyncio.user['status'] == 'kicked': # Если пользователь заблокирован в чате то ничего не делаем и просто выдаём сообщение в консоль logger.debug(f'User @{new_member.username}:{new_member.id} already kicked from the chat \ ("{message.chat.title}@{message.chat.username}" chat_id:{message.chat.id}) by other bot or admin') else: # Если пользователь не был заблокирован то назначается его блокировка на указанное в конфигурации время await bot.kick_chat_member(chat_id=message.chat.id, user_id=new_member.id, until_date=until_date) logger.debug(f'User was kicked from chat @{new_member.username}:{new_member.id} on {BAN_TIME} seconds') # Завершаем состояние "новый пользователь", если пользователь просто проигнорировал капчу state = dp.current_state(user=new_member.id, chat=message.chat.id) await state.finish() logger.debug(f'User @{new_member.username}:{new_member.id} is out of the state') for service_message in service_messages: logger.debug(f'Message {service_message.message_id} was deleted') await service_message.delete() await message.delete()
async def set_store(self, user_id): async with (dp.current_state(chat=user_id, user=user_id)).proxy() as data: data["host_id"] = self.gameHost # хост игры data[ "is_host_player"] = self.isHostPlayer # по умолчанию считаем что тот кто создал игру будет вести игру, а не играть
async def get_store(self, user_id): return dp.current_state(chat=user_id, user=user_id).get_data()
async def updated_chat_member(chat_member_updated: types.ChatMemberUpdated): """Хендлер для вышедших либо кикнутых пользователей""" performer_mention = chat_member_updated.from_user.get_mention(as_html=True) member_mention = chat_member_updated.old_chat_member.user.get_mention(as_html=True) bot_user = await dp.bot.me if chat_member_updated.from_user.id == bot_user.id: return False if chat_member_updated.new_chat_member.status == types.ChatMemberStatus.MEMBER: state = dp.current_state(chat=chat_member_updated.chat.id, user=chat_member_updated.new_chat_member.user.id) await state.update_data(is_active=False) await chat_member_updated.bot.restrict_chat_member( chat_id=chat_member_updated.chat.id, user_id=chat_member_updated.new_chat_member.user.id, permissions=set_new_user_permissions(), ) message_bot = await chat_member_updated.bot.send_message( chat_member_updated.chat.id, text=( f"{member_mention}, добро пожаловать в чат!\n" "Подтверди, что ты не бот, нажатием на кнопку ниже. Внимание! У тебя есть всего одна минута, или я тебя удаляю." ), reply_markup=generate_confirm_markup(chat_member_updated.new_chat_member.user.id), ) await asyncio.sleep(60) data = await state.get_data() is_active = data.get('is_active') if not is_active: service_message = data.get('service_message') await chat_member_updated.bot.kick_chat_member(chat_member_updated.chat.id, chat_member_updated.new_chat_member.user.id) await chat_member_updated.bot.unban_chat_member(chat_member_updated.chat.id, chat_member_updated.new_chat_member.user.id) await message_bot.delete() await service_message.delete() await state.finish() return if chat_member_updated.new_chat_member.status == types.ChatMemberStatus.BANNED: text = f"{member_mention} был удален из чата пользователем {performer_mention}." elif chat_member_updated.new_chat_member.status == types.ChatMemberStatus.RESTRICTED and chat_member_updated.old_chat_member.status == types.ChatMemberStatus.ADMINISTRATOR: text = f"Для пользователя {member_mention} были изменены права пользователем {performer_mention}." # Проверяем вышел ли пользователь сам # elif chat_member_updated.new_chat_member.status == types.ChatMemberStatus.LEFT: # text = f"{member_mention} вышел из чата." # # until_date = datetime.datetime.now() + datetime.timedelta(days=1) # await chat_member_updated.chat.kick(user_id=chat_member_updated.old_chat_member.user.id, # until_date=until_date) elif chat_member_updated.new_chat_member.status == types.ChatMemberStatus.ADMINISTRATOR: if chat_member_updated.old_chat_member.status != types.ChatMemberStatus.ADMINISTRATOR: db.add_chat_admin(chat_member_updated.chat.id, chat_member_updated.from_user.id) text = f'Пользователь {member_mention} был повышен до статуса Администратора чата с титулом: {chat_member_updated.new_chat_member.custom_title}' else: text = f'Для администратора {member_mention} были изменены права' elif chat_member_updated.old_chat_member.status == types.ChatMemberStatus.ADMINISTRATOR and chat_member_updated.new_chat_member.status != types.ChatMemberStatus.ADMINISTRATOR: db.del_chat_admin(chat_member_updated.chat.id, chat_member_updated.from_user.id) text = f'Администратора {member_mention} понизили до статуса Пользователь' else: return await chat_member_updated.bot.send_message( chat_member_updated.chat.id, text )
async def new_chat_member(message: types.Message): """ Обрабатываем вход нового пользователя """ logger.debug( f"New chat member: @{message.from_user.username}:{message.from_user.id} -> " f"{', '.join([f'@{user.username}:{user.id}' for user in message.new_chat_members])} " f'in chat "{message.chat.title}@{message.chat.username}" chat_id:{message.chat.id}' ) # Пропускаем старые запросы if message.date < datetime.datetime.now() - datetime.timedelta(minutes=1): return logger.debug('Old updates was skipped') for new_member in message.new_chat_members: try: # сразу выдаём ему права, неподтверждённого пользователя await bot.restrict_chat_member( chat_id=message.chat.id, user_id=new_member.id, permissions=new_user_added, ) logger.debug( f'User @{new_member.username}:{new_member.id} cannot send messages now' ) except CantRestrictSelf: return logger.debug('Can\'t restrict self') service_messages = list() # Каждому пользователю отсылаем кнопку for new_member in message.new_chat_members: generated_tuple = generate_confirm_markup(new_member.id) markup = generated_tuple[0] subject = generated_tuple[1] answer = users_entrance_generator( mention=new_member.get_mention(as_html=True), subject=subject) service_message: types.Message = await message.reply( text=answer, reply_markup=markup) logger.debug(f'User @{new_member.username}:{new_member.id} ' f'got message {service_message.message_id} with keyboard') await storage.set_state(chat=message.chat.id, user=new_member.id, state=ConfirmUserState.IncomerUser) logger.debug( f'User @{new_member.username}:{new_member.id} in state "IncomerUser"' ) state = dp.current_state(user=new_member.id, chat=message.chat.id) await state.update_data(user_id=new_member.id) logger.debug( f'@{new_member.username}:{new_member.id} user data has been updated' ) service_messages.append(service_message) logger.debug( f'The bot waits {ENTRY_TIME} seconds ' f'for {", ".join([str(user.username) for user in message.new_chat_members])}' ) await asyncio.sleep(ENTRY_TIME) for new_member in message.new_chat_members: state = dp.current_state(user=new_member.id, chat=message.chat.id) data = await state.get_data() if data.get('user_id', None): logger.debug( f'User @{new_member.username}:{new_member.id} data: {data}') until_date = datetime.datetime.now() + datetime.timedelta( seconds=BAN_TIME) await bot.kick_chat_member(chat_id=message.chat.id, user_id=new_member.id, until_date=until_date) logger.debug( f'User was kicked from chat @{new_member.username}:{new_member.id} on {BAN_TIME} seconds' ) for service_message in service_messages: logger.debug(f'Message {service_message.message_id} was deleted') await service_message.delete() await message.delete()
async def text_msg(message): db.user_create(message.chat.id) state = dp.current_state(user=message.from_user.id) print(TestStates.all()) s = message.text if s == "📋 Анкета": d = get_info(message.chat.id) if d["is_couple"]: s = "{}, {},\n{}, {} \n{}\n{}".format(d["name"], d["age"], d["name2"], d["age2"], d["location"], d["description"]) else: s = "{}, {}, {}\n{}".format(d["name"], d["age"], d["location"], d["description"]) try: await bot.send_photo(message.from_user.id, caption=s, photo=d['photo']) except: await bot.send_message(message.from_user.id, s) await message.answer("Выберете действие с вашей анкетой", reply_markup=user_form_btns(is_activate(message.from_user.id))) elif s == '📝 Редактировать': print("|") print("|") print("V") print(is_couple(message.chat.id)) await state.set_state(TestStates.all()[3]) await message.answer("Выберите, пара МЖ, М или Ж?", reply_markup=gender_btns()) elif s == "✅ Открыть": edit_status(message.chat.id, 1) await message.answer("Ваша анкета открыта для общего доступа", reply_markup=menu()) elif s == "❌ Закрыть": edit_status(message.chat.id, 0) await message.answer("Ваша анкета закрыта для общего доступа", reply_markup=menu()) elif s == '👍 Поиск симпатий': print("👍 Поиск симпатий") print(1) d = get_partners(message.chat.id) print(2) if d: print(3) if d["is_couple"]: s = "{}, {},\n{}, {} \n{}\n{}".format(d["name"], d["age"], d["name2"], d["age2"], d["location"], d["description"]) else: s = "{}, {}, {}\n{}".format(d["name"], d["age"], d["location"], d["description"]) print(4) print(s) try: await bot.send_photo(message.from_user.id, caption=s, photo=d['photo'], reply_markup=mark(d["id"], message.message_id)) except: await bot.send_message(message.from_user.id, s, reply_markup=mark(d["id"], message.message_id)) print(5) print(message.message_id) else: await message.answer("В вашем городе нет подходящих для вас партнёров", reply_markup=menu()) elif s == "🔙 Назад" or s == "↪️ В главное меню ↩️": await message.answer("Вы в главном меню", reply_markup=menu()) elif s == "💩 Помощь": await message.answer("Обращайтесь к @MSadovskiy", reply_markup=menu()) elif s == "🆘 Правила": await message.answer("Ждём свод законов от @MSadovskiy", reply_markup=menu()) elif s == "💼 Мой профиль": info = get_info(message.chat.id) cash = int(info["cash"]) if info["cash"] == int(info["cash"]) else info["cash"] wasted = int(info["wasted"]) if info["wasted"] == int(info["wasted"]) else info["wasted"] s = "id: " + str(message.chat.id) + "\n" s += "Ваш баланс: " + str(cash) + " руб.\n" s += "Потрачено за всё время: " + str(wasted) + " руб.\n" await message.answer(s, reply_markup=info_btns()) elif s == "👤 Рефералы": ref_create(message.chat.id) referrals = get_ref(message.chat.id) refs = list(map(lambda x: x["cash"], referrals)) all_cash = sum(refs) count = len(refs) await message.answer("👤Ваш реферер: \nПроцент возврата по реферальной программе 50% \nВаша реферальная ссылка: https://t.me/swingerclubbot?start={} \nКоличество ваших рефералов: {} \nВыплаченная сумма за рефералов: {} руб.".format(message.chat.id, count, all_cash), reply_markup=tomenu()) else: await message.answer("Воспользуйтесь клавиатурой", reply_markup=menu())
async def handle_docs_photo(message): edit_photo(message.chat.id, message.photo[0].file_id) state = dp.current_state(user=message.from_user.id) await state.reset_state() await message.answer("Редактирование завершено", reply_markup=menu())
async def show_question_fnc(user_id, mess_id): state = await dp.get_current().current_state().get_data() # пытаемся найти у игрока ключ с полем хоста host_id = state.get("game_host") # если такой ключ не найден, значит функцию запустил хост и смотрим в его state if not host_id: host_id = user_id i = 1 # теперь переводим игру в другой цикл, где будем показывать готовность игроков к началу игры while True: # ogging.info("Зашли в start_minute в цикле " + str(i) + ": " + str(early_answ)) async with (dp.current_state(chat=host_id, user=host_id)).proxy() as data: show_teams = "Ожидание готовности участников:\n\n" # обновим статус по каждой команде for team in data["teams"]: if team["readyPlay"] == 0: status_text = "." * i else: status_text = "готов ✅" # формируем итоговый вывод команд для пользователя show_teams = show_teams + "<b>" + str( team["name"]) + "</b> - " + status_text + "\n" for team in data["teams"]: if team["host_id"] == user_id: await bot.edit_message_text(chat_id=user_id, message_id=mess_id, text=show_teams) break cnt_noconn_teams = sum( i['readyPlay'] == 0 for i in data["teams"]) # кол-во команд, которые еще не готовы i += 1 if i == 4: i = 1 # await self.bot.edit_message_reply_markup(chat_id=chat_id, message_id=message_id,reply_markup=self.markup_early_answer) await sleep(1) # как только закончились команды, которые не готовы - начинаем игру через 5 секунд if cnt_noconn_teams == 0: time_to_start = 3 show_teams = re.sub( r"Ожидание готовности участников:", f"Все готовы игра начнется через <b>{time_to_start}</b>", show_teams) for x in range(time_to_start): # меняем цифру каждую секунду show_teams = re.sub(r"\d", str(time_to_start - x), show_teams) # отобразим каждой команде статус других команд for team in data["teams"]: if team["host_id"] == user_id: await bot.edit_message_text(chat_id=team["host_id"], message_id=mess_id, text=show_teams) break await sleep(1) break async with (dp.current_state(chat=host_id, user=host_id)).proxy() as data: global quest_number quest_number = data["cur_question"] time_to_answer = 60 show_quest = f"Вопрос №{quest_number + 1}:\n\n<b>{quests[quest_number]}</b>\n\n⌛ <b>{time_to_answer}</b>" # даем 11 секунд на ознакомление с вопросом for x in range(time_to_answer): show_quest = re.sub(r"<b>\d+<\/b>", f"<b>{time_to_answer - x}</b>", show_quest) for team in data["teams"]: if team["host_id"] == user_id: await bot.edit_message_text(chat_id=team["host_id"], message_id=mess_id, text=show_quest) break await sleep(1) #быстро сбрасываем активность, чтобы в момент ответа пользователю не защитали ответ for team in data["teams"]: team[ "readyPlay"] = 0 # сбрасываем готовность, для ожидания других участников в новом вопросе #ПРОВЕРКА ОТВЕТОВ #обновим state #async with (dp.current_state(chat=host_id, user=host_id)).proxy() as data: logging.info("хранилищe " + str(data["teams"])) #проверим на правильность ответов и предложим пойти дальше for team in data["teams"]: add_text = "❌" cur_answer = db.get_answer(team["host_id"]) #если ответ совпадает, то прибавим бал logging.info("хранилищe " + str(cur_answer)) logging.info("Ответ в массиве " + str(answers[quest_number]).lower()) #если пользователь хоть что то ответил, то зайдем проверять на корректность его ответ if cur_answer: #правильный ответ является шаблоном для регулярного выражения, чтобы максимально засчитывать верные ответы if re.search(answersPattern[quest_number], cur_answer[1]): team["score"] += 1 add_text = "✅" show_quest = re.sub(r"(.+<b>\d+<\/b>)$", add_text, show_quest) # удалим инфу о таймере и оставим только текст вопроса if team["host_id"] == user_id: await bot.edit_message_text(chat_id=team["host_id"], message_id=mess_id, text=show_quest) #убираем верно или неверно, add_text = "Верно✅" if add_text == "✅" else "Неверно❌" if quest_number + 1 == len(quests): await bot.send_message( chat_id=user_id, text=add_text + '\n\nОтвет: ' + answers[quest_number] + "\n\n" + str(quest_number + 1) + ' из ' + str(len(quests)) + ' пройден ✅') result = "Итого:\n\n" #отсортируем список, будем выводить лидирующие команды первыми data["teams"].sort(key=lambda dictionary: dictionary['score'], reverse=True) for team in data["teams"]: result = result + team["name"] + ": <b>" + str( team["score"]) + "</b>\n" await bot.send_message(chat_id=user_id, text=result + '\n\nСпасибо за игру, вопросы закончились', reply_markup=exit_game) else: await bot.send_message( chat_id=user_id, text=add_text + '\n\nОтвет: ' + answers[quest_number] + "\n\n" + str(quest_number + 1) + ' из ' + str(len(quests)) + ' пройден ✅', reply_markup=next_question) #переходим к следующему вопросу data["cur_question"] += 1
async def show_answer_fnc(user_id, mess_id): # ПРОВЕРКА ОТВЕТОВ state = await dp.get_current().current_state().get_data() # пытаемся найти у игрока ключ с полем хоста host_id = state.get("game_host") # если такой ключ не найден, значит функцию запустил хост и смотрим в его state if not host_id: host_id = user_id i = 1 async with (dp.current_state(chat=host_id, user=host_id)).proxy() as data: # обновим state # async with (dp.current_state(chat=host_id, user=host_id)).proxy() as data: logging.info("хранилищe " + str(data["teams"])) # проверим на правильность ответов и предложим пойти дальше for team in data["teams"]: add_text = "Неверно!" if team["host_id"] == user_id: # если ответ совпадает, то прибавим бал logging.info("хранилищe " + str(data["teams"])) logging.info("ответ из хранилища " + str(team["cur_answer"])) logging.info("ответ из пакета " + str(user_answers)) if team["cur_answer"] == str(answers[quest_number]).lower(): team["score"] += 1 add_text = "Верно!" show_quest = re.sub(r"Время на ответ <b>\d+<\/b>", add_text, show_quest) # удалим инфу о таймере и оставим только текст вопроса await bot.edit_message_text(chat_id=team["host_id"], message_id=mess_id, text=show_quest) if quest_number + 1 == len(quests): await bot.send_message( chat_id=user_id, text=add_text + '\n\nОтвет: ' + answers[quest_number] + '\nКомментарий: ' + quest_comment[quest_number] + "\n\n" + str(quest_number + 1) + ' из ' + str(len(quests)) + ' пройден ✅') await bot.send_message(chat_id=user_id, text='Спасибо за игру, вопросы закончились', reply_markup=exit_game) else: await bot.send_message( chat_id=user_id, text=add_text + '\n\nОтвет: ' + answers[quest_number] + '\nКомментарий: ' + quest_comment[quest_number] + "\n\n" + str(quest_number + 1) + ' из ' + str(len(quests)) + ' пройден ✅', reply_markup=next_question) # переходим к следующему вопросу data["cur_question"] += 1
async def wait_teams_fnc(chat_id, mess_id): i = 1 is_host = False # logging.info("Зашли в start_minute в цикле " + str(i) + ": " + str(early_answ)) state = await dp.get_current().current_state().get_data() # пытаемся найти у игрока ключ с полем хоста host_id = state.get("game_host") # если такой ключ не найден, значит функцию запустил хост и смотрим в его state if not host_id: host_id = chat_id is_host = True while True: async with (dp.current_state(chat=host_id, user=host_id)).proxy() as data: show_teams = "Ожидание подключение других участников:\n\n" for team in data["teams"]: if not team["host_id"]: status_text = "." * i + " " else: status_text = "подключен ✅" # формируем итоговый вывод команд для пользователя show_teams = show_teams + "<b>" + str( team["name"]) + "</b> - " + status_text + "\n" cnt_noconn_teams = sum( i['host_id'] is None for i in data["teams"] ) # кол-во команд, которые еще не подключились i += 1 if i == 4: i = 1 #как только закончились команды, которым не назначен хост, выходим из цикла if cnt_noconn_teams == 0: show_teams = re.sub(r"Ожидание подключение других участников:", f"Все участники успешно подключились:", show_teams) await bot.edit_message_text(chat_id=chat_id, message_id=mess_id, text=show_teams) break #если функция запущена для хоста игры, то выводим ему результат с кнопкой Поделиться if is_host: show_teams = show_teams + "\n\nДайте игрокам отсканировать QRCODE или пришлите им ссылку" await bot.edit_message_text(chat_id=chat_id, message_id=mess_id, text=show_teams, reply_markup=shareLinkMrp) else: await bot.edit_message_text(chat_id=chat_id, message_id=mess_id, text=show_teams) # await self.bot.edit_message_reply_markup(chat_id=chat_id, message_id=message_id,reply_markup=self.markup_early_answer) await sleep(1) rules = "<b>Правила:</b>\n\n1. Вопросы не появятся, пока каждый игрок подтвердит готовность\n\n2. После нажатия кнопки \"Начать игру\"\\\"Далее\" у вас будет 60 секунд, чтобы написать свой ответ\n\n3. В зачет идет последний отправленный ответ" await bot.send_message( chat_id=chat_id, text="Теперь, как только все участники будут готовы, игра начнется!\n\n" + rules, reply_markup=start_game)