Skip to content

Instantly share code, notes, and snippets.

@tsudoko
Last active August 29, 2015 14:05
Show Gist options
  • Save tsudoko/aa1018440aa8cb264d24 to your computer and use it in GitHub Desktop.
Save tsudoko/aa1018440aa8cb264d24 to your computer and use it in GitHub Desktop.
uTox log converter
#!/usr/bin/env python3
from datetime import datetime
from os.path import basename
import struct
import sys
format_toxic = False
datestamp = "%Y/%m/%d"
timestamp = "%X"
name_a = "* %s"
name_c = "<%s>"
event = "-!- %s"
datechange = "Day changed to %s"
namechange = "%s has changed their name to %s"
def process(filename):
with open(filename, "rb") as fi:
time_last = None
names_last = [None, None]
while fi:
try:
msg_header = struct.unpack("QHHBB2B", fi.read(16))
except struct.error:
break
time = msg_header[0]
namelen = msg_header[1]
length = msg_header[2]
flags = msg_header[3]
msg_type = msg_header[4]
#zeroes = msg_header[-2:]
time = datetime.fromtimestamp(time)
name = fi.read(namelen).decode()
msg = fi.read(length).decode()
if not format_toxic and time_last and time.day != time_last.day:
print(event % datechange % time.strftime(datestamp))
time_last = time
if names_last[flags] and name != names_last[flags]:
print(event % namechange % (names_last[flags], name))
names_last[flags] = name
if sys.stdout.isatty():
if flags:
name = "\033[35m" + name + "\033[m"
for line in msg.split('\n'):
if line.startswith('>'):
msg = msg.replace(line, "\033[32m" + line + "\033[m")
if msg_type:
logstr = time.strftime(timestamp) + ' ' + name_a % name + ' ' + msg
else:
logstr = time.strftime(timestamp) + ' ' + name_c % name + ' ' + msg
print(logstr)
if format_toxic:
timestamp = "%Y/%m/%d [%X]"
name_c = "%s:"
event = "????/??/?? [??:??:??] * %s"
namechange = "%s is now known as %s"
if len(sys.argv) < 2:
print("usage: %s [logfile]..." % basename(sys.argv[0]), file=sys.stderr)
for i in sys.argv[1:]:
process(i)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment