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 }