2016-08-14 19:48:51 +00:00
|
|
|
package config
|
2016-07-11 19:23:33 +00:00
|
|
|
|
|
|
|
import (
|
2016-09-18 17:21:15 +00:00
|
|
|
"github.com/BurntSushi/toml"
|
2016-07-11 19:23:33 +00:00
|
|
|
"log"
|
2016-10-30 21:32:29 +00:00
|
|
|
"os"
|
|
|
|
"reflect"
|
|
|
|
"strings"
|
2017-02-18 22:10:22 +00:00
|
|
|
"time"
|
2016-07-11 19:23:33 +00:00
|
|
|
)
|
|
|
|
|
2016-11-14 21:53:06 +00:00
|
|
|
const (
|
2017-04-07 22:42:37 +00:00
|
|
|
EVENT_JOIN_LEAVE = "join_leave"
|
|
|
|
EVENT_FAILURE = "failure"
|
|
|
|
EVENT_REJOIN_CHANNELS = "rejoin_channels"
|
2017-07-30 15:48:23 +00:00
|
|
|
EVENT_USER_ACTION = "user_action"
|
2017-09-11 20:45:15 +00:00
|
|
|
EVENT_MSG_DELETE = "msg_delete"
|
2016-11-14 21:53:06 +00:00
|
|
|
)
|
|
|
|
|
2016-08-14 19:48:51 +00:00
|
|
|
type Message struct {
|
2017-06-05 21:18:13 +00:00
|
|
|
Text string `json:"text"`
|
|
|
|
Channel string `json:"channel"`
|
|
|
|
Username string `json:"username"`
|
2017-06-18 13:44:54 +00:00
|
|
|
UserID string `json:"userid"` // userid on the bridge
|
2017-06-05 21:18:13 +00:00
|
|
|
Avatar string `json:"avatar"`
|
|
|
|
Account string `json:"account"`
|
|
|
|
Event string `json:"event"`
|
|
|
|
Protocol string `json:"protocol"`
|
|
|
|
Gateway string `json:"gateway"`
|
|
|
|
Timestamp time.Time `json:"timestamp"`
|
2017-08-27 22:33:17 +00:00
|
|
|
ID string `json:"id"`
|
2017-09-21 20:35:21 +00:00
|
|
|
Extra map[string][]interface{}
|
|
|
|
}
|
|
|
|
|
|
|
|
type FileInfo struct {
|
2017-11-12 23:20:31 +00:00
|
|
|
Name string
|
|
|
|
Data *[]byte
|
|
|
|
Comment string
|
2016-09-18 17:21:15 +00:00
|
|
|
}
|
|
|
|
|
2017-03-28 21:56:58 +00:00
|
|
|
type ChannelInfo struct {
|
2017-04-01 15:24:19 +00:00
|
|
|
Name string
|
|
|
|
Account string
|
|
|
|
Direction string
|
|
|
|
ID string
|
|
|
|
SameChannel map[string]bool
|
|
|
|
Options ChannelOptions
|
2017-03-28 21:56:58 +00:00
|
|
|
}
|
|
|
|
|
2016-09-18 17:21:15 +00:00
|
|
|
type Protocol struct {
|
2017-06-21 23:02:05 +00:00
|
|
|
AuthCode string // steam
|
2017-06-24 17:36:10 +00:00
|
|
|
BindAddress string // mattermost, slack // DEPRECATED
|
2017-02-18 22:10:22 +00:00
|
|
|
Buffer int // api
|
2017-08-29 19:30:59 +00:00
|
|
|
Charset string // irc
|
2017-04-15 16:46:25 +00:00
|
|
|
EditSuffix string // mattermost, slack, discord, telegram, gitter
|
|
|
|
EditDisable bool // mattermost, slack, discord, telegram, gitter
|
2016-09-18 17:21:15 +00:00
|
|
|
IconURL string // mattermost, slack
|
|
|
|
IgnoreNicks string // all protocols
|
2017-06-17 23:08:11 +00:00
|
|
|
IgnoreMessages string // all protocols
|
2016-09-18 17:21:15 +00:00
|
|
|
Jid string // xmpp
|
2017-02-24 17:49:52 +00:00
|
|
|
Login string // mattermost, matrix
|
2016-09-18 17:21:15 +00:00
|
|
|
Muc string // xmpp
|
|
|
|
Name string // all protocols
|
|
|
|
Nick string // all protocols
|
|
|
|
NickFormatter string // mattermost, slack
|
|
|
|
NickServNick string // IRC
|
2017-09-20 20:47:26 +00:00
|
|
|
NickServUsername string // IRC
|
2016-09-18 17:21:15 +00:00
|
|
|
NickServPassword string // IRC
|
|
|
|
NicksPerRow int // mattermost, slack
|
2017-05-12 21:04:58 +00:00
|
|
|
NoHomeServerSuffix bool // matrix
|
2016-09-18 17:21:15 +00:00
|
|
|
NoTLS bool // mattermost
|
2017-02-24 17:49:52 +00:00
|
|
|
Password string // IRC,mattermost,XMPP,matrix
|
2016-09-18 17:21:15 +00:00
|
|
|
PrefixMessagesWithNick bool // mattemost, slack
|
|
|
|
Protocol string //all protocols
|
2016-11-01 21:52:28 +00:00
|
|
|
MessageQueue int // IRC, size of message queue for flood control
|
|
|
|
MessageDelay int // IRC, time in millisecond to wait between messages
|
2017-05-29 19:54:34 +00:00
|
|
|
MessageLength int // IRC, max length of a message allowed
|
2017-02-24 17:49:52 +00:00
|
|
|
MessageFormat string // telegram
|
2016-09-18 17:21:15 +00:00
|
|
|
RemoteNickFormat string // all protocols
|
2016-09-19 18:53:26 +00:00
|
|
|
Server string // IRC,mattermost,XMPP,discord
|
2016-09-18 17:21:15 +00:00
|
|
|
ShowJoinPart bool // all protocols
|
2017-06-24 21:17:57 +00:00
|
|
|
ShowEmbeds bool // discord
|
2016-09-18 17:21:15 +00:00
|
|
|
SkipTLSVerify bool // IRC, mattermost
|
2017-10-26 22:07:33 +00:00
|
|
|
StripNick bool // all protocols
|
2016-09-18 17:21:15 +00:00
|
|
|
Team string // mattermost
|
2017-06-05 22:05:32 +00:00
|
|
|
Token string // gitter, slack, discord, api
|
2017-06-24 17:36:10 +00:00
|
|
|
URL string // mattermost, slack // DEPRECATED
|
2016-09-18 17:21:15 +00:00
|
|
|
UseAPI bool // mattermost, slack
|
|
|
|
UseSASL bool // IRC
|
|
|
|
UseTLS bool // IRC
|
2017-05-15 21:23:10 +00:00
|
|
|
UseFirstName bool // telegram
|
2017-08-01 16:18:55 +00:00
|
|
|
UseUserName bool // discord
|
2017-07-03 23:34:02 +00:00
|
|
|
UseInsecureURL bool // telegram
|
2017-06-24 17:36:10 +00:00
|
|
|
WebhookBindAddress string // mattermost, slack
|
|
|
|
WebhookURL string // mattermost, slack
|
|
|
|
WebhookUse string // mattermost, slack, discord
|
2016-09-18 17:21:15 +00:00
|
|
|
}
|
|
|
|
|
2017-01-04 13:10:35 +00:00
|
|
|
type ChannelOptions struct {
|
2017-08-12 12:51:41 +00:00
|
|
|
Key string // irc
|
|
|
|
WebhookURL string // discord
|
2017-01-04 13:10:35 +00:00
|
|
|
}
|
|
|
|
|
2016-09-18 17:21:15 +00:00
|
|
|
type Bridge struct {
|
2017-04-01 15:24:19 +00:00
|
|
|
Account string
|
|
|
|
Channel string
|
|
|
|
Options ChannelOptions
|
|
|
|
SameChannel bool
|
2016-09-18 17:21:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type Gateway struct {
|
|
|
|
Name string
|
|
|
|
Enable bool
|
|
|
|
In []Bridge
|
|
|
|
Out []Bridge
|
2016-11-20 22:01:44 +00:00
|
|
|
InOut []Bridge
|
2016-08-14 19:48:51 +00:00
|
|
|
}
|
|
|
|
|
2016-09-30 21:19:47 +00:00
|
|
|
type SameChannelGateway struct {
|
|
|
|
Name string
|
|
|
|
Enable bool
|
|
|
|
Channels []string
|
|
|
|
Accounts []string
|
|
|
|
}
|
|
|
|
|
2016-07-11 19:23:33 +00:00
|
|
|
type Config struct {
|
2017-02-18 22:10:22 +00:00
|
|
|
Api map[string]Protocol
|
2016-09-30 21:19:47 +00:00
|
|
|
IRC map[string]Protocol
|
|
|
|
Mattermost map[string]Protocol
|
2017-02-19 23:49:27 +00:00
|
|
|
Matrix map[string]Protocol
|
2016-09-30 21:19:47 +00:00
|
|
|
Slack map[string]Protocol
|
2017-06-21 23:02:05 +00:00
|
|
|
Steam map[string]Protocol
|
2016-09-30 21:19:47 +00:00
|
|
|
Gitter map[string]Protocol
|
|
|
|
Xmpp map[string]Protocol
|
|
|
|
Discord map[string]Protocol
|
2016-11-15 22:15:57 +00:00
|
|
|
Telegram map[string]Protocol
|
2016-12-02 23:10:29 +00:00
|
|
|
Rocketchat map[string]Protocol
|
2016-11-20 22:33:41 +00:00
|
|
|
General Protocol
|
2016-09-30 21:19:47 +00:00
|
|
|
Gateway []Gateway
|
|
|
|
SameChannelGateway []SameChannelGateway
|
2016-07-11 19:23:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func NewConfig(cfgfile string) *Config {
|
|
|
|
var cfg Config
|
2016-09-20 21:18:51 +00:00
|
|
|
if _, err := toml.DecodeFile(cfgfile, &cfg); err != nil {
|
2016-07-11 19:23:33 +00:00
|
|
|
log.Fatal(err)
|
|
|
|
}
|
2017-06-24 17:36:10 +00:00
|
|
|
fail := false
|
|
|
|
for k, v := range cfg.Mattermost {
|
|
|
|
res := Deprecated(v, "mattermost."+k)
|
|
|
|
if res {
|
|
|
|
fail = res
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for k, v := range cfg.Slack {
|
|
|
|
res := Deprecated(v, "slack."+k)
|
|
|
|
if res {
|
|
|
|
fail = res
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for k, v := range cfg.Rocketchat {
|
|
|
|
res := Deprecated(v, "rocketchat."+k)
|
|
|
|
if res {
|
|
|
|
fail = res
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if fail {
|
|
|
|
log.Fatalf("Fix your config. Please see changelog for more information")
|
|
|
|
}
|
2016-07-11 19:23:33 +00:00
|
|
|
return &cfg
|
|
|
|
}
|
2016-10-30 21:32:29 +00:00
|
|
|
|
|
|
|
func OverrideCfgFromEnv(cfg *Config, protocol string, account string) {
|
|
|
|
var protoCfg Protocol
|
|
|
|
val := reflect.ValueOf(cfg).Elem()
|
|
|
|
// loop over the Config struct
|
|
|
|
for i := 0; i < val.NumField(); i++ {
|
|
|
|
typeField := val.Type().Field(i)
|
|
|
|
// look for the protocol map (both lowercase)
|
|
|
|
if strings.ToLower(typeField.Name) == protocol {
|
|
|
|
// get the Protocol struct from the map
|
|
|
|
data := val.Field(i).MapIndex(reflect.ValueOf(account))
|
|
|
|
protoCfg = data.Interface().(Protocol)
|
|
|
|
protoStruct := reflect.ValueOf(&protoCfg).Elem()
|
|
|
|
// loop over the found protocol struct
|
|
|
|
for i := 0; i < protoStruct.NumField(); i++ {
|
|
|
|
typeField := protoStruct.Type().Field(i)
|
|
|
|
// build our environment key (eg MATTERBRIDGE_MATTERMOST_WORK_LOGIN)
|
|
|
|
key := "matterbridge_" + protocol + "_" + account + "_" + typeField.Name
|
|
|
|
key = strings.ToUpper(key)
|
|
|
|
// search the environment
|
|
|
|
res := os.Getenv(key)
|
|
|
|
// if it exists and the current field is a string
|
|
|
|
// then update the current field
|
|
|
|
if res != "" {
|
|
|
|
fieldVal := protoStruct.Field(i)
|
|
|
|
if fieldVal.Kind() == reflect.String {
|
|
|
|
log.Printf("config: overriding %s from env with %s\n", key, res)
|
|
|
|
fieldVal.Set(reflect.ValueOf(res))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// update the map with the modified Protocol (cfg.Protocol[account] = Protocol)
|
|
|
|
val.Field(i).SetMapIndex(reflect.ValueOf(account), reflect.ValueOf(protoCfg))
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-11-05 00:11:28 +00:00
|
|
|
|
|
|
|
func GetIconURL(msg *Message, cfg *Protocol) string {
|
|
|
|
iconURL := cfg.IconURL
|
2016-11-13 22:06:37 +00:00
|
|
|
info := strings.Split(msg.Account, ".")
|
|
|
|
protocol := info[0]
|
|
|
|
name := info[1]
|
2016-11-05 00:11:28 +00:00
|
|
|
iconURL = strings.Replace(iconURL, "{NICK}", msg.Username, -1)
|
2016-11-13 22:06:37 +00:00
|
|
|
iconURL = strings.Replace(iconURL, "{BRIDGE}", name, -1)
|
|
|
|
iconURL = strings.Replace(iconURL, "{PROTOCOL}", protocol, -1)
|
2016-11-05 00:11:28 +00:00
|
|
|
return iconURL
|
|
|
|
}
|
2017-06-24 17:36:10 +00:00
|
|
|
|
|
|
|
func Deprecated(cfg Protocol, account string) bool {
|
|
|
|
if cfg.BindAddress != "" {
|
|
|
|
log.Printf("ERROR: %s BindAddress is deprecated, you need to change it to WebhookBindAddress.", account)
|
|
|
|
} else if cfg.URL != "" {
|
|
|
|
log.Printf("ERROR: %s URL is deprecated, you need to change it to WebhookURL.", account)
|
2017-07-13 22:35:01 +00:00
|
|
|
} else if cfg.UseAPI {
|
2017-06-24 17:36:10 +00:00
|
|
|
log.Printf("ERROR: %s UseAPI is deprecated, it's enabled by default, please remove it from your config file.", account)
|
|
|
|
} else {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
//log.Fatalf("ERROR: Fix your config: %s", account)
|
|
|
|
}
|