Skip to content

Commit 2cb12ce

Browse files
committed
game_handler: add widget_content support
1 parent 25f7901 commit 2cb12ce

File tree

1 file changed

+29
-17
lines changed

1 file changed

+29
-17
lines changed

zulip_bots/zulip_bots/game_handler.py

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import random
44
import logging
55
from copy import deepcopy
6-
from typing import Any, Dict, Tuple, List
6+
from typing import Any, Dict, Tuple, List, Union
77
from zulip_bots.test_lib import BotTestCase
88
import operator
99
import random
@@ -155,16 +155,17 @@ def confirm_invitation_declined(self, game_id: str) -> str:
155155
host = self.invites[game_id]['host']
156156
return 'Declined invitation to play **{}** from @**{}**.'.format(self.game_name, self.get_username_by_email(host))
157157

158-
def send_message(self, to: str, content: str, is_private: bool, subject: str='') -> None:
158+
def send_message(self, to: str, content: str, is_private: bool, subject: str='', widget_content: str='') -> None:
159159
self.bot_handler.send_message(dict(
160160
type='private' if is_private else 'stream',
161161
to=to,
162162
content=content,
163-
subject=subject
163+
subject=subject,
164+
widget_content=widget_content
164165
))
165166

166-
def send_reply(self, original_message: Dict[str, Any], content: str) -> None:
167-
self.bot_handler.send_reply(original_message, content)
167+
def send_reply(self, original_message: Dict[str, Any], content: str, widget_content: str='') -> None:
168+
self.bot_handler.send_reply(original_message, content, widget_content)
168169

169170
def usage(self) -> str:
170171
return '''
@@ -713,20 +714,20 @@ def generate_game_id(self) -> str:
713714
id += valid_characters[random.randrange(0, len(valid_characters))]
714715
return id
715716

716-
def broadcast(self, game_id: str, content: str, include_private: bool=True) -> bool:
717+
def broadcast(self, game_id: str, content: str, include_private: bool=True, widget_content: str='') -> bool:
717718
if include_private:
718719
private_recipients = self.get_players(game_id, parameter='p')
719720
if private_recipients is not None:
720721
for user in private_recipients:
721-
self.send_message(user, content, True)
722+
self.send_message(user, content, True, '', widget_content)
722723
if game_id in self.invites.keys():
723724
if self.invites[game_id]['subject'] != '###private###':
724725
self.send_message(
725-
self.invites[game_id]['stream'], content, False, self.invites[game_id]['subject'])
726+
self.invites[game_id]['stream'], content, False, self.invites[game_id]['subject'], widget_content)
726727
return True
727728
if game_id in self.instances.keys():
728729
self.send_message(
729-
self.instances[game_id].stream, content, False, self.instances[game_id].subject)
730+
self.instances[game_id].stream, content, False, self.instances[game_id].subject, widget_content)
730731
return True
731732
return False
732733

@@ -774,7 +775,7 @@ def __init__(self, gameAdapter: GameAdapter, is_private: bool, subject: str, gam
774775
self.board = self.model.current_board
775776
self.turn = random.randrange(0, len(players)) - 1
776777
self.current_draw = {} # type: Dict[str, bool]
777-
self.current_messages = [] # type: List[str]
778+
self.current_messages = [] # type: List[Union[str, Tuple[str, str]]]
778779
self.is_changing_subject = False
779780

780781
def start(self) -> None:
@@ -831,17 +832,17 @@ def handle_message(self, content: str, player_email: str) -> None:
831832
user_turn_avatar = "!avatar({})".format(self.players[self.turn])
832833
if self.gameAdapter.gameMessageHandler.get_player_color(self.turn) is None:
833834
self.broadcast('{} It\'s **{}**\'s turn.'.format(
834-
user_turn_avatar,
835-
self.gameAdapter.get_username_by_email(
836-
self.players[self.turn])))
835+
user_turn_avatar,
836+
self.gameAdapter.get_username_by_email(
837+
self.players[self.turn])))
837838
else:
838839
self.broadcast('{} It\'s **{}**\'s ({}) turn.'.format(
839840
user_turn_avatar,
840841
self.gameAdapter.get_username_by_email(
841842
self.players[self.turn]),
842843
self.gameAdapter.gameMessageHandler.get_player_color(self.turn)))
843844

844-
def broadcast(self, content: str) -> None:
845+
def broadcast(self, content: str, widget_content: str='') -> None:
845846
self.gameAdapter.broadcast(self.game_id, content)
846847

847848
def check_draw(self) -> bool:
@@ -866,7 +867,11 @@ def make_move(self, content: str, is_computer: bool) -> None:
866867
return
867868
except BadMoveException as e:
868869
self.broadcast(e.message)
869-
self.broadcast(self.parse_current_board())
870+
current_board_message = self.parse_current_board
871+
if isinstance(current_board_message, tuple):
872+
self.broadcast(
873+
current_board_message[0], current_board_message[1])
874+
self.broadcast(str(current_board_message))
870875
return
871876
if not is_computer:
872877
self.current_messages.append(self.gameAdapter.gameMessageHandler.alert_move_message(
@@ -926,8 +931,15 @@ def next_turn(self) -> None:
926931
self.make_move('', True)
927932

928933
def broadcast_current_message(self) -> None:
929-
content = '\n\n'.join(self.current_messages)
930-
self.broadcast(content)
934+
# if there are no widgets, send all the messages all at once
935+
if len(list(filter(lambda x: isinstance(x, tuple), self.current_messages))) == 0:
936+
self.broadcast("\n\n".join(str(m) for m in self.current_messages))
937+
else:
938+
for message in self.current_messages:
939+
if isinstance(message, tuple):
940+
self.broadcast(message[0], message[1])
941+
else:
942+
self.broadcast(str(message))
931943
self.current_messages = []
932944

933945
def parse_current_board(self) -> Any:

0 commit comments

Comments
 (0)