Проблема с массивом бота

Есть код

async def check_sub_channel(channels,user_id):
    for channel in channels:
        chat_member = await bot.get_chat_member(chat_id=channel[1], user_id=user_id)
        if chat_member["status"] == "left":
            return False
        return True

@dp.message_handler()
async def mess_handler(message: types.Message):
    if await check_sub_channel(cfg.CHANNELS, message.from_user.id):
        return True
    else:
        await bot.send_message(message.chat.id, f" @{str(message.from_user.username)} Для пропуска сообщений, подпишись на канал", reply_markup=nav.showChannels(), parse_mode = "html")
        await message.delete()

И есть массив с этими каналами

CHANNELS = [["Канал 1", "-100199460****", "https://t.me/dsf****"],
            ["Канал 2", "-100214592****", "https://t.me/susidne****"]]

Проблема в том, что бот пропускает сообщения, если подписаться только на первый канал. Как можно решить? Через continue в цикле не работает


Ответы (2 шт):

Автор решения: Collapse

Потому что Ваш цикл успевает проверить всего 1 канал, который в списке первый, так как если пользователя нет - Вы сразу возвращаете false или true. Т.е если пользователя не будет в первой группе, но будет в 20 последующих, то Вы получите false, а если будет в первой группе, но не будет в 20 других, то Вы получите true. Сопоставляйте как-то иначе, например ставьте счетчик и увеличивайте его каждый раз, когда пользователь есть в группе, а если его нет - ничего не делайте, после цикла проверяйте количество групп в массиве с счетчиком, если счетчик равен количеству групп в массиве (размеру массива), то делаем вывод что пользователь есть во всех группах

→ Ссылка
Автор решения: Kamran Pulatov
async def check_sub_channel(channels,user_id):
    not_sub_channels_amount = 0
    for channel in channels:
        chat_member = await bot.get_chat_member(chat_id=channel[1], user_id=user_id)
        if chat_member["status"] == "left":
            not_sub_channels_amount += 1
    return not_sub_channels_amount == 0

Таким образом идет проверка подписан ли человек на все каналы, и хоть если в счетчике будет 1, то он сразу вернет False

Как будет работать проверка в хендлере

@dp.message_handler()
async def mess_handler(message: types.Message):
    if not await check_sub_channel(cfg.CHANNELS, message.from_user.id):
        await bot.send_message(message.chat.id, f" @{str(message.from_user.username)} Для пропуска сообщений, подпишись на канал", reply_markup=nav.showChannels(), parse_mode = "html")
        await message.delete()

    return True
→ Ссылка