X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-live.git;a=blobdiff_plain;f=yoweb-scrape;h=93ce3177b59d5370da7b90544b9bd21a98ec5990;hp=43b95225638fe6731938b7d1682adb10d83c33ba;hb=d759000ee3d3e189ab8e8305ec0ea97bc9889e5a;hpb=b179c914a258d5f14ba11b99a05efa5580da5671 diff --git a/yoweb-scrape b/yoweb-scrape index 43b9522..93ce317 100755 --- a/yoweb-scrape +++ b/yoweb-scrape @@ -39,7 +39,7 @@ max_pirate_namelen = 12 def debug(m): if opts.debug > 0: - print m + print >>opts.debug_file, m def format_time_interval(ti): if ti < 120: return '%d:%02d' % (ti / 60, ti % 60) @@ -423,7 +423,7 @@ class ChatLogTracker: def __init__(self, myself_pi, logfn): self._pl = {} # self._pl['Pirate'] = self._vl = {} # self._vl['Vessel']['Pirate'] = PirateAboard - # self._vl['Vessel']['#lastaboard'] + # self._vl['Vessel']['#lastinfo'] self._v = None # self._v = self._vessel = None # self._vl[self._vessel] self._date = None @@ -436,18 +436,17 @@ class ChatLogTracker: def force_redisplay(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: + def _onboard_event(self,v,timestamp,pirate,event): + pa = self._pl.get(pirate, None) + if pa is not None and pa.v is v: pa.last_time = timestamp pa.last_event = event else: if pa is not None: del pa.v[pirate] - pa = PirateAboard(pirate, self._v, timestamp, event) + pa = PirateAboard(pirate, v, timestamp, event) self._pl[pirate] = pa - self._v[pirate] = pa - self._v['#lastaboard'] = timestamp + v[pirate] = pa + v['#lastinfo'] = timestamp self.force_redisplay() return pa @@ -459,18 +458,29 @@ class ChatLogTracker: def expire_garbage(self, timestamp): for (vn,v) in list(self._vl.iteritems()): - la = v['#lastaboard'] + la = v['#lastinfo'] if timestamp - la > opts.ship_reboard_clearout: self._debug_line_disposition(timestamp,'', 'stale reset '+vn) self._trash_vessel(v) del self._vl[vn] - def clear_vessel(self, timestamp): - if self._v is not None: - self._trash_vessel(self._v) - self._v = {'#lastaboard': timestamp} - self._vl[self._vessel] = self._v + def _create_vessel(self, vn, timestamp): + self._vl[vn] = v = { '#lastinfo': timestamp } + return v + + def _update_vessel_lookup(self, vn, timestamp, dml): + v = self._vl.get(vn, None) + if v is None: + dml.append('new') + v = self._create_vessel(vn, timestamp) + elif timestamp - v['#lastinfo'] > opts.ship_reboard_clearout: + dml.append('stale') + self._trash_vessel(v) + v = self._create_vessel(vn, timestamp) + else: + dml.append('current') + return v def _debug_line_disposition(self,timestamp,l,m): debug('CLT %13s %-30s %s' % (timestamp,m,l)) @@ -507,35 +517,27 @@ class ChatLogTracker: l = l[l.find(' ')+1:] - def ob_x(who,event): - return self._onboard_event(timestamp, who, event) + def ob_x(pirate,event): + return self._onboard_event( + self._v, timestamp, pirate, event) def ob1(did): ob_x(m.group(1), did); return d(did) def oba(did): return ob1('%s %s' % (did, m.group(2))) - def disembark(who, how): - ob_x(who, 'leaving '+how) - del self._v[who] - del self._pl[who] + def disembark(pirate, event): + ob_x(pirate, 'leaving '+event) + del self._v[pirate] + del self._pl[pirate] m = rm('Going aboard the (\\S.*\\S)\\.\\.\\.$') if m: + dm = ['boarding'] pn = self._myself.name - self._vessel = m.group(1) - dm = 'boarding' - - try: self._v = self._vl[self._vessel] - except KeyError: self._v = None; dm += ' new' - - if self._v is not None: la = self._v['#lastaboard'] - else: la = 0; dm += ' ?la' - - if timestamp - la > opts.ship_reboard_clearout: - self.clear_vessel(timestamp) - dm += ' stale' + self._vessel = vn = m.group(1) + self._v = self._update_vessel_lookup(vn, timestamp, dm) ob_x(pn, 'we boarded') self.expire_garbage(timestamp) - return d(dm) + return d(' '.join(dm)) if self._v is None: return d('no vessel') @@ -632,8 +634,8 @@ class ChatLogTracker: def _str_vessel(self, vn, v): s = ' vessel %s\n' % vn s += ' '*20 + "%-*s %13s\n" % ( - max_pirate_namelen, '#lastaboard', - v['#lastaboard']) + max_pirate_namelen, '#lastinfo', + v['#lastinfo']) for pn in sorted(v.keys()): if pn.startswith('#'): continue pa = v[pn] @@ -677,6 +679,8 @@ class ChatLogTracker: if self._lbuf.endswith('\n'): self.chatline(self._lbuf.rstrip()) self._lbuf = '' + if opts.debug >= 2: + debug(self.__str__()) if progress: progress.caughtup() def changed(self): @@ -759,9 +763,9 @@ def prep_chat_log(args, bu, progress.show_init(pirate, fetcher.ocean) track = ChatLogTracker(myself, logfn) - opts.debug -= 1 + opts.debug -= 2 track.catchup(progress) - opts.debug += 1 + opts.debug += 2 track.force_redisplay() @@ -913,7 +917,7 @@ display modes (for --display) apply to ship-aid: help='cache yoweb pages in DIR') ao('-D','--debug', action='count', dest='debug', default=0, help='enable debugging output') - ao('--debug-fd', action='count', dest='debug_fd', + ao('--debug-fd', type='int', dest='debug_fd', help='write any debugging output to specified fd') ao('-q','--quiet', action='store_true', dest='quiet', help='suppress warning output') @@ -933,7 +937,9 @@ display modes (for --display) apply to ship-aid: pa.error('need a mode argument') if opts.debug_fd is not None: - opts.debug_file = fdopen(opts.debug_fd, 'w') + opts.debug_file = os.fdopen(opts.debug_fd, 'w') + else: + opts.debug_file = sys.stdout mode = args[0] mode_fn_name = 'do_' + mode.replace('_','#').replace('-','_')