From cbb6f77fa2a1d46ff6052baeefd26a44d878f2a3 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Thu, 26 Aug 2021 21:18:22 +1000 Subject: started working on erc type logs. --- gentree.py | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 7 deletions(-) diff --git a/gentree.py b/gentree.py index 220edf3..0a472bc 100644 --- a/gentree.py +++ b/gentree.py @@ -1,6 +1,7 @@ from enum import Enum import sys import pprint +import textwrap class LogType(Enum): QUASSEL = 1 @@ -44,7 +45,7 @@ def parse_log_quassel(log): [hh:mm:ss] blahblah. or [hh:mm:ss] -*- sender-nick does something. - [06:05:28] *** Mode #fsf +o zoe by ChanServ + [hh:mm:ss] *** Mode #abc +o def by ChanServ args: log: a string of quassel log. return: @@ -55,13 +56,12 @@ def parse_log_quassel(log): messages = [] for line in log.splitlines(): message = Message() - is_me = False + line = line.lstrip() [_, nick, payload] = line.split(' ', maxsplit=2) if nick == '***': continue if nick == '-*-': [_, _, nick, payload] = line.split(' ', maxsplit=3) - is_me = True else: nick = nick[1:-1] # removes <> message.message = line @@ -85,13 +85,51 @@ def parse_log_erc(log): An erc message is in the form of blahblah blahblah blah [hh:mm] + ** nick does something + **** old-nick is now known as new-nick And the timestamp is optional args: log: a string of quassel log. return: a list of Messages """ - return [] + last_messages = dict() + index = 0 + messages = [] + log_lines = log.splitlines() + log_lines.append('') + nick = '' + for line, next_line in zip(log_lines, log_lines[1:]): + line = line.lstrip() + if line[0] == '<': + [nick, payload] = line.split(' ', maxsplit=1) + elif line[:3] = '** ': + [_, nick, payload] = line.split(' ', maxsplit=2) + elif line[:5] = '**** ': + continue + else: + payload += f'\n{line}' + if nick == '***': + continue + if nick == '-*-': + [_, _, nick, payload] = line.split(' ', maxsplit=3) + else: + nick = nick[1:-1] # removes <> + message.message = line + message.id = index + # Remove special symbol for op + if nick[0] in ['@', '%']: + nick = nick[1:] + message.sender = nick + if nick in last_messages: + message.previous_msg = last_messages[nick] + last_messages[nick] = index + for participant, msg_id in last_messages.items(): + if payload.find(participant) != -1: + message.reply_to_msgs.append(msg_id) + messages.append(message) + index += 1 + return messages def parse_log(log): """parse log. @@ -111,18 +149,24 @@ def parse_log(log): def gen_graph(meeting): dot = """ digraph meeting { + graph [ + width = 20 + ]; + node [ shape = box, - width = 40 + margin = 0, + pad = 0 ]; """ for msg in meeting: - quoted_message = msg.message.replace('"', '\\"') + quoted_message = textwrap.fill(msg.message.replace('"', '\\"')) dot += f'\nm{str(msg.id)} [label="{quoted_message}"];' if msg.id > 0: dot += f'\nm{str(msg.id - 1)} -> m{str(msg.id)} [style="invis"];' + for msg in meeting: if msg.previous_msg > -1: - dot += f'\nm{str(msg.previous_msg)} -> m{str(msg.id)};' + dot += f'\nm{str(msg.previous_msg)} -> m{str(msg.id)} [style="dashed"];' for id in msg.reply_to_msgs: dot += f'\nm{str(id)} -> m{str(msg.id)};' dot += '\n}' -- cgit v1.2.3