呼び出し時に特定のコマンドに応答できるPython(3.9.2)でデフォルトのircボットを作成しようとしています。たとえば、応答にスペースが含まれている場合、ボットは最初の単語のみを表示します。
me > @hello
bot > hi
me > @how is the weather?
bot > the
言わなければならなかったが、the weather seems nice today
これはコードです
import sys
import time
import socket
import string
server_address="irc.libera.chat"
server_port = 6667
botnick="lamebot"
channel_name="##megadouched"
irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
irc.connect((server_address,server_port))
irc.setblocking(False)
time.sleep(1)
irc.send(bytes("USER "+botnick+" "+botnick+" "+botnick+" bot has joined the chat\r\n", "UTF-8"))
time.sleep(1)
irc.send(bytes("NICK "+botnick+"\n", "UTF-8"))
time.sleep(1)
irc.send(bytes("JOIN "+channel_name+"\n", "UTF-8"))
irc_privmsg = 'b"PRIVMSG "+channel_name+" Hello\r\n"'
while True:
try:
text = irc.recv(4096)
except Exception:
pass
if text.find(bytes(":@hi", "UTF-8"))!=-1:
irc.sendall(bytes("PRIVMSG "+channel_name+" Hello\r\n", "UTF-8"))
text=b""
elif text.find(bytes(":@how is the weather?", "UTF-8"))!=-1:
irc.sendall(bytes("PRIVMSG "+channel_name+" the weather today seems nice\r\n", "UTF-8"))
text=b""
input()
ベストアンサー1
IRCプロトコルは、メッセージをスペースで区切られたコマンドと複数のパラメータに分割します。後続のパラメータ自体にスペースを含めるために、プロトコルはパラメータの前にコロンを付けることができます。この例のようにRFC 2812:
PRIVMSG Angel :yes I'm receiving it !
; Command to send a message to Angel.
これで実際にRFCには指定されていませんが、2.3.1メッセージのBNF構文に隠されていることがわかりました。
params = *14(中央の空白) [後ろの空白 ":"] =/ 14(中央空白) [空白[":"] 末尾] 中間 = nospcrlfcl *( ":" / nospcrlfcl ) 末尾 = *( ":" / " " / nospcrlfcl )
trailing
構文要素はコロンの後ろの末尾に表示され、空白も許可されます。params
middle
(はい、これはこのようなメッセージにコマンドが使用するPRIVMSG someone the weather today seems nice
よりも多くのパラメータがあることを意味しますPRIVMSG
が、何らかの理由でこれはエラーとは見なされません。単純な実装でも法律による郵便の愚かさでもあります。)