#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.