github.com/diamondburned/arikawa/v2@v2.1.0/state/store/defaultstore/voicestate.go (about) 1 package defaultstore 2 3 import ( 4 "sync" 5 6 "github.com/diamondburned/arikawa/v2/discord" 7 "github.com/diamondburned/arikawa/v2/internal/moreatomic" 8 "github.com/diamondburned/arikawa/v2/state/store" 9 ) 10 11 type VoiceState struct { 12 guilds moreatomic.Map 13 } 14 15 var _ store.VoiceStateStore = (*VoiceState)(nil) 16 17 type voiceStates struct { 18 mut sync.Mutex 19 voiceStates map[discord.UserID]discord.VoiceState 20 } 21 22 func NewVoiceState() *VoiceState { 23 return &VoiceState{ 24 guilds: *moreatomic.NewMap(func() interface{} { 25 return &voiceStates{ 26 voiceStates: make(map[discord.UserID]discord.VoiceState, 1), 27 } 28 }), 29 } 30 } 31 32 func (s *VoiceState) Reset() error { 33 return s.guilds.Reset() 34 } 35 36 func (s *VoiceState) VoiceState( 37 guildID discord.GuildID, userID discord.UserID) (*discord.VoiceState, error) { 38 39 iv, ok := s.guilds.Load(guildID) 40 if !ok { 41 return nil, store.ErrNotFound 42 } 43 44 vs := iv.(*voiceStates) 45 46 vs.mut.Lock() 47 defer vs.mut.Unlock() 48 49 v, ok := vs.voiceStates[userID] 50 if ok { 51 return &v, nil 52 } 53 54 return nil, store.ErrNotFound 55 } 56 57 func (s *VoiceState) VoiceStates(guildID discord.GuildID) ([]discord.VoiceState, error) { 58 iv, ok := s.guilds.Load(guildID) 59 if !ok { 60 return nil, store.ErrNotFound 61 } 62 63 vs := iv.(*voiceStates) 64 65 vs.mut.Lock() 66 defer vs.mut.Unlock() 67 68 var states = make([]discord.VoiceState, 0, len(vs.voiceStates)) 69 for _, state := range vs.voiceStates { 70 states = append(states, state) 71 } 72 73 return states, nil 74 } 75 76 func (s *VoiceState) VoiceStateSet(guildID discord.GuildID, voiceState discord.VoiceState) error { 77 iv, _ := s.guilds.LoadOrStore(guildID) 78 79 vs := iv.(*voiceStates) 80 81 vs.mut.Lock() 82 vs.voiceStates[voiceState.UserID] = voiceState 83 vs.mut.Unlock() 84 85 return nil 86 } 87 88 func (s *VoiceState) VoiceStateRemove(guildID discord.GuildID, userID discord.UserID) error { 89 iv, ok := s.guilds.Load(guildID) 90 if !ok { 91 return nil 92 } 93 94 vs := iv.(*voiceStates) 95 96 vs.mut.Lock() 97 delete(vs.voiceStates, userID) 98 vs.mut.Unlock() 99 100 return nil 101 }