Skip to content

Commit d4cd9de

Browse files
Return the rooms a client is in
1 parent 7195217 commit d4cd9de

File tree

4 files changed

+38
-0
lines changed

4 files changed

+38
-0
lines changed

socketio/base_manager.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ def close_room(self, namespace, room):
7171
except KeyError:
7272
pass
7373

74+
def get_rooms(self, sid, namespace):
75+
"""Return the rooms a client is in."""
76+
r = []
77+
for room_name, room in six.iteritems(self.rooms[namespace]):
78+
if room_name is not None and sid in room and room[sid]:
79+
r.append(room_name)
80+
return r
81+
7482
def emit(self, event, data, namespace, room=None, skip_sid=None,
7583
callback=None):
7684
"""Emit a message to a single client, a room, or all the clients

socketio/server.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,16 @@ def close_room(self, room, namespace=None):
236236
self.logger.info('room %s is closing [%s]', room, namespace)
237237
self.manager.close_room(namespace, room)
238238

239+
def rooms(self, sid, namespace=None):
240+
"""Return the rooms a client is in.
241+
242+
:param sid: Session ID of the client.
243+
:param namespace: The Socket.IO namespace for the event. If this
244+
argument is omitted the default namespace is used.
245+
"""
246+
namespace = namespace or '/'
247+
return self.manager.get_rooms(sid, namespace)
248+
239249
def handle_request(self, environ, start_response):
240250
"""Handle an HTTP request from the client.
241251

tests/test_base_manager.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,14 @@ def test_close_room(self):
107107
def test_close_invalid_room(self):
108108
self.bm.close_room('/foo', 'bar')
109109

110+
def test_rooms(self):
111+
self.bm.connect('123', '/foo')
112+
self.bm.enter_room('123', '/foo', 'bar')
113+
r = self.bm.get_rooms('123', '/foo')
114+
self.assertEqual(len(r), 2)
115+
self.assertIn('123', r)
116+
self.assertIn('bar', r)
117+
110118
def test_emit_to_sid(self):
111119
self.bm.connect('123', '/foo')
112120
self.bm.connect('456', '/foo')

tests/test_server.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,18 @@ def test_close_room_default_namespace(self, eio):
9494
s.close_room('room')
9595
s.manager.close_room.assert_called_once_with('/', 'room')
9696

97+
def test_rooms(self, eio):
98+
mgr = mock.MagicMock()
99+
s = server.Server(client_manager_class=mgr)
100+
s.rooms('123', namespace='/foo')
101+
s.manager.get_rooms.assert_called_once_with('123', '/foo')
102+
103+
def test_rooms_default_namespace(self, eio):
104+
mgr = mock.MagicMock()
105+
s = server.Server(client_manager_class=mgr)
106+
s.rooms('123')
107+
s.manager.get_rooms.assert_called_once_with('123', '/')
108+
97109
def test_handle_request(self, eio):
98110
s = server.Server()
99111
s.handle_request('environ', 'start_response')

0 commit comments

Comments
 (0)