tBKwtWS 8 жил өмнө
commit
cfff66c32d
2 өөрчлөгдсөн 293 нэмэгдсэн , 0 устгасан
  1. 112 0
      original_testbot.py
  2. 181 0
      rotbot.py

+ 112 - 0
original_testbot.py

@@ -0,0 +1,112 @@
+#! /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.client import ip_numstr_to_quad, ip_quad_to_numstr
+
+class TestBot(irc.bot.SingleServerIRCBot):
+    def __init__(self, channel, nickname, server, port=6667):
+        irc.bot.SingleServerIRCBot.__init__(self, [(server, port)], nickname, nickname)
+        self.channel = channel
+
+    def on_nicknameinuse(self, c, e):
+        c.nick(c.get_nickname() + "_")
+
+    def on_welcome(self, c, e):
+        c.join(self.channel)
+
+    def on_privmsg(self, c, e):
+        self.do_command(e, e.arguments[0])
+
+    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, 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("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]
+
+    bot = TestBot(channel, nickname, server, port)
+    bot.start()
+
+if __name__ == "__main__":
+main()

+ 181 - 0
rotbot.py

@@ -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()