2

twisted.words.protocols.irc モジュールを使って IRC ボットを作ろうとしています。

ボットはチャネルからのメッセージを解析し、コマンド文字列を解析します。

bot が whois コマンドを送信してニックネームを特定する必要がある場合を除いて、すべて正常に動作します。whois 応答は、privmsg メソッド (解析を行っているメソッド) が戻るまで処理されません。
例:

from twisted.words.protocols import irc

class MyBot(irc.IRClient):

..........

    def privmsg(self, user, channel, msg):
        """This method is called when the client recieves a message"""
        if msg.startswith(':whois '):
            nick = msg.split()[1]
            self.whois(nick)
            print(self.whoislist)

    def irc_RPL_WHOISCHANNELS(self, prefix, params):
        """This method is called when the client recieves a reply for whois"""
        self.whoislist[prefix] = params

self.whois(nick) の後にボットに返信を待たせる方法はありますか?

おそらくスレッドを使用してください(私はそれらの経験がありません)

4

2 に答える 2

-2

すべてのハンドラーメソッドをスレッドとして実行し、kirelaginの提案に従ってフィールドを設定してから、whoisクエリを実行し、データを受信するメソッドを変更して、応答を受信したときにフィールドを変更することで、これを修正できました。これは最もエレガントなソリューションではありませんが、機能します。

変更されたコード:

class MyBot(irc.IRClient):
..........

    def privmsg(self, user, channel, msg):
        """This method is called when the client recieves a message"""
        if msg.startswith(':whois '):
            nick = msg.split()[1]

            self.whois_status = 'REQUEST'
            self.whois(nick)
            while not self.whois_status == 'ACK':
                sleep(1)

            print(self.whoislist)

    def irc_RPL_WHOISCHANNELS(self, prefix, params):
        """This method is called when the client recieves a reply for whois"""
        self.whoislist[prefix] = params

    def handleCommand(self, command, prefix, params):
        """Determine the function to call for the given command and call
        it with the given arguments.
        """
        method = getattr(self, "irc_%s" % command, None)
        try:
            # all handler methods are now threaded.
            if method is not None:
                thread.start_new_thread(method, (prefix, params))
            else:
                thread.start_new_thread(self.irc_unknown, (prefix, command, params))
        except:
            irc.log.deferr()

    def irc_RPL_WHOISCHANNELS(self, prefix, params):
        """docstring for irc_RPL_WHOISCHANNELS"""
        self.whoislist[prefix] = params

    def irc_RPL_ENDOFWHOIS(self, prefix, params):
        self.whois_status = 'ACK'
于 2013-06-01T20:23:41.823 に答える