summaryrefslogtreecommitdiff
path: root/gentree.py
diff options
context:
space:
mode:
Diffstat (limited to 'gentree.py')
-rw-r--r--gentree.py184
1 files changed, 0 insertions, 184 deletions
diff --git a/gentree.py b/gentree.py
deleted file mode 100644
index 0a472bc..0000000
--- a/gentree.py
+++ /dev/null
@@ -1,184 +0,0 @@
-from enum import Enum
-import sys
-import pprint
-import textwrap
-
-class LogType(Enum):
- QUASSEL = 1
- ERC = 2
-
-
-class Message:
- def __init__(self):
- self.id = -1
- self.sender = ""
- self.message = ""
- self.reply_to_msgs = []
- self.previous_msg = -1
-
- def to_dict(self):
- return {'id': self.id,
- 'sender': self.sender,
- 'message': self.message,
- 'reply_to_msgs': self.reply_to_msgs,
- 'previous_msg': self.previous_msg}
-
-
-def get_log_type(log):
- """determine the type of irc log.
- args:
- log: a string of irc log.
- returns:
- a LogType.
- """
- if log[0] == '[':
- return LogType.QUASSEL
- elif log[0] == '<':
- return LogType.ERC
- else:
- raise ValueError('Unknown irc log type.')
-
-
-def parse_log_quassel(log):
- """parse a quassel log.
- A quassel message is in the form of
- [hh:mm:ss] <sender-nick> blahblah.
- or
- [hh:mm:ss] -*- sender-nick does something.
- [hh:mm:ss] *** Mode #abc +o def by ChanServ
- args:
- log: a string of quassel log.
- return:
- a list of Messages
- """
- last_messages = dict()
- index = 0
- messages = []
- for line in log.splitlines():
- message = Message()
- line = line.lstrip()
- [_, nick, payload] = line.split(' ', maxsplit=2)
- 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_erc(log):
- """parse an erc log.
- An erc message is in the form of
- <nick> 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
- """
- 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.
- args:
- log: a string of irc log.
- returns:
- a list of Messages
- """
- log_type = get_log_type(log)
- if log_type == LogType.QUASSEL:
- return parse_log_quassel(log)
- elif log_type == LogType.ERC:
- return parse_log_erc(log)
- else:
- raise ValueError('Unknown irc log type.')
-
-def gen_graph(meeting):
- dot = """
-digraph meeting {
- graph [
- width = 20
- ];
-
- node [
- shape = box,
- margin = 0,
- pad = 0
- ];
-"""
- for msg in meeting:
- 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)} [style="dashed"];'
- for id in msg.reply_to_msgs:
- dot += f'\nm{str(id)} -> m{str(msg.id)};'
- dot += '\n}'
- return dot
-
-def main():
- log = open(sys.argv[1]).read()
- meeting = parse_log(log)
- graph = gen_graph(meeting)
- open(sys.argv[2], 'w').write(graph)
- # pp = pprint.PrettyPrinter(indent=4)
- # pp.pprint([msg.to_dict() for msg in meeting])
-
-if __name__ == '__main__':
- main()