Added error handling for (?most?) invalid Player responses
[pyrisk.git] / pyrisk / player / email.py
index 988f151eca9f48303bb0fda315c316b93556cbed..67bc7f9d14ae08187b1269e06abc5f2057b5f41d 100644 (file)
@@ -68,7 +68,7 @@ class IncomingEmailDispatcher (object):
             self._cache.append((msg_tag, msg))
             msg = self._get_msg()
             msg_tag = self._msg_tag(msg['Subject'])
             self._cache.append((msg_tag, msg))
             msg = self._get_msg()
             msg_tag = self._msg_tag(msg['Subject'])
-        if verbose == True:
+        if self.verbose == True:
             print >> sys.stderr, msg
         return msg
     def _msg_tag(self, subject):
             print >> sys.stderr, msg
         return msg
     def _msg_tag(self, subject):
@@ -300,7 +300,7 @@ class EmailPlayer (Player):
             else:
                 body.append('  %s' % c)
         self._send_mail(world, log, 'Drawing cards', '\n'.join(body))
             else:
                 body.append('  %s' % c)
         self._send_mail(world, log, 'Drawing cards', '\n'.join(body))
-    def select_territory(self, world, log):
+    def __select_territory(self, world, log, error=None):
         """Return the selected territory's name.
         """
         body = [
         """Return the selected territory's name.
         """
         body = [
@@ -311,11 +311,15 @@ class EmailPlayer (Player):
         for t in world.territories():
             if t.player == None:
                 body.append('  %s' % t)
         for t in world.territories():
             if t.player == None:
                 body.append('  %s' % t)
+        if error != None:
+            body.insert(0, '')
+            body.insert(0, str(error))
         tag = self._send_mail(world, log, 'Select territory', '\n'.join(body))
         body = self._get_mail(tag)
         name = body.splitlines()[0].strip()
         return name
         tag = self._send_mail(world, log, 'Select territory', '\n'.join(body))
         body = self._get_mail(tag)
         name = body.splitlines()[0].strip()
         return name
-    def play_cards(self, world, log, play_required=True):
+    def play_cards(self, world, log, error=None,
+                   play_required=True):
         """Decide whether or not to turn in a set of cards.
 
         Return a list of cards to turn in or None.  If play_required
         """Decide whether or not to turn in a set of cards.
 
         Return a list of cards to turn in or None.  If play_required
@@ -333,13 +337,17 @@ class EmailPlayer (Player):
             'blank to pass).  Available sets are:']
         for i,h in enumerate(possibles):
             body.append('  %d: %s' % (i, h))
             'blank to pass).  Available sets are:']
         for i,h in enumerate(possibles):
             body.append('  %d: %s' % (i, h))
+        if error != None:
+            body.insert(0, '')
+            body.insert(0, str(error))
         tag = self._send_mail(world, log, subject, '\n'.join(body))
         body = self._get_mail(tag)
         text = body.splitlines()[0].strip()
         if text == '':
             return None
         return possibles[int(text)]
         tag = self._send_mail(world, log, subject, '\n'.join(body))
         body = self._get_mail(tag)
         text = body.splitlines()[0].strip()
         if text == '':
             return None
         return possibles[int(text)]
-    def place_armies(self, world, log, remaining=1, this_round=1):
+    def place_armies(self, world, log, error=None,
+                     remaining=1, this_round=1):
         """Both during setup and before each turn.
 
         Return {territory_name: num_armies, ...}
         """Both during setup and before each turn.
 
         Return {territory_name: num_armies, ...}
@@ -360,6 +368,9 @@ class EmailPlayer (Player):
             'Your current disposition is:']
         for t in self.territories(world):
             body.append('  %d : %s' % (t.armies, t))
             'Your current disposition is:']
         for t in self.territories(world):
             body.append('  %d : %s' % (t.armies, t))
+        if error != None:
+            body.insert(0, '')
+            body.insert(0, str(error))
         tag = self._send_mail(world, log, subject, '\n'.join(body))
         body = self._get_mail(tag)
         placements = {}
         tag = self._send_mail(world, log, subject, '\n'.join(body))
         body = self._get_mail(tag)
         placements = {}
@@ -367,10 +378,13 @@ class EmailPlayer (Player):
             line = line.strip()
             if len(line) == 0:
                 break
             line = line.strip()
             if len(line) == 0:
                 break
+            if line.count(':') != 1:
+                raise PlayerError('Invalid syntax "%s"' % line)
             armies,terr_name = [x.strip() for x in line.split(':')]
             placements[terr_name] = int(armies)
         return placements
             armies,terr_name = [x.strip() for x in line.split(':')]
             placements[terr_name] = int(armies)
         return placements
-    def attack_and_fortify(self, world, log, mode='attack'):
+    def attack_and_fortify(self, world, log, error=None,
+                           mode='attack'):
         """Return list of (source, target, armies) tuples.  Place None
         in the list to end this phase.
         """
         """Return list of (source, target, armies) tuples.  Place None
         in the list to end this phase.
         """
@@ -408,6 +422,9 @@ class EmailPlayer (Player):
                 '  ',
                 'or',
                 '  Pass']
                 '  ',
                 'or',
                 '  Pass']
+        if error != None:
+            body.insert(0, '')
+            body.insert(0, str(error))
         tag = self._send_mail(world, log, subject, '\n'.join(body))
         body = self._get_mail(tag)
         if mode == 'fortify':
         tag = self._send_mail(world, log, subject, '\n'.join(body))
         body = self._get_mail(tag)
         if mode == 'fortify':
@@ -432,7 +449,8 @@ class EmailPlayer (Player):
         elif line.lower() == 'pass' \
                 or (mode == 'fortify' and len(line) == 0):
             return None
         elif line.lower() == 'pass' \
                 or (mode == 'fortify' and len(line) == 0):
             return None
-    def support_attack(self, world, log, source, target):
+    def support_attack(self, world, log, error,
+                       source, target):
         """Follow up on a conquest by moving additional armies.
         """
         subject = 'Support conquest of %s by %s' % (target, source)
         """Follow up on a conquest by moving additional armies.
         """
         subject = 'Support conquest of %s by %s' % (target, source)
@@ -445,6 +463,9 @@ class EmailPlayer (Player):
             'Reply with first line(s) of the body of your email set',
             'to "<number_of_armies>", or leave the first line blank',
             'to pass.']
             'Reply with first line(s) of the body of your email set',
             'to "<number_of_armies>", or leave the first line blank',
             'to pass.']
+        if error != None:
+            body.insert(0, '')
+            body.insert(0, str(error))
         tag = self._send_mail(world, log, subject, '\n'.join(body))
         body = self._get_mail(tag)
         text = body.splitlines()[0].strip()
         tag = self._send_mail(world, log, subject, '\n'.join(body))
         body = self._get_mail(tag)
         text = body.splitlines()[0].strip()