matterbridge/bridge/config/config.go

219 lines
6.7 KiB
Go
Raw Normal View History

package config
2016-07-11 12:23:33 -07:00
import (
"github.com/BurntSushi/toml"
2016-07-11 12:23:33 -07:00
"log"
"os"
"reflect"
"strings"
2017-02-18 14:10:22 -08:00
"time"
2016-07-11 12:23:33 -07:00
)
const (
EVENT_JOIN_LEAVE = "join_leave"
EVENT_FAILURE = "failure"
EVENT_REJOIN_CHANNELS = "rejoin_channels"
)
type Message struct {
2017-06-05 14:18:13 -07:00
Text string `json:"text"`
Channel string `json:"channel"`
Username string `json:"username"`
UserID string `json:"userid"` // userid on the bridge
2017-06-05 14:18:13 -07: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-03-28 14:56:58 -07:00
type ChannelInfo struct {
Name string
Account string
Direction string
ID string
GID map[string]bool
SameChannel map[string]bool
Options ChannelOptions
2017-03-28 14:56:58 -07:00
}
type Protocol struct {
2017-06-21 16:02:05 -07:00
AuthCode string // steam
BindAddress string // mattermost, slack // DEPRECATED
2017-02-18 14:10:22 -08:00
Buffer int // api
EditSuffix string // mattermost, slack, discord, telegram, gitter
EditDisable bool // mattermost, slack, discord, telegram, gitter
IconURL string // mattermost, slack
IgnoreNicks string // all protocols
IgnoreMessages string // all protocols
Jid string // xmpp
Login string // mattermost, matrix
Muc string // xmpp
Name string // all protocols
Nick string // all protocols
NickFormatter string // mattermost, slack
NickServNick string // IRC
NickServPassword string // IRC
NicksPerRow int // mattermost, slack
NoHomeServerSuffix bool // matrix
NoTLS bool // mattermost
Password string // IRC,mattermost,XMPP,matrix
PrefixMessagesWithNick bool // mattemost, slack
Protocol string //all protocols
MessageQueue int // IRC, size of message queue for flood control
MessageDelay int // IRC, time in millisecond to wait between messages
MessageLength int // IRC, max length of a message allowed
MessageFormat string // telegram
RemoteNickFormat string // all protocols
2016-09-19 11:53:26 -07:00
Server string // IRC,mattermost,XMPP,discord
ShowJoinPart bool // all protocols
2017-06-24 14:17:57 -07:00
ShowEmbeds bool // discord
SkipTLSVerify bool // IRC, mattermost
Team string // mattermost
2017-06-05 15:05:32 -07:00
Token string // gitter, slack, discord, api
URL string // mattermost, slack // DEPRECATED
UseAPI bool // mattermost, slack
UseSASL bool // IRC
UseTLS bool // IRC
UseFirstName bool // telegram
WebhookBindAddress string // mattermost, slack
WebhookURL string // mattermost, slack
WebhookUse string // mattermost, slack, discord
}
type ChannelOptions struct {
Key string // irc
}
type Bridge struct {
Account string
Channel string
Options ChannelOptions
SameChannel bool
}
type Gateway struct {
Name string
Enable bool
In []Bridge
Out []Bridge
InOut []Bridge
}
2016-09-30 14:19:47 -07:00
type SameChannelGateway struct {
Name string
Enable bool
Channels []string
Accounts []string
}
2016-07-11 12:23:33 -07:00
type Config struct {
2017-02-18 14:10:22 -08:00
Api map[string]Protocol
2016-09-30 14:19:47 -07:00
IRC map[string]Protocol
Mattermost map[string]Protocol
2017-02-19 15:49:27 -08:00
Matrix map[string]Protocol
2016-09-30 14:19:47 -07:00
Slack map[string]Protocol
2017-06-21 16:02:05 -07:00
Steam map[string]Protocol
2016-09-30 14:19:47 -07:00
Gitter map[string]Protocol
Xmpp map[string]Protocol
Discord map[string]Protocol
2016-11-15 14:15:57 -08:00
Telegram map[string]Protocol
2016-12-02 15:10:29 -08:00
Rocketchat map[string]Protocol
General Protocol
2016-09-30 14:19:47 -07:00
Gateway []Gateway
SameChannelGateway []SameChannelGateway
2016-07-11 12:23:33 -07:00
}
func NewConfig(cfgfile string) *Config {
var cfg Config
2016-09-20 14:18:51 -07:00
if _, err := toml.DecodeFile(cfgfile, &cfg); err != nil {
2016-07-11 12:23:33 -07:00
log.Fatal(err)
}
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 12:23:33 -07:00
return &cfg
}
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
}
}
}
func GetIconURL(msg *Message, cfg *Protocol) string {
iconURL := cfg.IconURL
2016-11-13 14:06:37 -08:00
info := strings.Split(msg.Account, ".")
protocol := info[0]
name := info[1]
iconURL = strings.Replace(iconURL, "{NICK}", msg.Username, -1)
2016-11-13 14:06:37 -08:00
iconURL = strings.Replace(iconURL, "{BRIDGE}", name, -1)
iconURL = strings.Replace(iconURL, "{PROTOCOL}", protocol, -1)
return iconURL
}
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)
} else if cfg.UseAPI == true {
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)
}