你能帮我解决带有循环(在任务中)的discord.py 中的错误吗?

问题描述 投票:0回答:1

如果我运行我的不和谐机器人,我会遇到此错误:

Traceback (most recent call last):File "c:\Users\progi\Documents\GitHub\discord_bot\main.py", line 221, in <module>bot.add_cog(MyCog(bot))^^^^^^^^^^File "c:\Users\progi\Documents\GitHub\discord_bot\main.py", line 207, in initself.check_empty_channels.start()File "C:\Users\progi\AppData\Local\Programs\Python\Python312\Lib\site-packages\discord\ext\tasks_init_.py", line 398, in startself._task = asyncio.create_task(self._loop(*args, **kwargs))^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^File "C:\Users\progi\AppData\Local\Programs\Python\Python312\Lib\asyncio\tasks.py", line 417, in create_taskloop = events.get_running_loop()^^^^^^^^^^^^^^^^^^^^^^^^^RuntimeError: no running event loopsys:1: RuntimeWarning: coroutine 'Loop._loop' was never awaited

请帮我解决这个问题!

我用这段代码运行我的机器人(discord.py):

import os
import discord
import discord.ui
from worlds import *
from vars import *
from lists import *
from rule_checker import *
from discord.ext import commands, tasks
from discord import app_commands
from discord import ActionRow, Button, ButtonStyle
from discord.utils import get
import asyncio

from env import *

intents = discord.Intents.all()
bot = commands.Bot(command_prefix='!', intents=intents, test_guilds=[1238156026054705182])  # Префикс для команд
client = discord.Client(intents=intents)
tree = bot.tree

error_embed = discord.Embed(description="У вас недостаточно прав на это действие!", color=embed_color)

#TOKEN = os.getenv("TOKEN")

class Dropdown(discord.ui.Select):
    def __init__(self):
        options = [
            #discord.SelectOption(label=" » Асгард", value=str(roleid3), emoji="🕊️"),
            discord.SelectOption(label=" » Альвхейм", value=str(roleid1), emoji="🧚‍♂️"),
            discord.SelectOption(label=" » Мидгард", value=str(roleid2), emoji="🏃"),
            discord.SelectOption(label=" ∥ Муспельхейм", value=str(roleid4), emoji="🔥"),
            discord.SelectOption(label=" ∥ Ванахейм", value=str(roleid5), emoji="🔮"),
            discord.SelectOption(label=" ∥ Йотунхейм", value=str(roleid6), emoji="🦣"),
            discord.SelectOption(label=" ∥ Свартальвхейм", value=str(roleid7), emoji="⚒️"),
            discord.SelectOption(label=" ∥ Нифльхейм", value=str(roleid8), emoji="☁️"),
            discord.SelectOption(label=" ∥ Хельхейм", value=str(roleid9), emoji="🧊")
        ]

        super().__init__(placeholder="Выберите свой сервер",options=options)
    
    async def callback(self, inter: discord.Interaction):
        # Получаем пользователя, который выбрал опцию
        member = inter.user

        # Получаем ID роли из выбранной опции
        role_id = int(self.values[0])

        # Получаем роль по ID
        role = inter.guild.get_role(role_id)

        # Проверяем роль по доступным серверами к игре
        if role_id == 1238473654585786369 or role_id == 1238473033707028582:
            # Проверяем, есть ли у пользователя указанная роль
            if role in member.roles:
                # Если роль есть, убираем ее
                await member.remove_roles(role)
                await inter.response.send_message(f"> ❌ Роль <@&{role.id}> была убрана.", ephemeral=True)
            else:
                # Если роли нет, выдаем ее
                await member.add_roles(role)
                await inter.response.send_message(f"> ✅ Роль <@&{role.id}> была выдана.", ephemeral=True)
        else:
            await inter.response.send_message(f"> ⚠️ Эта роль недоступна для вас!", ephemeral=True)



class DropdownView(discord.ui.View):
    def __init__(self):
        super().__init__()
        self.add_item(Dropdown())

class MyView1(discord.ui.View):
    @discord.ui.button(label="Асгард", style=discord.ButtonStyle.blurple, emoji="🕊️")
    async def second_button_callback(self, interaction, button):
        await interaction.response.send_message(embed=world2, ephemeral=True)

    @discord.ui.button(label="Альвхейм", style=discord.ButtonStyle.blurple, emoji="🧚‍♂️")
    async def first_button_callback(self, interaction, button):
        await interaction.response.send_message(embed=world1, ephemeral=True)

    @discord.ui.button(label="Мидгард", style=discord.ButtonStyle.blurple, emoji="🏃")
    async def five_button_callback(self, interaction, button):
        await interaction.response.send_message(embed=world5, ephemeral=True)

    @discord.ui.button(label="Муспелльхейм", style=discord.ButtonStyle.gray, emoji="🔥")
    async def six_button_callback(self, interaction, button):
        await interaction.response.send_message(embed=world6, ephemeral=True)

    @discord.ui.button(label="Ванахейм", style=discord.ButtonStyle.gray, emoji="🔮")
    async def tree_button_callback(self, interaction, button):
        await interaction.response.send_message(embed=world3, ephemeral=True)

    @discord.ui.button(label="Йотунхейм", style=discord.ButtonStyle.gray, emoji="🦣")
    async def four_button_callback(self, interaction, button):
        await interaction.response.send_message(embed=world4, ephemeral=True)

    @discord.ui.button(label="Свартальвхейм", style=discord.ButtonStyle.gray, emoji="⚒️")
    async def eight_button_callback(self, interaction, button):
        await interaction.response.send_message(embed=world8, ephemeral=True)

    @discord.ui.button(label="Нифльхейм", style=discord.ButtonStyle.gray, emoji="☁️")
    async def seven_button_callback(self, interaction, button):
        await interaction.response.send_message(embed=world7, ephemeral=True)

    @discord.ui.button(label="Хельхейм", style=discord.ButtonStyle.gray, emoji="🧊")
    async def nine_button_callback(self, interaction, button):
        await interaction.response.send_message(embed=world9, ephemeral=True)

