discord.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  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. member, err := user.Session.State.Member(channel.GuildID, user.DiscordID)
  18. if errors.Is(err, discordgo.ErrStateNotFound) {
  19. user.log.Debugfln("Fetching own membership in %s to check own roles", channel.GuildID)
  20. member, err = user.Session.GuildMember(channel.GuildID, user.DiscordID)
  21. if err != nil {
  22. 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)
  23. } else {
  24. err = user.Session.State.MemberAdd(member)
  25. if err != nil {
  26. user.log.Warnfln("Failed to add own membership in %s to cache: %v", channel.GuildID, err)
  27. }
  28. }
  29. } else if err != nil {
  30. 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)
  31. }
  32. err = user.Session.State.ChannelAdd(channel)
  33. if err != nil {
  34. user.log.Warnfln("Failed to add channel %s/%s to cache: %v", channel.GuildID, channel.ID, err)
  35. }
  36. perms, err := user.Session.State.UserChannelPermissions(user.DiscordID, channel.ID)
  37. if err != nil {
  38. user.log.Warnfln("Failed to get permissions in %s/%s to determine if it's bridgeable: %v", channel.GuildID, channel.ID, err)
  39. return true
  40. }
  41. user.log.Debugfln("Computed permissions in %s/%s: %d (view channel: %t)", channel.GuildID, channel.ID, perms, perms&discordgo.PermissionViewChannel > 0)
  42. return perms&discordgo.PermissionViewChannel > 0
  43. }