Add support for edited messages from discord
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user