[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