else:
return None
+ def local_command(self, metacmd):
+ # returns None if all went well, or problem message
+ return self._command(self._myself.name, metacmd,
+ "local", time.time(),
+ (lambda m: debug('CMD %s' % metacmd)))
+
+ def _command(self, cmdr, metacmd, chan, timestamp, d):
+ # returns None if all went well, or problem message
+ metacmd = regexp.sub('\\s+', ' ', metacmd).strip()
+ m2 = regexp.match(
+ '/([adj]) (?:([A-Za-z* ]+)\\s*:)?([A-Za-z ]+)$',
+ metacmd)
+ if not m2: return "unknown syntax or command"
+
+ (cmd, pattern, targets) = m2.groups()
+ dml = ['cmd', chan, cmd]
+
+ if cmd == 'a': each = self._onboard_event
+ elif cmd == 'd': each = disembark
+ else: each = lambda *l: self._onboard_event(*l,
+ **{'jobber':'applied'})
+
+ if cmdr == self._myself.name:
+ dml.append('self')
+ how = 'cmd: %s' % cmd
+ else:
+ dml.append('other')
+ how = 'cmd: %s %s' % (cmd,cmdr)
+
+ if cmd == 'j':
+ if pattern is not None:
+ return "/j command does not take a vessel"
+ v = None
+ else:
+ v = self._find_matching_vessel(
+ pattern, timestamp, cmdr,
+ dml, create=True)
+
+ if cmd == 'j' or v is not None:
+ targets = targets.strip().split(' ')
+ dml.append(`len(targets)`)
+ for target in targets:
+ each(v, timestamp, target.title(), how)
+ self._vessel_updated(v, timestamp)
+
+ dm = ' '.join(dml)
+ return d(dm)
+
+ return None
+
def chatline(self,l):
rm = lambda re: regexp.match(re,l)
d = lambda m: self._debug_line_disposition(timestamp,l,m)
def chat_metacmd(chan):
(cmdr, metacmd) = m.groups()
- metacmd = regexp.sub('\\s+', ' ', metacmd).strip()
- m2 = regexp.match(
- '/([adj]) (?:([A-Za-z* ]+)\\s*:)?([A-Za-z ]+)$',
- metacmd)
- if not m2: return chat(chan)
-
- (cmd, pattern, targets) = m2.groups()
- dml = ['cmd', chan, cmd]
-
- if cmd == 'a': each = self._onboard_event
- elif cmd == 'd': each = disembark
- else: each = lambda *l: self._onboard_event(*l,
- **{'jobber':'applied'})
-
- if cmdr == self._myself.name:
- dml.append('self')
- how = 'cmd: %s' % cmd
+ whynot = self._command(
+ cmdr, metacmd, chan, timestamp, d)
+ if whynot is not None:
+ return chat(chan)
else:
- dml.append('other')
- how = 'cmd: %s %s' % (cmd,cmdr)
-
- if cmd == 'j':
- if pattern is not None:
- return chat(chan)
- v = None
- else:
- v = self._find_matching_vessel(
- pattern, timestamp, cmdr,
- dml, create=True)
-
- if cmd == 'j' or v is not None:
- targets = targets.strip().split(' ')
- dml.append(`len(targets)`)
- for target in targets:
- each(v, timestamp, target.title(), how)
- self._vessel_updated(v, timestamp)
-
- dm = ' '.join(dml)
- chat_core(cmdr, 'cmd '+chan)
- return d(dm)
+ chat_core(cmdr, 'cmd '+chan)
m = rm('(\\w+) (?:issued an order|ordered everyone) "')
if m: return ob1('general order');
rotate_nya = '/-\\'
sort = NameSorter()
+ clicmd = None
+ clierr = None
+ cliexec = None
while True:
track.catchup()
now = time.time()
- (vn, s) = find_vessel()
- s = track.myname() + s
- s += " at %s" % time.strftime("%Y-%m-%d %H:%M:%S")
- s += kreader.info()
+ (vn, vs) = find_vessel()
+
+ s = ''
+ if cliexec is not None:
+ s += '...'
+ elif clierr is not None:
+ s += 'Error: '+clierr
+ elif clicmd is not None:
+ s += '/' + clicmd
+ else:
+ s = track.myname() + vs
+ s += " at %s" % time.strftime("%Y-%m-%d %H:%M:%S")
+ s += kreader.info()
s += '\n'
tbl_s = StringIO()
displayer.show(s)
tbl_s.close()
+ if cliexec is not None:
+ clierr = track.local_command("/"+cliexec.strip())
+ cliexec = None
+ continue
+
k = kreader.getch()
if k is None:
rotate_nya = rotate_nya[1:3] + rotate_nya[0]
continue
+ if clierr is not None:
+ clierr = None
+ continue
+
+ if clicmd is not None:
+ if k == '\r' or k == '\n':
+ cliexec = clicmd
+ clicmd = clicmdbase
+ elif k == '\e' and clicmd != "":
+ clicmd = clicmdbase
+ elif k == '\33':
+ clicmd = None
+ elif k == '\b' or k == '\177':
+ clicmd = clicmd[ 0 : len(clicmd)-1 ]
+ else:
+ clicmd += k
+ continue
+
if k == 'q': break
elif k == 'g': sort = SkillSorter('Gunning')
elif k == 'c': sort = SkillSorter('Carpentry')
elif k == 'd': sort = SkillSorter('Battle Navigation')
elif k == 't': sort = SkillSorter('Treasure Haul')
elif k == 'a': sort = NameSorter()
+ elif k == '/': clicmdbase = ""; clicmd = clicmdbase
+ elif k == '+': clicmdbase = "a "; clicmd = clicmdbase
else: pass # unknown key command
#---------- individual keystroke input ----------