* looking for nirs@freeshell.org--2005/moin--fix--1.3--patch-27 to compare with
* comparing to nirs@freeshell.org--2005/moin--fix--1.3--patch-27
M  MoinMoin/server/twistedmoin.py
M  MoinMoin/PageEditor.py

* modified files

--- orig/MoinMoin/PageEditor.py
+++ mod/MoinMoin/PageEditor.py
@@ -948,8 +948,19 @@
         # we broke his lock ==> but revision checking during preview will
         self.lock.release(force=not msg) # XXX does "not msg" make any sense?
   
+        self.publish(wiki=self.request.cfg.sitename, page=self.page_name,
+            action=action, user=self.request.user.name or '--anon--',
+            comment=comment)
+
         return msg
             
+    def publish(self, **kw):
+        if not (hasattr(self.request, 'publisher') and
+                self.request.publisher.connected):
+            return
+        from MoinMoin.util import web
+        text = web.makeQueryString(kw)
+        self.request.publisher.connected.publish(text)
             
 class PageLock:
     """


--- orig/MoinMoin/server/twistedmoin.py
+++ mod/MoinMoin/server/twistedmoin.py
@@ -24,7 +24,8 @@
 # Twisted imports
 from twisted.application import internet, service
 from twisted.web import script, static, server, vhost, resource, util
-from twisted.internet import threads, reactor
+from twisted.internet import threads, reactor, protocol
+from twisted.protocols import irc
 
 # Enable threads
 from twisted.python import threadable
@@ -42,6 +43,43 @@
 # Server globals
 config = None
 
+
+class IRCPublisherService(service.Service):
+
+    def getIRCBot(self, channel, nickname):
+        """ Get irc bot factory connecting to channel """
+        f = PublisherFactory()
+        f.protocol, f.channel, f.nickname, = IRCPublisher, channel, nickname
+        return f
+
+
+class PublisherFactory(protocol.ReconnectingClientFactory):
+    """ Create publishers """
+    
+    def __init__(self):
+        self.connected = None
+        
+    def buildProtocol(self, addr):
+        """Create publishers, one per channel """
+        self.connected = protocol.ReconnectingClientFactory.buildProtocol(
+            self, addr)
+        return self.connected
+
+    def clientConnectionLost(self, connector, unused_reason):
+        self.connected = None
+        protocol.ReconnectingClientFactory.clientConnectionLost(self,
+            connector, unused_reason)
+
+class IRCPublisher(irc.IRCClient):
+    
+    def connectionMade(self):
+        self.nickname = self.factory.nickname
+        irc.IRCClient.connectionMade(self)
+        self.join(self.factory.channel)
+
+    def publish(self, text):
+        self.say(self.factory.channel, text)
+            
     
 class WikiResource(resource.Resource):
     """ Wiki resource """
@@ -71,7 +109,8 @@
         else:
             if config.memoryProfile:
                 config.memoryProfile.addRequest()
-            req = RequestTwisted(request, name, reactor)
+            req = RequestTwisted(request, name, reactor, 
+                                 {'publisher': config.publisher})
             if config.hotshotProfile:
                 threads.deferToThread(config.hotshotProfile.runcall, req.run)
             else:
@@ -266,5 +305,12 @@
         s = internet.TCPServer(port, site, interface=interface)
         s.setServiceParent(sc)
 
+    # Start IRC publisher
+    config.publisher = IRCPublisherService().getIRCBot('#MoinMoinEvents',
+                                                       "Nirs_Wiki")
+    internet.TCPClient('irc.freenode.net', 6667,
+                       config.publisher).setServiceParent(sc)
+   
+
     return application
 



