X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-test.git;a=blobdiff_plain;f=yoweb-scrape;h=4832d1ec34b88226af7c2f8e4eacd1aacadde377;hp=ed9533ef51c513b4628673712880bc9a0b0b1e3c;hb=ab90a60e9977026cfe91233221d0caf9bcf9d5c0;hpb=e9615860253eb8bfdb50d80fbea58002bc350c5b diff --git a/yoweb-scrape b/yoweb-scrape index ed9533e..4832d1e 100755 --- a/yoweb-scrape +++ b/yoweb-scrape @@ -89,8 +89,9 @@ class Fetcher: ages.append(age) return ages - def need_wait(self, now): + def need_wait(self, now, imaginary=[]): ages = self._cache_scan(now) + ages += imaginary ages.sort() debug('Fetcher ages ' + `ages`) min_age = 1 @@ -247,7 +248,7 @@ u'\\s*\\S*/([-A-Za-z]+)\\s*$|\\s*\\S*/\\S*\\s*\\(ocean\\-wide(?:\\s|\\xa0)+([-A- skl.msg('puzzle "%s" no standing found' % puzzle) continue standing = sl[0] - for i in range(0, len(standingvals)-1): + for i in range(0, len(standingvals)): if standing == standingvals[i]: self.standings[puzzle] = i if not puzzle in self.standings: @@ -417,8 +418,23 @@ class PirateAboard: pa.pi = None def pirate_info(pa): - if not pa.pi and not fetcher.need_wait(time.time()): - pa.pi = PirateInfo(pa.name, 3600) + now = time.time() + if pa.pi: + age = now - pa.pi_fetched + guide = random.randint(120,240) + if age <= guide: + return pa.pi + debug('PirateAboard refresh %d > %d %s' % ( + age, guide, pa.name)) + imaginary = [2,6] + else: + imaginary = [1] + wait = fetcher.need_wait(now, imaginary) + if wait: + debug('PirateAboard fetcher not ready %d' % wait) + return pa.pi + pa.pi = PirateInfo(pa.name, 600) + pa.pi_fetched = now return pa.pi class ChatLogTracker: @@ -521,7 +537,7 @@ class ChatLogTracker: if pattern is None: pattern_check = lambda vn: True else: - re = '(?:.* )?%s$' % pattern.lower().replace('*','.*') + re = '(?:.* )?%s$' % pattern.lower().replace('*','.+') pattern_check = regexp.compile(re, regexp.I).match tries = [] @@ -884,9 +900,9 @@ def prep_chat_log(args, bu, if not match: bu('chat log filename is not in expected format') (pirate, ocean) = match.groups() fetcher.default_ocean(ocean) - - myself = PirateInfo(pirate,max_myself_age) + progress.show_init(pirate, fetcher.ocean) + myself = PirateInfo(pirate,max_myself_age) track = ChatLogTracker(myself, logfn) opts.debug -= 2 @@ -983,30 +999,29 @@ def do_ship_aid(args, bu): displayer.realstart() - while True: - track.catchup() - now = time.time() - - s = "%s" % track.myname() - + def find_vessel(): vn = track.vesselname() - if vn is not None: - s += " on board the %s" % vn + if vn: return (vn, " on board the %s" % vn) + vn = track.lastvesselname() + if vn: return (vn, " ashore from the %s" % vn) + return (None, " not on a vessel") - if vn is None: - vn = track.lastvesselname() - if vn is not None: - s += " ashore from the %s" % vn + displayer.show(track.myname() + find_vessel()[1] + '...') - if vn is None: - s += " not on a vessel" + while True: + track.catchup() + now = time.time() + (vn, s) = find_vessel() + s = track.myname() + s s += " at %s\n" % time.strftime("%Y-%m-%d %H:%M:%S") tbl = StandingsTable() tbl.headings() - for pa in track.aboard(): + aboard = track.aboard(vn) + + for pa in aboard: pi = pa.pirate_info() xs = '' @@ -1065,6 +1080,10 @@ display modes (for --display) apply to ship-aid: ao('--all-puzzles', action='store_false', dest='ship_duty', help='show all puzzles, not just ship duty stations') + ao('--min-cache-reuse', type='int', dest='min_max_age', + metavar='SECONDS', default=60, + help='always reuse cache yoweb data if no older than this') + (opts,args) = pa.parse_args() random.seed() @@ -1082,8 +1101,8 @@ display modes (for --display) apply to ship-aid: except KeyError: pa.error('unknown mode "%s"' % mode) # fixed parameters - opts.min_max_age = 60 - opts.expire_age = 3600 + opts.expire_age = max(3600, opts.min_max_age) + opts.ship_reboard_clearout = 3600 if opts.cache_dir.startswith('~/'):