This commit is contained in:
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "jwebot-sdk"
|
||||
version = "0.6.5a0+1015"
|
||||
version = "0.6.6a0+1015"
|
||||
description = "Typed, capability-limited extension API for JWeBot plugins"
|
||||
requires-python = ">=3.9"
|
||||
dependencies = []
|
||||
|
||||
@@ -38,4 +38,4 @@ __all__ = [
|
||||
"SingleGroupContext",
|
||||
]
|
||||
|
||||
__version__ = "0.6.5a0+1015"
|
||||
__version__ = "0.6.6a0+1015"
|
||||
|
||||
@@ -20,6 +20,7 @@ class ContractViolation(ValueError):
|
||||
|
||||
class PlanKind(str, Enum):
|
||||
TEXT = "text"
|
||||
MULTI_TEXT = "multi_text"
|
||||
NO_REPLY = "no_reply"
|
||||
|
||||
|
||||
@@ -156,6 +157,7 @@ class ReplyPlan:
|
||||
|
||||
kind: PlanKind
|
||||
message: str = ""
|
||||
messages: tuple[str, ...] = ()
|
||||
|
||||
def __post_init__(self) -> None:
|
||||
if self.kind is PlanKind.TEXT:
|
||||
@@ -168,13 +170,40 @@ class ReplyPlan:
|
||||
limit=MAX_REPLY_CHARS,
|
||||
),
|
||||
)
|
||||
if self.messages:
|
||||
raise ContractViolation("text plan cannot contain multiple messages")
|
||||
elif self.kind is PlanKind.MULTI_TEXT:
|
||||
if self.message:
|
||||
raise ContractViolation("multi_text plan cannot contain text")
|
||||
if not self.messages:
|
||||
raise ContractViolation("multi_text plan requires messages")
|
||||
if len(self.messages) > 8:
|
||||
raise ContractViolation("multi_text plan exceeds 8 messages")
|
||||
object.__setattr__(
|
||||
self,
|
||||
"messages",
|
||||
tuple(
|
||||
_required_text(
|
||||
message,
|
||||
name="reply message",
|
||||
limit=MAX_REPLY_CHARS,
|
||||
)
|
||||
for message in self.messages
|
||||
),
|
||||
)
|
||||
elif self.message:
|
||||
raise ContractViolation("no_reply plan cannot contain text")
|
||||
elif self.messages:
|
||||
raise ContractViolation("no_reply plan cannot contain messages")
|
||||
|
||||
@classmethod
|
||||
def text(cls, message: str) -> "ReplyPlan":
|
||||
return cls(kind=PlanKind.TEXT, message=message)
|
||||
|
||||
@classmethod
|
||||
def multi_text(cls, messages: tuple[str, ...] | list[str]) -> "ReplyPlan":
|
||||
return cls(kind=PlanKind.MULTI_TEXT, messages=tuple(messages))
|
||||
|
||||
@classmethod
|
||||
def no_reply(cls) -> "ReplyPlan":
|
||||
return cls(kind=PlanKind.NO_REPLY)
|
||||
@@ -189,14 +218,23 @@ class ReplyPlan:
|
||||
raise ContractViolation("reply plan kind is invalid") from error
|
||||
if kind is PlanKind.TEXT:
|
||||
return cls.text(str(value.get("text", "")))
|
||||
if kind is PlanKind.MULTI_TEXT:
|
||||
messages = value.get("texts", ())
|
||||
if not isinstance(messages, list):
|
||||
raise ContractViolation("multi_text plan messages must be a list")
|
||||
return cls.multi_text([str(message) for message in messages])
|
||||
if value.get("text"):
|
||||
raise ContractViolation("no_reply plan cannot contain text")
|
||||
if value.get("texts"):
|
||||
raise ContractViolation("no_reply plan cannot contain messages")
|
||||
return cls.no_reply()
|
||||
|
||||
def to_mapping(self) -> dict[str, str]:
|
||||
def to_mapping(self) -> dict[str, Any]:
|
||||
value = {"kind": self.kind.value}
|
||||
if self.kind is PlanKind.TEXT:
|
||||
value["text"] = self.message
|
||||
if self.kind is PlanKind.MULTI_TEXT:
|
||||
value["texts"] = list(self.messages)
|
||||
return value
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user