From 1016085bed2d48294cb1da789168256b1347655c Mon Sep 17 00:00:00 2001
From: Gabor Guzmics <gab@g4b.org>
Date: Fri, 10 Apr 2015 20:52:17 +0200
Subject: [PATCH] updated analyze code to use chat.log added system messages -
 albeit it does not determine sub-stuff chat log still needs to eat following
 packets

---
 analyze.py      | 21 ++++++++++++++++-----
 logs/chat.py    | 15 +++++++++++++++
 logs/combat.py  |  1 +
 logs/game.py    |  1 +
 logs/session.py |  5 +++++
 5 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/analyze.py b/analyze.py
index e521d94..da76dbe 100644
--- a/analyze.py
+++ b/analyze.py
@@ -29,8 +29,9 @@ if __name__ == '__main__':
     #f = open('output.txt', 'w')
     rex_combat = {}
     rex_game = {}
+    rex_chat = {}
     for logf in coll.sessions:
-        logf.parse_files(['game.log', 'combat.log'])
+        logf.parse_files(['game.log', 'combat.log', 'chat.log'])
         print "----- Log %s -----" % logf.idstr
         if logf.combat_log:
             for l in logf.combat_log.lines:
@@ -54,12 +55,22 @@ if __name__ == '__main__':
                     else:
                         rex_game[l.__class__.__name__] = rex_game.get(l.__class__.__name__, 0) + 1
                         print l.values['log']
-                    # ClientInfo introspection for ping
-                    #if isinstance(l, ClientInfo) and l.values.get('clinfo', '') == 'avgPing':
-                    #    print l.values
-                    #    # fix avgPing parsing!
+        if logf.chat_log:
+            for l in logf.chat_log.lines:
+                if isinstance(l, dict):
+                    rex_chat['dict'] = rex_chat.get('dict', 0) + 1 
+                elif isinstance(l, str):
+                    print l
+                else:
+                    if l.unpack():
+                        pass
+                    else:
+                        rex_chat[l.__class__.__name__] = rex_chat.get(l.__class__.__name__, 0) + 1
+                        print l.values['log']
     print 'Analysis complete:'
     print '#'*20+' RexCombat ' + '#' *20
     print rex_combat
     print '#'*20+' RexGame ' + '#' *20
     print rex_game
+    print '#'*20+' RexChat ' + '#' *20
+    print rex_chat
diff --git a/logs/chat.py b/logs/chat.py
index aef8a61..7269ba3 100644
--- a/logs/chat.py
+++ b/logs/chat.py
@@ -24,6 +24,7 @@ class ChatLog(Log):
     
     def __init__(self, values=None):
         self.values = values or {}
+        self.reviewed = False
     
     def unpack(self, force=False):
         if self.reviewed and not force:
@@ -48,6 +49,19 @@ class ChatLog(Log):
         ''' returns a String readable by humans explaining this Log '''
         return self.values.get('log', 'Unknown Chat Log')
 
+class SystemMessage(ChatLog):
+    matcher = re.compile(r"^<\s+SYSTEM>\s(?P<message>.*)")
+    
+    @classmethod
+    def _is_handler(cls, log):
+        if log.get('log', '').lstrip().startswith('<          SYSTEM>'):
+            return True
+        return False
+    
+    def explain(self):
+        return '[SYSTEM]: %(message)s' % self.values
+
+    
 
 class PrivateMessageReceived(ChatLog):
     matcher = re.compile(r"^<\s\s\s\sPRIVATE From>\[\s*(?P<nickname>[^\]]+)\]\s(?P<message>.*)")
@@ -146,6 +160,7 @@ class ChatServerDisconnect(ChatLog):
         return '[disconnected]'
     
 CHAT_LOGS = [
+        SystemMessage,
         PrivateMessageReceived,
         PrivateMessageSent,
         ChatMessage, # private messages need to be before chatmessage.
diff --git a/logs/combat.py b/logs/combat.py
index f0a5c0f..fd22623 100644
--- a/logs/combat.py
+++ b/logs/combat.py
@@ -39,6 +39,7 @@ class CombatLog(Log):
     
     def __init__(self, values=None):
         self.values = values or {}
+        self.reviewed = False
     
     def unpack(self, force=False):
         if self.reviewed and not force:
diff --git a/logs/game.py b/logs/game.py
index 8658817..ea6bd6b 100644
--- a/logs/game.py
+++ b/logs/game.py
@@ -58,6 +58,7 @@ class GameLog(Log):
     
     def __init__(self, values=None):
         self.values = values
+        self.reviewed = False
     
     def unpack(self, force=False):
         if self.reviewed and not force:
diff --git a/logs/session.py b/logs/session.py
index 49b8bac..194f5fc 100644
--- a/logs/session.py
+++ b/logs/session.py
@@ -117,6 +117,11 @@ class LogFileSession(LogSession):
                         self.game_log.set_data(z.read(filename))
                         self.game_log.parse()
                         self.files_parsed.append('game.log')
+                    elif fn == 'chat.log' and (not files or fn in files) and not 'chat.log' in self.files_parsed:
+                        self.chat_log = ChatLogFile(fn)
+                        self.chat_log.set_data(z.read(filename))
+                        self.chat_log.parse()
+                        self.files_parsed.append('chat.log')
         except:
             self._error = True
             return