63 lines
1.5 KiB
Go
63 lines
1.5 KiB
Go
|
package steam
|
||
|
|
||
|
import (
|
||
|
. "github.com/Philipp15b/go-steam/protocol"
|
||
|
. "github.com/Philipp15b/go-steam/protocol/protobuf"
|
||
|
. "github.com/Philipp15b/go-steam/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 *Packet) {
|
||
|
switch packet.EMsg {
|
||
|
case EMsg_ClientUserNotifications:
|
||
|
n.handleClientUserNotifications(packet)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
type NotificationType uint
|
||
|
|
||
|
const (
|
||
|
TradeOffer NotificationType = 1
|
||
|
)
|
||
|
|
||
|
func (n *Notifications) handleClientUserNotifications(packet *Packet) {
|
||
|
msg := new(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})
|
||
|
}
|
||
|
}
|
||
|
}
|