discord.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package main
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "github.com/bwmarrin/discordgo"
  6. )
  7. func ptrBool(val bool) *bool {
  8. return &val
  9. }
  10. func (user *User) channelIsBridgeable(channel *discordgo.Channel) bool {
  11. switch channel.Type {
  12. case discordgo.ChannelTypeGuildText, discordgo.ChannelTypeGuildNews:
  13. // allowed
  14. default:
  15. // everything else is not allowed
  16. return false
  17. }
  18. hasRole := map[string]bool{
  19. channel.GuildID: true,
  20. }
  21. var roles []string
  22. member, err := user.Session.State.Member(channel.GuildID, user.DiscordID)
  23. if errors.Is(err, discordgo.ErrStateNotFound) {
  24. user.log.Debugfln("Fetching own membership in %s to check own roles", channel.GuildID)
  25. member, err = user.Session.GuildMember(channel.GuildID, user.DiscordID)
  26. if err != nil {
  27. user.log.Warnfln("Failed to get own membership in %s from server to determine own roles for bridging %s: %v", channel.GuildID, channel.ID, err)
  28. } else {
  29. err = user.Session.State.MemberAdd(member)
  30. if err != nil {
  31. user.log.Warnfln("Failed to add own membership in %s to cache: %v", channel.GuildID, err)
  32. }
  33. }
  34. } else if err != nil {
  35. user.log.Warnfln("Failed to get own membership in %s from cache to determine own roles for bridging %s: %v", channel.GuildID, channel.ID, err)
  36. }
  37. if member != nil {
  38. roles = member.Roles
  39. for _, role := range member.Roles {
  40. hasRole[role] = true
  41. }
  42. }
  43. var userAllowed, roleAllowed *bool
  44. for _, override := range channel.PermissionOverwrites {
  45. if override.Type == discordgo.PermissionOverwriteTypeMember && override.ID == user.DiscordID {
  46. if override.Allow&discordgo.PermissionViewChannel > 0 {
  47. userAllowed = ptrBool(true)
  48. } else if override.Deny&discordgo.PermissionViewChannel > 0 {
  49. userAllowed = ptrBool(false)
  50. }
  51. } else if override.Type == discordgo.PermissionOverwriteTypeRole && hasRole[override.ID] {
  52. if override.Allow&discordgo.PermissionViewChannel > 0 {
  53. roleAllowed = ptrBool(true)
  54. } else if override.Deny&discordgo.PermissionViewChannel > 0 {
  55. roleAllowed = ptrBool(false)
  56. }
  57. }
  58. }
  59. allowed := true
  60. if userAllowed != nil {
  61. allowed = *userAllowed
  62. } else if roleAllowed != nil {
  63. allowed = *roleAllowed
  64. }
  65. if !allowed {
  66. dat, _ := json.Marshal(channel.PermissionOverwrites)
  67. user.log.Debugfln("Permission overwrites (%s) resulted in %s/%s not being allowed to bridge with roles %+v", dat, channel.GuildID, channel.ID, roles)
  68. }
  69. return allowed
  70. }