chiark / gitweb /
Make /off /a and /off /d work for vessels other than the one we're on
[ypp-sc-tools.db-test.git] / yoweb-scrape
index 720e886769131f60d64f854f9b26576a5d4ffe86..7db7afac44400fe17ae3ae0e4b3a904d994c2c40 100755 (executable)
@@ -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['#lastinfo'] = timestamp
+                       v[pirate] = pa
+               v['#lastinfo'] = timestamp
                self.force_redisplay()
                return pa
 
@@ -518,15 +517,17 @@ 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(v, timestamp, pirate, event):
+                       self._onboard_event(
+                                       v, timestamp, pirate, 'leaving '+event)
+                       del v[pirate]
+                       del self._pl[pirate]
 
                m = rm('Going aboard the (\\S.*\\S)\\.\\.\\.$')
                if m:
@@ -575,23 +576,43 @@ class ChatLogTracker:
                        if not m2: return chat(what)
 
                        (cmd, vn, targets) = m2.groups()
+                       dml = ['metachat', cmd]
 
-                       if cmdr == self._myself.name: how = 'manual: /%s' % cmd
-                       else: how = '/%s %s' % (cmd,cmdr)
-                       if cmd == 'a': each = ob_x
+                       if cmd == 'a': each = self._onboard_event
                        else: each = disembark
 
-                       if vn is not None:
-                               vn = vn.title()
-                               if not regexp.match(
-                                               '(?:.* )?' + vn + '$',
-                                               self._vessel):
-                                       return chat('/%s %s:' % (cmd,vn))
+                       if cmdr == self._myself.name:
+                               dml.append('self')
+                               how = 'manual: /%s' % cmd
+                       else:
+                               dml.append('other')
+                               how = '/%s %s' % (cmd,cmdr)
+
+                       v = None
+                       if vn is not None and len(vn.split(' ')) == 2:
+                               v = self._update_vessel_lookup(
+                                       vn.title(), timestamp, dml)
+                       elif self._v is None:
+                               dml.append('no-current')
+                       elif vn is None:
+                               dml.append('current')
+                               v = self._v
+                       elif regexp.match('(?:.* )?%s$' % vn.title(),
+                                       self._vessel):
+                               dml.append('match')
+                               v = self._v
+                       else:
+                               dml.append('unk-abbrev')
+
+                       if v is None:
+                               return d(' '.join(dml))
+
+                       targets = targets.strip().split(' ')
+                       dml.append(`len(targets)`)
+                       for target in targets:
+                               each(v, timestamp, target.title(), how)
 
-                       for target in targets.split(' '):
-                               if not target: continue
-                               each(target.title(), how)
-                       return d('/%s' % cmd)
+                       return d(' '.join(dml))
 
                m = rm('(\\w+) (?:issued an order|ordered everyone) "')
                if m: return ob1('general order');
@@ -626,7 +647,8 @@ class ChatLogTracker:
 
                m = rm('(\\w+) has left the vessel\.')
                if m:
-                       disembark(m.group(1), 'disembarked')
+                       pirate = m.group(1)
+                       disembark(self._v, timestamp, pirate, 'disembarked')
                        return d('disembarked')
 
                return d('not matched')