Browse Source

Add message cache and use it for "Peers updated:" messages.

Signed-off-by: Maximilian Wilhelm <max@rfc2324.org>
Maximilian Wilhelm 9 years ago
parent
commit
ac4c4194b4
1 changed files with 28 additions and 4 deletions
  1. 28 4
      modules/ffpb.py

+ 28 - 4
modules/ffpb.py

@@ -40,12 +40,14 @@ __batcave = None
 ffpb_resolver = dns.resolver.Resolver()
 ffpb_resolver.nameservers = ['10.132.251.53']
 
+msg_cache = {}
+msg_cache_time = 10
 
 class MsgHandler(SocketServer.BaseRequestHandler):
     """Reads line from TCP stream and forwards it to configured IRC channels."""
 
     def handle(self):
-        data = self.request.recv(2048).strip()
+        msg = str (self.request.recv(2048).strip())
         sender = self.resolve_name(self.client_address[0])
 
         bot = self.server.bot
@@ -55,15 +57,28 @@ class MsgHandler(SocketServer.BaseRequestHandler):
 
         target = bot.config.core.owner
         if bot.config.has_section('ffpb'):
-            is_public = data.lstrip().startswith("PUBLIC:")
+            is_public = msg.lstrip().startswith("PUBLIC:")
 
             if is_public and not bot.config.ffpb.msg_target_public is None:
-                data = data[7:].lstrip()
+                msg = msg[7:].lstrip()
                 target = bot.config.ffpb.msg_target_public
             elif not bot.config.ffpb.msg_target is None:
                 target = bot.config.ffpb.msg_target
 
-        bot.msg(target, "[{0}] {1}".format(sender, str(data)))
+        # Try to aggregate peer updates and print them in batch
+        if msg.startswith ("Peers updated:"):
+            if msg not in msg_cache:
+                msg_cache[msg] = {
+                    'time' : time.time (),
+                    'nodes' : []
+                }
+
+            # Save message in message cache, will be delivered later
+            msg_cache[msg]['nodes'].append (sender)
+            return
+
+        bot.msg(target, "[{0}] {1}".format(sender, msg))
+
 
     def resolve_name(self, ipaddr):
         """
@@ -565,6 +580,15 @@ def ffpb_updatepeers(bot):
         bot.msg(bot.config.ffpb.msg_target, response)
 
 
+@willie.module.interval(15)
+def ffpb_print_cached_messages (bot):
+    for msg, m_info in msg_cache.items ():
+        if time.time () - m_info['time'] > msg_cache_time:
+            sender = ", ".join (sorted (m_info['nodes']))
+            bot.msg (bot.config.ffpb.msg_target, "[{0}] {1}".format (sender, msg))
+            del msg_cache[msg]
+
+
 def ffpb_fetch_stats(bot, url, memoryid):
     """Fetch a ffmap-style nodes.json from the given URL and
     store it in the bot's memory."""