Проблема, с которой вы сталкиваетесь, связана с отсутствием объекта "chat" при вызове метода "bot.get_chat_member()". Это может произойти, если бот не находится в чате, на котором вы пытаетесь проверить подписки.
Чтобы решить эту проблему, вам необходимо убедиться, что ваш бот имеет доступ к желаемому чату. Это можно сделать, добавив бота в этот чат и предоставив ему необходимые права доступа (например, администратора).
Кроме того, у вас есть две функции для проверки подписок - check() и check2(). Вы можете использовать одну функцию для проверки подписок на все каналы, вместо того, чтобы иметь несколько одинаковых функций. Это может сделать код более читаемым и устранит повторение кода.
Вот пример переписанной функции check(), которая объединяет функции check(), check2() и check3():
```python
def check(call):
status = ["creator", "administrator", "member"]
channels = [
{"chat_id": "-1002058536468", "url": url_cm_fish},
{"chat_id": "-1001517647456", "url": url_alkash},
{"chat_id": "-1001758164447", "url": url_sancherkin},
]
subscribed_channels = []
for channel in channels:
if any(m.status in status for m in bot.get_chat_member(channel["chat_id"], call.message.chat.id)):
subscribed_channels.append(channel["url"])
if len(subscribed_channels) == len(channels):
bot.send_message(call.message.chat.id,
f"Спасибо, что подписались на каналы, вот ссылка на официальный дискорд сервер: {server}")
else:
reply_markup = start_markup()
for channel in channels:
if channel["url"] not in subscribed_channels:
reply_markup.add(types.InlineKeyboardButton(text="Подписаться", url=channel["url"]))
bot.send_message(call.message.chat.id, "Подпишитесь на каналы!", reply_markup=reply_markup)
```
В этом примере кода мы создаем список каналов, который содержит информацию о каждом канале - его chat_id и url. Затем мы проходим по каждому каналу и проверяем статус пользователя в чате канала. Если пользователь имеет один из заданных статусов для хотя бы одного канала, мы добавляем url этого канала в список подписанных каналов.
Если длина списка подписанных каналов равна длине списка каналов, значит пользователь подписан на все каналы. В этом случае мы отправляем сообщение с благодарностью и ссылкой на сервер Discord. Если пользователь не подписан на все каналы, мы отправляем сообщение с запросом на подписку на неподписанные каналы, предоставляя кнопку "Подписаться" для каждого канала.
Это лишь пример решения проблемы, и вам может потребоваться внести некоторые изменения в соответствии с вашими конкретными требованиями и структурой данных для каналов.