summaryrefslogtreecommitdiffstats
path: root/bridge/slack
diff options
context:
space:
mode:
Diffstat (limited to 'bridge/slack')
-rw-r--r--bridge/slack/slack.go89
1 files changed, 48 insertions, 41 deletions
diff --git a/bridge/slack/slack.go b/bridge/slack/slack.go
index 0d482a3a..c7c2fac8 100644
--- a/bridge/slack/slack.go
+++ b/bridge/slack/slack.go
@@ -12,6 +12,7 @@ import (
"html"
"regexp"
"strings"
+ "sync"
"time"
)
@@ -23,13 +24,14 @@ type Bslack struct {
Usergroups []slack.UserGroup
si *slack.Info
channels []slack.Channel
- *config.BridgeConfig
+ *bridge.Config
+ sync.RWMutex
}
const messageDeleted = "message_deleted"
-func New(cfg *config.BridgeConfig) bridge.Bridger {
- return &Bslack{BridgeConfig: cfg}
+func New(cfg *bridge.Config) bridge.Bridger {
+ return &Bslack{Config: cfg}
}
func (b *Bslack) Command(cmd string) string {
@@ -37,64 +39,65 @@ func (b *Bslack) Command(cmd string) string {
}
func (b *Bslack) Connect() error {
- if b.Config.WebhookBindAddress != "" {
- if b.Config.WebhookURL != "" {
+ b.RLock()
+ defer b.RUnlock()
+ if b.GetString("WebhookBindAddress") != "" {
+ if b.GetString("WebhookURL") != "" {
b.Log.Info("Connecting using webhookurl (sending) and webhookbindaddress (receiving)")
- b.mh = matterhook.New(b.Config.WebhookURL,
- matterhook.Config{InsecureSkipVerify: b.Config.SkipTLSVerify,
- BindAddress: b.Config.WebhookBindAddress})
- } else if b.Config.Token != "" {
+ b.mh = matterhook.New(b.GetString("WebhookURL"),
+ matterhook.Config{InsecureSkipVerify: b.GetBool("SkipTLSVerify"),
+ BindAddress: b.GetString("WebhookBindAddress")})
+ } else if b.GetString("Token") != "" {
b.Log.Info("Connecting using token (sending)")
- b.sc = slack.New(b.Config.Token)
+ b.sc = slack.New(b.GetString("Token"))
b.rtm = b.sc.NewRTM()
go b.rtm.ManageConnection()
b.Log.Info("Connecting using webhookbindaddress (receiving)")
- b.mh = matterhook.New(b.Config.WebhookURL,
- matterhook.Config{InsecureSkipVerify: b.Config.SkipTLSVerify,
- BindAddress: b.Config.WebhookBindAddress})
+ b.mh = matterhook.New(b.GetString("WebhookURL"),
+ matterhook.Config{InsecureSkipVerify: b.GetBool("SkipTLSVerify"),
+ BindAddress: b.GetString("WebhookBindAddress")})
} else {
b.Log.Info("Connecting using webhookbindaddress (receiving)")
- b.mh = matterhook.New(b.Config.WebhookURL,
- matterhook.Config{InsecureSkipVerify: b.Config.SkipTLSVerify,
- BindAddress: b.Config.WebhookBindAddress})
+ b.mh = matterhook.New(b.GetString("WebhookURL"),
+ matterhook.Config{InsecureSkipVerify: b.GetBool("SkipTLSVerify"),
+ BindAddress: b.GetString("WebhookBindAddress")})
}
go b.handleSlack()
return nil
}
- if b.Config.WebhookURL != "" {
+ if b.GetString("WebhookURL") != "" {
b.Log.Info("Connecting using webhookurl (sending)")
- b.mh = matterhook.New(b.Config.WebhookURL,
- matterhook.Config{InsecureSkipVerify: b.Config.SkipTLSVerify,
+ b.mh = matterhook.New(b.GetString("WebhookURL"),
+ matterhook.Config{InsecureSkipVerify: b.GetBool("SkipTLSVerify"),
DisableServer: true})
- if b.Config.Token != "" {
+ if b.GetString("Token") != "" {
b.Log.Info("Connecting using token (receiving)")
- b.sc = slack.New(b.Config.Token)
+ b.sc = slack.New(b.GetString("Token"))
b.rtm = b.sc.NewRTM()
go b.rtm.ManageConnection()
go b.handleSlack()
}
- } else if b.Config.Token != "" {
+ } else if b.GetString("Token") != "" {
b.Log.Info("Connecting using token (sending and receiving)")
- b.sc = slack.New(b.Config.Token)
+ b.sc = slack.New(b.GetString("Token"))
b.rtm = b.sc.NewRTM()
go b.rtm.ManageConnection()
go b.handleSlack()
}
- if b.Config.WebhookBindAddress == "" && b.Config.WebhookURL == "" && b.Config.Token == "" {
+ if b.GetString("WebhookBindAddress") == "" && b.GetString("WebhookURL") == "" && b.GetString("Token") == "" {
return errors.New("no connection method found. See that you have WebhookBindAddress, WebhookURL or Token configured")
}
return nil
}
func (b *Bslack) Disconnect() error {
- return nil
-
+ return b.rtm.Disconnect()
}
func (b *Bslack) JoinChannel(channel config.ChannelInfo) error {
// we can only join channels using the API
if b.sc != nil {
- if strings.HasPrefix(b.Config.Token, "xoxb") {
+ if strings.HasPrefix(b.GetString("Token"), "xoxb") {
// TODO check if bot has already joined channel
return nil
}
@@ -117,7 +120,7 @@ func (b *Bslack) Send(msg config.Message) (string, error) {
}
// Use webhook to send the message
- if b.Config.WebhookURL != "" {
+ if b.GetString("WebhookURL") != "" {
return b.sendWebhook(msg)
}
@@ -143,7 +146,7 @@ func (b *Bslack) Send(msg config.Message) (string, error) {
}
// Prepend nick if configured
- if b.Config.PrefixMessagesWithNick {
+ if b.GetBool("PrefixMessagesWithNick") {
msg.Text = msg.Username + msg.Text
}
@@ -159,12 +162,12 @@ func (b *Bslack) Send(msg config.Message) (string, error) {
// create slack new post parameters
np := slack.NewPostMessageParameters()
- if b.Config.PrefixMessagesWithNick {
+ if b.GetBool("PrefixMessagesWithNick") {
np.AsUser = true
}
np.Username = msg.Username
np.LinkNames = 1 // replace mentions
- np.IconURL = config.GetIconURL(&msg, &b.Config)
+ np.IconURL = config.GetIconURL(&msg, b.GetString("iconurl"))
if msg.Avatar != "" {
np.IconURL = msg.Avatar
}
@@ -198,6 +201,10 @@ func (b *Bslack) Send(msg config.Message) (string, error) {
return "slack " + id, nil
}
+func (b *Bslack) Reload(cfg *bridge.Config) (string, error) {
+ return "", nil
+}
+
func (b *Bslack) getAvatar(user string) string {
var avatar string
if b.Users != nil {
@@ -236,7 +243,7 @@ func (b *Bslack) getChannelByID(ID string) (*slack.Channel, error) {
func (b *Bslack) handleSlack() {
messages := make(chan *config.Message)
- if b.Config.WebhookBindAddress != "" {
+ if b.GetString("WebhookBindAddress") != "" {
b.Log.Debugf("Choosing webhooks based receiving")
go b.handleMatterHook(messages)
} else {
@@ -419,7 +426,7 @@ func (b *Bslack) handleDownloadFile(rmsg *config.Message, file *slack.File) erro
return err
}
// actually download the file
- data, err := helper.DownloadFileAuth(file.URLPrivateDownload, "Bearer "+b.Config.Token)
+ data, err := helper.DownloadFileAuth(file.URLPrivateDownload, "Bearer "+b.GetString("Token"))
if err != nil {
return fmt.Errorf("download %s failed %#v", file.URLPrivateDownload, err)
}
@@ -454,10 +461,10 @@ func (b *Bslack) handleMessageEvent(ev *slack.MessageEvent) (*config.Message, er
}
// Edit message
- if !b.Config.EditDisable && ev.SubMessage != nil && ev.SubMessage.ThreadTimestamp != ev.SubMessage.Timestamp {
+ if !b.GetBool("EditDisable") && ev.SubMessage != nil && ev.SubMessage.ThreadTimestamp != ev.SubMessage.Timestamp {
b.Log.Debugf("SubMessage %#v", ev.SubMessage)
ev.User = ev.SubMessage.User
- ev.Text = ev.SubMessage.Text + b.Config.EditSuffix
+ ev.Text = ev.SubMessage.Text + b.GetString("EditSuffix")
}
// use our own func because rtm.GetChannelInfo doesn't work for private channels
@@ -493,7 +500,7 @@ func (b *Bslack) handleMessageEvent(ev *slack.MessageEvent) (*config.Message, er
}
// when using webhookURL we can't check if it's our webhook or not for now
- if ev.BotID != "" && b.Config.WebhookURL == "" {
+ if ev.BotID != "" && b.GetString("WebhookURL") == "" {
bot, err := b.rtm.GetBotInfo(ev.BotID)
if err != nil {
return nil, err
@@ -568,14 +575,14 @@ func (b *Bslack) sendWebhook(msg config.Message) (string, error) {
return "", nil
}
- if b.Config.PrefixMessagesWithNick {
+ if b.GetBool("PrefixMessagesWithNick") {
msg.Text = msg.Username + msg.Text
}
if msg.Extra != nil {
// this sends a message only if we received a config.EVENT_FILE_FAILURE_SIZE
for _, rmsg := range helper.HandleExtra(&msg, b.General) {
- matterMessage := matterhook.OMessage{IconURL: b.Config.IconURL, Channel: msg.Channel, UserName: rmsg.Username, Text: rmsg.Text}
+ matterMessage := matterhook.OMessage{IconURL: b.GetString("IconURL"), Channel: msg.Channel, UserName: rmsg.Username, Text: rmsg.Text}
b.mh.Send(matterMessage)
}
@@ -598,7 +605,7 @@ func (b *Bslack) sendWebhook(msg config.Message) (string, error) {
}
}
- matterMessage := matterhook.OMessage{IconURL: b.Config.IconURL, Attachments: attachs, Channel: msg.Channel, UserName: msg.Username, Text: msg.Text}
+ matterMessage := matterhook.OMessage{IconURL: b.GetString("IconURL"), Attachments: attachs, Channel: msg.Channel, UserName: msg.Username, Text: msg.Text}
if msg.Avatar != "" {
matterMessage.IconURL = msg.Avatar
}
@@ -618,7 +625,7 @@ func (b *Bslack) skipMessageEvent(ev *slack.MessageEvent) bool {
}
// do not send messages from ourself
- if b.Config.WebhookURL == "" && b.Config.WebhookBindAddress == "" && ev.Username == b.si.User.Name {
+ if b.GetString("WebhookURL") == "" && b.GetString("WebhookBindAddress") == "" && ev.Username == b.si.User.Name {
return true
}
@@ -629,7 +636,7 @@ func (b *Bslack) skipMessageEvent(ev *slack.MessageEvent) bool {
}
}
- if !b.Config.EditDisable && ev.SubMessage != nil && ev.SubMessage.ThreadTimestamp != ev.SubMessage.Timestamp {
+ if !b.GetBool("EditDisable") && ev.SubMessage != nil && ev.SubMessage.ThreadTimestamp != ev.SubMessage.Timestamp {
// it seems ev.SubMessage.Edited == nil when slack unfurls
// do not forward these messages #266
if ev.SubMessage.Edited == nil {