123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- package bridge
- import (
- "fmt"
- log "maunium.net/go/maulogger/v2"
- "maunium.net/go/mautrix/appservice"
- "maunium.net/go/mautrix/event"
- "maunium.net/go/mautrix/id"
- "gitlab.com/beeper/discord/database"
- )
- type PortalMatrixMessage struct {
- evt *event.Event
- user *User
- }
- type Portal struct {
- *database.Portal
- bridge *Bridge
- log log.Logger
- matrixMessages chan PortalMatrixMessage
- }
- func (b *Bridge) loadPortal(dbPortal *database.Portal, key *database.PortalKey) *Portal {
- // If we weren't given a portal we'll attempt to create it if a key was
- // provided.
- if dbPortal == nil {
- if key == nil {
- return nil
- }
- dbPortal = b.db.Portal.New()
- dbPortal.Key = *key
- dbPortal.Insert()
- }
- portal := b.NewPortal(dbPortal)
- // No need to lock, it is assumed that our callers have already acquired
- // the lock.
- b.portalsByID[portal.Key] = portal
- if portal.MXID != "" {
- b.portalsByMXID[portal.MXID] = portal
- }
- return portal
- }
- func (b *Bridge) GetPortalByMXID(mxid id.RoomID) *Portal {
- b.portalsLock.Lock()
- defer b.portalsLock.Unlock()
- portal, ok := b.portalsByMXID[mxid]
- if !ok {
- return b.loadPortal(b.db.Portal.GetByMXID(mxid), nil)
- }
- return portal
- }
- func (b *Bridge) NewPortal(dbPortal *database.Portal) *Portal {
- portal := &Portal{
- Portal: dbPortal,
- bridge: b,
- log: b.log.Sub(fmt.Sprintf("Portal/%s", dbPortal.Key)),
- matrixMessages: make(chan PortalMatrixMessage, b.config.Bridge.PortalMessageBuffer),
- }
- go portal.messageLoop()
- return portal
- }
- func (p *Portal) HandleMatrixInvite(sender *User, evt *event.Event) {
- // Look up an existing puppet or create a new one.
- puppet := p.bridge.GetPuppetByMXID(id.UserID(evt.GetStateKey()))
- if puppet != nil {
- p.log.Infoln("no puppet for %v", sender)
- // Open a conversation on the discord side?
- }
- p.log.Infoln("puppet:", puppet)
- }
- func (p *Portal) messageLoop() {
- for {
- select {
- case msg := <-p.matrixMessages:
- p.log.Infoln("got message", msg)
- }
- }
- }
- func (p *Portal) IsPrivateChat() bool {
- return false
- }
- func (p *Portal) MainIntent() *appservice.IntentAPI {
- if p.IsPrivateChat() {
- return p.bridge.GetPuppetByID(p.Key.ID).DefaultIntent()
- }
- return p.bridge.bot
- }
|