chiark / gitweb /
yoweb-scrape: new flag and ocean functionality - embargoes-flag-of
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 16 Jan 2011 20:05:15 +0000 (20:05 +0000)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 16 Jan 2011 20:05:15 +0000 (20:05 +0000)
yoweb-scrape

index 90a5677..f9976b8 100755 (executable)
@@ -361,12 +361,14 @@ u'\\s*\\S*/([-A-Za-z]+)\\s*$|\\s*\\S*/\\S*\\s*\\(ocean\\-wide(?:\\s|\\xa0)+([-A-
 
 class CrewInfo(SomethingSoupInfo):
        # Public data members:
+       #  ci.crewid
        #  ci.crew = [ ('Captain',        ['Pirate', ...]),
        #              ('Senior Officer', [...]),
        #               ... ]
        #  pi.msgs = [ 'message describing problem with scrape' ]
 
        def __init__(self, crewid, max_age=300):
+               self.crewid = crewid
                SomethingSoupInfo.__init__(self,
                        'crew/info.wm?crewid=', crewid, max_age)
                self._find_crew()
@@ -410,6 +412,7 @@ class CrewInfo(SomethingSoupInfo):
 class FlagInfo(SomethingSoupInfo):
        # Public data members (after init):
        #
+       #   flagid
        #   name        #               string
        #
        #   relations[n] = (otherflagname, otherflagid, [stringfromyoweb],
@@ -424,6 +427,7 @@ class FlagInfo(SomethingSoupInfo):
        #   islands[n] = (islandname, islandid)
        #
        def __init__(self, flagid, max_age=600):
+               self.flagid = flagid
                SomethingSoupInfo.__init__(self,
                        'flag/info.wm?flagid=', flagid, max_age)
                self._find_flag()
@@ -612,12 +616,11 @@ class IslandFlagInfo(IslandExtendedInfo):
                return IslandExtendedInfo.__str__(self) + '; ' + str(self.flag)
 
 class NullProgressReporter():
-       def start(self): pass
        def doing(self, msg): pass
        def stop(self): pass
 
 class TypewriterProgressReporter():
-       def start(self):
+       def __init__(self):
                self._l = 0
        def doing(self,m):
                self._doing(m + '...')
@@ -640,15 +643,10 @@ class OceanInfo():
        # Public data attributes:
        #   oi.islands[islename] = IslandInfo(...)
        #   oi.arches[archname][islename] = IslandInfo(...)
-       def __init__(self, isleclass=IslandBasicInfo, progressreporter=None):
-               if progressreporter is None:
-                       if opts.debug: progressreporter = NullProgressReporter()
-                       else: progressreporter = TypewriterProgressReporter()
-
+       def __init__(self, isleclass=IslandBasicInfo):
                self.isleclass = isleclass
                self.ocean = fetcher.ocean.lower().capitalize()
 
-               progressreporter.start()
                progressreporter.doing('fetching ocean info')
 
                cmdl = ['./yppedia-ocean-scraper']
@@ -705,8 +703,6 @@ class OceanInfo():
                        self.islands[islename] = isle
                        self.arches[archname][islename] = isle
 
-               progressreporter.stop()
-
        def __str__(self):
                return `(self.islands, self.arches)`
 
@@ -1359,23 +1355,27 @@ def do_pirate(pirates, bu):
                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')
+def prep_crewflag_of(args, bu, max_age, selector, constructor):
+       if len(args) != 1: bu('crew-of etc. take one pirate name')
        pi = PirateInfo(args[0], max_age)
-       if pi.crew is None: return None
-       return CrewInfo(pi.crew[0], max_age)
+       cf = selector(pi)
+       if cf is None: return None
+       return constructor(cf[0], max_age)
+
+def prep_crew_of(args, bu, max_age=300):
+       return prep_crewflag_of(args, bu, max_age,
+               (lambda pi: pi.crew), CrewInfo)
+
+def prep_flag_of(args, bu, max_age=300):
+       return prep_crewflag_of(args, bu, max_age,
+               (lambda pi: pi.flag), FlagInfo)
 
 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
+       fi = prep_flag_of(args, bu)
 
 def do_standings_crew_of(args, bu):
        ci = prep_crew_of(args, bu, 60)
@@ -1411,6 +1411,8 @@ def do_embargoes(args, bu):
                if isle.flag is None: return 'uncolonised'
                return isle.flag.name
 
+       progressreporter.stop()
+
        for archname in sorted(oi.arches.keys()):
                print 'ARCHIPELAGO: ',archname
                for islename in sorted(oi.arches[archname].keys()):
@@ -1430,6 +1432,27 @@ def do_embargoes(args, bu):
                                delim = '; '
                        print ''
 
+def do_embargoes_flag_of(args, bu):
+       progressreporter.doing('fetching flag info')
+       fi = prep_flag_of(args, bu)
+       oi = OceanInfo(IslandFlagInfo)
+       progressreporter.stop()
+       any = False
+       for islename in sorted(oi.islands.keys()):
+               isle = oi.islands[islename]
+               flag = isle.flag
+               if flag is None: continue
+               for rel in flag.relations:
+                       (oname, oid, dummy, thisdeclaring,
+                               odeclaringmin,odeclaringmax) = rel
+                       if thisdeclaring >= 0: continue
+                       if oid != fi.flagid: continue
+                       if not any: print 'EMBARGOED:'
+                       any = True
+                       print " %-30s (%s)" % (islename, flag.name)
+       if not any:
+               print 'No embargoes.'
+
 #----- modes which use the chat log parser are quite complex -----
 
 class ProgressPrintPercentage:
@@ -1751,7 +1774,7 @@ class KeystrokeReader(DummyKeystrokeReader):
 #---------- main program ----------
 
 def main():
-       global opts, fetcher, yppedia
+       global opts, fetcher, yppedia, progressreporter
 
        pa = OptionParser(
 '''usage: .../yoweb-scrape [OPTION...] ACTION [ARGS...]
@@ -1760,6 +1783,8 @@ actions:
  yoweb-scrape [--ocean OCEAN ...] crew-of PIRATE
  yoweb-scrape [--ocean OCEAN ...] standings-crew-of PIRATE
  yoweb-scrape [--ocean OCEAN ...] track-chat-log CHAT-LOG
+ yoweb-scrape [--ocean OCEAN ...] ocean|embargoes
+ yoweb-scrape [--ocean OCEAN ...] embargoes-flag-of PIRATE
  yoweb-scrape [options] ship-aid CHAT-LOG  (must be .../PIRATE_OCEAN_chat-log*)
 
 display modes (for --display) apply to ship-aid:
@@ -1836,6 +1861,11 @@ display modes (for --display) apply to ship-aid:
        fetcher = Yoweb(opts.ocean, opts.cache_dir)
        yppedia = Yppedia(opts.cache_dir)
 
+       if opts.debug or not os.isatty(0):
+                progressreporter = NullProgressReporter()
+       else:
+               progressreporter = TypewriterProgressReporter()
+
        mode_fn(args[1:], pa.error)
 
 main()