Thumbnail

rani/matterbridge.git

Clone URL: https://git.buni.party/rani/matterbridge.git

commit 1d5a53d71c1128bb2d166775f72bafa884c44b40 Author: Jerry Heiselman <jheiselman@users.noreply.github.com> Date: Wed Sep 12 15:30:14 2018 +0000 Replace @... string with user mention if match found (discord) (#492). Closes #460 * Added check for @-mention pattern and replacing it with a user with a matching Nick on incoming messages diff --git a/bridge/discord/discord.go b/bridge/discord/discord.go index b424e4b..25a6a7a 100644 --- a/bridge/discord/discord.go +++ b/bridge/discord/discord.go @@ -26 +27 @@ package bdiscord    import (   "bytes" + "errors"   "fmt"   "regexp"   "strings" @@ -216 +227 @@ type Bdiscord struct {   Nick string   UseChannelID bool   userMemberMap map[string]*discordgo.Member + nickMemberMap map[string]*discordgo.Member   guildID string   webhookID string   webhookToken string @@ -326 +347 @@ type Bdiscord struct {  func New(cfg *bridge.Config) bridge.Bridger {   b := &Bdiscord{Config: cfg}   b.userMemberMap = make(map[string]*discordgo.Member) + b.nickMemberMap = make(map[string]*discordgo.Member)   b.channelInfoMap = make(map[string]*config.ChannelInfo)   if b.GetString("WebhookURL") != "" {   b.Log.Debug("Configuring Discord Incoming Webhook") @@ -1816 +1848 @@ func (b *Bdiscord) Send(msg config.Message) (string, error) {   }     msg.Text = helper.ClipMessage(msg.Text, MessageLength) + msg.Text = b.replaceUserMentions(msg.Text) +   // Edit message   if msg.ID != "" {   _, err := b.c.ChannelMessageEdit(channelID, msg.ID, msg.Username+msg.Text) @@ -2936 +2987 @@ func (b *Bdiscord) memberUpdate(s *discordgo.Session, m *discordgo.GuildMemberUp   b.Log.Debugf("%s: memberupdate: user %s (nick %s) changes nick to %s", b.Account, m.Member.User.Username, b.userMemberMap[m.Member.User.ID].Nick, m.Member.Nick)   }   b.userMemberMap[m.Member.User.ID] = m.Member + b.nickMemberMap[m.Member.Nick] = m.Member   b.Unlock()  }   @@ -3236 +32918 @@ func (b *Bdiscord) getNick(user *discordgo.User) string {   return user.Username  }   +func (b *Bdiscord) getGuildMemberByNick(nick string) (*discordgo.Member, error) { + b.Lock() + defer b.Unlock() + if _, ok := b.nickMemberMap[nick]; ok { + if b.nickMemberMap[nick] != nil { + return b.nickMemberMap[nick], nil + } + } + + return nil, errors.New("Couldn't find guild member with nick " + nick) // This will most likely get ignored by the caller +} +  func (b *Bdiscord) getChannelID(name string) string {   idcheck := strings.Split(name, "ID:")   if len(idcheck) > 1 { @@ -3646 +38234 @@ func (b *Bdiscord) replaceChannelMentions(text string) string {   return text  }   +func (b *Bdiscord) replaceUserMentions(text string) string { + re := regexp.MustCompile("@[^@]{1,32}") + text = re.ReplaceAllStringFunc(text, func(m string) string { + mention := strings.TrimSpace(m[1:]) + var member *discordgo.Member + var err error + for { + b.Log.Debugf("Testing mention: '%s'", mention) + member, err = b.getGuildMemberByNick(mention) + if err != nil { + lastSpace := strings.LastIndex(mention, " ") + if lastSpace == -1 { + break + } + mention = strings.TrimSpace(mention[0:lastSpace]) + } else { + break + } + } + if err != nil { + return m + } + return member.User.Mention() + }) + b.Log.Debugf("Message with mention replaced: %s", text) + return text +} +  func (b *Bdiscord) replaceAction(text string) (string, bool) {   if strings.HasPrefix(text, "_") && strings.HasSuffix(text, "_") {   return strings.Replace(text, "_", "", -1), true