54 lines
1.5 KiB
Python
54 lines
1.5 KiB
Python
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<date>\d\d\d\d/\d\d/\d\d \d\d:\d\d:\d\d) (\d+) (\S+) \[(?P<level>\S+) (\S+) (\d+)\] '
|
|
r'(?P<channel>[#@%$&]?)(?P<ToFrom>To|From)?\s?(?P<guild><\S+>)? ?(?P<user>[^:]+): (?P<message>.*)'
|
|
)
|
|
|
|
|
|
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
|