Source code for evennia.contrib.base_systems.godotwebsocket.webclient

"""
Godot Websocket - ChrisLR 2022

This file contains the code necessary to dedicate a port to communicate with Godot via Websockets.
It uses the plugin system and should be plugged via settings as detailed in the readme.
"""
import json

from autobahn.twisted import WebSocketServerFactory
from twisted.application import internet

from evennia import settings
from evennia.contrib.base_systems.godotwebsocket.text2bbcode import parse_to_bbcode
from evennia.server.portal import webclient
from evennia.settings_default import LOCKDOWN_MODE


[docs]class GodotWebSocketClient(webclient.WebSocketClient): """ Implements the server-side of the Websocket connection specific to Godot. It inherits from the basic Websocket implementation and changes only what is necessary. """
[docs] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.protocol_key = "godotclient/websocket"
[docs] def send_text(self, *args, **kwargs): """ Send text data. This will pre-process the text for color-replacement, conversion to bbcode etc. Args: text (str): Text to send. Keyword Args: options (dict): Options-dict with the following keys understood: - nocolor (bool): Clean out all color. - send_prompt (bool): Send a prompt with parsed bbcode """ if args: args = list(args) text = args[0] if text is None: return else: return flags = self.protocol_flags options = kwargs.pop("options", {}) nocolor = options.get("nocolor", flags.get("NOCOLOR", False)) prompt = options.get("send_prompt", False) cmd = "prompt" if prompt else "text" args[0] = parse_to_bbcode(text, strip_ansi=nocolor) # send to client on required form [cmdname, args, kwargs] self.sendLine(json.dumps([cmd, args, kwargs]))
[docs]def start_plugin_services(portal): class GodotWebsocket(WebSocketServerFactory): "Only here for better naming in logs" pass factory = GodotWebsocket() factory.noisy = False factory.protocol = GodotWebSocketClient from evennia.server.portal.portalsessionhandler import PORTAL_SESSIONS factory.sessionhandler = PORTAL_SESSIONS interface = "127.0.0.1" if LOCKDOWN_MODE else settings.GODOT_CLIENT_WEBSOCKET_CLIENT_INTERFACE port = settings.GODOT_CLIENT_WEBSOCKET_PORT websocket_service = internet.TCPServer(port, factory, interface=interface) websocket_service.setName("GodotWebSocket%s:%s" % (interface, port)) portal.services.addService(websocket_service)