Python IRC Bot,区分频道消息和私信
Python IRC Bot, distinguish from channel messages and private messages
我正在 Python 中编写一个简单的 IRC 机器人。实际上,它可以连接到特定频道,读取消息并发送响应,但无法区分频道消息和私人消息。
示例:
连接到同一频道的 John 向 Bot 的聊天室发送私人消息,例如“!打个招呼”;
Bot 必须发送 "hello" 到同一个私人聊天,只能发送给 John。
取而代之的是,当机器人在频道面板中读取“!say hello”时,必须向频道发送 "hello"。
我的代码:
ircmsg = connection.ircsock.recv(2048)
ircmsg_clean = ircmsg.strip(str.encode('\n\r'))
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 :Are you receiving this message ?
如此拆分会导致:
[':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。
我正在 Python 中编写一个简单的 IRC 机器人。实际上,它可以连接到特定频道,读取消息并发送响应,但无法区分频道消息和私人消息。
示例:
连接到同一频道的 John 向 Bot 的聊天室发送私人消息,例如“!打个招呼”;
Bot 必须发送 "hello" 到同一个私人聊天,只能发送给 John。
取而代之的是,当机器人在频道面板中读取“!say hello”时,必须向频道发送 "hello"。
我的代码:
ircmsg = connection.ircsock.recv(2048)
ircmsg_clean = ircmsg.strip(str.encode('\n\r'))
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 :Are you receiving this message ?
如此拆分会导致:
[':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。