• Я не могу решить вопрос с асинхронным выполнением кода. Оптимальное решение?

    @esq
    Никита Обухов, если возникли проблемы с производительностью, то имеет смысл запустить какой-нибудь профилировщик и проанализировать результаты его работы. Для профилирования многопоточного/асинхронного кода можете попробовать, например, Yappi.

    Что касается Вашего кода, то после беглого просмотра репозитория хотел бы отметить следующее:

    1. Зачем в репозиторий добавлен файл .cache? Судя по его содержимому это некий токен доступа:
    содержимое файла .cache
    {"access_token": "BQCSmZjp2...", "token_type": "Bearer", "expires_in": 3600, "expires_at": 1689875354}

    Справедливости ради нужно отметить, что срок его действия истек примерно за 3 дня до того как он был опубликован 23.07.2023:
    >>> import datetime
    >>> datetime.datetime.fromtimestamp(1689875354)
    datetime.datetime(2023, 7, 20, 21, 49, 14)

    Поэтому компрометации учетной записи не произошло, тем не менее, никаким токенам доступа, логинам, паролям и иной подобной информации не место в публичном репозитории. Следите за этим!

    2. Зачем в репозиторий добавлены папки __pycache__ и cogs/__pycache__? Им там тоже не место.
    Добавьте в корневую папку файл .gitignore, например такой. При необходимости его следует отредактировать, чтобы он соответствовал проекту.

    3. Что касается

    не переборщил ли я с асинхронниками, и блокировками.

    то обратите внимание на следующий код в файле bot_handler.py:
    # ... skip ....
    async def load_cog():
        for file in os.listdir("./cogs"):
            if file.endswith(".py"):
                bot.load_extension(f"cogs.{file[:-3]}")
                log_message(f"The cog {file[:-3]} has been loaded.")
    # ... skip ...
    if __name__ == '__main__':
        bot.loop.run_until_complete(load_cog())
    # ... skip ...

    Функция load_cog не содержит вызовов каких-либо корутин, т.е. инструкций вида await some_coroutine(), поэтому нет никого смысла запускать её с использованием event loop. Убирайте ключевое слово async и используйте её как обычную синхронную функцию. Кроме того, аналогичная функция есть в библиотеке disnake. Можете использовать её.

    Я уверен, что существует масса и других способов улучшить Вашу программу, но у меня, к сожалению, нет возможности детально разбираться с кодом и давать рекомендации.
  • Я не могу решить вопрос с асинхронным выполнением кода. Оптимальное решение?

    @esq
    Никита Обухов, ну вот, уже лучше. Исчезла ошибка AttributeError: ... has no attribute 'call_soon_threadsafe', вызванная тем, что в функцию asyncio.run_coroutine_threadsafe(coro, loop) передавалась не ссылка на event loop, а функция, которая его возвращает.

    Новая ошибка RuntimeError: There is no current event loop in thread 'Thread-3' вызвана тем, что сам плейер запускается в отдельном потоке, где нет своего event loop'а.

    Нужно найти, где в коде программы имеется ссылка на event loop основного потока (она не обязательно должна называться client.loop) или получить такую ссылку с помощью asyncio.get_event_loop() и подумать как её передать в функцию my_after.

    По тем отрывкам кода, что были приведены ранее, я это сделать затрудняюсь.
  • Я не могу решить вопрос с асинхронным выполнением кода. Оптимальное решение?

    @esq
    Никита Обухов, попробуйте, для начала, получить event loop с помощью функции asyncio.get_event_loop() и вызвать с его использованием функцию asyncio.run_coroutine_threadsafe(coro, loop) в примере выше.
    Т.е. в функции my_after нужно изменить последнюю строку следующим образом:
    def my_after(self, error):
        # ...skip...
        asyncio.run_coroutine_threadsafe(coro, asyncio.get_event_loop()).result()
  • Я не могу решить вопрос с асинхронным выполнением кода. Оптимальное решение?

    @esq
    disnake.ext.tasks.loop тоже не является ссылкой на event loop, поэтому и возникает ошибка: AttributeError: 'function' object has no attribute 'call_soon_threadsafe'.
  • Я не могу решить вопрос с асинхронным выполнением кода. Оптимальное решение?

    @esq
    Функция asyncio.run_coroutine_threadsafe(coro, loop) принимает в качестве второго аргумента ссылку на event loop, а Вы ей передаёте функцию, которая возвращает event loop: asyncio.get_event_loop.