forked from lug/matterbridge
		
	
		
			
				
	
	
		
			147 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package socialcache
 | 
						|
 | 
						|
import (
 | 
						|
	"errors"
 | 
						|
	. "github.com/Philipp15b/go-steam/protocol/steamlang"
 | 
						|
	. "github.com/Philipp15b/go-steam/steamid"
 | 
						|
	"sync"
 | 
						|
)
 | 
						|
 | 
						|
// Friends list is a thread safe map
 | 
						|
// They can be iterated over like so:
 | 
						|
// 	for id, friend := range client.Social.Friends.GetCopy() {
 | 
						|
// 		log.Println(id, friend.Name)
 | 
						|
// 	}
 | 
						|
type FriendsList struct {
 | 
						|
	mutex sync.RWMutex
 | 
						|
	byId  map[SteamId]*Friend
 | 
						|
}
 | 
						|
 | 
						|
// Returns a new friends list
 | 
						|
func NewFriendsList() *FriendsList {
 | 
						|
	return &FriendsList{byId: make(map[SteamId]*Friend)}
 | 
						|
}
 | 
						|
 | 
						|
// Adds a friend to the friend list
 | 
						|
func (list *FriendsList) Add(friend Friend) {
 | 
						|
	list.mutex.Lock()
 | 
						|
	defer list.mutex.Unlock()
 | 
						|
	_, exists := list.byId[friend.SteamId]
 | 
						|
	if !exists { //make sure this doesnt already exist
 | 
						|
		list.byId[friend.SteamId] = &friend
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Removes a friend from the friend list
 | 
						|
func (list *FriendsList) Remove(id SteamId) {
 | 
						|
	list.mutex.Lock()
 | 
						|
	defer list.mutex.Unlock()
 | 
						|
	delete(list.byId, id)
 | 
						|
}
 | 
						|
 | 
						|
// Returns a copy of the friends map
 | 
						|
func (list *FriendsList) GetCopy() map[SteamId]Friend {
 | 
						|
	list.mutex.RLock()
 | 
						|
	defer list.mutex.RUnlock()
 | 
						|
	flist := make(map[SteamId]Friend)
 | 
						|
	for key, friend := range list.byId {
 | 
						|
		flist[key] = *friend
 | 
						|
	}
 | 
						|
	return flist
 | 
						|
}
 | 
						|
 | 
						|
// Returns a copy of the friend of a given SteamId
 | 
						|
func (list *FriendsList) ById(id SteamId) (Friend, error) {
 | 
						|
	list.mutex.RLock()
 | 
						|
	defer list.mutex.RUnlock()
 | 
						|
	if val, ok := list.byId[id]; ok {
 | 
						|
		return *val, nil
 | 
						|
	}
 | 
						|
	return Friend{}, errors.New("Friend not found")
 | 
						|
}
 | 
						|
 | 
						|
// Returns the number of friends
 | 
						|
func (list *FriendsList) Count() int {
 | 
						|
	list.mutex.RLock()
 | 
						|
	defer list.mutex.RUnlock()
 | 
						|
	return len(list.byId)
 | 
						|
}
 | 
						|
 | 
						|
//Setter methods
 | 
						|
func (list *FriendsList) SetName(id SteamId, name string) {
 | 
						|
	list.mutex.Lock()
 | 
						|
	defer list.mutex.Unlock()
 | 
						|
	if val, ok := list.byId[id]; ok {
 | 
						|
		val.Name = name
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (list *FriendsList) SetAvatar(id SteamId, hash string) {
 | 
						|
	list.mutex.Lock()
 | 
						|
	defer list.mutex.Unlock()
 | 
						|
	if val, ok := list.byId[id]; ok {
 | 
						|
		val.Avatar = hash
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (list *FriendsList) SetRelationship(id SteamId, relationship EFriendRelationship) {
 | 
						|
	list.mutex.Lock()
 | 
						|
	defer list.mutex.Unlock()
 | 
						|
	if val, ok := list.byId[id]; ok {
 | 
						|
		val.Relationship = relationship
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (list *FriendsList) SetPersonaState(id SteamId, state EPersonaState) {
 | 
						|
	list.mutex.Lock()
 | 
						|
	defer list.mutex.Unlock()
 | 
						|
	if val, ok := list.byId[id]; ok {
 | 
						|
		val.PersonaState = state
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (list *FriendsList) SetPersonaStateFlags(id SteamId, flags EPersonaStateFlag) {
 | 
						|
	list.mutex.Lock()
 | 
						|
	defer list.mutex.Unlock()
 | 
						|
	if val, ok := list.byId[id]; ok {
 | 
						|
		val.PersonaStateFlags = flags
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (list *FriendsList) SetGameAppId(id SteamId, gameappid uint32) {
 | 
						|
	list.mutex.Lock()
 | 
						|
	defer list.mutex.Unlock()
 | 
						|
	if val, ok := list.byId[id]; ok {
 | 
						|
		val.GameAppId = gameappid
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (list *FriendsList) SetGameId(id SteamId, gameid uint64) {
 | 
						|
	list.mutex.Lock()
 | 
						|
	defer list.mutex.Unlock()
 | 
						|
	if val, ok := list.byId[id]; ok {
 | 
						|
		val.GameId = gameid
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func (list *FriendsList) SetGameName(id SteamId, name string) {
 | 
						|
	list.mutex.Lock()
 | 
						|
	defer list.mutex.Unlock()
 | 
						|
	if val, ok := list.byId[id]; ok {
 | 
						|
		val.GameName = name
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// A Friend
 | 
						|
type Friend struct {
 | 
						|
	SteamId           SteamId `json:",string"`
 | 
						|
	Name              string
 | 
						|
	Avatar            string
 | 
						|
	Relationship      EFriendRelationship
 | 
						|
	PersonaState      EPersonaState
 | 
						|
	PersonaStateFlags EPersonaStateFlag
 | 
						|
	GameAppId         uint32
 | 
						|
	GameId            uint64 `json:",string"`
 | 
						|
	GameName          string
 | 
						|
}
 |