Getting an improved version of the shared session system vaguely in shape.
This commit is contained in:
parent
a31441b3ce
commit
eebd41f46d
11 changed files with 143 additions and 130 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 %}
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue