Added AMP support to the Replaceable Networking effort. Can now replace the AMP protocols. Also cleaned up some imports.

This commit is contained in:
Andrew Bastien 2020-04-12 17:01:43 -07:00
parent 0639d43ddc
commit d7623cd8a5
5 changed files with 24 additions and 33 deletions

View file

@ -5,9 +5,11 @@ Portal. This module sets up the Client-side communication.
""" """
import os import os
from django.conf import settings
from evennia.server.portal import amp from evennia.server.portal import amp
from twisted.internet import protocol from twisted.internet import protocol
from evennia.utils import logger from evennia.utils import logger
from evennia.utils.utils import class_from_module
class AMPClientFactory(protocol.ReconnectingClientFactory): class AMPClientFactory(protocol.ReconnectingClientFactory):
@ -33,7 +35,7 @@ class AMPClientFactory(protocol.ReconnectingClientFactory):
""" """
self.server = server self.server = server
self.protocol = AMPServerClientProtocol self.protocol = class_from_module(settings.AMP_CLIENT_PROTOCOL_CLASS)
self.maxDelay = 10 self.maxDelay = 10
# not really used unless connecting to multiple servers, but # not really used unless connecting to multiple servers, but
# avoids having to check for its existence on the protocol # avoids having to check for its existence on the protocol

View file

@ -11,6 +11,7 @@ from evennia.server.portal import amp
from django.conf import settings from django.conf import settings
from subprocess import Popen, STDOUT from subprocess import Popen, STDOUT
from evennia.utils import logger from evennia.utils import logger
from evennia.utils.utils import class_from_module
def _is_windows(): def _is_windows():
@ -56,7 +57,7 @@ class AMPServerFactory(protocol.ServerFactory):
""" """
self.portal = portal self.portal = portal
self.protocol = AMPServerProtocol self.protocol = class_from_module(settings.AMP_SERVER_PROTOCOL_CLASS)
self.broadcasts = [] self.broadcasts = []
self.server_connection = None self.server_connection = None
self.launcher_connection = None self.launcher_connection = None
@ -74,7 +75,7 @@ class AMPServerFactory(protocol.ServerFactory):
protocol (Protocol): The created protocol. protocol (Protocol): The created protocol.
""" """
self.portal.amp_protocol = AMPServerProtocol() self.portal.amp_protocol = self.protocol()
self.portal.amp_protocol.factory = self self.portal.amp_protocol.factory = self
return self.portal.amp_protocol return self.portal.amp_protocol

View file

@ -7,7 +7,8 @@ import time
from collections import deque, namedtuple from collections import deque, namedtuple
from twisted.internet import reactor from twisted.internet import reactor
from django.conf import settings from django.conf import settings
from evennia.server.sessionhandler import SessionHandler, PCONN, PDISCONN, PCONNSYNC, PDISCONNALL from evennia.server.sessionhandler import SessionHandler
from evennia.server.portal.amp import PCONN, PDISCONN, PCONNSYNC, PDISCONNALL
from evennia.utils.logger import log_trace from evennia.utils.logger import log_trace
from evennia.utils.utils import class_from_module from evennia.utils.utils import class_from_module

View file

