+ def _find_matching_vessel(self, pattern, timestamp, cmdr,
+ dml=[], create=False):
+ # use when a commander pirate `cmdr' specified a vessel
+ # by name `pattern' (either may be None)
+ # if create is true, will create the vessel
+ # record if an exact name is specified
+
+ if (pattern is not None and
+ not '*' in pattern
+ and len(pattern.split(' ')) == 2):
+ vn = pattern.title()
+ dml.append('exact')
+ return self._vessel_lookup(
+ vn, timestamp, dml=dml, create=create)
+
+ if pattern is None:
+ pattern_check = lambda vn: True
+ else:
+ re = '(?:.* )?%s$' % pattern.lower().replace('*','.+')
+ pattern_check = regexp.compile(re, regexp.I).match
+
+ tries = []
+
+ cmdr_pa = self._pl.get(cmdr, None)
+ if cmdr_pa: tries.append((cmdr_pa.v, 'cmdr'))
+
+ tries.append((self._v, 'here'))
+ tried_vns = []
+
+ for (v, dm) in tries:
+ if v is None: dml.append(dm+'?'); continue
+
+ vn = v['#name']
+ if not pattern_check(vn):
+ tried_vns.append(vn)
+ dml.append(dm+'#')
+ continue
+
+ dml.append(dm+'!')
+ return v
+
+ if pattern is not None and '*' in pattern:
+ search = [
+ (vn,v)
+ for (vn,v) in self._vl.iteritems()
+ if not self._vessel_stale(v, timestamp)
+ if pattern_check(vn)
+ ]
+ #debug('CLT-RE /%s/ wanted (%s) searched (%s)' % (
+ # re,
+ # '/'.join(tried_vns),
+ # '/'.join([vn for (vn,v) in search])))
+
+ if len(search)==1:
+ dml.append('one')
+ return search[0][1]
+ elif search:
+ dml.append('many')
+ else:
+ dml.append('none')
+