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  }