@ -25,6 +25,7 @@ from evennia.utils.utils import (
callables_from_module, callables_from_module,
class_from_module class_from_module
) )
from evennia.server.portal import amp
from evennia.server.signals import SIGNAL_ACCOUNT_POST_LOGIN, SIGNAL_ACCOUNT_POST_LOGOUT from evennia.server.signals import SIGNAL_ACCOUNT_POST_LOGIN, SIGNAL_ACCOUNT_POST_LOGOUT
from evennia.server.signals import SIGNAL_ACCOUNT_POST_FIRST_LOGIN, SIGNAL_ACCOUNT_POST_LAST_LOGOUT from evennia.server.signals import SIGNAL_ACCOUNT_POST_FIRST_LOGIN, SIGNAL_ACCOUNT_POST_LAST_LOGOUT
from evennia.utils.inlinefuncs import parse_inlinefunc from evennia.utils.inlinefuncs import parse_inlinefunc
@ -48,25 +49,6 @@ class DummySession(object):
DUMMYSESSION = DummySession() DUMMYSESSION = DummySession()
# AMP signals
PCONN = chr(1) # portal session connect
PDISCONN = chr(2) # portal session disconnect
PSYNC = chr(3) # portal session sync
SLOGIN = chr(4) # server session login
SDISCONN = chr(5) # server session disconnect
SDISCONNALL = chr(6) # server session disconnect all
SSHUTD = chr(7) # server shutdown
SSYNC = chr(8) # server session sync
SCONN = chr(11) # server portal connection (for bots)
PCONNSYNC = chr(12) # portal post-syncing session
PDISCONNALL = chr(13) # portal session discnnect all
SRELOAD = chr(14) # server reloading (have portal start a new server)
SSTART = chr(15) # server start (portal must already be running anyway)
PSHUTD = chr(16) # portal (+server) shutdown
SSHUTD = chr(17) # server shutdown
PSTATUS = chr(18) # ping server or portal status
SRESET = chr(19) # server shutdown in reset mode
# i18n # i18n
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
@ -452,7 +434,7 @@ class ServerSessionHandler(SessionHandler):
""" """
self.server.amp_protocol.send_AdminServer2Portal( self.server.amp_protocol.send_AdminServer2Portal(
DUMMYSESSION, operation=SCONN, protocol_path=protocol_path, config=configdict DUMMYSESSION, operation=amp.SCONN, protocol_path=protocol_path, config=configdict
) )
def portal_restart_server(self): def portal_restart_server(self):
@ -460,14 +442,14 @@ class ServerSessionHandler(SessionHandler):
Called by server when reloading. We tell the portal to start a new server instance. Called by server when reloading. We tell the portal to start a new server instance.
""" """
self.server.amp_protocol.send_AdminServer2Portal(DUMMYSESSION, operation=SRELOAD) self.server.amp_protocol.send_AdminServer2Portal(DUMMYSESSION, operation=amp.SRELOAD)
def portal_reset_server(self): def portal_reset_server(self):
""" """
Called by server when reloading. We tell the portal to start a new server instance. Called by server when reloading. We tell the portal to start a new server instance.
""" """
self.server.amp_protocol.send_AdminServer2Portal(DUMMYSESSION, operation=SRESET) self.server.amp_protocol.send_AdminServer2Portal(DUMMYSESSION, operation=amp.SRESET)
def portal_shutdown(self): def portal_shutdown(self):
""" """
@ -475,7 +457,7 @@ class ServerSessionHandler(SessionHandler):
itself down) itself down)
""" """
self.server.amp_protocol.send_AdminServer2Portal(DUMMYSESSION, operation=PSHUTD) self.server.amp_protocol.send_AdminServer2Portal(DUMMYSESSION, operation=amp.PSHUTD)
def login(self, session, account, force=False, testmode=False): def login(self, session, account, force=False, testmode=False):
""" """
@ -523,7 +505,7 @@ class ServerSessionHandler(SessionHandler):
# sync the portal to the session # sync the portal to the session
if not testmode: if not testmode:
self.server.amp_protocol.send_AdminServer2Portal( self.server.amp_protocol.send_AdminServer2Portal(
session, operation=SLOGIN, sessiondata={"logged_in": True, "uid": session.uid} session, operation=amp.SLOGIN, sessiondata={"logged_in": True, "uid": session.uid}
) )
account.at_post_login(session=session) account.at_post_login(session=session)
if nsess < 2: if nsess < 2:
@ -568,7 +550,7 @@ class ServerSessionHandler(SessionHandler):
if sync_portal: if sync_portal:
# inform portal that session should be closed. # inform portal that session should be closed.
self.server.amp_protocol.send_AdminServer2Portal( self.server.amp_protocol.send_AdminServer2Portal(
session, operation=SDISCONN, reason=reason session, operation=amp.SDISCONN, reason=reason
) )
def all_sessions_portal_sync(self): def all_sessions_portal_sync(self):
@ -579,7 +561,7 @@ class ServerSessionHandler(SessionHandler):
""" """
sessdata = self.get_all_sync_data() sessdata = self.get_all_sync_data()
return self.server.amp_protocol.send_AdminServer2Portal( return self.server.amp_protocol.send_AdminServer2Portal(
DUMMYSESSION, operation=SSYNC, sessiondata=sessdata DUMMYSESSION, operation=amp.SSYNC, sessiondata=sessdata
) )
def session_portal_sync(self, session): def session_portal_sync(self, session):
@ -590,7 +572,7 @@ class ServerSessionHandler(SessionHandler):
""" """
sessdata = {session.sessid: session.get_sync_data()} sessdata = {session.sessid: session.get_sync_data()}
return self.server.amp_protocol.send_AdminServer2Portal( return self.server.amp_protocol.send_AdminServer2Portal(
DUMMYSESSION, operation=SSYNC, sessiondata=sessdata, clean=False DUMMYSESSION, operation=amp.SSYNC, sessiondata=sessdata, clean=False
) )
def session_portal_partial_sync(self, session_data): def session_portal_partial_sync(self, session_data):
@ -603,7 +585,7 @@ class ServerSessionHandler(SessionHandler):
""" """
return self.server.amp_protocol.send_AdminServer2Portal( return self.server.amp_protocol.send_AdminServer2Portal(
DUMMYSESSION, operation=SSYNC, sessiondata=session_data, clean=False DUMMYSESSION, operation=amp.SSYNC, sessiondata=session_data, clean=False
) )
def disconnect_all_sessions(self, reason="You have been disconnected."): def disconnect_all_sessions(self, reason="You have been disconnected."):
@ -619,7 +601,7 @@ class ServerSessionHandler(SessionHandler):
del session del session
# tell portal to disconnect all sessions # tell portal to disconnect all sessions
self.server.amp_protocol.send_AdminServer2Portal( self.server.amp_protocol.send_AdminServer2Portal(
DUMMYSESSION, operation=SDISCONNALL, reason=reason DUMMYSESSION, operation=amp.SDISCONNALL, reason=reason
) )
def disconnect_duplicate_sessions( def disconnect_duplicate_sessions(

View file

@ -572,6 +572,11 @@ SESSION_SYNC_ATTRS = (
"cmdset_storage_string" "cmdset_storage_string"
) )
# The following are used for the communications between the Portal and Server.
# Very dragons territory.
AMP_SERVER_PROTOCOL_CLASS = 'evennia.server.portal.amp_server.AMPServerProtocol'
AMP_CLIENT_PROTOCOL_CLASS = 'evennia.server.amp_client.AMPServerClientProtocol'
###################################################################### ######################################################################
# Options and validators # Options and validators
###################################################################### ######################################################################