From 33e8517b87978cb9c258a24ddfb811e0d2c06e10 Mon Sep 17 00:00:00 2001
From: "neiljp (Neil Pilgrim)" <github@kepier.clara.net>
Date: Sat, 9 Dec 2017 21:03:59 -0800
Subject: [PATCH] TicTacToe: Decouple TicTacToeGame.tictactoe() string from
 move result.

This allows the storage update to be refactored into one block before
sending the result text.
---
 .../zulip_bots/bots/tictactoe/tictactoe.py    | 25 +++++++++++--------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/zulip_bots/zulip_bots/bots/tictactoe/tictactoe.py b/zulip_bots/zulip_bots/bots/tictactoe/tictactoe.py
index 400d2f49..68a31f4f 100644
--- a/zulip_bots/zulip_bots/bots/tictactoe/tictactoe.py
+++ b/zulip_bots/zulip_bots/bots/tictactoe/tictactoe.py
@@ -224,7 +224,7 @@ class TicTacToeGame(object):
 
         if board[row][column] != "_":
             return_string += output_mode("That space is already filled, sorry!", mode)
-            return return_string
+            return ("filled",return_string)
         else:
             board[row][column] = "x"
 
@@ -233,11 +233,11 @@ class TicTacToeGame(object):
         # Check to see if the user won/drew after they made their move. If not, it's the computer's turn.
         if self.win_conditions(board, self.triplets):
             return_string += output_mode("Game over! You've won!", mode)
-            return return_string
+            return ("player_win", return_string)
 
         if self.board_is_full(board):
             return_string += output_mode("It's a draw! Neither of us was able to win.", mode)
-            return return_string
+            return ("draw", return_string)
 
         return_string += output_mode("My turn:\n", mode)
         self.computer_move(board)
@@ -247,10 +247,10 @@ class TicTacToeGame(object):
         # in checking.) If the computer didn't win, the user gets another turn.
         if self.win_conditions(board, self.triplets):
             return_string += output_mode("Game over! I've won!", mode)
-            return return_string
+            return ("computer_win", return_string)
 
         return_string += output_mode("Your turn! Enter a coordinate or type help.", mode)
-        return return_string
+        return ("next_turn", return_string)
 
 # -------------------------------------
 flat_initial = sum(initial_board, [])
@@ -288,6 +288,7 @@ class ticTacToeHandler(object):
             storage.put(original_sender, user_board)
         user_game = TicTacToeGame(user_board) if user_board else None
 
+        move = None
         if command == 'new':
             if user_game and not first_time(user_game.board):
                 return_content = "You're already playing a game! Type **@tictactoe help** or **@ttt help** to see valid inputs."
@@ -297,16 +298,20 @@ class ticTacToeHandler(object):
         elif command == 'help':
             return_content = TicTacToeGame.detailed_help_message
         elif (user_game) and TicTacToeGame.check_validity(user_game, TicTacToeGame.sanitize_move(user_game, command)):
-            return_content = TicTacToeGame.tictactoe(user_game, user_board, command)
-            storage.put(original_sender, user_board)
+            move, return_content = TicTacToeGame.tictactoe(user_game, user_board, command)
         elif (user_game) and command == 'quit':
-            storage.put(original_sender, None)
+            move = "quit"
             return_content = "You've successfully quit the game."
         else:
             return_content = "Hmm, I didn't understand your input. Type **@tictactoe help** or **@ttt help** to see valid inputs."
 
-        if "Game over" in return_content or "draw" in return_content:
-            storage.put(original_sender, None)
+        if move is not None:
+            if any(reset_text in move for reset_text in ("win", "draw", "quit")):
+                storage.put(original_sender, None)
+            elif move is "next_turn":
+                storage.put(original_sender, user_board)
+            else:  # "filled" => no change, user_board remains the same
+                pass
 
         bot_handler.send_message(dict(
             type = 'private',