我正在用Python编写一个简单的IRC bot。实际上,它可以连接到一个特定的通道,读取消息并发送响应,但它不能区分通道消息和私人消息。
:
连接到同一频道的John向Bot的聊天发送了一条私信,比如"!说"你好";他们必须发送"你好"到同一个私人聊天,只有约翰。
相反,当他读到"!"在频道板上说"你好",必须向频道发送"你好"。
我的代码:
ircmsg = connection.ircsock.recv(2048)
ircmsg_clean = ircmsg.strip(str.encode('nr'))
if ircmsg.find(str.encode("!say")) != -1:
try:
parts = ircmsg_clean.split()
content = parts[4]
connection.sendMsg(channel, content)
except IndexError:
connection.sendMsg(channel, "Invalid syntax")
连接文件:def sendmsg(channel, msg):
ircsock.send(str.encode("PRIVMSG " + channel +" :" + msg + "n"))
我知道如何向特定用户发送消息:
def sendPrivateMsg(username, msg):
ircsock.send(str.encode("PRIVMSG " + username + " :" + msg + "n"))
但必须知道消息来自何处,渠道或用户,并发送适当的响应。
对不起,我的英语不好。
消息的源包含在协议消息中,现在您只是没有使用它。
在你做这个的部分
parts = ircmsg_clean.split()
你把它放到列表parts
。
如果我没记错,并且对RFQ理解正确的话,您从服务器收到的irc消息看起来是这样的:
:John!something@something.org PRIVMSG BotName:你收到这个消息了吗?
所以拆分会得到这样的结果:
[':John!something@something.org', 'PRIVMSG', 'BotName', ':Are', 'you', 'receiving', 'this', 'message', '?']
消息的发送者是第一个元素parts
,所以是parts[0]
。你需要去掉多余的':'。
消息的目标在parts[2]
,它可以是您的名称或通道名称,然后您需要将目标与您自己的名称进行比较,以了解它是给您的消息还是给通道的消息。
如果为真,你可以这样做:
source = parts[0].strip(':')
content = ' '.join(parts[3:]).strip(':')
connection.sendMsg(source, content)
请注意,消息的实际内容也被拆分了,因此如果您这样做,则需要将其重新连接到字符串中。如果您点击了IndexError
,这意味着您收到了一条只有一个单词的消息,因为第一个单词位于索引3,而不是4。