2016-10-16 14 views
1

Я кодирую простой IRC-бот в Python. Фактически, он может подключаться к определенному каналу, читать сообщения и отправлять ответ, но он не может различать сообщения канала и личные сообщения.Python IRC Bot, отличаться от сообщений канала и личных сообщений

Пример:
Джон, подключен к тому же каналу, отправить личное сообщение для чат бота, как, «поздороваться!» Бот должен отправить «привет» в тот же чат, только для Джона.
Вместо этого, когда бот читает «! 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")) 

Но должны знать откуда ge, канал или пользователь и отправить соответствующий ответ.

Извините за мой плохой английский.

ответ

1

Источник сообщения включен в сообщение протокола, теперь вы его просто не используете.

В той части, где вы делаете это

parts = ircmsg_clean.split() 

вы получите его к списку parts.

Если я правильно помню, и понять RFQ права, ИРЦ сообщение, которое вы получите от сервера выглядит примерно так:

: Джон [email protected] PRIVMSG ИМЯ_БОТ: Вы получили это сообщение ?

так, что расщепление привело бы в этом:

[':[email protected]', '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.