Бот на Python IRC, отличающийся от сообщений канала и личных сообщений

#python #networking #bots #irc #channel

#python #сеть #боты #irc #канал

Вопрос:

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

Пример:
Джон, подключенный к тому же каналу, отправляет личное сообщение в чат бота, например «! скажи привет»; Бот должен отправить «привет» в тот же приватный чат, только Джону.
Вместо этого, когда бот читает «! скажи привет» на доске канала, нужно отправить «привет» каналу.

Мой код:

 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"))
 

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

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

Ответ №1:

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

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

 parts = ircmsg_clean.split()
 

вы добавляете его в список parts .

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

: Джон!something@something.org PRIVMSG BotName: Вы получаете это сообщение ?

таким образом, разделение, которое приведет к этому:

 [':John!something@something.org', 'PRIVMSG', 'BotName', ':Are', 'you', 'receiving', 'this', 'message', '?']
 

Отправитель сообщения — это первый элемент parts , так parts[0] что . Вам нужно будет убрать лишнее ‘:’.

Цель сообщения — at parts[2] , и это может быть ваше имя или название канала, а затем вам нужно сравнить цель с вашим собственным именем, чтобы узнать, является ли это сообщение для вас или для канала.

Если это правда, вы можете сделать что-то вроде этого:

 source = parts[0].strip(':')
content = ' '.join(parts[3:]).strip(':')
connection.sendMsg(source, content)
 

Обратите внимание, что фактическое содержимое сообщения также разделяется, поэтому вам нужно объединить его в строку, если вы делаете это таким образом. Если вы нажмете это IndexError , это означает, что вы получили сообщение, в котором было только одно слово, поскольку первое слово находится с индексом 3, а не 4.