Changed internal bit identifiers in AMP protocol, for compactness.
This commit is contained in:
parent
631020d8a2
commit
9935bff36e
2 changed files with 45 additions and 27 deletions
|
|
@ -20,7 +20,7 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
import pickle
|
import pickle
|
||||||
from twisted.protocols import amp
|
from twisted.protocols import amp
|
||||||
from twisted.internet import protocol, defer, reactor
|
from twisted.internet import protocol, defer
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from src.utils import utils
|
from src.utils import utils
|
||||||
from src.server.models import ServerConfig
|
from src.server.models import ServerConfig
|
||||||
|
|
@ -31,6 +31,17 @@ from src.server.serversession import ServerSession
|
||||||
PORTAL_RESTART = os.path.join(settings.GAME_DIR, "portal.restart")
|
PORTAL_RESTART = os.path.join(settings.GAME_DIR, "portal.restart")
|
||||||
SERVER_RESTART = os.path.join(settings.GAME_DIR, "server.restart")
|
SERVER_RESTART = os.path.join(settings.GAME_DIR, "server.restart")
|
||||||
|
|
||||||
|
# communication bits
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
# i18n
|
# i18n
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
|
||||||
|
|
@ -212,7 +223,7 @@ class AMPProtocol(amp.AMP):
|
||||||
sessdata = self.factory.portal.sessions.get_all_sync_data()
|
sessdata = self.factory.portal.sessions.get_all_sync_data()
|
||||||
#print sessdata
|
#print sessdata
|
||||||
self.call_remote_ServerAdmin(0,
|
self.call_remote_ServerAdmin(0,
|
||||||
"PSYNC",
|
PSYNC,
|
||||||
data=sessdata)
|
data=sessdata)
|
||||||
if get_restart_mode(SERVER_RESTART):
|
if get_restart_mode(SERVER_RESTART):
|
||||||
msg = _(" ... Server restarted.")
|
msg = _(" ... Server restarted.")
|
||||||
|
|
@ -315,7 +326,6 @@ class AMPProtocol(amp.AMP):
|
||||||
|
|
||||||
|
|
||||||
# Server administration from the Portal side
|
# Server administration from the Portal side
|
||||||
|
|
||||||
def amp_server_admin(self, sessid, operation, data):
|
def amp_server_admin(self, sessid, operation, data):
|
||||||
"""
|
"""
|
||||||
This allows the portal to perform admin
|
This allows the portal to perform admin
|
||||||
|
|
@ -326,7 +336,7 @@ class AMPProtocol(amp.AMP):
|
||||||
|
|
||||||
#print "serveradmin (server side):", sessid, operation, data
|
#print "serveradmin (server side):", sessid, operation, data
|
||||||
|
|
||||||
if operation == 'PCONN': #portal_session_connect
|
if operation == PCONN: #portal_session_connect
|
||||||
# create a new session and sync it
|
# create a new session and sync it
|
||||||
sess = ServerSession()
|
sess = ServerSession()
|
||||||
sess.sessionhandler = self.factory.server.sessions
|
sess.sessionhandler = self.factory.server.sessions
|
||||||
|
|
@ -338,11 +348,11 @@ class AMPProtocol(amp.AMP):
|
||||||
|
|
||||||
self.factory.server.sessions.portal_connect(sessid, sess)
|
self.factory.server.sessions.portal_connect(sessid, sess)
|
||||||
|
|
||||||
elif operation == 'PDISCONN': #'portal_session_disconnect'
|
elif operation == PDISCONN: #'portal_session_disconnect'
|
||||||
# session closed from portal side
|
# session closed from portal side
|
||||||
self.factory.server.sessions.portal_disconnect(sessid)
|
self.factory.server.sessions.portal_disconnect(sessid)
|
||||||
|
|
||||||
elif operation == 'PSYNC': #'portal_session_sync'
|
elif operation == PSYNC: #'portal_session_sync'
|
||||||
# force a resync of sessions when portal reconnects to server (e.g. after a server reboot)
|
# force a resync of sessions when portal reconnects to server (e.g. after a server reboot)
|
||||||
# the data kwarg contains a dict {sessid: {arg1:val1,...}} representing the attributes
|
# the data kwarg contains a dict {sessid: {arg1:val1,...}} representing the attributes
|
||||||
# to sync for each session.
|
# to sync for each session.
|
||||||
|
|
@ -390,24 +400,24 @@ class AMPProtocol(amp.AMP):
|
||||||
data = loads(data)
|
data = loads(data)
|
||||||
|
|
||||||
#print "portaladmin (portal side):", sessid, operation, data
|
#print "portaladmin (portal side):", sessid, operation, data
|
||||||
if operation == 'SLOGIN': # 'server_session_login'
|
if operation == SLOGIN: # 'server_session_login'
|
||||||
# a session has authenticated; sync it.
|
# a session has authenticated; sync it.
|
||||||
sess = self.factory.portal.sessions.get_session(sessid)
|
sess = self.factory.portal.sessions.get_session(sessid)
|
||||||
sess.load_sync_data(data)
|
sess.load_sync_data(data)
|
||||||
|
|
||||||
elif operation == 'SDISCONN': #'server_session_disconnect'
|
elif operation == SDISCONN: #'server_session_disconnect'
|
||||||
# the server is ordering to disconnect the session
|
# the server is ordering to disconnect the session
|
||||||
self.factory.portal.sessions.server_disconnect(sessid, reason=data)
|
self.factory.portal.sessions.server_disconnect(sessid, reason=data)
|
||||||
|
|
||||||
elif operation == 'SDISCONNALL': #'server_session_disconnect_all'
|
elif operation == SDISCONNALL: #'server_session_disconnect_all'
|
||||||
# server orders all sessions to disconnect
|
# server orders all sessions to disconnect
|
||||||
self.factory.portal.sessions.server_disconnect_all(reason=data)
|
self.factory.portal.sessions.server_disconnect_all(reason=data)
|
||||||
|
|
||||||
elif operation == 'SSHUTD': #server_shutdown'
|
elif operation == SSHUTD: #server_shutdown'
|
||||||
# the server orders the portal to shut down
|
# the server orders the portal to shut down
|
||||||
self.factory.portal.shutdown(restart=False)
|
self.factory.portal.shutdown(restart=False)
|
||||||
|
|
||||||
elif operation == 'SSYNC': #'server_session_sync'
|
elif operation == SSYNC: #'server_session_sync'
|
||||||
# server wants to save session data to the portal, maybe because
|
# server wants to save session data to the portal, maybe because
|
||||||
# it's about to shut down. We don't overwrite any sessions,
|
# it's about to shut down. We don't overwrite any sessions,
|
||||||
# just update data on them and remove eventual ones that are
|
# just update data on them and remove eventual ones that are
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@ There are two similar but separate stores of sessions:
|
||||||
twisted protocols. These are dumb connectors that
|
twisted protocols. These are dumb connectors that
|
||||||
handle network communication but holds no game info.
|
handle network communication but holds no game info.
|
||||||
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import time
|
import time
|
||||||
|
|
@ -21,6 +20,16 @@ from src.utils import utils
|
||||||
|
|
||||||
from src.commands.cmdhandler import CMD_LOGINSTART
|
from src.commands.cmdhandler import CMD_LOGINSTART
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
# i18n
|
# i18n
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
|
||||||
|
|
@ -129,7 +138,7 @@ class ServerSessionHandler(SessionHandler):
|
||||||
Called by server when shutting down the portal.
|
Called by server when shutting down the portal.
|
||||||
"""
|
"""
|
||||||
self.server.amp_protocol.call_remote_PortalAdmin(0,
|
self.server.amp_protocol.call_remote_PortalAdmin(0,
|
||||||
operation='SSHUTD',
|
operation=SSHUTD,
|
||||||
data="")
|
data="")
|
||||||
# server-side access methods
|
# server-side access methods
|
||||||
|
|
||||||
|
|
@ -144,7 +153,7 @@ class ServerSessionHandler(SessionHandler):
|
||||||
del self.sessions[sessid]
|
del self.sessions[sessid]
|
||||||
# inform portal that session should be closed.
|
# inform portal that session should be closed.
|
||||||
self.server.amp_protocol.call_remote_PortalAdmin(sessid,
|
self.server.amp_protocol.call_remote_PortalAdmin(sessid,
|
||||||
operation='SDISCONN',
|
operation=SDISCONN,
|
||||||
data=reason)
|
data=reason)
|
||||||
self.session_count(-1)
|
self.session_count(-1)
|
||||||
|
|
||||||
|
|
@ -165,7 +174,7 @@ class ServerSessionHandler(SessionHandler):
|
||||||
# sync the portal to this session
|
# sync the portal to this session
|
||||||
sessdata = session.get_sync_data()
|
sessdata = session.get_sync_data()
|
||||||
self.server.amp_protocol.call_remote_PortalAdmin(session.sessid,
|
self.server.amp_protocol.call_remote_PortalAdmin(session.sessid,
|
||||||
operation='SLOGIN',
|
operation=SLOGIN,
|
||||||
data=sessdata)
|
data=sessdata)
|
||||||
|
|
||||||
def session_sync(self):
|
def session_sync(self):
|
||||||
|
|
@ -175,11 +184,11 @@ class ServerSessionHandler(SessionHandler):
|
||||||
"""
|
"""
|
||||||
sessdata = self.get_all_sync_data()
|
sessdata = self.get_all_sync_data()
|
||||||
self.server.amp_protocol.call_remote_PortalAdmin(0,
|
self.server.amp_protocol.call_remote_PortalAdmin(0,
|
||||||
'SSYNC',
|
SSYNC,
|
||||||
data=sessdata)
|
data=sessdata)
|
||||||
|
|
||||||
|
|
||||||
def disconnect_all_sessions(self, reason="You have been disconnected."):
|
def disconnect_all_sessions(self, reason=_("You have been disconnected.")):
|
||||||
"""
|
"""
|
||||||
Cleanly disconnect all of the connected sessions.
|
Cleanly disconnect all of the connected sessions.
|
||||||
"""
|
"""
|
||||||
|
|
@ -189,10 +198,10 @@ class ServerSessionHandler(SessionHandler):
|
||||||
self.session_count(0)
|
self.session_count(0)
|
||||||
# tell portal to disconnect all sessions
|
# tell portal to disconnect all sessions
|
||||||
self.server.amp_protocol.call_remote_PortalAdmin(0,
|
self.server.amp_protocol.call_remote_PortalAdmin(0,
|
||||||
operation='SDISCONNALL',
|
operation=SDISCONNALL,
|
||||||
data=reason)
|
data=reason)
|
||||||
|
|
||||||
def disconnect_duplicate_sessions(self, curr_session):
|
def disconnect_duplicate_sessions(self, curr_session, reason = _("Logged in from elsewhere. Disconnecting.") ):
|
||||||
"""
|
"""
|
||||||
Disconnects any existing sessions with the same game object.
|
Disconnects any existing sessions with the same game object.
|
||||||
"""
|
"""
|
||||||
|
|
@ -201,7 +210,6 @@ class ServerSessionHandler(SessionHandler):
|
||||||
if sess.logged_in
|
if sess.logged_in
|
||||||
and sess.get_character() == curr_char
|
and sess.get_character() == curr_char
|
||||||
and sess != curr_session]
|
and sess != curr_session]
|
||||||
reason = _("Logged in from elsewhere. Disconnecting.")
|
|
||||||
for sessid in doublet_sessions:
|
for sessid in doublet_sessions:
|
||||||
self.disconnect(session, reason)
|
self.disconnect(session, reason)
|
||||||
self.session_count(-1)
|
self.session_count(-1)
|
||||||
|
|
@ -213,11 +221,11 @@ class ServerSessionHandler(SessionHandler):
|
||||||
and see if any are dead.
|
and see if any are dead.
|
||||||
"""
|
"""
|
||||||
tcurr = time.time()
|
tcurr = time.time()
|
||||||
invalid_sessions = [session for session in self.sessions.values()
|
reason= _("Idle timeout exceeded, disconnecting."))
|
||||||
if session.logged_in and IDLE_TIMEOUT > 0
|
for session in (session for session in self.sessions.values()
|
||||||
and (tcurr - session.cmd_last) > IDLE_TIMEOUT]
|
if session.logged_in and IDLE_TIMEOUT > 0
|
||||||
for session in invalid_sessions:
|
and (tcurr - session.cmd_last) > IDLE_TIMEOUT):
|
||||||
self.disconnect(session, reason=_("Idle timeout exceeded, disconnecting."))
|
self.disconnect(session, reason=reason)
|
||||||
self.session_count(-1)
|
self.session_count(-1)
|
||||||
|
|
||||||
def session_count(self, num=None):
|
def session_count(self, num=None):
|
||||||
|
|
@ -357,7 +365,7 @@ class PortalSessionHandler(SessionHandler):
|
||||||
self.sessions[sessid] = session
|
self.sessions[sessid] = session
|
||||||
# sync with server-side
|
# sync with server-side
|
||||||
self.portal.amp_protocol.call_remote_ServerAdmin(sessid,
|
self.portal.amp_protocol.call_remote_ServerAdmin(sessid,
|
||||||
operation="PCONN",
|
operation=PCONN,
|
||||||
data=sessdata)
|
data=sessdata)
|
||||||
def disconnect(self, session):
|
def disconnect(self, session):
|
||||||
"""
|
"""
|
||||||
|
|
@ -365,7 +373,7 @@ class PortalSessionHandler(SessionHandler):
|
||||||
"""
|
"""
|
||||||
sessid = session.sessid
|
sessid = session.sessid
|
||||||
self.portal.amp_protocol.call_remote_ServerAdmin(sessid,
|
self.portal.amp_protocol.call_remote_ServerAdmin(sessid,
|
||||||
operation="PDISCONN")
|
operation=PDISCONN)
|
||||||
|
|
||||||
def server_disconnect(self, sessid, reason=""):
|
def server_disconnect(self, sessid, reason=""):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue