diff --git a/mclog2mysql/main.py b/mclog2mysql/main.py new file mode 100644 index 0000000..08b9514 --- /dev/null +++ b/mclog2mysql/main.py @@ -0,0 +1,61 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i python3 -p "python3.withPackages(ps: with ps; [ tqdm ])" + +from tqdm import tqdm +from pprint import pprint +from pathlib import Path +from datetime import datetime +import gzip + +# Currently not mysql lol +import sqlite3 + +def parse_login_logout_events_from_file(path: Path): + date = path.name[:10] + result = [] + with gzip.open(path, 'r') as file: + for line in file: + if b'joined the game' in line or b'left the game' in line: + split = line.decode().split() + time = datetime.fromisoformat(f"{date} {split[0][1:9]}") + name = split[3] + state = split[4] + result.append((time, name, state)) + return result + +def conjoin_sessions(event_log): + result = [] + login_session_table = dict() + for time, name, state in event_log: + if state == 'joined': + login_session_table[name] = time + elif name in login_session_table: + result.append((name, time, (time - login_session_table[name]).total_seconds())) + del login_session_table[name] + else: + print(f"warn: loose session found for {name} at {time}") + return result + +def insert_sessions_into_db(session_log): + con = sqlite3.connect("test.db") + cur = con.cursor() + cur.execute("DROP TABLE IF EXISTS minecraft_login_sessions") + cur.execute(""" + CREATE TABLE minecraft_login_sessions( + username TEXT NOT NULL, + start DATETIME, + duration INTEGER + ) + """) + cur.executemany("INSERT INTO minecraft_login_sessions(username, start, duration) VALUES(?, ?, ?)", session_log) + con.commit() + + +if __name__ == "__main__": + event_log = [] + files = list(Path(__file__).parent.glob(r"*.log.gz")) + for file in (pbar:=tqdm(files)): + pbar.set_postfix_str(file) + event_log += parse_login_logout_events_from_file(file) + session_log = conjoin_sessions(event_log) + insert_sessions_into_db(session_log)