github.com/diamondburned/arikawa/v2@v2.1.0/state/store/defaultstore/member.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 Member struct {
    12  	guilds moreatomic.Map // discord.GuildID -> *guildMembers
    13  }
    14  
    15  type guildMembers struct {
    16  	mut     sync.Mutex
    17  	members map[discord.UserID]discord.Member
    18  }
    19  
    20  var _ store.MemberStore = (*Member)(nil)
    21  
    22  func NewMember() *Member {
    23  	return &Member{
    24  		guilds: *moreatomic.NewMap(func() interface{} {
    25  			return &guildMembers{
    26  				members: make(map[discord.UserID]discord.Member, 1),
    27  			}
    28  		}),
    29  	}
    30  }
    31  
    32  func (s *Member) Reset() error {
    33  	return s.guilds.Reset()
    34  }
    35  
    36  func (s *Member) Member(guildID discord.GuildID, userID discord.UserID) (*discord.Member, error) {
    37  	iv, ok := s.guilds.Load(guildID)
    38  	if !ok {
    39  		return nil, store.ErrNotFound
    40  	}
    41  
    42  	gm := iv.(*guildMembers)
    43  
    44  	gm.mut.Lock()
    45  	defer gm.mut.Unlock()
    46  
    47  	m, ok := gm.members[userID]
    48  	if ok {
    49  		return &m, nil
    50  	}
    51  
    52  	return nil, store.ErrNotFound
    53  }
    54  
    55  func (s *Member) Members(guildID discord.GuildID) ([]discord.Member, error) {
    56  	iv, ok := s.guilds.Load(guildID)
    57  	if !ok {
    58  		return nil, store.ErrNotFound
    59  	}
    60  
    61  	gm := iv.(*guildMembers)
    62  
    63  	gm.mut.Lock()
    64  	defer gm.mut.Unlock()
    65  
    66  	var members = make([]discord.Member, 0, len(gm.members))
    67  	for _, m := range gm.members {
    68  		members = append(members, m)
    69  	}
    70  
    71  	return members, nil
    72  }
    73  
    74  func (s *Member) MemberSet(guildID discord.GuildID, member discord.Member) error {
    75  	iv, _ := s.guilds.LoadOrStore(guildID)
    76  	gm := iv.(*guildMembers)
    77  
    78  	gm.mut.Lock()
    79  	gm.members[member.User.ID] = member
    80  	gm.mut.Unlock()
    81  
    82  	return nil
    83  }
    84  
    85  func (s *Member) MemberRemove(guildID discord.GuildID, userID discord.UserID) error {
    86  	iv, ok := s.guilds.Load(guildID)
    87  	if !ok {
    88  		return nil
    89  	}
    90  
    91  	gm := iv.(*guildMembers)
    92  
    93  	gm.mut.Lock()
    94  	delete(gm.members, userID)
    95  	gm.mut.Unlock()
    96  
    97  	return nil
    98  }