Getting an improved version of the shared session system vaguely in shape.

This commit is contained in:
Griatch 2016-05-31 20:17:07 +02:00
parent a31441b3ce
commit eebd41f46d
11 changed files with 143 additions and 130 deletions

View file

@ -217,20 +217,21 @@ An "emitter" object must have a function
var ever_open = false;
var websocket = null;
var wsurl = window.wsurl;
var csessid = window.csessid;
var connect = function() {
if (websocket && websocket.readyState != websocket.CLOSED) {
// No-op if a connection is already open.
return;
}
websocket = new WebSocket(wsurl);
websocket = new WebSocket(wsurl + '?' + csessid);
// Handle Websocket open event
websocket.onopen = function (event) {
open = true;
ever_open = true;
Evennia.emit('connection_open', ["websocket"], event);
Evennia.msg('browser_sessid', [browser_sessid], {});
Evennia.msg('csessid', [csessid], {});
};
// Handle Websocket close event
websocket.onclose = function (event) {
@ -295,22 +296,22 @@ An "emitter" object must have a function
//
var AjaxCometConnection = function() {
log("Trying ajax ...");
var client_hash = '0';
var open = false;
var stop_polling = false;
var is_closing = false;
var csessid = window.csessid;
// initialize connection and get hash
// initialize connection, send csessid
var init = function() {
$.ajax({type: "POST", url: "/webclientdata",
async: true, cache: false, timeout: 50000,
datatype: "json",
data: {mode: "init", suid: client_hash},
data: {mode: "init", csessid: csessid},
success: function(data) {
open = true;
data = JSON.parse(data);
log ("connection_open", ["AJAX/COMET"], data);
Evennia.msg("browser_sessid", [browser_sessid], {});
client_hash = data.suid;
stop_polling = false;
poll();
},
@ -331,7 +332,7 @@ An "emitter" object must have a function
async: true, cache: false, timeout: 30000,
dataType: "json",
data: {mode: inmode == null ? 'input' : inmode,
data: JSON.stringify(data), 'suid': client_hash},
data: JSON.stringify(data), 'csessid': csessid},
success: function(req, stat, err) {
stop_polling = false;
},
@ -351,7 +352,7 @@ An "emitter" object must have a function
$.ajax({type: "POST", url: "/webclientdata",
async: true, cache: false, timeout: 60000,
dataType: "json",
data: {mode: 'receive', 'suid': client_hash},
data: {mode: 'receive', 'csessid': csessid},
success: function(data) {
// log("ajax data received:", data);
if (data[0] === "ajax_keepalive") {
@ -393,7 +394,7 @@ An "emitter" object must have a function
// Kill the connection and do house cleaning on the server.
var close = function webclient_close(){
if (is_closing || client_hash === '0') {
if (is_closing || !(open)) {
// Already closed or trying to close.
return;
}
@ -406,11 +407,11 @@ An "emitter" object must have a function
cache: false,
timeout: 50000,
dataType: "json",
data: {mode: 'close', 'suid': client_hash},
data: {mode: 'close', 'csessid': csessid},
success: function(data){
is_closing = false;
client_hash = '0';
open = false;
Evennia.emit("connection_close", ["AJAX/COMET"], {});
log("AJAX/COMET connection closed cleanly.")
},
@ -419,13 +420,13 @@ An "emitter" object must have a function
Evennia.emit("connection_error", ["AJAX/COMET close error"], err);
// Also emit a close event so that the COMET API mirrors the websocket API.
Evennia.emit("connection_close", ["AJAX/COMET close unclean"], err);
client_hash = '0';
open = false;
}
});
};
var isOpen = function () {
return !(is_closing || client_hash === '0');
return !(is_closing || !(open));
}
// init

View file

@ -36,9 +36,9 @@ JQuery available.
{% endif %}
{% if browser_sessid %}
var browser_sessid = "{{browser_sessid}}";
var csessid = "{{browser_sessid}}";
{% else %}
var browser_sessid = false;
var csessid = false;
{% endif %}
{% if websocket_url %}

View file

@ -18,27 +18,26 @@ def webclient(request):
"""
print ("webclient session:", request.session.session_key, request.user, request.user.is_authenticated())
browser_session = request.session
browserid = request.session.session_key
csession = request.session
csessid = request.session.session_key
player = request.user
# check if user has authenticated to website
if player.is_authenticated():
print ("webclient: player auth, trying to connect sessions")
# Try to login all the player's webclient sessions - only
# unloggedin ones will actually be logged in.
for session in SESSION_HANDLER.sessions_from_browserid(browserid):
for session in SESSION_HANDLER.sessions_from_csessid(csessid):
print ("session to connect:", session)
if session.protocol_key in ("websocket", "ajax/comet"):
SESSION_HANDLER.login(session, player)
session.browserid = browser_session.session_key
browser_session["logged_in"] = player.id
elif browser_session.get("logged_in"):
csession["logged_in"] = player.id
elif csession.get("logged_in"):
# The webclient has previously registered a login to this browser_session
print ("webclient: browser_session logged in, trying to login")
player = PlayerDB.objects.get(browser_session.get("uid"))
player = PlayerDB.objects.get(csession.get("logged_in"))
login(player, request)
else:
browser_session["logged_in"] = False
csession["logged_in"] = False
# make sure to store the browser session's hash so the webclient can get to it
pagevars = {'browser_sessid': request.session.session_key}

View file

@ -26,27 +26,27 @@ def page_index(request):
# handle webclient-website shared login
browser_session = request.session
browserid = request.session.session_key
csession = request.session
csessid = request.session.session_key
player = request.user
# check if user has authenticated to website
if player.is_authenticated():
# Try to login all the player's webclient sessions - only
# unloggedin ones will actually be logged in.
print "website: player auth, trying to connect sessions"
for session in SESSION_HANDLER.sessions_from_browserid(browserid):
for session in SESSION_HANDLER.sessions_from_csessid(csessid):
print "session to connect:", session
if session.protocol_key in ("websocket", "ajax/comet"):
SESSION_HANDLER.login(session, player)
session.browserid = browser_session.session_key
browser_session["logged_in"] = player.id
elif browser_session.get("logged_in"):
# The webclient has previously registered a login to this browser_session
print "website: browser_session logged in, trying to login"
player = PlayerDB.objects.get(id=browser_session.get("logged_in"))
session.csessid = csession.session_key
csession["logged_in"] = player.id
elif csession.get("logged_in"):
# The webclient has previously registered a login to this csession
print "website: csession logged in, trying to login"
player = PlayerDB.objects.get(id=csession.get("logged_in"))
login(request, player)
else:
browser_session["logged_in"] = None
csession["logged_in"] = None
print ("website session:", request.session.session_key, request.user, request.user.is_authenticated())