handlematrix: bridge outgoing typing events
This commit is contained in:
@@ -23,6 +23,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"slices"
|
"slices"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/bwmarrin/discordgo"
|
"github.com/bwmarrin/discordgo"
|
||||||
@@ -40,7 +41,11 @@ type DiscordClient struct {
|
|||||||
usersFromReady map[string]*discordgo.User
|
usersFromReady map[string]*discordgo.User
|
||||||
UserLogin *bridgev2.UserLogin
|
UserLogin *bridgev2.UserLogin
|
||||||
Session *discordgo.Session
|
Session *discordgo.Session
|
||||||
|
|
||||||
hasBegunSyncing bool
|
hasBegunSyncing bool
|
||||||
|
|
||||||
|
markedOpened map[string]time.Time
|
||||||
|
markedOpenedLock sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DiscordConnector) LoadUserLogin(ctx context.Context, login *bridgev2.UserLogin) error {
|
func (d *DiscordConnector) LoadUserLogin(ctx context.Context, login *bridgev2.UserLogin) error {
|
||||||
@@ -73,6 +78,7 @@ var _ bridgev2.NetworkAPI = (*DiscordClient)(nil)
|
|||||||
// nil may be passed for meta, especially during provisioning where we need to
|
// nil may be passed for meta, especially during provisioning where we need to
|
||||||
// connect to the Discord gateway, but don't have a UserLogin yet.
|
// connect to the Discord gateway, but don't have a UserLogin yet.
|
||||||
func (d *DiscordClient) SetUp(ctx context.Context, meta *UserLoginMetadata) {
|
func (d *DiscordClient) SetUp(ctx context.Context, meta *UserLoginMetadata) {
|
||||||
|
// TODO: Turn this into a factory function like `NewDiscordClient`.
|
||||||
log := zerolog.Ctx(ctx)
|
log := zerolog.Ctx(ctx)
|
||||||
|
|
||||||
// We'll have UserLogin metadata if this UserLogin is being loaded from the
|
// We'll have UserLogin metadata if this UserLogin is being loaded from the
|
||||||
@@ -85,6 +91,8 @@ func (d *DiscordClient) SetUp(ctx context.Context, meta *UserLoginMetadata) {
|
|||||||
meta.HeartbeatSession.BumpLastUsed()
|
meta.HeartbeatSession.BumpLastUsed()
|
||||||
d.Session.HeartbeatSession = meta.HeartbeatSession
|
d.Session.HeartbeatSession = meta.HeartbeatSession
|
||||||
}
|
}
|
||||||
|
|
||||||
|
d.markedOpened = make(map[string]time.Time)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DiscordClient) Connect(ctx context.Context) {
|
func (d *DiscordClient) Connect(ctx context.Context) {
|
||||||
|
|||||||
@@ -18,8 +18,10 @@ package connector
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/bwmarrin/discordgo"
|
"github.com/bwmarrin/discordgo"
|
||||||
|
"github.com/rs/zerolog"
|
||||||
"maunium.net/go/mautrix/bridgev2"
|
"maunium.net/go/mautrix/bridgev2"
|
||||||
"maunium.net/go/mautrix/bridgev2/database"
|
"maunium.net/go/mautrix/bridgev2/database"
|
||||||
"maunium.net/go/mautrix/bridgev2/networkid"
|
"maunium.net/go/mautrix/bridgev2/networkid"
|
||||||
@@ -147,7 +149,7 @@ func (d *DiscordClient) HandleMatrixReadReceipt(ctx context.Context, msg *bridge
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Support guilds.
|
// TODO: Support guilds and threads.
|
||||||
channelID := string(msg.Portal.ID)
|
channelID := string(msg.Portal.ID)
|
||||||
resp, err := d.Session.ChannelMessageAckNoToken(channelID, targetMessageID, discordgo.WithChannelReferer("", channelID))
|
resp, err := d.Session.ChannelMessageAckNoToken(channelID, targetMessageID, discordgo.WithChannelReferer("", channelID))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -164,7 +166,50 @@ func (d *DiscordClient) HandleMatrixReadReceipt(ctx context.Context, msg *bridge
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DiscordClient) HandleMatrixTyping(ctx context.Context, msg *bridgev2.MatrixTyping) error {
|
func (d *DiscordClient) viewingChannel(ctx context.Context, portal *bridgev2.Portal) error {
|
||||||
//TODO implement me
|
// TODO: When guilds are supported, explicitly bail out if this method is called with a guild channel.
|
||||||
panic("implement me")
|
d.markedOpenedLock.Lock()
|
||||||
|
defer d.markedOpenedLock.Unlock()
|
||||||
|
|
||||||
|
channelID := string(portal.ID)
|
||||||
|
log := zerolog.Ctx(ctx).With().
|
||||||
|
Str("channel_id", channelID).Logger()
|
||||||
|
|
||||||
|
lastMarkedOpenedTs := d.markedOpened[channelID]
|
||||||
|
if lastMarkedOpenedTs.IsZero() {
|
||||||
|
d.markedOpened[channelID] = time.Now()
|
||||||
|
|
||||||
|
err := d.Session.MarkViewing(channelID)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Error().Err(err).Msg("Failed to mark user as viewing channel")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Trace().Msg("Marked channel as being viewed")
|
||||||
|
} else {
|
||||||
|
log.Trace().Str("channel_id", channelID).
|
||||||
|
Msg("Already marked channel as viewed, not doing so")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *DiscordClient) HandleMatrixTyping(ctx context.Context, msg *bridgev2.MatrixTyping) error {
|
||||||
|
log := zerolog.Ctx(ctx)
|
||||||
|
|
||||||
|
// Don't mind if this fails.
|
||||||
|
_ = d.viewingChannel(ctx, msg.Portal)
|
||||||
|
|
||||||
|
channelID := string(msg.Portal.ID)
|
||||||
|
// TODO: Support guilds and threads properly when sending the referer.
|
||||||
|
err := d.Session.ChannelTyping(channelID, discordgo.WithChannelReferer("", channelID))
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Warn().Err(err).Msg("Failed to mark user as typing")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debug().Msg("Marked user as typing")
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user