|
|
|
import re
|
|
import random
|
|
from typing import List
|
|
|
|
from App_Function_Libraries.Personas.models import CharacterCardV3
|
|
|
|
|
|
class CBSHandler:
|
|
"""Handles Curly Braced Syntaxes (CBS) in strings."""
|
|
|
|
CBS_PATTERN = re.compile(r'\{\{(.*?)\}\}')
|
|
|
|
def __init__(self, character_card: CharacterCardV3, user_display_name: str):
|
|
self.character_card = character_card
|
|
self.user_display_name = user_display_name
|
|
|
|
def replace_cbs(self, text: str) -> str:
|
|
"""Replaces CBS in the given text with appropriate values."""
|
|
def replacer(match):
|
|
cbs_content = match.group(1).strip()
|
|
if cbs_content.lower() == 'char':
|
|
return self.character_card.data.nickname or self.character_card.data.name
|
|
elif cbs_content.lower() == 'user':
|
|
return self.user_display_name
|
|
elif cbs_content.lower().startswith('random:'):
|
|
options = self._split_escaped(cbs_content[7:])
|
|
return random.choice(options) if options else ''
|
|
elif cbs_content.lower().startswith('pick:'):
|
|
options = self._split_escaped(cbs_content[5:])
|
|
return random.choice(options) if options else ''
|
|
elif cbs_content.lower().startswith('roll:'):
|
|
return self._handle_roll(cbs_content[5:])
|
|
elif cbs_content.lower().startswith('//'):
|
|
return ''
|
|
elif cbs_content.lower().startswith('hidden_key:'):
|
|
|
|
return ''
|
|
elif cbs_content.lower().startswith('comment:'):
|
|
|
|
return ''
|
|
elif cbs_content.lower().startswith('reverse:'):
|
|
return cbs_content[8:][::-1]
|
|
else:
|
|
|
|
return ''
|
|
|
|
return self.CBS_PATTERN.sub(replacer, text)
|
|
|
|
def _split_escaped(self, text: str) -> List[str]:
|
|
"""Splits a string by commas, considering escaped commas."""
|
|
return [s.replace('\\,', ',') for s in re.split(r'(?<!\\),', text)]
|
|
|
|
def _handle_roll(self, value: str) -> str:
|
|
"""Handles the roll:N CBS."""
|
|
value = value.lower()
|
|
if value.startswith('d'):
|
|
value = value[1:]
|
|
if value.isdigit():
|
|
return str(random.randint(1, int(value)))
|
|
return ''
|
|
|
|
def handle_comments(self, text: str) -> str:
|
|
"""Handles comments in CBS."""
|
|
|
|
|
|
return re.sub(r'\{\{comment:.*?\}\}', '', text) |