summaryrefslogtreecommitdiffstats
path: root/bridge/slack
diff options
context:
space:
mode:
authorWim <wim@42.be>2018-08-18 00:12:05 +0200
committerWim <wim@42.be>2018-08-18 00:12:05 +0200
commitb51fdbce9f26ea40274ee73bfcf6082896c9bacd (patch)
treed2c8daf02ea5c39c511b492b205d37af0ddc3545 /bridge/slack
parent351b423e156698e2bb66cd2168e40f9548bc1f93 (diff)
downloadmatterbridge-msglm-b51fdbce9f26ea40274ee73bfcf6082896c9bacd.tar.gz
matterbridge-msglm-b51fdbce9f26ea40274ee73bfcf6082896c9bacd.tar.bz2
matterbridge-msglm-b51fdbce9f26ea40274ee73bfcf6082896c9bacd.zip
Add caching to fix issue with slack API changes (slack). #481
Diffstat (limited to 'bridge/slack')
-rw-r--r--bridge/slack/slack.go39
1 files changed, 36 insertions, 3 deletions
diff --git a/bridge/slack/slack.go b/bridge/slack/slack.go
index 8d709d54..f77541c1 100644
--- a/bridge/slack/slack.go
+++ b/bridge/slack/slack.go
@@ -14,6 +14,7 @@ import (
"github.com/42wim/matterbridge/bridge/config"
"github.com/42wim/matterbridge/bridge/helper"
"github.com/42wim/matterbridge/matterhook"
+ "github.com/hashicorp/golang-lru"
"github.com/nlopes/slack"
"github.com/rs/xid"
)
@@ -26,6 +27,7 @@ type Bslack struct {
Usergroups []slack.UserGroup
si *slack.Info
channels []slack.Channel
+ cache *lru.Cache
UseChannelID bool
uuid string
*bridge.Config
@@ -35,7 +37,9 @@ type Bslack struct {
const messageDeleted = "message_deleted"
func New(cfg *bridge.Config) bridge.Bridger {
- return &Bslack{Config: cfg, uuid: xid.New().String()}
+ b := &Bslack{Config: cfg, uuid: xid.New().String()}
+ b.cache, _ = lru.New(5000)
+ return b
}
func (b *Bslack) Command(cmd string) string {
@@ -456,15 +460,26 @@ func (b *Bslack) handleDownloadFile(rmsg *config.Message, file *slack.File) erro
// handleUploadFile handles native upload of files
func (b *Bslack) handleUploadFile(msg *config.Message, channelID string) (string, error) {
- var err error
for _, f := range msg.Extra["file"] {
fi := f.(config.FileInfo)
- _, err = b.sc.UploadFile(slack.FileUploadParameters{
+ if msg.Text == fi.Comment {
+ msg.Text = ""
+ }
+ /* because the result of the UploadFile is slower than the MessageEvent from slack
+ we can't match on the file ID yet, so we have to match on the filename too
+ */
+ b.Log.Debugf("Adding file %s to cache %s", fi.Name, time.Now().String())
+ b.cache.Add("filename"+fi.Name, time.Now())
+ res, err := b.sc.UploadFile(slack.FileUploadParameters{
Reader: bytes.NewReader(*fi.Data),
Filename: fi.Name,
Channels: []string{channelID},
InitialComment: fi.Comment,
})
+ if res.ID != "" {
+ b.Log.Debugf("Adding fileid %s to cache %s", res.ID, time.Now().String())
+ b.cache.Add("file"+res.ID, time.Now())
+ }
if err != nil {
b.Log.Errorf("uploadfile %#v", err)
}
@@ -694,6 +709,24 @@ func (b *Bslack) skipMessageEvent(ev *slack.MessageEvent) bool {
return true
}
}
+
+ if len(ev.Files) > 0 {
+ for _, f := range ev.Files {
+ // if the file is in the cache and isn't older then a minute, skip it
+ if ts, ok := b.cache.Get("file" + f.ID); ok && time.Since(ts.(time.Time)) < time.Minute {
+ b.Log.Debugf("Not downloading file id %s which we uploaded", f.ID)
+ return true
+ } else {
+ if ts, ok := b.cache.Get("filename" + f.Name); ok && time.Since(ts.(time.Time)) < time.Second*10 {
+ b.Log.Debugf("Not downloading file name %s which we uploaded", f.Name)
+ return true
+ } else {
+ b.Log.Debugf("Not skipping %s %s", f.Name, time.Now().String())
+ }
+ }
+ }
+ }
+
return false
}