-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathpresence_channel.go
116 lines (101 loc) · 3.19 KB
/
presence_channel.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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package pusher
import (
"encoding/json"
"github.com/FlowerWrong/pusher/api/forms"
"github.com/thoas/go-funk"
)
var (
PresenceMaximumMembersCount int64 = 100
PresenceMaximumUserDataSize = 1000
PresenceMaximumUserIDLen = 128
)
// PresenceChannelData ...
type PresenceChannelData struct {
UserID string `json:"user_id"` // user id, not socket id
UserInfo map[string]string `json:"user_info,omitempty"`
}
// MemberRemovedData ...
type MemberRemovedData struct {
UserID string `json:"user_id"`
}
// PresenceData ...
type PresenceData struct {
IDs []string `json:"ids"`
Hash map[string]map[string]string `json:"hash"`
Count int `json:"count"`
}
// GetPresenceChannelData ...
func GetPresenceChannelData(socketID, channel string) (*PresenceChannelData, error) {
user := GetUserInfo(socketID)
var presenceChannelData PresenceChannelData
err := json.Unmarshal([]byte(user[UserInfoChannelDataKey(channel)]), &presenceChannelData)
if err != nil {
return nil, err
}
return &presenceChannelData, nil
}
// GetPresenceChannelDataByUser ...
func GetPresenceChannelDataByUser(user map[string]string, channel string) (*PresenceChannelData, error) {
var presenceChannelData PresenceChannelData
err := json.Unmarshal([]byte(user[UserInfoChannelDataKey(channel)]), &presenceChannelData)
if err != nil {
return nil, err
}
return &presenceChannelData, nil
}
// PresenceChannelUserIDs ...
func PresenceChannelUserIDs(channel string) []string {
subs := GetSubscriptions(channel)
var userIDs []string
for _, socketID := range subs {
data, err := GetPresenceChannelDataByUser(GetUserInfo(socketID), channel)
if err != nil {
continue
}
if funk.Contains(userIDs, data.UserID) {
continue
}
userIDs = append(userIDs, data.UserID)
}
return userIDs
}
// PublishPresenceMemberAddedEvent ...
func PublishPresenceMemberAddedEvent(socketID, channel string) error {
user := GetUserInfo(socketID)
// member_added event
eventForm := forms.EventForm{Name: PusherPresenceMemberAdded, Channel: channel, Data: user[UserInfoChannelDataKey(channel)], SocketID: socketID}
err := PublishEventForm(eventForm)
if err != nil {
return err
}
// member_added hook
presenceChannelData, err := GetPresenceChannelDataByUser(user, channel)
if err != nil {
return err
}
hookEvent := HookEvent{Name: "member_added", Channel: channel, UserID: presenceChannelData.UserID}
go TriggerHook(&hookEvent)
return nil
}
// PublishPresenceMemberRemovedEvent ...
func PublishPresenceMemberRemovedEvent(socketID, channel string) error {
presenceChannelData, err := GetPresenceChannelData(socketID, channel)
if err != nil {
return err
}
// member_removed hook
hookEvent := HookEvent{Name: "member_removed", Channel: channel, UserID: presenceChannelData.UserID}
go TriggerHook(&hookEvent)
memberRemovedData := MemberRemovedData{UserID: presenceChannelData.UserID}
b, err := json.Marshal(memberRemovedData)
if err != nil {
return err
}
// member_removed event
eventForm := forms.EventForm{Name: PusherPresenceMemberRemoved, Channel: channel, Data: string(b[:]), SocketID: socketID}
err = PublishEventForm(eventForm)
if err != nil {
return err
}
return nil
}