+ def _str_vessel(self, vn, v):
+ s = ' vessel %s\n' % vn
+ s += ' '*20 + "%-*s %13s\n" % (
+ max_pirate_namelen, '#lastinfo',
+ v['#lastinfo'])
+ assert v['#name'] == vn
+ for pn in sorted(v.keys()):
+ if pn.startswith('#'): continue
+ pa = v[pn]
+ assert pa.v == v
+ s += self._str_pa(pn,pa)
+ 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])
+ s += " elsewhere\n"
+ for p in self._pl:
+ pa = self._pl[p]
+ if pa.v is not None:
+ assert pa.v[p] is pa
+ assert pa.v in self._vl.values()
+ else:
+ s += self._str_pa(pa.name, pa)
+ 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 opts.debug >= 2:
+ debug(self.__str__())
+ self._expire_jobbers(time.time())
+
+ 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 vesselname(self):
+ # returns the vessel name we're aboard or None
+ return self._vessel
+ def lastvesselname(self):
+ # returns the last vessel name we were aboard or None
+ return self._lastvessel
+ def aboard(self, vesselname=True):
+ # returns a list of PirateAboard the vessel
+ # sorted by pirate name
+ # you can pass this None and you'll get []
+ # or True for the current vessel (which is the default)
+ # the returned value is a fresh list of persistent
+ # PirateAboard objects
+ if vesselname is True: v = self._v
+ else: v = self._vl.get(vesselname.title())
+ if v is None: return []
+ return [ v[pn]
+ for pn in sorted(v.keys())
+ if not pn.startswith('#') ]
+ def jobbers(self):
+ # returns a the jobbers' PirateAboards,
+ # sorted by jobber class and reverse of expiry time
+ l = [ pa
+ for pa in self._pl.values()
+ if pa.jobber is not None
+ ]
+ def compar_key(pa):
+ return (pa.jobber, -pa.expires)
+ l.sort(key = compar_key)
+ return l
+
+#---------- implementations of actual operation modes ----------
+
+def do_pirate(pirates, bu):
+ print '{'
+ for pirate in pirates:
+ info = PirateInfo(pirate)
+ print '%s: %s,' % (`pirate`, info)
+ print '}'
+
+def prep_crew_of(args, bu, max_age=300):
+ if len(args) != 1: bu('crew-of takes one pirate name')
+ pi = PirateInfo(args[0], max_age)
+ if pi.crew is None: return None
+ return CrewInfo(pi.crew[0], max_age)
+
+def do_crew_of(args, bu):
+ ci = prep_crew_of(args, bu)
+ print ci
+
+def do_flag_of(args, bu):
+ if len(args) != 1: bu('flag-of takes one pirate name')
+ max_age = 300
+ pi = PirateInfo(args[0], max_age)
+ if pi.flag is None: fi = None
+ else: fi = FlagInfo(pi.flag[0], max_age)
+ print `fi`
+
+def do_standings_crew_of(args, bu):
+ ci = prep_crew_of(args, bu, 60)
+ tab = StandingsTable(sys.stdout)
+ tab.headings()
+ for (rank, members) in ci.crew:
+ if not members: continue
+ tab.literalline('')
+ tab.literalline('%s:' % rank)
+ for p in members:
+ pi = PirateInfo(p, random.randint(900,1800))
+ tab.pirate(pi)
+
+def do_ocean(args, bu):
+ if (len(args)): bu('ocean takes no further arguments')
+ fetcher.default_ocean()
+ oi = OceanInfo()
+ oi.collect()
+ for islename in sorted(oi.islands.keys()):
+ isle = oi.islands[islename]
+ yoweb_url = isle.yoweb_url()
+ print " %s -- %s" % (islename, yoweb_url)
+
+#----- modes which use the chat log parser are quite complex -----
+
+class ProgressPrintPercentage:
+ def __init__(self, f=sys.stdout):
+ self._f = f
+ def progress_string(self,done,total):
+ return "scan chat logs %3d%%\r" % ((done*100) / total)
+ def progress(self,*a):
+ self._f.write(self.progress_string(*a))
+ self._f.flush()
+ def show_init(self, pirate, ocean):
+ print >>self._f, 'Starting up, %s on the %s ocean' % (
+ pirate, ocean)
+ 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')