Add support for edited messages from discord

This commit is contained in:
Gary Kramlich
2022-02-11 02:43:54 -06:00
parent 11bd655027
commit c2e1c35dca
3 changed files with 62 additions and 2 deletions

View File

@@ -270,6 +270,8 @@ func (p *Portal) handleDiscordMessages(msg portalDiscordMessage) {
switch msg.msg.(type) { switch msg.msg.(type) {
case *discordgo.MessageCreate: case *discordgo.MessageCreate:
p.handleDiscordMessageCreate(msg.user, msg.msg.(*discordgo.MessageCreate).Message) p.handleDiscordMessageCreate(msg.user, msg.msg.(*discordgo.MessageCreate).Message)
case *discordgo.MessageUpdate:
p.handleDiscordMessagesUpdate(msg.user, msg.msg.(*discordgo.MessageUpdate).Message)
case *discordgo.MessageDelete: case *discordgo.MessageDelete:
p.handleDiscordMessageDelete(msg.user, msg.msg.(*discordgo.MessageDelete).Message) p.handleDiscordMessageDelete(msg.user, msg.msg.(*discordgo.MessageDelete).Message)
case *discordgo.MessageReactionAdd: case *discordgo.MessageReactionAdd:
@@ -329,11 +331,50 @@ func (p *Portal) handleDiscordMessageCreate(user *User, msg *discordgo.Message)
resp, err := intent.SendMessageEvent(p.MXID, event.EventMessage, content) resp, err := intent.SendMessageEvent(p.MXID, event.EventMessage, content)
if err != nil { if err != nil {
p.log.Warnfln("failed to send message %q to matrix: %v", msg.ID, err) p.log.Warnfln("failed to send message %q to matrix: %v", msg.ID, err)
return return
} }
ts, _ := msg.Timestamp.Parse() ts, _ := msg.Timestamp.Parse()
p.markMessageHandled(nil, msg.ID, resp.EventID, msg.Author.ID, ts) p.markMessageHandled(existing, msg.ID, resp.EventID, msg.Author.ID, ts)
}
func (p *Portal) handleDiscordMessagesUpdate(user *User, msg *discordgo.Message) {
if user.ID == msg.Author.ID {
return
}
if p.MXID == "" {
p.log.Warnln("handle message called without a valid portal")
return
}
existing := p.bridge.db.Message.GetByDiscordID(p.Key, msg.ID)
if existing == nil {
p.log.Debugln("failed to find previous message to update", msg.ID)
}
content := &event.MessageEventContent{
Body: msg.Content,
MsgType: event.MsgText,
}
content.SetEdit(existing.MatrixID)
intent := p.bridge.GetPuppetByID(msg.Author.ID).IntentFor(p)
_, err := intent.SendMessageEvent(p.MXID, event.EventMessage, content)
if err != nil {
p.log.Warnfln("failed to send message %q to matrix: %v", msg.ID, err)
return
}
// It appears that matrix updates only work against the original event id
// so updating it to the new one from an edit makes it so you can't update
// it anyways. So we just don't update anything and we can keep updating
// the message.
} }
func (p *Portal) handleDiscordMessageDelete(user *User, msg *discordgo.Message) { func (p *Portal) handleDiscordMessageDelete(user *User, msg *discordgo.Message) {

View File

@@ -214,6 +214,7 @@ func (u *User) Connect() error {
u.User.Session.AddHandler(u.messageCreateHandler) u.User.Session.AddHandler(u.messageCreateHandler)
u.User.Session.AddHandler(u.messageDeleteHandler) u.User.Session.AddHandler(u.messageDeleteHandler)
u.User.Session.AddHandler(u.messageUpdateHandler)
u.User.Session.AddHandler(u.reactionAddHandler) u.User.Session.AddHandler(u.reactionAddHandler)
u.User.Session.AddHandler(u.reactionRemoveHandler) u.User.Session.AddHandler(u.reactionRemoveHandler)
@@ -321,6 +322,24 @@ func (u *User) messageDeleteHandler(s *discordgo.Session, m *discordgo.MessageDe
portal.discordMessages <- msg portal.discordMessages <- msg
} }
func (u *User) messageUpdateHandler(s *discordgo.Session, m *discordgo.MessageUpdate) {
if m.GuildID != "" {
u.log.Debugln("ignoring message update for guild message")
return
}
key := database.NewPortalKey(m.ChannelID, u.ID)
portal := u.bridge.GetPortalByID(key)
msg := portalDiscordMessage{
msg: m,
user: u,
}
portal.discordMessages <- msg
}
func (u *User) reactionAddHandler(s *discordgo.Session, m *discordgo.MessageReactionAdd) { func (u *User) reactionAddHandler(s *discordgo.Session, m *discordgo.MessageReactionAdd) {
if m.GuildID != "" { if m.GuildID != "" {
u.log.Debugln("ignoring reaction for guild message") u.log.Debugln("ignoring reaction for guild message")

View File

@@ -69,7 +69,7 @@ func (m *Message) Delete() {
func (m *Message) UpdateMatrixID(mxid id.EventID) { func (m *Message) UpdateMatrixID(mxid id.EventID) {
query := "UPDATE message SET matrix_message_id=$1 WHERE channel_id=$2" + query := "UPDATE message SET matrix_message_id=$1 WHERE channel_id=$2" +
"AND receiver=$3 AND discord_message_id=$4" " AND receiver=$3 AND discord_message_id=$4"
m.MatrixID = mxid m.MatrixID = mxid
_, err := m.db.Exec(query, m.MatrixID, m.Channel.ChannelID, m.Channel.Receiver, m.DiscordID) _, err := m.db.Exec(query, m.MatrixID, m.Channel.ChannelID, m.Channel.Receiver, m.DiscordID)