home · contact · privacy
Differentiate thing blocking into blocks_{sound,light,movement}.
[plomrogue2] / plomrogue / parser.py
index 2a87e7d10ea221336cde9dae391b14d5b774b024..302733d0322a69c9592276b94239b626debcb4c3 100644 (file)
@@ -77,7 +77,18 @@ class Parser:
         """Parse msg as call to function, return function with args tuple.
 
         Respects function signature defined in function's .argtypes attribute.
         """Parse msg as call to function, return function with args tuple.
 
         Respects function signature defined in function's .argtypes attribute.
+
+        Throws out messages with any but a small list of acceptable characters.
+
         """
         """
+        import string
+        msg = msg.replace('\n', ' ')  # Inserted by some tablet keyboards.
+        legal_chars = string.digits + string.ascii_letters +\
+            string.punctuation + ' ' + 'ÄäÖöÜüߧ' + 'éèáàô' + '–…'
+        for c in msg:
+            if not c in legal_chars:
+                raise ArgError('Command/message contains illegal character(s), '
+                               'may only contain ones of: %s' % legal_chars)
         tokens = self.tokenize(msg)
         if len(tokens) == 0:
             return None, ()
         tokens = self.tokenize(msg)
         if len(tokens) == 0:
             return None, ()
@@ -101,8 +112,8 @@ class Parser:
         tmpl_tokens = signature.split()
         if len(tmpl_tokens) != len(args_tokens):
             raise ArgError('Number of arguments (' + str(len(args_tokens)) +
         tmpl_tokens = signature.split()
         if len(tmpl_tokens) != len(args_tokens):
             raise ArgError('Number of arguments (' + str(len(args_tokens)) +
-                           ') not expected number (' + str(len(tmpl_tokens))
-                           ').')
+                           ') not expected number (' + str(len(tmpl_tokens)) +
+                           ').')
         args = []
         string_string = 'string'
         for i in range(len(tmpl_tokens)):
         args = []
         string_string = 'string'
         for i in range(len(tmpl_tokens)):
@@ -116,6 +127,15 @@ class Parser:
                 if not arg.isdigit() or int(arg) < 1:
                     raise ArgError('Argument must be positive integer.')
                 args += [int(arg)]
                 if not arg.isdigit() or int(arg) < 1:
                     raise ArgError('Argument must be positive integer.')
                 args += [int(arg)]
+            elif tmpl == 'int':
+                try:
+                    args += [int(arg)]
+                except ValueError:
+                    raise ArgError('Argument must be integer.')
+            elif tmpl == 'bool':
+                if not arg.isdigit() or int(arg) not in (0, 1):
+                    raise ArgError('Argument must be 0 or 1.')
+                args += [bool(int(arg))]
             elif tmpl == 'char':
                 try:
                     ord(arg)
             elif tmpl == 'char':
                 try:
                     ord(arg)