[commits] r88 - in selinux-site/trunk: . selinux.ircbot

tim at mail.se.linux.org tim at mail.se.linux.org
Fre Juli 27 21:17:21 CEST 2007


Author: tim
Date: 2007-07-27 21:17:20 +0200 (Fri, 27 Jul 2007)
New Revision: 88

Added:
   selinux-site/trunk/selinux.ircbot/
   selinux-site/trunk/selinux.ircbot/README.txt
   selinux-site/trunk/selinux.ircbot/ircbot.py
Log:
Have implemented an irc bot that can be called through XML-RPC.


Added: selinux-site/trunk/selinux.ircbot/README.txt
===================================================================
--- selinux-site/trunk/selinux.ircbot/README.txt	2007-07-26 21:41:09 UTC (rev 87)
+++ selinux-site/trunk/selinux.ircbot/README.txt	2007-07-27 19:17:20 UTC (rev 88)
@@ -0,0 +1,11 @@
+Det här är en XML-RPC-gateway för IRC. När programmet startar så körs
+en XML-RPC-server och en IRC-klient igång. XML-RPC-servern har ett
+API som tillåter någon att ansluta och få boten att säga något på IRC.
+Detta används för webbplatsen, då den enkelt kan berätta för folk på
+IRC att en nyhet eller dokument lagts till.
+
+Så här kan man använda den i python:
+
+  from xmlrpclib import Server
+  server = Server('http://localhost:7080')
+  server.say('irckanal', 'Hejsan hejsan!')

Added: selinux-site/trunk/selinux.ircbot/ircbot.py
===================================================================
--- selinux-site/trunk/selinux.ircbot/ircbot.py	2007-07-26 21:41:09 UTC (rev 87)
+++ selinux-site/trunk/selinux.ircbot/ircbot.py	2007-07-27 19:17:20 UTC (rev 88)
@@ -0,0 +1,119 @@
+# twisted imports
+from twisted.words.protocols import irc
+from twisted.internet import reactor, protocol
+from twisted.python import log
+from twisted.web.xmlrpc import XMLRPC
+from twisted.web.server import Site
+
+# system imports
+import time, sys
+
+CHANNEL = 'webb'
+NICK = 'Webbis'
+
+class SeLinuxBot(irc.IRCClient):
+    """A logging IRC bot."""
+    
+    nickname = NICK
+
+    def connectionMade(self):
+        irc.IRCClient.connectionMade(self)
+        self.factory.chatter = self
+
+    def connectionLost(self, reason):
+        irc.IRCClient.connectionLost(self, reason)
+        self.factory.chatter = None
+
+    # callbacks for events
+
+    def signedOn(self):
+        """Called when bot has succesfully signed on to server."""
+        self.join(CHANNEL)
+
+    def privmsg(self, user, channel, msg):
+        """This will get called when the bot receives a message."""
+        user = user.split('!', 1)[0]
+        
+        # Check to see if they're sending me a private message
+        if channel == NICK:
+            msg = "It isn't nice to whisper!  Play nice with the group."
+            self.msg(user, msg)
+            return
+
+        # Otherwise check to see if it is a message directed at me
+        if msg.startswith(NICK + ":"):
+            msg = "%s: I am a log bot" % user
+            self.msg(channel, msg)
+
+
+class SeLinuxBotFactory(protocol.ClientFactory):
+    """ 
+    A new protocol instance will be created each time we connect to the server.
+    """
+
+    # the class of the protocol to build when new connection is made
+    protocol = SeLinuxBot
+
+    def __init__(self):
+        self.chatter = None
+
+    def clientConnectionLost(self, connector, reason):
+        """If we get disconnected, reconnect to server."""
+        connector.connect()
+
+    def clientConnectionFailed(self, connector, reason):
+        print "connection failed:", reason
+        reactor.stop()
+
+    def msg(self, channel, message):
+        if self.chatter:
+            self.chatter.msg('#'+channel, message)
+        else:
+            print "not connected to any channels"
+
+class WebListener(XMLRPC):
+    """ The website can use this xml-rpc server to tell what
+        has happened on the site.
+    """
+
+    def __init__(self, messenger):
+        self.messenger = messenger
+
+    def render(self, request):
+        self.client_ip = request.getClientIP()
+        return XMLRPC.render(self, request)
+
+    def xmlrpc_say(self, channel, msg):
+        if self.client_ip == '127.0.0.1':
+            self.messenger.msg(channel, msg.encode('utf8'))
+            return True
+        else:
+            return False
+
+class Messenger:
+
+    def __init__(self, irc_factory):
+        self.irc_factory = irc_factory
+
+    def msg(self, channel, message):
+        self.irc_factory.msg(message)
+
+if __name__ == '__main__':
+    if len(sys.argv) > 2:
+        port = int(sys.argv[2])
+        print port
+    else:
+        port = 7080
+
+    # create factory protocol and application
+    f = SeLinuxBotFactory()
+    weblistener = WebListener(f)
+
+    middle_man = Messenger(f)
+
+    # connect factory to this host and port
+    reactor.connectTCP(sys.argv[1], 6667, f)
+    reactor.listenTCP(port, Site(weblistener))
+
+    # run bot
+    reactor.run()




More information about the commits mailing list