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 , Optional
7
7
from zulip_bots .test_lib import BotTestCase
8
8
import operator
9
9
import random
@@ -155,16 +155,21 @@ 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 : Optional [str ]= '' ) -> None :
159
+ if widget_content == '' :
160
+ widget_content = None
159
161
self .bot_handler .send_message (dict (
160
162
type = 'private' if is_private else 'stream' ,
161
163
to = to ,
162
164
content = content ,
163
- subject = subject
165
+ subject = subject ,
166
+ widget_content = widget_content
164
167
))
165
168
166
- def send_reply (self , original_message : Dict [str , Any ], content : str ) -> None :
167
- self .bot_handler .send_reply (original_message , content )
169
+ def send_reply (self , original_message : Dict [str , Any ], content : str , widget_content : Optional [str ]= '' ) -> None :
170
+ if widget_content == '' :
171
+ widget_content = None
172
+ self .bot_handler .send_reply (original_message , content , widget_content )
168
173
169
174
def usage (self ) -> str :
170
175
return '''
@@ -713,20 +718,20 @@ def generate_game_id(self) -> str:
713
718
id += valid_characters [random .randrange (0 , len (valid_characters ))]
714
719
return id
715
720
716
- def broadcast (self , game_id : str , content : str , include_private : bool = True ) -> bool :
721
+ def broadcast (self , game_id : str , content : str , include_private : bool = True , widget_content : str = '' ) -> bool :
717
722
if include_private :
718
723
private_recipients = self .get_players (game_id , parameter = 'p' )
719
724
if private_recipients is not None :
720
725
for user in private_recipients :
721
- self .send_message (user , content , True )
726
+ self .send_message (user , content , True , '' , widget_content )
722
727
if game_id in self .invites .keys ():
723
728
if self .invites [game_id ]['subject' ] != '###private###' :
724
729
self .send_message (
725
- self .invites [game_id ]['stream' ], content , False , self .invites [game_id ]['subject' ])
730
+ self .invites [game_id ]['stream' ], content , False , self .invites [game_id ]['subject' ], widget_content )
726
731
return True
727
732
if game_id in self .instances .keys ():
728
733
self .send_message (
729
- self .instances [game_id ].stream , content , False , self .instances [game_id ].subject )
734
+ self .instances [game_id ].stream , content , False , self .instances [game_id ].subject , widget_content )
730
735
return True
731
736
return False
732
737
@@ -774,7 +779,7 @@ def __init__(self, gameAdapter: GameAdapter, is_private: bool, subject: str, gam
774
779
self .board = self .model .current_board
775
780
self .turn = random .randrange (0 , len (players )) - 1
776
781
self .current_draw = {} # type: Dict[str, bool]
777
- self .current_messages = [] # type: List[str]
782
+ self .current_messages = [] # type: List[Union[ str, Tuple[str, str]] ]
778
783
self .is_changing_subject = False
779
784
780
785
def start (self ) -> None :
@@ -845,8 +850,8 @@ def send_current_turn_message(self) -> None:
845
850
self .players [self .turn ]),
846
851
self .gameAdapter .gameMessageHandler .get_player_color (self .turn )))
847
852
848
- def broadcast (self , content : str ) -> None :
849
- self .gameAdapter .broadcast (self .game_id , content )
853
+ def broadcast (self , content : str , widget_content : str = '' ) -> None :
854
+ self .gameAdapter .broadcast (self .game_id , content , widget_content = widget_content )
850
855
851
856
def check_draw (self ) -> bool :
852
857
for d in self .current_draw .values ():
@@ -870,7 +875,11 @@ def make_move(self, content: str, is_computer: bool) -> None:
870
875
return
871
876
except BadMoveException as e :
872
877
self .broadcast (e .message )
873
- self .broadcast (self .parse_current_board ())
878
+ current_board_message = self .parse_current_board ()
879
+ if isinstance (current_board_message , tuple ):
880
+ self .broadcast (
881
+ current_board_message [0 ], current_board_message [1 ])
882
+ self .broadcast (str (current_board_message ))
874
883
return
875
884
if not is_computer :
876
885
self .current_messages .append (self .gameAdapter .gameMessageHandler .alert_move_message (
@@ -918,8 +927,15 @@ def next_turn(self) -> None:
918
927
self .make_move ('' , True )
919
928
920
929
def broadcast_current_message (self ) -> None :
921
- content = '\n \n ' .join (self .current_messages )
922
- self .broadcast (content )
930
+ # if there are no widgets, send all the messages all at once
931
+ if len (list (filter (lambda x : isinstance (x , tuple ), self .current_messages ))) == 0 :
932
+ self .broadcast ("\n \n " .join (str (m ) for m in self .current_messages ))
933
+ else :
934
+ for message in self .current_messages :
935
+ if isinstance (message , tuple ):
936
+ self .broadcast (message [0 ], message [1 ])
937
+ else :
938
+ self .broadcast (str (message ))
923
939
self .current_messages = []
924
940
925
941
def parse_current_board (self ) -> Any :
0 commit comments