@@ -266,6 +266,68 @@ func (g *Group) Broadcast(route string, v any) error {
266266 return err
267267}
268268
269+ // MultiKick 将消息发送给满足过滤条件的会话并关闭连接, 被踢出的会话将从组中移除
270+ func (g * Group ) MultiKick (v any , fn SessionFilterFunc ) error {
271+ if g .IsClosed () {
272+ return ErrClosedGroup
273+ }
274+
275+ data , err := env .Marshal (v )
276+ if err != nil {
277+ return err
278+ }
279+
280+ if env .Debug {
281+ log .Info ("MultiKick, Data=%v" , v )
282+ }
283+
284+ g .mu .Lock ()
285+ defer g .mu .Unlock ()
286+
287+ for _ , s := range g .sessions {
288+ if ! fn (s ) {
289+ continue
290+ }
291+ if err = s .Kick (data ); err != nil {
292+ log .Error ("Session kick error, ID=%d, UID=%d." , s .ID (), s .UID (), err )
293+ }
294+ // 移除
295+ delete (g .sessions , s .ID ())
296+ }
297+
298+ return err
299+ }
300+
301+ // BroadKick 将消息发送给组中的所有会话并关闭连接, 清空组内所有会话
302+ func (g * Group ) BroadKick (v any ) error {
303+ if g .IsClosed () {
304+ return ErrClosedGroup
305+ }
306+
307+ data , err := env .Marshal (v )
308+ if err != nil {
309+ return err
310+ }
311+
312+ if env .Debug {
313+ log .Info ("BroadKick, Data=%v" , v )
314+ }
315+
316+ g .mu .Lock ()
317+ defer g .mu .Unlock ()
318+
319+ for _ , s := range g .sessions {
320+ if err = s .Kick (data ); err != nil {
321+ log .Error ("Session kick error, ID=%d, UID=%d." , s .ID (), s .UID (), err )
322+ }
323+ }
324+
325+ // 清空
326+ g .sessions = make (map [int64 ]* session.Session )
327+
328+ return err
329+ }
330+
269331// IsClosed 组是否关闭
270332func (g * Group ) IsClosed () bool {
271333 return g .status .Load () == groupStatusClosed
0 commit comments