Skip to content

Commit d398b88

Browse files
committed
feat(group): support kick sessions in group
1 parent 7488bd8 commit d398b88

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

group.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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 组是否关闭
270332
func (g *Group) IsClosed() bool {
271333
return g.status.Load() == groupStatusClosed

0 commit comments

Comments
 (0)