discord.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package main
  2. import (
  3. "errors"
  4. "github.com/bwmarrin/discordgo"
  5. )
  6. func (user *User) channelIsBridgeable(channel *discordgo.Channel) bool {
  7. switch channel.Type {
  8. case discordgo.ChannelTypeGuildText, discordgo.ChannelTypeGuildNews:
  9. // allowed
  10. case discordgo.ChannelTypeDM, discordgo.ChannelTypeGroupDM:
  11. // DMs are always bridgeable, no need for permission checks
  12. return true
  13. default:
  14. // everything else is not allowed
  15. return false
  16. }
  17. log := user.log.With().Str("guild_id", channel.GuildID).Str("channel_id", channel.ID).Logger()
  18. member, err := user.Session.State.Member(channel.GuildID, user.DiscordID)
  19. if errors.Is(err, discordgo.ErrStateNotFound) {
  20. log.Debug().Msg("Fetching own membership in guild to check roles")
  21. member, err = user.Session.GuildMember(channel.GuildID, user.DiscordID)
  22. if err != nil {
  23. log.Warn().Err(err).Msg("Failed to get own membership in guild from server")
  24. } else {
  25. err = user.Session.State.MemberAdd(member)
  26. if err != nil {
  27. log.Warn().Err(err).Msg("Failed to add own membership in guild to cache")
  28. }
  29. }
  30. } else if err != nil {
  31. log.Warn().Err(err).Msg("Failed to get own membership in guild from cache")
  32. }
  33. err = user.Session.State.ChannelAdd(channel)
  34. if err != nil {
  35. log.Warn().Err(err).Msg("Failed to add channel to cache")
  36. }
  37. perms, err := user.Session.State.UserChannelPermissions(user.DiscordID, channel.ID)
  38. if err != nil {
  39. log.Warn().Err(err).Msg("Failed to get permissions in channel to determine if it's bridgeable")
  40. return true
  41. }
  42. log.Debug().
  43. Int64("permissions", perms).
  44. Bool("view_channel", perms&discordgo.PermissionViewChannel > 0).
  45. Msg("Computed permissions in channel")
  46. return perms&discordgo.PermissionViewChannel > 0
  47. }