1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
#!/usr/bin/env python3
"""
A simple script to parse and output logs from a poezio logfile
"""
import argparse
from functools import singledispatch
from typing import List, Optional, IO
from poezio import poopt
from poezio.logger import LogInfo, LogMessage, parse_log_line
INFO_COLOR = '\033[35;2m'
NICK_COLOR = '\033[36;2m'
NO_COLOR = '\033[0m'
TIME_COLOR = '\033[33;2m'
SHOW_INFO = True
SHOW_TIME = True
@singledispatch
def print_log(log_object: LogMessage,
additional_lines: Optional[List[str]] = None):
time = log_object.time.strftime('%Y-%m-%d %H:%M:%S')
nick = log_object.nick
offset = ((
(poopt.wcswidth(time) + 1) if SHOW_TIME else 0)
+ 2 + poopt.wcswidth(nick)
)
pad = ' ' * offset
if additional_lines:
more = ''.join([(pad + line) for line in additional_lines])
else:
more = ''
if SHOW_TIME:
print(
f'{TIME_COLOR}{time}{NO_COLOR} {NICK_COLOR}{nick}{NO_COLOR}> '
f'{log_object.text}\n' + more,
end='',
)
else:
print(
f'{NICK_COLOR}{nick}{NO_COLOR}> '
f'{log_object.text}\n' + more,
end='',
)
@print_log.register(type(None))
def print_log_none(log_object, additional_lines=None):
return
@print_log.register(LogInfo)
def print_log_loginfo(log_object: LogInfo,
additional_lines: Optional[List[str]] = None):
if not SHOW_INFO:
return
time = log_object.time.strftime('%Y-%m-%d %H:%M:%S') + ' '
offset = (poopt.wcswidth(time) + 1) if SHOW_TIME else 0
pad = ' ' * offset
if additional_lines:
more = ''.join([(pad + line) for line in additional_lines])
else:
more = ''
if SHOW_TIME:
print(
f'{TIME_COLOR}{time}{NO_COLOR}{log_object.text}\n' + more,
end=''
)
else:
print(f'{INFO_COLOR}{log_object.text}\n' + more, end='')
def parse_messages(fd: IO[str]):
in_text = False
more_lines: List[str] = []
current_log = None
for line in fd:
if in_text and not line.startswith(' '):
print_log(current_log, more_lines)
more_lines = []
in_text = False
current_log = None
elif in_text:
more_lines.append(line[1:])
continue
current_log = parse_log_line(line, fd.name)
in_text = True
print_log(current_log, more_lines)
if __name__ == '__main__':
parser = argparse.ArgumentParser('poezio_logs', description="""
Show the logs stored in poezio format in a more human-readable way.
""")
parser.add_argument('-i', '--hide-info', dest='hide_info',
action='store_true', default=False,
help='Hide info lines')
parser.add_argument('-t', '--hide-time', dest='hide_time',
action='store_true', default=False,
help='Hide timestamps')
parser.add_argument('-c', '--no-color', dest='no_color',
action='store_true', default=False,
help='Remove color')
parser.add_argument('log_file', type=argparse.FileType('r'))
result = parser.parse_args()
SHOW_INFO = not result.hide_info
SHOW_TIME = not result.hide_time
if result.no_color:
INFO_COLOR = ''
NICK_COLOR = ''
NO_COLOR = ''
TIME_COLOR = ''
parse_messages(result.log_file)
|