2017-12-31 32 views
0

discott.pyのコグで@ bot.event を使用することが可能かどうか疑問に思っていました。 __私は私のCOGクラスで@ 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

私はあなたのイベントをコグに移動する賢明な方法ではないので、答えはいくつかの未知の/予想外の例外をスローする可能性があります。

代わりにこのようなことをしてください。

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を実行しました。コードは、誰もが私の説明

EDITを理解していなかった場合には

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)) 

です: これは物事の悪い方法です。代わりに精神的な方法を使用してください

関連する問題