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