From: Ian Jackson Date: Sat, 16 May 2009 13:37:29 +0000 (+0100) Subject: WIP ship aid. Currently does not work at all X-Git-Tag: 1.0~63 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-test.git;a=commitdiff_plain;h=f6ea97a00f4890926e35de02645891f93c0d65a4;ds=sidebyside WIP ship aid. Currently does not work at all --- diff --git a/yoweb-scrape b/yoweb-scrape index a8a1a11..ca174e2 100755 --- a/yoweb-scrape +++ b/yoweb-scrape @@ -216,7 +216,7 @@ u'\\s*\\S*/([-A-Za-z]+)\\s*$|\\s*\\S*/\\S*\\s*\\(ocean\\-wide(?:\\s|\\xa0)+([-A- skl.msg('puzzle "%s" multiple standings %s' % (puzzle, `sl`)) continue - if not len(sl): + if not sl: skl.msg('puzzle "%s" no standing found' % puzzle) continue standing = sl[0] @@ -386,6 +386,143 @@ def do_standings_crew_of(args, bu): tab.pirate(pi) print tab.results() +class PirateAboard: + # pa.v + # pa.last_time + # pa.last_event + # pa.gunner + def __init__(pa, v, time, event): + pa.v = v + pa.last_time = time + pa.last_event = event + pa.gunner = False + +class ShipCrewTracker: + def __init__(self, myself_pi): + self._pl = {} # self._pl['Pirate'] = + self._vl = {} # self._vl['Vessel']['Pirate'] = PirateAboard + # self._vl['Vessel']['#lastaboard'] + self._v = None # self._v = + self._vessel = None # self._vl[self._vessel] + self._date = None + self._myself = myself_pi + self._need_redisplay = False + + def _refresh(self): + self._need_redisplay = True + + def _onboard_event(self,timestamp,pirate,event): + try: pa = self._pl[pirate] + except KeyError: pa = None + if pa is not None and pa.v is self._v: + pa.last_time = timestamp + pa.last_event = event + else: + if pa is not None: del pa.v[pirate] + pa = PirateAboard(self._v, timestamp, event) + self._pl[pirate] = pa + self._v[pirate] = pa + self._v['#lastaboard'] = timestamp + self._refresh() + return pa + + def clear_vessel(self, timestamp): + if self._v is not None: + for p in self._v: + if p.startswith('#'): continue + del self._pl[p] + self._v = {'#lastaboard': timestamp} + + def _warn(self, m): + pass + + def chatline(self,l): + rm = lambda re: regexp.match(re,l) + m = rm('=+ (\\d+)/(\\d+)/(\\d+) =+$') + if m: + self._date = m.groups() + return + if self._date is None: + return + m = rm('\\[(\d\d):(\d\d):(\d\d)\\] ') + if not m: + self._warn('undated? '+l) + return + + time_tuple = [int(x) for x in self._date + m.groups()] + time_tuple += (-1,-1,-1) + print `time_tuple` + timestamp = time.mktime(time_tuple) + l = l[l.find(' ')+1:] + + ob = lambda who, event: self._onboard_event( + timestamp, who, event) + oba = lambda m, did: ob( + m.group(1), '%s %s' % (did, m.group(2))) + + m = rm('Going aboard the (\\S.*\\S)\\.\\.\\.$') + if m: + self._vessel = m.group(1) + try: self._v = self._vl[self._vessel] + except KeyError: self._v = None + if self._v is not None: la = self._v['#lastaboard'] + else: la = 0 + if timestamp - la > 3600: + self.clear_vessel(timestamp) + ob(self._myself.name, 'we boarded') + + if self._v is None: return + + m = rm('You have ordered (\\w+) to do some (\\S.*\\S)\\.$') + if m: + pa = oba(m, 'ordered') + if m.group(2) == 'Gunning': + pa.gunner = True + return + + m = rm('(\\w+) abandoned a (\\S.*\\S) station\\.$') + if m: oba(m,'abandoned'); return + + m = rm('(\\w+) says, "') + if m: ob(m.group(1), 'talked'); return + + m = rm('(\\w+) has left the vessel\.') + if m: + who = m.group(1) + ob(who, 'disembarked') + del self._v[who] + del self._pl[who] + return + + return + +def do_ship_aid(args, bu): + if len(args) != 1: bu('ship-aid takes only chat log filename') + logfn = args[0] + logfn_re = '(?:.*/)?([A-Z][a-z]+)_([a-z]+)_chat-log-\\w+$' + match = regexp.match(logfn_re, logfn) + if not match: bu('ship-aid chat log filename is not in default format') + (pirate, fetcher.ocean) = match.groups() + myself_pi = PirateInfo(pirate,3600) + track = ShipCrewTracker(myself_pi) + f = file(logfn) + l = '' + while True: + print "1>"+l+"<" + l += f.readline() + if l.endswith('\n'): + l.rstrip() + print "2>"+l+"<" + track.chatline(l) +# print `track.__dict__` + l = '' + continue + if l: + continue + print "3>EOF<" + print `track.__dict__` + os.sleep(1) + def main(): global opts, fetcher