Skip to content

Commit 00d39ca

Browse files
skip_sid parameter can also be a list (fixes miguelgrinberg#202)
1 parent d3e19b7 commit 00d39ca

File tree

5 files changed

+37
-4
lines changed

5 files changed

+37
-4
lines changed

socketio/asyncio_manager.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ async def emit(self, event, data, namespace, room=None, skip_sid=None,
1515
if namespace not in self.rooms or room not in self.rooms[namespace]:
1616
return
1717
tasks = []
18+
if not isinstance(skip_sid, list):
19+
skip_sid = [skip_sid]
1820
for sid in self.get_participants(namespace, room):
19-
if sid != skip_sid:
21+
if sid not in skip_sid:
2022
if callback is not None:
2123
id = self._generate_ack_id(sid, namespace, callback)
2224
else:

socketio/base_manager.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,10 @@ def emit(self, event, data, namespace, room=None, skip_sid=None,
130130
connected to the namespace."""
131131
if namespace not in self.rooms or room not in self.rooms[namespace]:
132132
return
133+
if not isinstance(skip_sid, list):
134+
skip_sid = [skip_sid]
133135
for sid in self.get_participants(namespace, room):
134-
if sid != skip_sid:
136+
if sid not in skip_sid:
135137
if callback is not None:
136138
id = self._generate_ack_id(sid, namespace, callback)
137139
else:

socketio/server.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,8 @@ def emit(self, event, data=None, room=None, skip_sid=None, namespace=None,
218218
connected clients.
219219
:param skip_sid: The session ID of a client to skip when broadcasting
220220
to a room or to all clients. This can be used to
221-
prevent a message from being sent to the sender.
221+
prevent a message from being sent to the sender. To
222+
skip multiple sids, pass a list.
222223
:param namespace: The Socket.IO namespace for the event. If this
223224
argument is omitted the event is emitted to the
224225
default namespace.
@@ -258,7 +259,8 @@ def send(self, data, room=None, skip_sid=None, namespace=None,
258259
connected clients.
259260
:param skip_sid: The session ID of a client to skip when broadcasting
260261
to a room or to all clients. This can be used to
261-
prevent a message from being sent to the sender.
262+
prevent a message from being sent to the sender. To
263+
skip multiple sids, pass a list.
262264
:param namespace: The Socket.IO namespace for the event. If this
263265
argument is omitted the event is emitted to the
264266
default namespace.

tests/asyncio/test_asyncio_manager.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,19 @@ def test_emit_to_all_skip_one(self):
255255
self.bm.server._emit_internal.mock.assert_any_call(
256256
'789', 'my event', {'foo': 'bar'}, '/foo', None)
257257

258+
def test_emit_to_all_skip_two(self):
259+
self.bm.connect('123', '/foo')
260+
self.bm.enter_room('123', '/foo', 'bar')
261+
self.bm.connect('456', '/foo')
262+
self.bm.enter_room('456', '/foo', 'bar')
263+
self.bm.connect('789', '/foo')
264+
self.bm.connect('abc', '/bar')
265+
_run(self.bm.emit('my event', {'foo': 'bar'}, namespace='/foo',
266+
skip_sid=['123', '789']))
267+
self.assertEqual(self.bm.server._emit_internal.mock.call_count, 1)
268+
self.bm.server._emit_internal.mock.assert_any_call(
269+
'456', 'my event', {'foo': 'bar'}, '/foo', None)
270+
258271
def test_emit_with_callback(self):
259272
self.bm.connect('123', '/foo')
260273
self.bm._generate_ack_id = mock.MagicMock()

tests/common/test_base_manager.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,20 @@ def test_emit_to_all_skip_one(self):
237237
{'foo': 'bar'}, '/foo',
238238
None)
239239

240+
def test_emit_to_all_skip_two(self):
241+
self.bm.connect('123', '/foo')
242+
self.bm.enter_room('123', '/foo', 'bar')
243+
self.bm.connect('456', '/foo')
244+
self.bm.enter_room('456', '/foo', 'bar')
245+
self.bm.connect('789', '/foo')
246+
self.bm.connect('abc', '/bar')
247+
self.bm.emit('my event', {'foo': 'bar'}, namespace='/foo',
248+
skip_sid=['123', '789'])
249+
self.assertEqual(self.bm.server._emit_internal.call_count, 1)
250+
self.bm.server._emit_internal.assert_any_call('456', 'my event',
251+
{'foo': 'bar'}, '/foo',
252+
None)
253+
240254
def test_emit_with_callback(self):
241255
self.bm.connect('123', '/foo')
242256
self.bm._generate_ack_id = mock.MagicMock()

0 commit comments

Comments
 (0)