3
3
import random
4
4
import logging
5
5
from copy import deepcopy
6
- from typing import Any , Dict , Tuple , List
6
+ from typing import Any , Dict , Tuple , List , Union
7
7
from zulip_bots .test_lib import BotTestCase
8
8
import operator
9
9
import random
@@ -155,16 +155,17 @@ def confirm_invitation_declined(self, game_id: str) -> str:
155
155
host = self .invites [game_id ]['host' ]
156
156
return 'Declined invitation to play **{}** from @**{}**.' .format (self .game_name , self .get_username_by_email (host ))
157
157
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 :
159
159
self .bot_handler .send_message (dict (
160
160
type = 'private' if is_private else 'stream' ,
161
161
to = to ,
162
162
content = content ,
163
- subject = subject
163
+ subject = subject ,
164
+ widget_content = widget_content
164
165
))
165
166
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 )
168
169
169
170
def usage (self ) -> str :
170
171
return '''
@@ -713,20 +714,20 @@ def generate_game_id(self) -> str:
713
714
id += valid_characters [random .randrange (0 , len (valid_characters ))]
714
715
return id
715
716
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 :
717
718
if include_private :
718
719
private_recipients = self .get_players (game_id , parameter = 'p' )
719
720
if private_recipients is not None :
720
721
for user in private_recipients :
721
- self .send_message (user , content , True )
722
+ self .send_message (user , content , True , '' , widget_content )
722
723
if game_id in self .invites .keys ():
723
724
if self .invites [game_id ]['subject' ] != '###private###' :
724
725
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 )
726
727
return True
727
728
if game_id in self .instances .keys ():
728
729
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 )
730
731
return True
731
732
return False
732
733
@@ -774,7 +775,7 @@ def __init__(self, gameAdapter: GameAdapter, is_private: bool, subject: str, gam
774
775
self .board = self .model .current_board
775
776
self .turn = random .randrange (0 , len (players )) - 1
776
777
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]] ]
778
779
self .is_changing_subject = False
779
780
780
781
def start (self ) -> None :
@@ -831,17 +832,17 @@ def handle_message(self, content: str, player_email: str) -> None:
831
832
user_turn_avatar = "!avatar({})" .format (self .players [self .turn ])
832
833
if self .gameAdapter .gameMessageHandler .get_player_color (self .turn ) is None :
833
834
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 ])))
837
838
else :
838
839
self .broadcast ('{} It\' s **{}**\' s ({}) turn.' .format (
839
840
user_turn_avatar ,
840
841
self .gameAdapter .get_username_by_email (
841
842
self .players [self .turn ]),
842
843
self .gameAdapter .gameMessageHandler .get_player_color (self .turn )))
843
844
844
- def broadcast (self , content : str ) -> None :
845
+ def broadcast (self , content : str , widget_content : str = '' ) -> None :
845
846
self .gameAdapter .broadcast (self .game_id , content )
846
847
847
848
def check_draw (self ) -> bool :
@@ -866,7 +867,11 @@ def make_move(self, content: str, is_computer: bool) -> None:
866
867
return
867
868
except BadMoveException as e :
868
869
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 ))
870
875
return
871
876
if not is_computer :
872
877
self .current_messages .append (self .gameAdapter .gameMessageHandler .alert_move_message (
@@ -926,8 +931,15 @@ def next_turn(self) -> None:
926
931
self .make_move ('' , True )
927
932
928
933
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 ))
931
943
self .current_messages = []
932
944
933
945
def parse_current_board (self ) -> Any :
0 commit comments