Attached Files |
0001-Only-send-the-game-state-to-the-joining-spectator.patch [^] (5,626 bytes) 2013-06-04 00:51 [Show Content] [Hide Content]From dfc8dbbd5d70274b5b4673925720a056a2618a19 Mon Sep 17 00:00:00 2001
From: Pekka Lampila <pekka.lampila@iki.fi>
Date: Tue, 4 Jun 2013 01:17:42 +0300
Subject: [PATCH] Only send the game state to the joining spectator
Previously on WebTiles spectator join everyone would receive messages
for the current game state. Now these messages are only sent to the
joining spectator.
---
crawl-ref/source/tileweb.cc | 10 +++++++---
crawl-ref/source/tileweb.h | 2 +-
crawl-ref/source/webserver/process_handler.py | 16 +++++++++++++++-
crawl-ref/source/webserver/ws_handler.py | 8 ++++++++
4 files changed, 31 insertions(+), 5 deletions(-)
diff --git a/crawl-ref/source/tileweb.cc b/crawl-ref/source/tileweb.cc
index b5ed4b2..11a50b9 100644
--- a/crawl-ref/source/tileweb.cc
+++ b/crawl-ref/source/tileweb.cc
@@ -240,9 +240,12 @@ void TilesFramework::send_message(const char *format, ...)
finish_message();
}
-void TilesFramework::flush_messages()
+void TilesFramework::flush_messages(bool joining_only)
{
- send_message("*{\"msg\":\"flush_messages\"}");
+ if (joining_only)
+ send_message("*{\"msg\":\"flush_messages\",\"joining_only\":true}");
+ else
+ send_message("*{\"msg\":\"flush_messages\"}");
}
void TilesFramework::_await_connection()
@@ -306,8 +309,9 @@ wint_t TilesFramework::_handle_control_message(sockaddr_un addr, string data)
}
else if (msgtype == "spectator_joined")
{
- _send_everything();
flush_messages();
+ _send_everything();
+ flush_messages(true);
}
else if (msgtype == "menu_scroll")
{
diff --git a/crawl-ref/source/tileweb.h b/crawl-ref/source/tileweb.h
index adbfed8..16115e8 100644
--- a/crawl-ref/source/tileweb.h
+++ b/crawl-ref/source/tileweb.h
@@ -134,7 +134,7 @@ public:
void write_message(PRINTF(1, ));
void finish_message();
void send_message(PRINTF(1, ));
- void flush_messages();
+ void flush_messages(bool joining_only=false);
bool has_receivers() { return !m_dest_addrs.empty(); }
bool is_controlled_from_web() { return m_controlled_from_web; }
diff --git a/crawl-ref/source/webserver/process_handler.py b/crawl-ref/source/webserver/process_handler.py
index 9286a51..4b6c7e0 100644
--- a/crawl-ref/source/webserver/process_handler.py
+++ b/crawl-ref/source/webserver/process_handler.py
@@ -130,7 +130,18 @@ class CrawlProcessHandlerBase(object):
self._was_idle = self.is_idle()
update_all_lobbys(self)
+ def flush_messages_to_joining_spectators(self):
+ for receiver in self._receivers:
+ if receiver.joining:
+ receiver.flush_messages()
+ receiver.joining = False;
+ else:
+ receiver.clear_messages()
+
def flush_messages_to_all(self):
+ # would like to not send messages here if receiver.joining is true but
+ # it would break on older versions of crawl binary that never send
+ # flush_messages with joining_only
for receiver in self._receivers:
receiver.flush_messages()
@@ -612,7 +623,10 @@ class CrawlProcessHandler(CrawlProcessHandlerBase):
elif msgobj["msg"] == "flush_messages":
# only queue, once we know the crawl process asks for flushes
self.queue_messages = True;
- self.flush_messages_to_all()
+ if "joining_only" in msgobj:
+ self.flush_messages_to_joining_spectators()
+ else:
+ self.flush_messages_to_all()
else:
self.logger.warning("Unknown message from the crawl process: %s",
msgobj["msg"])
diff --git a/crawl-ref/source/webserver/ws_handler.py b/crawl-ref/source/webserver/ws_handler.py
index 6c07662..4685176 100644
--- a/crawl-ref/source/webserver/ws_handler.py
+++ b/crawl-ref/source/webserver/ws_handler.py
@@ -115,6 +115,7 @@ class CrawlWebSocket(tornado.websocket.WebSocketHandler):
self.process = None
self.game_id = None
self.received_pong = None
+ self.joining = False
self.ioloop = tornado.ioloop.IOLoop.instance()
@@ -335,6 +336,7 @@ class CrawlWebSocket(tornado.websocket.WebSocketHandler):
self.logger.info("Stopped watching %s.", self.watched_game.username)
self.watched_game.remove_watcher(self)
self.watched_game = None
+ self.joining = False
self.send_message("go_lobby")
def shutdown(self):
@@ -411,6 +413,7 @@ class CrawlWebSocket(tornado.websocket.WebSocketHandler):
self.logger.info("Started watching %s (P%s).", process.username,
process.id)
self.watched_game = process
+ self.joining = True
process.add_watcher(self)
self.send_message("watching_started")
else:
@@ -485,6 +488,10 @@ class CrawlWebSocket(tornado.websocket.WebSocketHandler):
# JSON
self.process.handle_input(message)
+ def clear_messages(self):
+ self.message_queue_time = None
+ self.message_queue = []
+
def flush_messages(self):
if len(self.message_queue) == 0:
return
@@ -541,6 +548,7 @@ class CrawlWebSocket(tornado.websocket.WebSocketHandler):
if self.watched_game:
self.watched_game.remove_watcher(self)
+ self.joining = False
if self.timeout:
self.ioloop.remove_timeout(self.timeout)
--
1.8.1.2
|