Files
Hippolyzer/addon_examples/addon_state_management.py
2021-06-13 12:06:04 +00:00

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()]