Initial desegregation of users and automatic config updating
This commit is contained in:
@ -56,12 +56,7 @@ func (bc *BridgeConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
|
||||
return err
|
||||
}
|
||||
|
||||
type DisplaynameTemplateArgs struct {
|
||||
Displayname string
|
||||
}
|
||||
|
||||
type UsernameTemplateArgs struct {
|
||||
Receiver string
|
||||
UserID string
|
||||
}
|
||||
|
||||
@ -74,14 +69,9 @@ func (bc BridgeConfig) FormatDisplayname(contact whatsapp.Contact) string {
|
||||
return buf.String()
|
||||
}
|
||||
|
||||
func (bc BridgeConfig) FormatUsername(receiver types.MatrixUserID, userID types.WhatsAppID) string {
|
||||
func (bc BridgeConfig) FormatUsername(userID types.WhatsAppID) string {
|
||||
var buf bytes.Buffer
|
||||
receiver = strings.Replace(receiver, "@", "=40", 1)
|
||||
receiver = strings.Replace(receiver, ":", "=3", 1)
|
||||
bc.usernameTemplate.Execute(&buf, UsernameTemplateArgs{
|
||||
Receiver: receiver,
|
||||
UserID: userID,
|
||||
})
|
||||
bc.usernameTemplate.Execute(&buf, userID)
|
||||
return buf.String()
|
||||
}
|
||||
|
||||
@ -92,7 +82,7 @@ func (bc BridgeConfig) MarshalYAML() (interface{}, error) {
|
||||
Name: "{{.Name}}",
|
||||
Short: "{{.Short}}",
|
||||
})
|
||||
bc.UsernameTemplate = bc.FormatUsername("{{.Receiver}}", "{{.UserID}}")
|
||||
bc.UsernameTemplate = bc.FormatUsername("{{.}}")
|
||||
return bc, nil
|
||||
}
|
||||
|
||||
|
@ -78,7 +78,6 @@ func (config *Config) Save(path string) error {
|
||||
|
||||
func (config *Config) MakeAppService() (*appservice.AppService, error) {
|
||||
as := appservice.Create()
|
||||
as.LogConfig = config.Logging
|
||||
as.HomeserverDomain = config.Homeserver.Domain
|
||||
as.HomeserverURL = config.Homeserver.Address
|
||||
as.Host.Hostname = config.AppService.Hostname
|
||||
|
115
config/recursivemap.go
Normal file
115
config/recursivemap.go
Normal file
@ -0,0 +1,115 @@
|
||||
// mautrix-whatsapp - A Matrix-WhatsApp puppeting bridge.
|
||||
// Copyright (C) 2018 Tulir Asokan
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package config
|
||||
|
||||
import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
type RecursiveMap map[interface{}]interface{}
|
||||
|
||||
func (rm RecursiveMap) GetDefault(path string, defVal interface{}) interface{} {
|
||||
val, ok := rm.Get(path)
|
||||
if !ok {
|
||||
return defVal
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
func (rm RecursiveMap) GetMap(path string) RecursiveMap {
|
||||
val := rm.GetDefault(path, nil)
|
||||
if val == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
newRM, ok := val.(map[interface{}]interface{})
|
||||
if ok {
|
||||
return RecursiveMap(newRM)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (rm RecursiveMap) Get(path string) (interface{}, bool) {
|
||||
if index := strings.IndexRune(path, '.'); index >= 0 {
|
||||
key := path[:index]
|
||||
path = path[index+1:]
|
||||
|
||||
submap := rm.GetMap(key)
|
||||
if submap == nil {
|
||||
return nil, false
|
||||
}
|
||||
return submap.Get(path)
|
||||
}
|
||||
val, ok := rm[path]
|
||||
return val, ok
|
||||
}
|
||||
|
||||
func (rm RecursiveMap) GetIntDefault(path string, defVal int) int {
|
||||
val, ok := rm.GetInt(path)
|
||||
if !ok {
|
||||
return defVal
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
func (rm RecursiveMap) GetInt(path string) (int, bool) {
|
||||
val, ok := rm.Get(path)
|
||||
if !ok {
|
||||
return 0, ok
|
||||
}
|
||||
intVal, ok := val.(int)
|
||||
return intVal, ok
|
||||
}
|
||||
|
||||
func (rm RecursiveMap) GetStringDefault(path string, defVal string) string {
|
||||
val, ok := rm.GetString(path)
|
||||
if !ok {
|
||||
return defVal
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
func (rm RecursiveMap) GetString(path string) (string, bool) {
|
||||
val, ok := rm.Get(path)
|
||||
if !ok {
|
||||
return "", ok
|
||||
}
|
||||
strVal, ok := val.(string)
|
||||
return strVal, ok
|
||||
}
|
||||
|
||||
func (rm RecursiveMap) Set(path string, value interface{}) {
|
||||
if index := strings.IndexRune(path, '.'); index >= 0 {
|
||||
key := path[:index]
|
||||
path = path[index+1:]
|
||||
nextRM := rm.GetMap(key)
|
||||
if nextRM == nil {
|
||||
nextRM = make(RecursiveMap)
|
||||
rm[key] = nextRM
|
||||
}
|
||||
nextRM.Set(path, value)
|
||||
return
|
||||
}
|
||||
rm[path] = value
|
||||
}
|
||||
|
||||
func (rm RecursiveMap) CopyFrom(otherRM RecursiveMap, path string) {
|
||||
val, ok := otherRM.Get(path)
|
||||
if ok {
|
||||
rm.Set(path, val)
|
||||
}
|
||||
}
|
@ -56,7 +56,7 @@ func (config *Config) copyToRegistration(registration *appservice.Registration)
|
||||
registration.SenderLocalpart = config.AppService.Bot.Username
|
||||
|
||||
userIDRegex, err := regexp.Compile(fmt.Sprintf("^@%s:%s$",
|
||||
config.Bridge.FormatUsername(".+", "[0-9]+"),
|
||||
config.Bridge.FormatUsername("[0-9]+"),
|
||||
config.Homeserver.Domain))
|
||||
if err != nil {
|
||||
return err
|
||||
|
100
config/update.go
Normal file
100
config/update.go
Normal file
@ -0,0 +1,100 @@
|
||||
// mautrix-whatsapp - A Matrix-WhatsApp puppeting bridge.
|
||||
// Copyright (C) 2018 Tulir Asokan
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU Affero General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU Affero General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU Affero General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package config
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
func Update(path, basePath string) error {
|
||||
oldCfgData, err := ioutil.ReadFile(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
oldCfg := make(RecursiveMap)
|
||||
err = yaml.Unmarshal(oldCfgData, &oldCfg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
baseCfgData, err := ioutil.ReadFile(basePath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
baseCfg := make(RecursiveMap)
|
||||
err = yaml.Unmarshal(baseCfgData, &baseCfg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = runUpdate(oldCfg, baseCfg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
newCfgData, err := yaml.Marshal(&baseCfg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return ioutil.WriteFile(path, newCfgData, 0600)
|
||||
}
|
||||
|
||||
func runUpdate(oldCfg, newCfg RecursiveMap) error {
|
||||
cp := func(path string) {
|
||||
newCfg.CopyFrom(oldCfg, path)
|
||||
}
|
||||
|
||||
cp("homeserver.address")
|
||||
cp("homeserver.domain")
|
||||
|
||||
cp("appservice.address")
|
||||
cp("appservice.hostname")
|
||||
cp("appservice.port")
|
||||
|
||||
cp("appservice.database.type")
|
||||
cp("appservice.database.uri")
|
||||
cp("appservice.state_store_path")
|
||||
|
||||
cp("appservice.id")
|
||||
cp("appservice.bot.username")
|
||||
cp("appservice.bot.displayname")
|
||||
cp("appservice.bot.avatar")
|
||||
|
||||
cp("appservice.bot.as_token")
|
||||
cp("appservice.bot.hs_token")
|
||||
|
||||
cp("bridge.username_template")
|
||||
cp("bridge.displayname_template")
|
||||
|
||||
cp("bridge.command_prefix")
|
||||
|
||||
cp("bridge.permissions")
|
||||
|
||||
cp("logging.directory")
|
||||
cp("logging.file_name_format")
|
||||
cp("logging.file_date_format")
|
||||
cp("logging.file_mode")
|
||||
cp("logging.timestamp_format")
|
||||
cp("logging.print_level")
|
||||
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user