@bot.event
async def on_ready():
    print(f'Logged in as {bot.user.name} ({bot.user.id})')

    await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.playing, name='scandworld.fun'))

    channel_with_buttons = bot.get_channel(1238168631091925012)
    async for message in channel_with_buttons.history(limit=None):
        await message.delete()
    if channel_with_buttons:

        # Отправляем сообщение с кнопками
        embed1 = discord.Embed(description='## Добро пожаловать в раздел миров! \n```Здесь вы можете почитать полезную информацию о всех существующих мирах нашего сервера.```\n *Для того, чтобы узнать о мирах подробнее, нажмите на кнопку.*', color=embed_color)
        await channel_with_buttons.send(embed=embed1, view=MyView1())
    else:
        print(f"Канал {channel_with_buttons} не найден.")

    channel_with_roles = bot.get_channel(1238168344000073802)
    async for message in channel_with_roles.history(limit=None):
        await message.delete()
    if channel_with_roles:

        # Отправляем сообщение с кнопками
        embed2 = discord.Embed(description='## Добро пожаловать в раздел ролей \n```Здесь вы можете получить роль любого мира, выбрав его из меню!``` \n*Выбор роли может помочь найти друзей для игры в вашем мире или помочь найти помощь!*', color=embed_color)
        await channel_with_roles.send(embed=embed2, view=DropdownView())
    else:
        print(f"Канал {channel_with_roles} не найден.")

@bot.command()
async def написать(ctx, *, text=None):
    # Отправляем сообщение от имени бота в тот же чат

    for role_id in moder_roles:
        role = discord.utils.get(ctx.author.roles, id=role_id)
        if role:
            
            await ctx.send(text)
            await ctx.message.delete()
            return
        else:
            await ctx.send(embed=error_embed, delete_after=delete_time)
            return

@bot.command()
async def панелька(ctx, *, text=None):
    for role_id in moder_roles:
        role = discord.utils.get(ctx.author.roles, id=role_id)
        if role:
            # Создаем Embed (панель) с кастомным цветом
            embed = discord.Embed(description=text, color=embed_color)  # Зеленый цвет

            # Прикрепляем изображение (если оно есть)
            if ctx.message.attachments:
                image_url = ctx.message.attachments[0].url
                embed.set_image(url=image_url)  # Отображаем GIF как анимацию

            # Отправляем Embed от имени бота в тот же чат
            await ctx.send(embed=embed)
            await ctx.message.delete()
            return
        else:
            await ctx.send(embed=error_embed, delete_after=delete_time)
            return


@bot.command(description="Информация о сервере")
async def инфо(ctx):
    # Отправляем сообщение только автору команды
    server = ctx.guild
    total_members = server.member_count
    online_members = sum(member.status == discord.Status.online for member in server.members)

    text = f'## Информация о {server} \n Айпи сервера: `scandworld.fun` \n Участников: `{total_members}` \n Онлайн: `{online_members}` \n\n## Полезные каналы \n Прочитайте правила: <#1238162480996286534> \n Выберите себе роль: <#1238168344000073802> \n Следите за новостями: <#1238481357676478536> \n\n *Связь с администрацией:* <#1238191924502990959>'

    embed = discord.Embed(description=text, color=embed_color)
    # Закомментировал удаление сообщения
    await ctx.send(embed=embed) #, delete_after=delete_time)
    #await ctx.message.delete()

@bot.command(description="Создать голосовой канал")
async def гс(ctx, channel_name="Г2С111", max_members=2):
    # Получаем сервер
    server = ctx.guild

    category = discord.utils.get(server.categories, id=category_id1)

    if channel_name == "Г2С111":
        await ctx.send(f"Нельзя создать канал без имени!")
    else:

    # Создаем голосовой канал с указанным именем и максимальным количеством участников в указанной категории
        channel = await server.create_voice_channel(channel_name, user_limit=max_members, category=category)

        await ctx.send(f"Голосовой канал '{channel.name}' с максимальным количеством участников {max_members}.")

class MyCog(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
        self.check_empty_channels.start()

    @tasks.loop(minutes=5)
    async def check_empty_channels(self):
        # Замените на ID вашей категории
        category = self.bot.get_channel(category_id1)

        for channel in category.voice_channels:
            if len(channel.members) == 0:
                await channel.delete()

    @check_empty_channels.before_loop
    async def before_check_empty_channels(self):
        await self.bot.wait_until_ready()
bot.add_cog(MyCog(bot))

# Запускаем бота с вашим токеном
bot.run(TOKEN)



我使用了任何代码行,但我不知道为什么这不起作用

我检查了所有帖子,但没有找到必要的信息

请帮助我!我和副驾驶搜索更多信息,但他没有给我需要我的信息

python python-3.x discord discord.py helper
1个回答
0
投票

作为discord.py v2.0 中 asyncio 的扩展更改,扩展和 cogs 的加载和卸载现在是异步的(了解更多)。 这样,您将需要在异步上下文中加载

MyCog
,如下所示:

import asyncio

# ...

async def main():
    async with bot:
        await bot.add_cog(MyCog(bot))
        await bot.start('TOKEN')

asyncio.run(main())

asyncio.run()
函数会自动为您创建一个循环,这可以防止启动任务时发生
RuntimeError: no running event loopsys
错误。

© www.soinside.com 2019 - 2024. All rights reserved.