@@ -137,6 +137,28 @@ def parse_logs(self, channels = [], timestamp = True, remove_bots = False):
137137 or specify a list of log files to parse." )
138138
139139 # Retrieve data from logs
140+ import re
141+ import codecs
142+
143+ ESCAPE_SEQUENCE_RE = re .compile (r'''
144+ ( \\U........ # 8-digit hex escapes
145+ | \\u.... # 4-digit hex escapes
146+ | \\x.. # 2-digit hex escapes
147+ | \\[0-7]{1,3} # Octal escapes
148+ | \\N\{[^}]+\} # Unicode characters by name
149+ | \\[\\'"abfnrtv] # Single-character escapes
150+ )''' , re .UNICODE | re .VERBOSE )
151+
152+ def decode_escapes (s ):
153+ def decode_match (match ):
154+ return codecs .decode (match .group (0 ), 'unicode-escape' )
155+
156+ return ESCAPE_SEQUENCE_RE .sub (decode_match , s )
157+
158+ # Check if string given
159+ if type (channels ) == str :
160+ channels = [channels ]
161+
140162 for channel in channels :
141163 if not channel .endswith (".log" ):
142164 filename = channel + ".log"
@@ -167,7 +189,7 @@ def parse_logs(self, channels = [], timestamp = True, remove_bots = False):
167189
168190 # Parse username, message text and (optional) datetime
169191 data = []
170- for ind , message in enumerate ( split_messages ) :
192+ for message in split_messages :
171193 username = None
172194 message_text = None
173195 datetime = None
@@ -179,7 +201,8 @@ def parse_logs(self, channels = [], timestamp = True, remove_bots = False):
179201
180202 slice_point = slice_ .find (":" ) + 1
181203 message_text = slice_ [slice_point :]
182- row ['text' ] = message_text
204+ decoded_txt = decode_escapes (message_text ).encode ('latin1' ).decode ('utf-8' )
205+ row ['text' ] = decoded_txt
183206
184207 # Parse username
185208 b = message .find ("b" )
0 commit comments