Fixe concurrent map read and map write.
This commit is contained in:
parent
4a3fdd3da1
commit
4961ad8c9e
|
|
@ -1,6 +1,8 @@
|
||||||
package gateway
|
package gateway
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"sync"
|
||||||
|
|
||||||
"github.com/Philipp15b/go-steam"
|
"github.com/Philipp15b/go-steam"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -23,7 +25,7 @@ type GatewayInfo struct {
|
||||||
SteamLoginInfo *steam.LogOnDetails
|
SteamLoginInfo *steam.LogOnDetails
|
||||||
SteamClient *steam.Client
|
SteamClient *steam.Client
|
||||||
SentryFile string
|
SentryFile string
|
||||||
FriendSteamId map[string]*StatusSteamFriend
|
friendSteamId map[string]*StatusSteamFriend
|
||||||
SteamConnecting bool
|
SteamConnecting bool
|
||||||
Deleting bool
|
Deleting bool
|
||||||
|
|
||||||
|
|
@ -35,6 +37,8 @@ type GatewayInfo struct {
|
||||||
XMPP_IQ_RemoteRoster_Request map[string]string
|
XMPP_IQ_RemoteRoster_Request map[string]string
|
||||||
AllowEditRoster bool
|
AllowEditRoster bool
|
||||||
ChatstateNotificationData chan string
|
ChatstateNotificationData chan string
|
||||||
|
|
||||||
|
sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
type StatusSteamFriend struct {
|
type StatusSteamFriend struct {
|
||||||
|
|
@ -68,3 +72,38 @@ func (g *GatewayInfo) Delete() {
|
||||||
|
|
||||||
g.Disconnect()
|
g.Disconnect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *GatewayInfo) CreateSteamIds() {
|
||||||
|
s.friendSteamId = make(map[string]*StatusSteamFriend)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GatewayInfo) GetFriendSteamId(steamId string) *StatusSteamFriend {
|
||||||
|
s.RLock()
|
||||||
|
defer s.RUnlock()
|
||||||
|
return s.friendSteamId[steamId]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GatewayInfo) GetAllFriendSteamId() []string {
|
||||||
|
s.RLock()
|
||||||
|
defer s.RUnlock()
|
||||||
|
allSteamIds := make([]string, len(s.friendSteamId))
|
||||||
|
|
||||||
|
i := 0
|
||||||
|
for steamId := range s.friendSteamId {
|
||||||
|
allSteamIds[i] = steamId
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
return allSteamIds
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GatewayInfo) SetFriendSteamId(steamId string, status *StatusSteamFriend) {
|
||||||
|
s.Lock()
|
||||||
|
s.friendSteamId[steamId] = status
|
||||||
|
s.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *GatewayInfo) RemoveFriendSteamId(steamId string) {
|
||||||
|
s.Lock()
|
||||||
|
delete(s.friendSteamId, steamId)
|
||||||
|
s.Unlock()
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -127,15 +127,16 @@ func (g *GatewayInfo) mainSteam() {
|
||||||
status = Status_extended_away
|
status = Status_extended_away
|
||||||
tpye = Type_available
|
tpye = Type_available
|
||||||
}
|
}
|
||||||
if _, ok := g.FriendSteamId[steamId]; !ok {
|
steamFriendId := g.GetFriendSteamId(steamId)
|
||||||
|
if steamFriendId == nil {
|
||||||
// Send subscribsion
|
// Send subscribsion
|
||||||
g.SendXmppPresence(status, Type_subscribe, "", steamId+"@"+XmppJidComponent, gameName, name)
|
g.SendXmppPresence(status, Type_subscribe, "", steamId+"@"+XmppJidComponent, gameName, name)
|
||||||
g.FriendSteamId[steamId] = &StatusSteamFriend{XMPP_Status: status, XMPP_Type: tpye}
|
g.SetFriendSteamId(steamId, &StatusSteamFriend{XMPP_Status: status, XMPP_Type: tpye})
|
||||||
} else {
|
} else {
|
||||||
g.FriendSteamId[steamId].XMPP_Status = status
|
steamFriendId.XMPP_Status = status
|
||||||
g.FriendSteamId[steamId].XMPP_Type = tpye
|
steamFriendId.XMPP_Type = tpye
|
||||||
g.FriendSteamId[steamId].SteamGameName = gameName
|
steamFriendId.SteamGameName = gameName
|
||||||
g.FriendSteamId[steamId].SteamName = name
|
steamFriendId.SteamName = name
|
||||||
}
|
}
|
||||||
g.SendXmppPresence(status, tpye, "", steamId+"@"+XmppJidComponent, gameName, name)
|
g.SendXmppPresence(status, tpye, "", steamId+"@"+XmppJidComponent, gameName, name)
|
||||||
|
|
||||||
|
|
@ -226,9 +227,9 @@ func (g *GatewayInfo) SteamDisconnect() {
|
||||||
|
|
||||||
func (g *GatewayInfo) DisconnectAllSteamFriend() {
|
func (g *GatewayInfo) DisconnectAllSteamFriend() {
|
||||||
logger.Debug.Printf("[%s] Disconnect all Steam friend", g.XMPP_JID_Client)
|
logger.Debug.Printf("[%s] Disconnect all Steam friend", g.XMPP_JID_Client)
|
||||||
for sid := range g.FriendSteamId {
|
for _, sid := range g.GetAllFriendSteamId() {
|
||||||
g.SendXmppPresence(Status_offline, Type_unavailable, "", sid+"@"+XmppJidComponent, "", "")
|
g.SendXmppPresence(Status_offline, Type_unavailable, "", sid+"@"+XmppJidComponent, "", "")
|
||||||
delete(g.FriendSteamId, sid)
|
g.RemoveFriendSteamId(sid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ func (g *GatewayInfo) ReceivedXMPP_Presence(presence *xmpp.Presence) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if presence.Type == Type_probe {
|
if presence.Type == Type_probe {
|
||||||
steamFriendStatus := g.FriendSteamId[steamJid[0]]
|
steamFriendStatus := g.GetFriendSteamId(steamJid[0])
|
||||||
if steamFriendStatus != nil {
|
if steamFriendStatus != nil {
|
||||||
g.SendXmppPresence(steamFriendStatus.XMPP_Status, steamFriendStatus.XMPP_Type, "", steamJid[0]+"@"+XmppJidComponent, steamFriendStatus.SteamGameName, steamFriendStatus.SteamName)
|
g.SendXmppPresence(steamFriendStatus.XMPP_Status, steamFriendStatus.XMPP_Type, "", steamJid[0]+"@"+XmppJidComponent, steamFriendStatus.SteamGameName, steamFriendStatus.SteamName)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -277,7 +277,7 @@ func AddNewUser(jidUser, steamLogin, steamPwd string, debugMessage bool) {
|
||||||
g.SteamPassword = steamPwd
|
g.SteamPassword = steamPwd
|
||||||
g.XMPP_JID_Client = jidUser
|
g.XMPP_JID_Client = jidUser
|
||||||
g.SentryFile = gateway.SentryDirectory + jidUser
|
g.SentryFile = gateway.SentryDirectory + jidUser
|
||||||
g.FriendSteamId = make(map[string]*gateway.StatusSteamFriend)
|
g.CreateSteamIds()
|
||||||
g.Deleting = false
|
g.Deleting = false
|
||||||
|
|
||||||
g.XMPP_Out = comp.Out
|
g.XMPP_Out = comp.Out
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue