From 7f3633c70a466c05a69c829f44f7f546ccddd81a Mon Sep 17 00:00:00 2001 From: Griatch Date: Sat, 11 Dec 2010 14:26:57 +0000 Subject: [PATCH] Web client users are now notified if the server is shut down forcefully (Ctrl-C, reboot etc) --- src/server/webclient.py | 15 ++++++++++++--- src/server/webserver.py | 2 +- src/web/media/javascript/evennia_webclient.js | 3 +-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/server/webclient.py b/src/server/webclient.py index c48e6e9c65..a84c715919 100644 --- a/src/server/webclient.py +++ b/src/server/webclient.py @@ -20,7 +20,7 @@ import time from hashlib import md5 from twisted.web import server, resource -from twisted.internet import defer +from twisted.internet import defer, reactor from django.utils import simplejson from django.utils.functional import Promise @@ -64,6 +64,7 @@ class WebClient(resource.Resource): def __init__(self): self.requests = {} self.databuffer = {} + reactor.addSystemEventTrigger('before', 'shutdown',self._forced_disconnect) def getChild(self, path, request): """ @@ -77,7 +78,15 @@ class WebClient(resource.Resource): self.requests.get(suid, []).remove(request) except ValueError: pass - + + def _forced_disconnect(self): + """ + Callback launched when webserver is closing forcefully (Ctrl-C, reboot etc) + All we do is make sure the connected clients are notitifed. + """ + for suid in self.requests.keys(): + self.lineSend(suid, parse_html("{rThe MUD server shut down. You were disconnected.{n")) + def lineSend(self, suid, string, data=None): """ This adds the data to the buffer and/or sends it to @@ -95,7 +104,7 @@ class WebClient(resource.Resource): dataentries = self.databuffer.get(suid, []) dataentries.append(jsonify({'msg':string, 'data':data})) self.databuffer[suid] = dataentries - + def disconnect(self, suid): "Disconnect session with given suid." sess = SESSIONS.session_from_suid(suid) diff --git a/src/server/webserver.py b/src/server/webserver.py index 004e6b5b6b..311cced08a 100644 --- a/src/server/webserver.py +++ b/src/server/webserver.py @@ -45,7 +45,7 @@ class DjangoWebRoot(resource.Resource): pool = threadpool.ThreadPool() pool.start() # Set it up so the pool stops after e.g. Ctrl-C kills the server - reactor.addSystemEventTrigger('after', 'shutdown', pool.stop) + reactor.addSystemEventTrigger('after', 'shutdown', pool.stop) # combine twisted's wsgi resource with django's wsgi handler wsgi_resource = WSGIResource(reactor, pool, WSGIHandler()) return wsgi_resource diff --git a/src/web/media/javascript/evennia_webclient.js b/src/web/media/javascript/evennia_webclient.js index 5ae007f61b..3a65e07743 100644 --- a/src/web/media/javascript/evennia_webclient.js +++ b/src/web/media/javascript/evennia_webclient.js @@ -88,7 +88,7 @@ function webclient_input(){ $('#inputform')[0].reset(); // clear input field }, error: function(XMLHttpRequest, textStatus, errorThrown){ - msg_display("err", "Error: Server returned an error or timed out. Try resending."); + msg_display("err", "Error: Server returned an error or timed out. Try resending or reloading the page."); }, }) } @@ -145,7 +145,6 @@ function webclient_close(){ }, error: function(XMLHttpRequest, textStatus, errorThrown){ CLIENT_HASH = '0'; - alert("There was an error disconnecting from the mud server."); } });