62 lines
2.8 KiB
Python
62 lines
2.8 KiB
Python
"""
|
|
Demonstrates how addon state can be tied to sessions and survive
|
|
across reloads using the GlobalProperty and SessionProperty ClassVars
|
|
"""
|
|
|
|
from hippolyzer.lib.proxy.commands import handle_command, Parameter
|
|
from hippolyzer.lib.proxy.addon_utils import BaseAddon, SessionProperty, GlobalProperty, send_chat
|
|
from hippolyzer.lib.proxy.region import ProxiedRegion
|
|
from hippolyzer.lib.proxy.sessions import Session
|
|
|
|
|
|
class AddonStateHelloWorldAddon(BaseAddon):
|
|
# How to say hello, value shared across sessions and will be the same
|
|
# regardless of which session is active when accessed.
|
|
# "hello_greeting" is added to session_manager.addon_ctx's dict and will survive reloads
|
|
# be mindful of conflicting with other addons' variables, other addons' variables
|
|
# can be accessed manually through the session_manager.addon_ctx dict since
|
|
# there isn't currently any namespacing.
|
|
hello_greeting: str = GlobalProperty(default="Hello")
|
|
# Who to say hello to, value specific to each session
|
|
# Value will be different depending on which session is having its event
|
|
# handled when the property is accessed.
|
|
# "hello_person" is added to session.addon_ctx's dict and will survive reloads
|
|
hello_person: str = SessionProperty(default="World")
|
|
|
|
def __init__(self):
|
|
# Tied to the addon instance.
|
|
# Shared across sessions and will die if the addon is reloaded
|
|
self.hello_punctuation = "!"
|
|
|
|
@handle_command(
|
|
# Use the longer-form `Parameter()` for declaring this because
|
|
# this field should be greedy and take the rest of the message (no separator.)
|
|
greeting=Parameter(str, sep=None),
|
|
)
|
|
async def set_hello_greeting(self, _session: Session, _region: ProxiedRegion, greeting: str):
|
|
"""Set the person to say hello to"""
|
|
self.hello_greeting = greeting
|
|
|
|
@handle_command(person=Parameter(str, sep=None))
|
|
async def set_hello_person(self, _session: Session, _region: ProxiedRegion, person: str):
|
|
"""Set the person to say hello to"""
|
|
self.hello_person = person
|
|
|
|
@handle_command(
|
|
# Punctuation should have no whitespace, so using a simple parameter is OK.
|
|
punctuation=str,
|
|
)
|
|
async def set_hello_punctuation(self, _session: Session, _region: ProxiedRegion, punctuation: str):
|
|
"""Set the punctuation to use for saying hello"""
|
|
self.hello_punctuation = punctuation
|
|
|
|
@handle_command()
|
|
async def say_hello(self, _session: Session, _region: ProxiedRegion):
|
|
"""Say hello using the configured hello variables"""
|
|
# These aren't instance properties, they can be accessed via the class as well.
|
|
hello_person = AddonStateHelloWorldAddon.hello_person
|
|
send_chat(f"{self.hello_greeting} {hello_person}{self.hello_punctuation}")
|
|
|
|
|
|
addons = [AddonStateHelloWorldAddon()]
|