bridge.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package config
  2. import (
  3. "strings"
  4. "text/template"
  5. "maunium.net/go/mautrix/id"
  6. "github.com/bwmarrin/discordgo"
  7. )
  8. type bridge struct {
  9. UsernameTemplate string `yaml:"username_template"`
  10. DisplaynameTemplate string `yaml:"displayname_template"`
  11. CommandPrefix string `yaml:"command_prefix"`
  12. ManagementRoomText managementRoomText `yaml:"management_root_text"`
  13. PortalMessageBuffer int `yaml:"portal_message_buffer"`
  14. SyncWithCustomPuppets bool `yaml:"sync_with_custom_puppets"`
  15. SyncDirectChatList bool `yaml:"sync_direct_chat_list"`
  16. DefaultBridgeReceipts bool `yaml:"default_bridge_receipts"`
  17. DefaultBridgePresence bool `yaml:"default_bridge_presence"`
  18. DoublePuppetServerMap map[string]string `yaml:"double_puppet_server_map"`
  19. DoublePuppetAllowDiscovery bool `yaml:"double_puppet_allow_discovery"`
  20. LoginSharedSecretMap map[string]string `yaml:"login_shared_secret_map"`
  21. usernameTemplate *template.Template `yaml:"-"`
  22. displaynameTemplate *template.Template `yaml:"-"`
  23. }
  24. func (config *Config) CanAutoDoublePuppet(userID id.UserID) bool {
  25. _, homeserver, _ := userID.Parse()
  26. _, hasSecret := config.Bridge.LoginSharedSecretMap[homeserver]
  27. return hasSecret
  28. }
  29. func (b *bridge) validate() error {
  30. var err error
  31. if b.UsernameTemplate == "" {
  32. b.UsernameTemplate = "discord_{{.}}"
  33. }
  34. b.usernameTemplate, err = template.New("username").Parse(b.UsernameTemplate)
  35. if err != nil {
  36. return err
  37. }
  38. if b.DisplaynameTemplate == "" {
  39. b.DisplaynameTemplate = "{{.Username}}#{{.Discriminator}} (D){{if .Bot}} (bot){{end}}"
  40. }
  41. b.displaynameTemplate, err = template.New("displayname").Parse(b.DisplaynameTemplate)
  42. if err != nil {
  43. return err
  44. }
  45. if b.PortalMessageBuffer <= 0 {
  46. b.PortalMessageBuffer = 128
  47. }
  48. if b.CommandPrefix == "" {
  49. b.CommandPrefix = "!dis"
  50. }
  51. if err := b.ManagementRoomText.validate(); err != nil {
  52. return err
  53. }
  54. return nil
  55. }
  56. func (b *bridge) UnmarshalYAML(unmarshal func(interface{}) error) error {
  57. type rawBridge bridge
  58. // Set our defaults that aren't zero values.
  59. raw := rawBridge{
  60. SyncWithCustomPuppets: true,
  61. DefaultBridgeReceipts: true,
  62. DefaultBridgePresence: true,
  63. }
  64. err := unmarshal(&raw)
  65. if err != nil {
  66. return err
  67. }
  68. *b = bridge(raw)
  69. return b.validate()
  70. }
  71. func (b bridge) FormatUsername(userid string) string {
  72. var buffer strings.Builder
  73. b.usernameTemplate.Execute(&buffer, userid)
  74. return buffer.String()
  75. }
  76. type simplfiedUser struct {
  77. Username string
  78. Discriminator string
  79. Locale string
  80. Verified bool
  81. MFAEnabled bool
  82. Bot bool
  83. System bool
  84. }
  85. func (b bridge) FormatDisplayname(user *discordgo.User) string {
  86. var buffer strings.Builder
  87. b.displaynameTemplate.Execute(&buffer, simplfiedUser{
  88. Username: user.Username,
  89. Discriminator: user.Discriminator,
  90. Locale: user.Locale,
  91. Verified: user.Verified,
  92. MFAEnabled: user.MFAEnabled,
  93. Bot: user.Bot,
  94. System: user.System,
  95. })
  96. return buffer.String()
  97. }