@@ -124,14 +124,14 @@ def stop(self) -> bool:
124
124
return True
125
125
return False
126
126
127
- def calc_intent (self , utterance : str , lang : str ) -> Optional [Dict [str , str ]]:
127
+ def calc_intent (self , utterance : str , lang : str , timeout = 1.0 ) -> Optional [Dict [str , str ]]:
128
128
"""helper to check what intent would be selected by ovos-core"""
129
129
# let's see what intent ovos-core will assign to the utterance
130
130
# NOTE: converse, common_query and fallbacks are not included in this check
131
131
response = self .bus .wait_for_response (Message ("intent.service.intent.get" ,
132
132
{"utterance" : utterance , "lang" : lang }),
133
133
"intent.service.intent.reply" ,
134
- timeout = 1.0 )
134
+ timeout = timeout )
135
135
if not response :
136
136
return None
137
137
return response .data ["intent" ]
@@ -183,7 +183,6 @@ def on_game_command(self, utterance: str, lang: str):
183
183
don't forget to self.speak the game output too!
184
184
"""
185
185
186
- @abc .abstractmethod
187
186
def on_abandon_game (self ):
188
187
"""user abandoned game mid interaction
189
188
@@ -193,7 +192,7 @@ def on_abandon_game(self):
193
192
on_game_stop will be called after this handler"""
194
193
195
194
# converse
196
- def skill_will_trigger (self , utterance : str , lang : str , skill_id : Optional [str ] = None ) -> bool :
195
+ def skill_will_trigger (self , utterance : str , lang : str , skill_id : Optional [str ] = None , timeout = 0.8 ) -> bool :
197
196
"""helper to check if this skill would be selected by ovos-core with the given utterance
198
197
199
198
useful in converse method
@@ -205,7 +204,7 @@ def skill_will_trigger(self, utterance: str, lang: str, skill_id: Optional[str]
205
204
# determine if an intent from this skill
206
205
# will be selected by ovos-core
207
206
id_to_check = skill_id or self .skill_id
208
- intent = self .calc_intent (utterance , lang )
207
+ intent = self .calc_intent (utterance , lang , timeout = timeout )
209
208
skill_id = intent ["skill_id" ] if intent else ""
210
209
return skill_id == id_to_check
211
210
@@ -221,26 +220,44 @@ def _autosave(self):
221
220
if self .settings .get ("auto_save" , False ) and self .save_is_implemented :
222
221
self .on_save_game ()
223
222
224
- def converse (self , message : Message ):
223
+ def _async_cmd (self , message : Message ):
224
+ utterance = message .data ["utterances" ][0 ]
225
+ lang = get_message_lang (message )
226
+ self .log .debug (f"Piping utterance to game: { utterance } " )
227
+ self .on_game_command (utterance , lang )
228
+
229
+ def converse (self , message : Message ) -> bool :
225
230
try :
231
+ utterance = message .data ["utterances" ][0 ]
232
+ lang = get_message_lang (message )
233
+ # let the user implemented intents do the job if they can handle the utterance
234
+ # otherwise pipe utterance to the game handler
235
+ if self .skill_will_trigger (utterance , lang ):
236
+ self .log .debug ("Skill intent will trigger, don't pipe utterance to game" )
237
+ return False
238
+
226
239
if self .is_paused :
240
+ self .log .debug ("game is paused" )
227
241
# let ocp_pipeline unpause as appropriate
228
242
return False
229
243
230
- self ._autosave ()
231
- utterance = message .data ["utterances" ][0 ]
232
- lang = get_message_lang (message )
233
- # let the user implemented intents do the job if they can handle the utterance
234
- if self .is_playing and not self .skill_will_trigger (utterance , lang ):
235
- # otherwise pipe utterance to the game handler
236
- self .on_game_command (utterance , lang )
244
+ try :
245
+ self ._autosave ()
246
+ except Exception as e :
247
+ self .log .error (f"Autosave failed: { e } " )
248
+
249
+ if self .is_playing :
250
+ # do this async so converse executes faster
251
+ self .bus .once (f"{ self .skill_id } .game_cmd" , self ._async_cmd )
252
+ self .bus .emit (message .forward (f"{ self .skill_id } .game_cmd" , message .data ))
237
253
return True
254
+
238
255
return False
239
256
except (KeyError , IndexError ) as e :
240
- self .log .error (f"Error processing converse message: { e } " )
257
+ self .log .error (f"Error processing game converse message: { e } " )
241
258
return False
242
259
except Exception as e :
243
- self .log .exception (f"Unexpected error in converse: { e } " )
260
+ self .log .exception (f"Unexpected error in game converse: { e } " )
244
261
return False
245
262
246
263
def handle_deactivate (self , message : Message ):
0 commit comments