bridge.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package bridge
  2. import (
  3. "errors"
  4. "fmt"
  5. "time"
  6. log "maunium.net/go/maulogger/v2"
  7. "maunium.net/go/mautrix"
  8. "maunium.net/go/mautrix/appservice"
  9. "gitlab.com/beeper/discord/config"
  10. "gitlab.com/beeper/discord/version"
  11. )
  12. const (
  13. reconnectDelay = 10 * time.Second
  14. )
  15. type Bridge struct {
  16. config *config.Config
  17. log log.Logger
  18. as *appservice.AppService
  19. eventProcessor *appservice.EventProcessor
  20. matrixHandler *matrixHandler
  21. bot *appservice.IntentAPI
  22. }
  23. func New(cfg *config.Config) (*Bridge, error) {
  24. // Create the logger.
  25. logger, err := cfg.CreateLogger()
  26. if err != nil {
  27. return nil, err
  28. }
  29. logger.Infoln("Initializing version", version.String)
  30. // Create and initalize the app service.
  31. appservice, err := cfg.CreateAppService()
  32. if err != nil {
  33. return nil, err
  34. }
  35. appservice.Log = log.Sub("matrix")
  36. appservice.Init()
  37. // Create the bot.
  38. bot := appservice.BotIntent()
  39. // Create the bridge.
  40. bridge := &Bridge{
  41. as: appservice,
  42. bot: bot,
  43. config: cfg,
  44. log: logger,
  45. }
  46. // Setup the event processors
  47. bridge.setupEvents()
  48. return bridge, nil
  49. }
  50. func (b *Bridge) connect() error {
  51. b.log.Debugln("Checking connection to homeserver")
  52. for {
  53. resp, err := b.bot.Whoami()
  54. if err != nil {
  55. if errors.Is(err, mautrix.MUnknownToken) {
  56. b.log.Fatalln("Access token invalid. Is the registration installed in your homeserver correctly?")
  57. return fmt.Errorf("invalid access token")
  58. }
  59. b.log.Errorfln("Failed to connect to homeserver : %v", err)
  60. b.log.Errorfln("reconnecting in %s", reconnectDelay)
  61. time.Sleep(reconnectDelay)
  62. } else if resp.UserID != b.bot.UserID {
  63. b.log.Fatalln("Unexpected user ID in whoami call: got %s, expected %s", resp.UserID, b.bot.UserID)
  64. return fmt.Errorf("expected user id %q but got %q", b.bot.UserID, resp.UserID)
  65. } else {
  66. break
  67. }
  68. }
  69. b.log.Debugln("Connected to homeserver")
  70. return nil
  71. }
  72. func (b *Bridge) Start() error {
  73. b.log.Infoln("Bridge started")
  74. if err := b.connect(); err != nil {
  75. return err
  76. }
  77. b.log.Debugln("Starting application service HTTP server")
  78. go b.as.Start()
  79. b.log.Debugln("Starting event processor")
  80. go b.eventProcessor.Start()
  81. go b.updateBotProfile()
  82. // Finally tell the appservice we're ready
  83. b.as.Ready = true
  84. return nil
  85. }
  86. func (b *Bridge) Stop() {
  87. b.log.Infoln("Bridge stopped")
  88. }