PoeTrade/src/trader.py

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