我正在尝试向我的python IRC机器人添加一个函数,当我在IRC上键入“join#channel-name”时,机器人将加入该频道。
这是我的代码:
public void showFlipProgressDialog(String orientation) {
FlipProgressDialog flip = new FlipProgressDialog();
flip.setImageList(imageList);
flip.setOrientation(orientation);
flip.setBackgroundColor(Color.parseColor("#FF4081"));
flip.setDimAmount(0.8f);
flip.setBackgroundAlpha(1.0f);
flip.setCornerRadius(32);
}
当然,以下代码不正确:
line23:
# IRC bot written by syrius
import socket
server = "irc.freenode.net" # IRC server
channel = "#syrius-test" # Channel
botnick = "syrius-bot" # Nickname of the bot
master = "syrius_" # Nickname of the bot's master
exitcode = "bye " + botnick #Text that we will use to make the bot quit
def ircwrite(message):
global ircsock
ircsock.send(str(message).encode('latin-1', 'ignore'))
def ping():
ircwrite("PONG :pingis\n")
def sendmsg(chan , msg):
ircwrite("PRIVMSG "+ chan +" :"+ msg +"\n")
def joinchan(channel):
ircsock.send(bytes("JOIN "+ channel + "\n"))
def join():
ircsock.send(bytes("JOIN %s"))
def hello():
ircwrite("PRIVMSG "+ channel +" :Hello!\n")
def quitting():
ircwrite("PRIVMSG "+ channel +" :Okay boss, leaving now.\n")
ircsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ircsock.connect((server, 6667))
ircwrite("USER "+ botnick +" "+ botnick +" "+ botnick +" :IRC bot coded by syrius.\n")
ircwrite("NICK "+ botnick +"\n")
joinchan(channel)
while 1:
ircmsg = ircsock.recv(2048).decode() # receive data from the server
ircmsg = ircmsg.strip('\n\r') # removing any unnecessary linebreaks.
print(ircmsg) # Here we print what's coming from the server
name = ircmsg.split('!',1)[0][1:] # We split out the name
if ircmsg.find(":Hello "+ botnick) != -1: # If we can find "Hello Mybot" it will call the function hello()
hello()
if ircmsg.find("PING :") != -1: # if the server pings us then we've got to respond!
ping()
if name.lower() == master.lower() and ircmsg.find(":quit " + botnick) != -1:
quitting()
ircsock.send(bytes("QUIT \n", "UTF-8"))
if name.lower() == master.lower() and ircmsg.find(":join %s") != -1:
join()
main()
第56行:
def join():
ircsock.send(bytes("JOIN %s"))
我想知道我应该放在哪里,以便机器人可以加入频道。
非常感谢任何帮助。
答案 0 :(得分:1)
我看到此解决方案有两个问题,我的建议是您可能应该尝试使用IRC框架(例如Pydle或已经处理协议的十亿个框架之一)。
我看到的第一个问题是使用latin-1进行编码,通常应该使用utf-8,也可以使用服务器从RPL_ISUPPORT答复在CHARSET中广告的任何内容,尽管这种情况已经不再常见。同样,沿着编码的方式,您可以从utf-8解码IRC线,这样就可以处理字符串而不是字节,然后在输出处重新编码。
下一个IRC问题将是您的行尾,IRC消息应始终以CR-LS(回车换行符)结尾,该字符将是\ r \ n个字符而不是\ n。
我最后要提到的是您的字符串格式设置,您应该使用"JOIN {}".format(channel)
,这是当今首选的字符串格式设置方法,除非您使用的是python 3.7,否则您将使用相似的fstrings。
您现在尝试进行格式化的方式是通过两个串联(例如"USER" + channel
)进行的,但是您还尝试通过%s使用旧样式的字符串格式。如果您想使用%s格式设置,则正确的方法是"JOIN %s" % (channel)
,尽管目前首选使用.format和fstrings。