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  }