Дискорд бот работает не целостно

Вот пример кода:

import vk_api
from vk_api.longpoll import VkEventType, VkLongPoll
import discord
from discord.ext import commands
import asyncio

client = commands.Bot(command_prefix='!', intents=discord.Intents.all())

@client.event
async def on_ready():
    print('Бот подключен к Discord!')

@client.event
async def on_message(message):
    if message.author == client.user: 
        return

@client.command()
async def привет(ctx):
    await ctx.send('Привет!')

login = 'login'
password = 'password'
api_version = 'api'
chat_id = 1
chat_id2 = 2

vk_session = vk_api.VkApi(login, password, app_id=api_version)
vk_session.auth()

vk = vk_session.get_api()

longpoll = VkLongPoll(vk_session)
async def disbot():
    for event in longpoll.listen():
        if event.type == VkEventType.MESSAGE_NEW and event.from_chat and event.chat_id == chat_id:
            user_id = event.user_id
            message = event.text
            attachments = event.attachments
            user_info = vk.users.get(user_ids=user_id)
            user_name = user_info[0]['first_name'] + ' ' + user_info[0]['last_name']
            await client.wait_until_ready()
            channel = client.get_channel(id1)
            if '@all' in message:
                if 'attach1_type' in attachments:
                    await channel.send(f"{user_name} » {message} [Вложение] @everyone")
                else:
                    await channel.send(f"{user_name} » {message} @everyone")
            else:
                if 'attach1_type' in attachments:
                    await channel.send(f"{user_name} » {message} [Вложение]")
                else:
                    await channel.send(f"{user_name} » {message}")

        elif event.type == VkEventType.MESSAGE_NEW and event.from_chat and event.chat_id == chat_id2:
            user_id = event.user_id
            message = event.text
            attachments = event.attachments
            user_info = vk.users.get(user_ids=user_id)
            user_name = user_info[0]['first_name'] + ' ' + user_info[0]['last_name']
            await client.wait_until_ready()
            channel = client.get_channel(id2)
            if 'attach1_type' in attachments:
                await channel.send(f"{user_name} » {message} [Вложение] @everyone")
            else:
                await channel.send(f"{user_name} » {message} @everyone")

async def main():
    async with client:
        client.loop.create_task(disbot())
        await client.start('Token')

asyncio.run(main())

Сделал пересылку сообщений из вк в дискорд и решил добавить пару команд в бота, но как не пытался вместе эти задачи не выполняются.


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

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

Возможно, ваш код сейчас пытается использовать два разных метода обработки событий: один через библиотеку discord.py и другой через библиотеку asyncio.

Для того чтобы оба этих асинхронных процесса работали вместе, вам нужно внести следующие изменения:

Удали использование asyncio.run(main()) и замените его на client.run('Token') для запуска бота discord.py.

Объедините вашу функцию disbot() с обработчиками событий discord.py.

Лучше не использовать await client.wait_until_ready() в цикле обработки событий VK, подождите, пока клиент Discord готов к работе перед началом обработки событий VK.

Вот:

# Ваши импорты и остальное...

@client.event
async def on_ready():
    print('Бот подключен к Discord!')
    await disbot()

async def disbot():
    # Здесь твой код обработки событий VK
    pass

@client.command()
async def привет(ctx):
    await ctx.send('Привет!')

# Запуск бота Discord
client.run('Token')
→ Ссылка