【问题标题】:List users in IRC channel using Twisted Python IRC framework使用 Twisted Python IRC 框架列出 IRC 频道中的用户
【发布时间】:2023-03-27 16:11:02
【问题描述】:

我正在尝试编写一个函数,该函数将使用 Twisted Python 将 IRC 频道中的缺口列表打印到该频道。我该怎么做呢?我已经阅读了 API 文档,并且在这个站点上只看到了一个与我的问题类似的问题,但它并没有真正回答我的问题。如果我知道如何获取用户列表(或 Twisted 识别的任何用户列表),我可以简单地使用 for 循环迭代列表,但我不知道如何获取此列表。

【问题讨论】:

  • 这不是骗人的,我什至提到了你所链接的那个问题,因为这不是我想要做的,也没有帮助。
  • 实际上是另一个问题的重复;我很好奇为什么你认为不是。
  • 这不是骗子,因为另一个问题不一样,答案也不起作用。我说的是一个使用 IRCClient 协议的 irc BOT,所以它是不同的。
  • 但它是一样的。该答案确实适用于您的问题,完全按照书面说明。您需要更具体地提出问题:尝试该解决方案时会发生什么?为什么它不能解决你的问题?

标签: python twisted irc


【解决方案1】:

您似乎认为的链接示例是相同的,使用WHO,不同的命令,不同的目的。正确的方法是使用NAMES

扩展 IRCClient 以支持名称命令。

from twisted.words.protocols import irc
from twisted.internet import defer

class NamesIRCClient(irc.IRCClient):
    def __init__(self, *args, **kwargs):
        self._namescallback = {}

    def names(self, channel):
        channel = channel.lower()
        d = defer.Deferred()
        if channel not in self._namescallback:
            self._namescallback[channel] = ([], [])

        self._namescallback[channel][0].append(d)
        self.sendLine("NAMES %s" % channel)
        return d

    def irc_RPL_NAMREPLY(self, prefix, params):
        channel = params[2].lower()
        nicklist = params[3].split(' ')

        if channel not in self._namescallback:
            return

        n = self._namescallback[channel][1]
        n += nicklist

    def irc_RPL_ENDOFNAMES(self, prefix, params):
        channel = params[1].lower()
        if channel not in self._namescallback:
            return

        callbacks, namelist = self._namescallback[channel]

        for cb in callbacks:
            cb.callback(namelist)

        del self._namescallback[channel]

例子:

def got_names(nicklist):
    log.msg(nicklist)
self.names("#some channel").addCallback(got_names)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2011-03-08
    • 2012-06-06
    • 2012-06-05
    • 2015-03-23
    • 1970-01-01
    • 2014-02-13
    相关资源
    最近更新 更多