state.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package discordgo
  2. import "errors"
  3. // NewState creates an empty state.
  4. func NewState() *State {
  5. return &State{
  6. Ready: Ready{
  7. PrivateChannels: []Channel{},
  8. Guilds: []Guild{},
  9. },
  10. }
  11. }
  12. // OnReady takes a Ready event and updates all internal state.
  13. func (s *State) OnReady(r *Ready) {
  14. s.Ready = *r
  15. }
  16. // AddGuild adds a guild to the current world state, or
  17. // updates it if it already exists.
  18. func (s *State) AddGuild(guild *Guild) {
  19. for _, g := range s.Guilds {
  20. if g.ID == guild.ID {
  21. // This could be a little faster ;)
  22. for _, m := range guild.Members {
  23. s.AddMember(&m)
  24. }
  25. for _, c := range guild.Channels {
  26. s.AddChannel(&c)
  27. }
  28. return
  29. }
  30. }
  31. s.Guilds = append(s.Guilds, *guild)
  32. }
  33. // RemoveGuild removes a guild from current world state.
  34. func (s *State) RemoveGuild(guild *Guild) error {
  35. for i, g := range s.Guilds {
  36. if g.ID == guild.ID {
  37. s.Guilds = append(s.Guilds[:i], s.Guilds[i+1:]...)
  38. return nil
  39. }
  40. }
  41. return errors.New("Guild not found.")
  42. }
  43. // GetGuildByID gets a guild by ID.
  44. // Useful for querying if @me is in a guild:
  45. // _, err := discordgo.Session.State.GetGuildById(guildID)
  46. // isInGuild := err == nil
  47. func (s *State) GetGuildByID(guildID string) (*Guild, error) {
  48. for _, g := range s.Guilds {
  49. if g.ID == guildID {
  50. return &g, nil
  51. }
  52. }
  53. return nil, errors.New("Guild not found.")
  54. }
  55. // TODO: Consider moving Guild state update methods onto *Guild.
  56. // AddMember adds a member to the current world state, or
  57. // updates it if it already exists.
  58. func (s *State) AddMember(member *Member) error {
  59. guild, err := s.GetGuildByID(member.GuildID)
  60. if err != nil {
  61. return err
  62. }
  63. for i, m := range guild.Members {
  64. if m.User.ID == member.User.ID {
  65. guild.Members[i] = *member
  66. return nil
  67. }
  68. }
  69. guild.Members = append(guild.Members, *member)
  70. return nil
  71. }
  72. // RemoveMember removes a member from current world state.
  73. func (s *State) RemoveMember(member *Member) error {
  74. guild, err := s.GetGuildByID(member.GuildID)
  75. if err != nil {
  76. return err
  77. }
  78. for i, m := range guild.Members {
  79. if m.User.ID == member.User.ID {
  80. guild.Members = append(guild.Members[:i], guild.Members[i+1:]...)
  81. return nil
  82. }
  83. }
  84. return errors.New("Member not found.")
  85. }
  86. // GetMemberByID gets a member by ID from a guild.
  87. func (s *State) GetMemberByID(guildID string, userID string) (*Member, error) {
  88. guild, err := s.GetGuildByID(guildID)
  89. if err != nil {
  90. return nil, err
  91. }
  92. for _, m := range guild.Members {
  93. if m.User.ID == userID {
  94. return &m, nil
  95. }
  96. }
  97. return nil, errors.New("Member not found.")
  98. }
  99. // AddChannel adds a guild to the current world state, or
  100. // updates it if it already exists.
  101. // Channels may exist either as PrivateChannels or inside
  102. // a guild.
  103. func (s *State) AddChannel(channel *Channel) error {
  104. if channel.IsPrivate {
  105. for i, c := range s.PrivateChannels {
  106. if c.ID == channel.ID {
  107. s.PrivateChannels[i] = *channel
  108. return nil
  109. }
  110. }
  111. s.PrivateChannels = append(s.PrivateChannels, *channel)
  112. } else {
  113. guild, err := s.GetGuildByID(channel.GuildID)
  114. if err != nil {
  115. return err
  116. }
  117. for i, c := range guild.Channels {
  118. if c.ID == channel.ID {
  119. guild.Channels[i] = *channel
  120. return nil
  121. }
  122. }
  123. guild.Channels = append(guild.Channels, *channel)
  124. }
  125. return nil
  126. }
  127. // RemoveChannel removes a channel from current world state.
  128. func (s *State) RemoveChannel(channel *Channel) error {
  129. if channel.IsPrivate {
  130. for i, c := range s.PrivateChannels {
  131. if c.ID == channel.ID {
  132. s.PrivateChannels = append(s.PrivateChannels[:i], s.PrivateChannels[i+1:]...)
  133. return nil
  134. }
  135. }
  136. } else {
  137. guild, err := s.GetGuildByID(channel.GuildID)
  138. if err != nil {
  139. return err
  140. }
  141. for i, c := range guild.Channels {
  142. if c.ID == channel.ID {
  143. guild.Channels = append(guild.Channels[:i], guild.Channels[i+1:]...)
  144. return nil
  145. }
  146. }
  147. }
  148. return errors.New("Channel not found.")
  149. }
  150. // GetGuildChannelById gets a channel by ID from a guild.
  151. func (s *State) GetGuildChannelByID(guildID string, channelID string) (*Channel, error) {
  152. guild, err := s.GetGuildByID(guildID)
  153. if err != nil {
  154. return nil, err
  155. }
  156. for _, c := range guild.Channels {
  157. if c.ID == channelID {
  158. return &c, nil
  159. }
  160. }
  161. return nil, errors.New("Channel not found.")
  162. }
  163. // GetPrivateChannelByID gets a private channel by ID.
  164. func (s *State) GetPrivateChannelByID(channelID string) (*Channel, error) {
  165. for _, c := range s.PrivateChannels {
  166. if c.ID == channelID {
  167. return &c, nil
  168. }
  169. }
  170. return nil, errors.New("Channel not found.")
  171. }