package main import ( "os" "gopkg.in/yaml.v3" ) type HomeserverConfig struct { Domain string `yaml:"domain"` URL string `yaml:"url"` } type AppserviceConfig struct { ID string `yaml:"id"` ASToken string `yaml:"as_token"` HSToken string `yaml:"hs_token"` BotLocalpart string `yaml:"bot_localpart"` Address string `yaml:"address"` Port uint16 `yaml:"port"` } type BridgeConfig struct { NtfyURL string `yaml:"ntfy_url"` Permissions map[string]string `yaml:"permissions"` } type Config struct { Homeserver HomeserverConfig `yaml:"homeserver"` Appservice AppserviceConfig `yaml:"appservice"` Bridge BridgeConfig `yaml:"bridge"` } func LoadConfig(path string) (*Config, error) { data, err := os.ReadFile(path) if err != nil { return nil, err } cfg := &Config{} if err = yaml.Unmarshal(data, cfg); err != nil { return nil, err } if cfg.Bridge.Permissions == nil { cfg.Bridge.Permissions = make(map[string]string) } if cfg.Bridge.NtfyURL == "" { cfg.Bridge.NtfyURL = "https://ntfy.sh" } if cfg.Appservice.Address == "" { cfg.Appservice.Address = "0.0.0.0" } if cfg.Appservice.Port == 0 { cfg.Appservice.Port = 8080 } return cfg, nil } func (b *BridgeConfig) PermissionLevel(id string) string { if level, ok := b.Permissions[id]; ok { return level } return "" } func (b *BridgeConfig) HasPermission(userID, requiredLevel string) bool { level := b.PermissionLevel(userID) if level == "" { level = b.PermissionLevel("*") } if level == "" { return false } if requiredLevel == "admin" { return level == "admin" } return true }