+ def _str_vessel(self, vn, v):
+ s = ' vessel %s\n' % vn
+ s += ' '*20 + "%-*s %13s\n" % (
+ max_pirate_namelen, '#lastaboard',
+ v['#lastaboard'])
+ for pn in sorted(v.keys()):
+ if pn.startswith('#'): continue
+ pa = v[pn]
+ assert pa.v == v
+ assert self._pl[pn] == pa
+ s += ' '*20 + "%s %-*s %13s %-30s %13s %s\n" % (
+ (' ','G')[pa.gunner],
+ max_pirate_namelen, pn,
+ pa.last_time, pa.last_event,
+ pa.last_chat_time, pa.last_chat_chan)
+ return s
+
+ def __str__(self):
+ s = '''<ChatLogTracker
+ myself %s
+ vessel %s
+''' % (self._myself.name, self._vessel)
+ assert ((self._v is None and self._vessel is None) or
+ (self._v is self._vl[self._vessel]))
+ if self._vessel is not None:
+ s += self._str_vessel(self._vessel, self._v)
+ for vn in sorted(self._vl.keys()):
+ if vn == self._vessel: continue
+ s += self._str_vessel(vn, self._vl[vn])
+ for p in self._pl:
+ pa = self._pl[p]
+ assert pa.v[p] is pa
+ assert pa.v in self._vl.values()
+ s += '>\n'
+ return s
+
+ def catchup(self, progress=None):
+ while True:
+ more = self._f.readline()
+ if not more: break
+
+ self._progress[0] += len(more)
+ if progress: progress.progress(*self._progress)
+
+ self._lbuf += more
+ if self._lbuf.endswith('\n'):
+ self.chatline(self._lbuf.rstrip())
+ self._lbuf = ''
+ if progress: progress.caughtup()
+
+ def changed(self):
+ rv = self._need_redisplay
+ self._need_redisplay = False
+ return rv
+ def myname(self):
+ # returns our pirate name
+ return self._myself.name
+ def vessel(self):
+ # returns the vessel we're aboard or None
+ return self._vessel
+ def aboard(self):
+ # returns a list of PirateAboard sorted by name
+ return [ self._v[pn]
+ for pn in sorted(self._v.keys())
+ if not pn.startswith('#') ]
+
+class ProgressPrintPercentage:
+ def __init__(self, f=sys.stdout): self._f = f
+ def progress(self,done,total):
+ self._f.write("scan chat logs %3d%%\r" % ((done*100) / total))
+ self._f.flush()
+ def caughtup(self):
+ self._f.write(' \r')
+ self._f.flush()
+
+def prep_chat_log(args, bu,
+ progress=ProgressPrintPercentage(),
+ max_myself_age=3600):
+ if len(args) != 1: bu('this action takes only chat log filename')