import time import datetime import re import logging from .data import Message, channel_mapping from . import gui log = logging.getLogger(__name__) logging.basicConfig(level=logging.DEBUG) re_log = re.compile( r'(?P\d\d\d\d/\d\d/\d\d \d\d:\d\d:\d\d) (\d+) (\S+) \[(?P\S+) (\S+) (\d+)\] ' r'(?P[#@%$&]?)(?PTo|From)?\s?(?P<\S+>)? ?(?P[^:]+): (?P.*)' ) def parse_log(text: str) -> Message: result = re_log.search(text) if not result: log.debug(f'Result is none for text "{text}"') return None date = datetime.datetime.strptime( result.group('date'), '%Y/%m/%d %H:%M:%S') guild = result.group('guild') if guild: guild = guild.strip('<>') return Message(result.group('message'), date, result.group('user'), channel_mapping[result.group('channel')], guild, result.group('ToFrom')) def read_log(logfile: str, app: gui.Gui) -> None: logfile = open(logfile, 'r', encoding='utf8') loglines = follow(logfile) for line in loglines: message = parse_log(line) log.debug(message) if message and message.trade and message.to_from == 'From': app.add_tab(30, message) def follow(thefile: str): thefile.seek(0, 2) while True: line = thefile.readline() if not line: time.sleep(0.1) continue yield line