-
Notifications
You must be signed in to change notification settings - Fork 131
/
notifications.go
62 lines (52 loc) · 1.5 KB
/
notifications.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
package steam
import (
"github.com/Philipp15b/go-steam/v3/protocol"
"github.com/Philipp15b/go-steam/v3/protocol/protobuf"
"github.com/Philipp15b/go-steam/v3/protocol/steamlang"
)
type Notifications struct {
// Maps notification types to their count. If a type is not present in the map,
// its count is zero.
notifications map[NotificationType]uint
client *Client
}
func newNotifications(client *Client) *Notifications {
return &Notifications{
make(map[NotificationType]uint),
client,
}
}
func (n *Notifications) HandlePacket(packet *protocol.Packet) {
switch packet.EMsg {
case steamlang.EMsg_ClientUserNotifications:
n.handleClientUserNotifications(packet)
}
}
type NotificationType uint
const (
TradeOffer NotificationType = 1
)
func (n *Notifications) handleClientUserNotifications(packet *protocol.Packet) {
msg := new(protobuf.CMsgClientUserNotifications)
packet.ReadProtoMsg(msg)
for _, notification := range msg.GetNotifications() {
typ := NotificationType(*notification.UserNotificationType)
count := uint(*notification.Count)
n.notifications[typ] = count
n.client.Emit(&NotificationEvent{typ, count})
}
// check if there is a notification in our map that isn't in the current packet
for typ, _ := range n.notifications {
exists := false
for _, t := range msg.GetNotifications() {
if NotificationType(*t.UserNotificationType) == typ {
exists = true
break
}
}
if !exists {
delete(n.notifications, typ)
n.client.Emit(&NotificationEvent{typ, 0})
}
}
}