#! /usr/bin/env python # # Example program using irc.bot. # # Joel Rosdahl """A simple example bot. This is an example bot that uses the SingleServerIRCBot class from irc.bot. The bot enters a channel and listens for commands in private messages and channel traffic. Commands in channel messages are given by prefixing the text by the bot name followed by a colon. It also responds to DCC CHAT invitations and echos data sent in such sessions. The known commands are: stats -- Prints some channel information. disconnect -- Disconnect the bot. The bot will try to reconnect after 60 seconds. die -- Let the bot cease to exist. dcc -- Let the bot invite you to a DCC CHAT connection. """ import irc.bot import irc.strings #from irc.bot import Channel from irc.client import ip_numstr_to_quad, ip_quad_to_numstr class RotBot(irc.bot.SingleServerIRCBot): def __init__(self, channel, nickname, server, port=6667): print("Connecting") irc.bot.SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname) print("Joining channel") self.channel = channel def on_nicknameinuse(self, c, e): c.nick(c.get_nickname() + "_") def on_welcome(self, c, e): print("Joining channel") c.join(self.channel) def on_privmsg(self, connection, event): self.do_command(connection, event) def on_pubmsg(self, connection, event): self.do_command(connection, event) #def on_pubmsg(self, c, e): # a = e.arguments[0].split(":", 1) # if len(a) > 1 and irc.strings.lower(a[0]) == irc.strings.lower(self.connection.get_nickname()): # self.do_command(e, a[1].strip()) # return def on_dccmsg(self, c, e): # non-chat DCC messages are raw bytes; decode as text text = e.arguments[0].decode('utf-8') c.privmsg("You said: " + text) def on_dccchat(self, c, e): if len(e.arguments) != 2: return args = e.arguments[1].split() if len(args) == 4: try: address = ip_numstr_to_quad(args[2]) port = int(args[3]) except ValueError: return self.dcc_connect(address, port) def do_command(self, connection, event): cmdchar = "!" helpchar = "@" trigger = event.arguments[0] #Check command prefix if trigger.startswith(cmdchar) or trigger.startswith(helpchar): #Do nothing if it's not a command. command = trigger[1:] #Without prefix. help = False if trigger.startswith(helpchar): #It's a help requist. help = True # Set replyto variable for output to multiple protocols if event.type == "pubmsg": replyto = event.target elif event.type == "privmsg": replyto = event.source.nick else: return if command == "cmd": if help: connection.privmsg(replyto, "Displays a list of commands.") else: connection.privmsg(replyto, "!cmd, !test, !msg") elif command == "test": if help: connection.privmsg(replyto, "Strictly for testing purposes only!") else: connection.privmsg(replyto, str(connection) + " | " + str(event)) #elif command == "channel": #channel = Channel() #print("aaa") #print(replyto) #connection.privmsg(replyto, event.source.nick) #connection.privmsg(replyto, str(channel.users(replyto))) #connection.privmsg(replyto, is_admin(event.source.nick)) #connection.privmsg(replyto, "A: " + self.channels[0].is_admin(event.source.nick)) elif command.split(maxsplit=1)[0] == "msg": print(1) if help: print(2) connection.privmsg(replyto, "Message a user or channel.") connection.privmsg(replyto, "\x0314Usage: \x0300!msg \x1Dname message") else: try: connection.privmsg(command.split()[1], command.split(maxsplit=2)[2]) except IndexError: connection.privmsg(replyto, "Nothing") #else: #Parrot mode # connection.privmsg("#[CP]Specifer", str(trigger.arguments[0].split(maxsplit=1)[0])) # def do_command(self, e, cmd): # nick = e.source.nick # c = self.connection # # if cmd == "disconnect": # self.disconnect() # elif cmd == "die": # self.die() # elif cmd == "stats": # for chname, chobj in self.channels.items(): # c.notice(nick, "--- Channel statistics ---") # c.notice(nick, "Channel: " + chname) # users = sorted(chobj.users()) # c.notice(nick, "Users: " + ", ".join(users)) # opers = sorted(chobj.opers()) # c.notice(nick, "Opers: " + ", ".join(opers)) # voiced = sorted(chobj.voiced()) # c.notice(nick, "Voiced: " + ", ".join(voiced)) # elif cmd == "dcc": # dcc = self.dcc_listen() # c.ctcp("DCC", nick, "CHAT chat %s %d" % ( # ip_quad_to_numstr(dcc.localaddress), # dcc.localport)) # else: # c.notice(nick, "Not understood: " + cmd) def main(): #import sys #if len(sys.argv) != 4: # print(sys.argv) # print("Usage: testbot ") # sys.exit(1) #s = sys.argv[1].split(":", 1) #server = s[0] #if len(s) == 2: # try: # port = int(s[1]) # except ValueError: # print("Error: Erroneous port.") # sys.exit(1) #else: # port = 6667 #channel = sys.argv[2] #nickname = sys.argv[3] channel = "#[CP]Specifer" nickname = "pyRotBot" server = "irc.gtanet.com" port = 6667 bot = RotBot(channel, nickname, server, port) print("Starting bot") bot.start() if __name__ == "__main__": main()