示例#1
0
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()
示例#2
0
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}) успешно подключился(-ась) к игре"
    )
示例#3
0
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
示例#4
0
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')
示例#5
0
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("Расскажите о себе и с кем хотите познакомиться")
示例#6
0
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])
示例#7
0
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("Из какого вы города?")
示例#8
0
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("Отправьте мне картинку для анкеты")
示例#9
0
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()
示例#10
0
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)
示例#11
0
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())
示例#12
0
    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()
示例#13
0
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()
示例#14
0
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())
示例#15
0
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("Сколько вам лет?")
示例#16
0
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("Расскажите о себе и с кем хотите познакомиться")
示例#17
0
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('Сообщения отправлены')
示例#18
0
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))
示例#19
0
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)
示例#20
0
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)
示例#21
0
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()
示例#22
0
 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  # по умолчанию считаем что тот кто создал игру будет вести игру, а не играть
示例#23
0
 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()
示例#26
0
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()) 
示例#27
0
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)