2017-12-31 33 views
0

@ bot.event 을 discord.py의 톱니에 사용할 수 있는지 궁금합니다. __ 내 장부 클래스@ cog discord.py의 bot.event

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

일을 시도,하지만 난 내 __init에 self.bot을 정의에도 불구하고 나는 오류를

NameError: name 'self' is not defined 

를 얻을.

톱니 바퀴로 bot.event를하는 방법이 다른가요? 그렇지 않습니다.

편집 : 나는 그것이 작동 (내 대답을 참조) 얻을 수있는 방법을 생각하지만, 사람이 더 좋은 방법을 알고 있다면,

답변

2

이것은 qspitzers 답변을 권장하지 않습니다. 이것은 귀하의 이벤트를 톱니 바퀴로 옮기는 합리적인 방법이 아니므로 대답을 알 수 없거나 예기치 않은 예외가 발생할 수 있습니다.

대신 다음과 같이하십시오.

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 ---->', bot.user) 
     print('ID:', bot.user.id) 

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

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

톱니 안에 이벤트를 배치하려면 데코레이터가 필요하지 않습니다. 또한 톱니 안에있는 이벤트는 기본 이벤트를 덮어 쓰지 않으며이 이벤트는 bot.extra_events에 저장됩니다.

0

그래서 그것을 게시 주시기 때문에 더 나은 방법이있을 수 있습니다, 나는 생각 이것이 작동하도록하는 방법. 내가 한 것은 새로운 함수를 생성하고 setup 함수에서 bot 변수를 전달한 것입니다. 그런 다음 새 함수의 백그라운드 작업을 만들고 그 안에 @ 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)) 

입니다 : 이 일을하는 나쁜 방법입니다. 대신에 정신적 방법을 사용하십시오