Source code for evennia.server.portal.naws

"""

NAWS - Negotiate About Window Size

This implements the NAWS telnet option as per
https://www.ietf.org/rfc/rfc1073.txt

NAWS allows telnet clients to report their current window size to the
client and update it when the size changes

"""

from codecs import encode as codecs_encode
import weakref

from django.conf import settings

NAWS = bytes([31])  # b"\x1f"
IS = bytes([0])  # b"\x00"

# default taken from telnet specification
DEFAULT_WIDTH = settings.CLIENT_DEFAULT_WIDTH
DEFAULT_HEIGHT = settings.CLIENT_DEFAULT_HEIGHT

# try to get the customized mssp info, if it exists.


[docs]class Naws: """ Implements the NAWS protocol. Add this to a variable on the telnet protocol to set it up. """
[docs] def __init__(self, protocol): """ initialize NAWS by storing protocol on ourselves and calling the client to see if it supports NAWS. Args: protocol (Protocol): The active protocol instance. """ self.naws_step = 0 self.protocol = weakref.ref(protocol) self.protocol().protocol_flags["SCREENWIDTH"] = { 0: DEFAULT_WIDTH } # windowID (0 is root):width self.protocol().protocol_flags["SCREENHEIGHT"] = {0: DEFAULT_HEIGHT} # windowID:width self.protocol().negotiationMap[NAWS] = self.negotiate_sizes self.protocol().do(NAWS).addCallbacks(self.do_naws, self.no_naws)
[docs] def no_naws(self, option): """ Called when client is not reporting NAWS. This is the normal operation. Args: option (Option): Not used. """ self.protocol().protocol_flags["AUTORESIZE"] = False self.protocol().handshake_done()
[docs] def do_naws(self, option): """ Client wants to negotiate all the NAWS information. Args: option (Option): Not used. """ self.protocol().protocol_flags["AUTORESIZE"] = True self.protocol().handshake_done()
[docs] def negotiate_sizes(self, options): """ Step through the NAWS handshake. Args: option (list): The incoming NAWS options. """ if len(options) == 4: # NAWS is negotiated with 16bit words width = options[0] + options[1] self.protocol().protocol_flags["SCREENWIDTH"][0] = int(codecs_encode(width, "hex"), 16) height = options[2] + options[3] self.protocol().protocol_flags["SCREENHEIGHT"][0] = int(codecs_encode(height, "hex"), 16)