forked from Craftserve/potoq
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathplayermgr.go
66 lines (57 loc) · 1.29 KB
/
playermgr.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package potoq
import "strings"
import "sync"
import "sync/atomic"
import "github.com/google/uuid"
type PlayerManager struct {
m sync.Map
count int64
}
func (pm *PlayerManager) Register(handler *Handler) bool {
key := strings.ToLower(handler.Nickname)
_, conflict := pm.m.LoadOrStore(key, handler)
if conflict {
return false
}
atomic.AddInt64(&pm.count, 1)
return true
}
func (pm *PlayerManager) Unregister(handler *Handler) {
key := strings.ToLower(handler.Nickname)
pm.m.Delete(key)
atomic.AddInt64(&pm.count, -1)
}
func (pm *PlayerManager) GetByNickname(nickname string) *Handler {
key := strings.ToLower(nickname)
v, ok := pm.m.Load(key)
if !ok {
return nil
}
return v.(*Handler)
}
func (pm *PlayerManager) GetByUUID(u uuid.UUID) (result *Handler) {
pm.Range(func(h *Handler) bool {
if u == h.UUID {
result = h
return false
}
return true
})
return result
}
func (pm *PlayerManager) Len() int {
return int(atomic.LoadInt64(&pm.count))
}
func (pm *PlayerManager) Range(f func(handler *Handler) bool) {
pm.m.Range(func(key, value interface{}) bool {
return f(value.(*Handler))
})
}
func (pm *PlayerManager) Broadcast(perm, msg string) {
pm.Range(func(h *Handler) bool {
if perm == "" || h.HasPermission(perm) {
h.SendChatMessage(msg)
}
return true
})
}