portal.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. package bridge
  2. import (
  3. "fmt"
  4. log "maunium.net/go/maulogger/v2"
  5. "maunium.net/go/mautrix/appservice"
  6. "maunium.net/go/mautrix/event"
  7. "maunium.net/go/mautrix/id"
  8. "gitlab.com/beeper/discord/database"
  9. )
  10. type PortalMatrixMessage struct {
  11. evt *event.Event
  12. user *User
  13. }
  14. type Portal struct {
  15. *database.Portal
  16. bridge *Bridge
  17. log log.Logger
  18. matrixMessages chan PortalMatrixMessage
  19. }
  20. func (b *Bridge) loadPortal(dbPortal *database.Portal, key *database.PortalKey) *Portal {
  21. // If we weren't given a portal we'll attempt to create it if a key was
  22. // provided.
  23. if dbPortal == nil {
  24. if key == nil {
  25. return nil
  26. }
  27. dbPortal = b.db.Portal.New()
  28. dbPortal.Key = *key
  29. dbPortal.Insert()
  30. }
  31. portal := b.NewPortal(dbPortal)
  32. // No need to lock, it is assumed that our callers have already acquired
  33. // the lock.
  34. b.portalsByID[portal.Key] = portal
  35. if portal.MXID != "" {
  36. b.portalsByMXID[portal.MXID] = portal
  37. }
  38. return portal
  39. }
  40. func (b *Bridge) GetPortalByMXID(mxid id.RoomID) *Portal {
  41. b.portalsLock.Lock()
  42. defer b.portalsLock.Unlock()
  43. portal, ok := b.portalsByMXID[mxid]
  44. if !ok {
  45. return b.loadPortal(b.db.Portal.GetByMXID(mxid), nil)
  46. }
  47. return portal
  48. }
  49. func (b *Bridge) NewPortal(dbPortal *database.Portal) *Portal {
  50. portal := &Portal{
  51. Portal: dbPortal,
  52. bridge: b,
  53. log: b.log.Sub(fmt.Sprintf("Portal/%s", dbPortal.Key)),
  54. matrixMessages: make(chan PortalMatrixMessage, b.config.Bridge.PortalMessageBuffer),
  55. }
  56. go portal.messageLoop()
  57. return portal
  58. }
  59. func (p *Portal) HandleMatrixInvite(sender *User, evt *event.Event) {
  60. // Look up an existing puppet or create a new one.
  61. puppet := p.bridge.GetPuppetByMXID(id.UserID(evt.GetStateKey()))
  62. if puppet != nil {
  63. p.log.Infoln("no puppet for %v", sender)
  64. // Open a conversation on the discord side?
  65. }
  66. p.log.Infoln("puppet:", puppet)
  67. }
  68. func (p *Portal) messageLoop() {
  69. for {
  70. select {
  71. case msg := <-p.matrixMessages:
  72. p.log.Infoln("got message", msg)
  73. }
  74. }
  75. }
  76. func (p *Portal) IsPrivateChat() bool {
  77. return false
  78. }
  79. func (p *Portal) MainIntent() *appservice.IntentAPI {
  80. if p.IsPrivateChat() {
  81. return p.bridge.GetPuppetByID(p.Key.ID).DefaultIntent()
  82. }
  83. return p.bridge.bot
  84. }