|
|
@@ -0,0 +1,181 @@
|
|
|
+#! /usr/bin/env python
|
|
|
+#
|
|
|
+# Example program using irc.bot.
|
|
|
+#
|
|
|
+# Joel Rosdahl <joel@rosdahl.net>
|
|
|
+
|
|
|
+"""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 <server[:port]> <channel> <nickname>")
|
|
|
+ # 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()
|