用Python编写的IRC bot - 加入通道功能

时间:2017-09-12 19:42:04

标签: python bots irc

我正在尝试向我的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"))

我想知道我应该放在哪里,以便机器人可以加入频道。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我看到此解决方案有两个问题,我的建议是您可能应该尝试使用IRC框架(例如Pydle或已经处理协议的十亿个框架之一)。

我看到的第一个问题是使用l​​atin-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。