Changed internal bit identifiers in AMP protocol, for compactness.

This commit is contained in:
Griatch 2012-02-25 19:26:54 +01:00
parent 631020d8a2
commit 9935bff36e
2 changed files with 45 additions and 27 deletions

View file

@ -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

View file

@ -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=""):
""" """