Merge pull request #2968 from InspectorCaracal/rpsystem-emote-fallback
Add optional fallback sdesc to rpsystem emote
This commit is contained in:
commit
2bb8da38ee
2 changed files with 37 additions and 4 deletions
|
|
@ -319,7 +319,7 @@ def parse_language(speaker, emote):
|
||||||
return emote, mapping
|
return emote, mapping
|
||||||
|
|
||||||
|
|
||||||
def parse_sdescs_and_recogs(sender, candidates, string, search_mode=False, case_sensitive=True):
|
def parse_sdescs_and_recogs(sender, candidates, string, search_mode=False, case_sensitive=True, fallback=None):
|
||||||
"""
|
"""
|
||||||
Read a raw emote and parse it into an intermediary
|
Read a raw emote and parse it into an intermediary
|
||||||
format for distributing to all observers.
|
format for distributing to all observers.
|
||||||
|
|
@ -332,11 +332,13 @@ def parse_sdescs_and_recogs(sender, candidates, string, search_mode=False, case_
|
||||||
string (str): The string (like an emote) we want to analyze for keywords.
|
string (str): The string (like an emote) we want to analyze for keywords.
|
||||||
search_mode (bool, optional): If `True`, the "emote" is a query string
|
search_mode (bool, optional): If `True`, the "emote" is a query string
|
||||||
we want to analyze. If so, the return value is changed.
|
we want to analyze. If so, the return value is changed.
|
||||||
case_sensitive (bool, optional); If set, the case of /refs matter, so that
|
case_sensitive (bool, optional): If set, the case of /refs matter, so that
|
||||||
/tall will come out as 'tall man' while /Tall will become 'Tall man'.
|
/tall will come out as 'tall man' while /Tall will become 'Tall man'.
|
||||||
This allows for more grammatically correct emotes at the cost of being
|
This allows for more grammatically correct emotes at the cost of being
|
||||||
a little more to learn for players. If disabled, the original sdesc case
|
a little more to learn for players. If disabled, the original sdesc case
|
||||||
is always kept and are inserted as-is.
|
is always kept and are inserted as-is.
|
||||||
|
fallback (string, optional): If set, any references that don't match a target
|
||||||
|
will be replaced with the fallback string.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
(emote, mapping) (tuple): If `search_mode` is `False`
|
(emote, mapping) (tuple): If `search_mode` is `False`
|
||||||
|
|
@ -485,7 +487,11 @@ def parse_sdescs_and_recogs(sender, candidates, string, search_mode=False, case_
|
||||||
# single-object search mode. Don't continue loop.
|
# single-object search mode. Don't continue loop.
|
||||||
break
|
break
|
||||||
elif nmatches == 0:
|
elif nmatches == 0:
|
||||||
errors.append(_EMOTE_NOMATCH_ERROR.format(ref=marker_match.group()))
|
if fallback:
|
||||||
|
# replace unmatched reference with the fallback string
|
||||||
|
string = f"{head}{fallback}{tail}"
|
||||||
|
else:
|
||||||
|
errors.append(_EMOTE_NOMATCH_ERROR.format(ref=marker_match.group()))
|
||||||
elif nmatches == 1:
|
elif nmatches == 1:
|
||||||
# a unique match - parse into intermediary representation
|
# a unique match - parse into intermediary representation
|
||||||
case = _get_case_ref(marker_match.group()) if case_sensitive else ""
|
case = _get_case_ref(marker_match.group()) if case_sensitive else ""
|
||||||
|
|
@ -560,9 +566,10 @@ def send_emote(sender, receivers, emote, msg_type="pose", anonymous_add="first",
|
||||||
|
|
||||||
"""
|
"""
|
||||||
case_sensitive = kwargs.pop("case_sensitive", True)
|
case_sensitive = kwargs.pop("case_sensitive", True)
|
||||||
|
fallback = kwargs.pop("fallback", None)
|
||||||
try:
|
try:
|
||||||
emote, obj_mapping = parse_sdescs_and_recogs(
|
emote, obj_mapping = parse_sdescs_and_recogs(
|
||||||
sender, receivers, emote, case_sensitive=case_sensitive
|
sender, receivers, emote, case_sensitive=case_sensitive, fallback=fallback
|
||||||
)
|
)
|
||||||
emote, language_mapping = parse_language(sender, emote)
|
emote, language_mapping = parse_language(sender, emote)
|
||||||
except (EmoteError, LanguageError) as err:
|
except (EmoteError, LanguageError) as err:
|
||||||
|
|
|
||||||
|
|
@ -96,6 +96,7 @@ recog01 = "Mr Receiver"
|
||||||
recog02 = "Mr Receiver2"
|
recog02 = "Mr Receiver2"
|
||||||
recog10 = "Mr Sender"
|
recog10 = "Mr Sender"
|
||||||
emote = 'With a flair, /me looks at /first and /colliding sdesc-guy. She says "This is a test."'
|
emote = 'With a flair, /me looks at /first and /colliding sdesc-guy. She says "This is a test."'
|
||||||
|
fallback_emote = '/Me is distracted from /first by /nomatch.'
|
||||||
case_emote = "/Me looks at /first. Then, /me looks at /FIRST, /First and /Colliding twice."
|
case_emote = "/Me looks at /first. Then, /me looks at /FIRST, /First and /Colliding twice."
|
||||||
poss_emote = "/Me frowns at /first for trying to steal /me's test."
|
poss_emote = "/Me frowns at /first for trying to steal /me's test."
|
||||||
|
|
||||||
|
|
@ -243,6 +244,31 @@ class TestRPSystem(BaseEvenniaTest):
|
||||||
'receiver of emotes.|n and |mReceiver2|n. She says |w"This is a test."|n',
|
'receiver of emotes.|n and |mReceiver2|n. She says |w"This is a test."|n',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_send_emote_fallback(self):
|
||||||
|
speaker = self.speaker
|
||||||
|
receiver1 = self.receiver1
|
||||||
|
receiver2 = self.receiver2
|
||||||
|
receivers = [speaker, receiver1, receiver2]
|
||||||
|
speaker.sdesc.add(sdesc0)
|
||||||
|
receiver1.sdesc.add(sdesc1)
|
||||||
|
receiver2.sdesc.add(sdesc2)
|
||||||
|
speaker.msg = lambda text, **kwargs: setattr(self, "out0", text)
|
||||||
|
receiver1.msg = lambda text, **kwargs: setattr(self, "out1", text)
|
||||||
|
receiver2.msg = lambda text, **kwargs: setattr(self, "out2", text)
|
||||||
|
rpsystem.send_emote(speaker, receivers, fallback_emote, fallback="something")
|
||||||
|
self.assertEqual(
|
||||||
|
self.out0[0],
|
||||||
|
"|mSender|n is distracted from |bthe first receiver of emotes.|n by something.",
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
self.out1[0],
|
||||||
|
"|bA nice sender of emotes|n is distracted from |mReceiver1|n by something.",
|
||||||
|
)
|
||||||
|
self.assertEqual(
|
||||||
|
self.out2[0],
|
||||||
|
"|bA nice sender of emotes|n is distracted from |bthe first receiver of emotes.|n by something.",
|
||||||
|
)
|
||||||
|
|
||||||
def test_send_case_sensitive_emote(self):
|
def test_send_case_sensitive_emote(self):
|
||||||
"""Test new case-sensitive rp-parsing"""
|
"""Test new case-sensitive rp-parsing"""
|
||||||
speaker = self.speaker
|
speaker = self.speaker
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue