Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python IRC Bot,区别于通道消息和私有消息_Python_Networking_Bots_Irc_Channel - Fatal编程技术网

Python IRC Bot,区别于通道消息和私有消息

Python IRC Bot,区别于通道消息和私有消息,python,networking,bots,irc,channel,Python,Networking,Bots,Irc,Channel,我正在用Python编写一个简单的IRC机器人。实际上,它可以连接到特定的通道,读取消息并发送响应,但它不能区分通道消息和私人消息 示例: 连接到同一频道的John向机器人的聊天室发送私人消息,如“!打招呼”; Bot必须向同一个私人聊天室发送“hello”,只发送给John。 相反,当bot在通道板上读到“!say hello”时,必须向通道发送“hello” 我的代码: ircmsg = connection.ircsock.recv(2048) ircmsg_clean = ircmsg.

我正在用Python编写一个简单的IRC机器人。实际上,它可以连接到特定的通道,读取消息并发送响应,但它不能区分通道消息和私人消息

示例
连接到同一频道的John向机器人的聊天室发送私人消息,如“!打招呼”; Bot必须向同一个私人聊天室发送“hello”,只发送给John。
相反,当bot在通道板上读到“!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()
您可以将其放入列表
零件

如果我没有记错,并且正确理解RFQ,那么您从服务器收到的irc消息如下所示:

source = parts[0].strip(':')
content = ' '.join(parts[3:]).strip(':')
connection.sendMsg(source, content)
:约翰!something@something.orgPRIVMSG BotName:您是否收到此消息

因此,拆分将导致以下情况:

[':John!something@something.org', 'PRIVMSG', 'BotName', ':Are', 'you', 'receiving', 'this', 'message', '?']
消息的发送者是第一个元素
部分
,因此
部分[0]
。您需要去掉多余的“:”

消息的目标位于
部分[2]
,可以是您的姓名或频道名称,然后您需要将目标与您自己的姓名进行比较,以了解它是发送给您的消息还是发送给频道的消息

如果这是真的,那么您可以这样做:

source = parts[0].strip(':')
content = ' '.join(parts[3:]).strip(':')
connection.sendMsg(source, content)
请注意,消息的实际内容也被拆分,因此如果这样做,则需要将其重新连接到字符串中。如果您点击的是
索引器
,则表示您收到的消息只有一个单词,因为第一个单词位于索引3,而不是索引4