Вопрос:

@ bot.event in cog discord.py

python-3.x discord discord.py

3026 просмотра

3 ответа

325 Репутация автора

Мне было интересно, можно ли использовать @ bot.event в Cog для discord.py. Я пытался делать

@self.bot.event
async def on_member_join(self, ctx, member):
    channel = discord.utils.get(member.guild.channels, name='general')
    await channel.send("hello")

в моем классе Cog, но я получаю ошибку

NameError: name 'self' is not defined

хотя я определяю self.bot в своем __init __.

Есть ли другой способ сделать bot.event в cogs или это просто невозможно?

Автор: qspitzer Источник Размещён: 31.12.2017 12:12

Ответы (3)


0 плюса

325 Репутация автора

Итак, я нашел способ заставить это работать. Я создал новую функцию и передал ей переменную бота из функции установки. Затем я создал фоновое задание новой функции, и в нем запустился @ bot.event. Код

def xyz(bot):
    @bot.event
    async def on_member_join(member):
        print("ABC")

def setup(bot):
    bot.loop.create_task(xyz(bot))
    bot.add_cog(cogClass(bot))

на случай, если кто-то не понял моего объяснения

РЕДАКТИРОВАТЬ: это плохой способ делать вещи. вместо этого используйте умственный способ

Автор: qspitzer Размещён: 31.12.2017 01:13

5 плюса

486 Репутация автора

Решение

Я не рекомендую ответ qspitzers, так как это не разумный способ перенести ваши события в Cog, и ответ может вызвать некоторые неизвестные / неожиданные исключения.

Вместо этого сделайте что-то вроде этого.

from discord.ext import commands

class Events:
    def __init__(self, bot):
        self.bot = bot

    async def on_ready(self):
        print('Ready!')
        print('Logged in as ---->', self.bot.user)
        print('ID:', self.bot.user.id)

    async def on_message(self, message):
        print(message)

def setup(bot):
    bot.add_cog(Events(bot))

Имейте в виду, что для помещения события в винтик вам не нужен декоратор. Также события внутри Cog не перевешивают события по умолчанию, и эти события будут сохранены в bot.extra_events.

Автор: mental Размещён: 04.01.2018 07:48

1 плюс

33933 Репутация автора

Чтобы зарегистрировать событие из нового стиля Cog , вы должны использовать commands.Cog.listenerдекоратор. Ниже приведен пример ментала, преобразованный в новый стиль:

from discord.ext import commands

class Events(commands.Cog):
    def __init__(self, bot):
        self.bot = bot

    @commands.Cog.listener()
    async def on_ready(self):
        print('Ready!')
        print('Logged in as ---->', self.bot.user)
        print('ID:', self.bot.user.id)

    @commands.Cog.listener()
    async def on_message(self, message):
        print(message)

def setup(bot):
    bot.add_cog(Events(bot))
Автор: Patrick Haugh Размещён: 06.05.2019 01:33
Вопросы из категории :
32x32