mirror of
https://github.com/cwinfo/matterbridge.git
synced 2024-11-22 18:40:25 +00:00
When a webhook "edits" a message, it does this by deleting the message and creating a new one with the new content. On creation of this new message, we'll get another ID then already is know by the gateway in its id cache. So we add it in our own cache and replace it whenever we want to edit/delete it again.
This commit is contained in:
parent
06b7bad714
commit
eaf92fca4d
@ -34,6 +34,8 @@ type Bdiscord struct {
|
|||||||
membersMutex sync.RWMutex
|
membersMutex sync.RWMutex
|
||||||
userMemberMap map[string]*discordgo.Member
|
userMemberMap map[string]*discordgo.Member
|
||||||
nickMemberMap map[string]*discordgo.Member
|
nickMemberMap map[string]*discordgo.Member
|
||||||
|
webhookCache map[string]string
|
||||||
|
webhookMutex sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(cfg *bridge.Config) bridge.Bridger {
|
func New(cfg *bridge.Config) bridge.Bridger {
|
||||||
@ -41,6 +43,7 @@ func New(cfg *bridge.Config) bridge.Bridger {
|
|||||||
b.userMemberMap = make(map[string]*discordgo.Member)
|
b.userMemberMap = make(map[string]*discordgo.Member)
|
||||||
b.nickMemberMap = make(map[string]*discordgo.Member)
|
b.nickMemberMap = make(map[string]*discordgo.Member)
|
||||||
b.channelInfoMap = make(map[string]*config.ChannelInfo)
|
b.channelInfoMap = make(map[string]*config.ChannelInfo)
|
||||||
|
b.webhookCache = make(map[string]string)
|
||||||
if b.GetString("WebhookURL") != "" {
|
if b.GetString("WebhookURL") != "" {
|
||||||
b.Log.Debug("Configuring Discord Incoming Webhook")
|
b.Log.Debug("Configuring Discord Incoming Webhook")
|
||||||
b.webhookID, b.webhookToken = b.splitURL(b.GetString("WebhookURL"))
|
b.webhookID, b.webhookToken = b.splitURL(b.GetString("WebhookURL"))
|
||||||
@ -188,6 +191,8 @@ func (b *Bdiscord) JoinChannel(channel config.ChannelInfo) error {
|
|||||||
func (b *Bdiscord) Send(msg config.Message) (string, error) {
|
func (b *Bdiscord) Send(msg config.Message) (string, error) {
|
||||||
b.Log.Debugf("=> Receiving %#v", msg)
|
b.Log.Debugf("=> Receiving %#v", msg)
|
||||||
|
|
||||||
|
origMsgID := msg.ID
|
||||||
|
|
||||||
channelID := b.getChannelID(msg.Channel)
|
channelID := b.getChannelID(msg.Channel)
|
||||||
if channelID == "" {
|
if channelID == "" {
|
||||||
return "", fmt.Errorf("Could not find channelID for %v", msg.Channel)
|
return "", fmt.Errorf("Could not find channelID for %v", msg.Channel)
|
||||||
@ -230,6 +235,7 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
|
|||||||
|
|
||||||
// If we are editing a message, delete the old message
|
// If we are editing a message, delete the old message
|
||||||
if msg.ID != "" {
|
if msg.ID != "" {
|
||||||
|
msg.ID = b.getCacheID(msg.ID)
|
||||||
b.Log.Debugf("Deleting edited webhook message")
|
b.Log.Debugf("Deleting edited webhook message")
|
||||||
err := b.c.ChannelMessageDelete(channelID, msg.ID)
|
err := b.c.ChannelMessageDelete(channelID, msg.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -273,6 +279,8 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
|
|||||||
if msg == nil {
|
if msg == nil {
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
b.updateCacheID(origMsgID, msg.ID)
|
||||||
return msg.ID, nil
|
return msg.ID, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -283,6 +291,7 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {
|
|||||||
if msg.ID == "" {
|
if msg.ID == "" {
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
msg.ID = b.getCacheID(msg.ID)
|
||||||
err := b.c.ChannelMessageDelete(channelID, msg.ID)
|
err := b.c.ChannelMessageDelete(channelID, msg.ID)
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
@ -208,6 +208,40 @@ func (b *Bdiscord) splitURL(url string) (string, string) {
|
|||||||
return webhookURLSplit[webhookIdxID], webhookURLSplit[webhookIdxToken]
|
return webhookURLSplit[webhookIdxID], webhookURLSplit[webhookIdxToken]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getcacheID tries to find a corresponding msgID in the webhook cache.
|
||||||
|
// if not found returns the original request.
|
||||||
|
func (b *Bdiscord) getCacheID(msgID string) string {
|
||||||
|
b.webhookMutex.RLock()
|
||||||
|
defer b.webhookMutex.RUnlock()
|
||||||
|
for k, v := range b.webhookCache {
|
||||||
|
if msgID == k {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return msgID
|
||||||
|
}
|
||||||
|
|
||||||
|
// updateCacheID updates the cache so that the newID takes the place of
|
||||||
|
// the original ID. This is used for edit/deletes in combination with webhooks
|
||||||
|
// as editing a message via webhook means deleting the message and creating a
|
||||||
|
// new message (with a new ID). This ID needs to be set instead of the original ID
|
||||||
|
func (b *Bdiscord) updateCacheID(origID, newID string) {
|
||||||
|
b.webhookMutex.Lock()
|
||||||
|
match := false
|
||||||
|
for k, v := range b.webhookCache {
|
||||||
|
if v == origID {
|
||||||
|
delete(b.webhookCache, k)
|
||||||
|
b.webhookCache[origID] = newID
|
||||||
|
match = true
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !match && origID != "" {
|
||||||
|
b.webhookCache[origID] = newID
|
||||||
|
}
|
||||||
|
b.webhookMutex.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
func enumerateUsernames(s string) []string {
|
func enumerateUsernames(s string) []string {
|
||||||
onlySpace := true
|
onlySpace := true
|
||||||
for _, r := range s {
|
for _, r := range s {
|
||||||
|
Loading…
Reference in New Issue
Block a user