Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .serverdata/mh/Game.ini
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,3 @@ ServerLagReportColor2=
ChatFeedWebhookURL=
ChatFeedColor=
ServerPassword=

23 changes: 16 additions & 7 deletions cmd/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ var saveParam string
var profileParam string

func init() {
flag.StringVar(&addressParam, "address", "localhost", "RCON address, excluding port")
flag.UintVar(&portParam, "port", 7778, "RCON port")
flag.StringVar(&addressParam, "address", config.DefaultAddr, "RCON address, excluding port")
flag.UintVar(&portParam, "port", config.DefaultPort, "RCON port")
flag.StringVar(&passwordParam, "pw", "", "RCON password, if not provided will attempt to load from env variables, if unavailable will prompt")
flag.UintVar(&logLevelParam, "log", logger.LevelWarning, "sets log level (syslog severity tiers) for execution")
flag.StringVar(&inputCmdParam, "cmd", "", "command to execute, if provided will not enter into interactive mode")
Expand Down Expand Up @@ -105,8 +105,17 @@ func Execute() {
flag.Parse()
logLevel := uint8(logLevelParam)
logger.Setup(logLevel)

resolvedAddress, resolvedPort, resolvedPassword, err := config.Resolve(profileParam, addressParam, portParam, passwordParam)
configBasePath, err := os.UserConfigDir()
if err != nil {
logger.Critical.Fatal(err)
}
resolvedAddress, resolvedPort, resolvedPassword, err := config.Resolve(
configBasePath,
profileParam,
addressParam,
portParam,
passwordParam,
)
if err != nil {
logger.Critical.Fatal(err)
}
Expand All @@ -121,7 +130,7 @@ func Execute() {

// TODO: consider moving to config lib
if saveParam != "" {
cfg, loadErr := config.Load()
cfg, loadErr := config.Load(configBasePath)
if loadErr != nil {
logger.Critical.Fatal(errors.Join(errors.New("failed to load config for saving"), loadErr))
}
Expand All @@ -142,10 +151,10 @@ func Execute() {
}

cfg.SetProfile(saveParam, newProfile)
if saveErr := cfg.Save(); saveErr != nil {
if saveErr := cfg.Save(configBasePath); saveErr != nil {
logger.Critical.Fatal(errors.Join(errors.New("failed to save config file"), saveErr))
}
configFilePath, pathErr := config.GetConfigPath()
configFilePath, pathErr := config.BuildConfigPath(configBasePath)
if pathErr != nil {
logger.Critical.Fatal(errors.Join(errors.New("failed to get config file path for display"), pathErr))
}
Expand Down
28 changes: 15 additions & 13 deletions internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,22 @@ type Config struct {
const (
configDirName = "tcprcon"
configFileName = "config.json"
DefaultAddr = "localhost"
DefaultPort = 7778
)

func GetConfigPath() (string, error) {
configDir, err := os.UserConfigDir()
if err != nil {
return "", err
func BuildConfigPath(basePath string) (string, error) {
if basePath == "" {
return "", ErrUndefinedConfigBasePath
}

fullPath := filepath.Join(configDir, configDirName)
fullPath := filepath.Join(basePath, configDirName)
return filepath.Join(fullPath, configFileName), nil
}

func Load() (*Config, error) {
path, err := GetConfigPath()
func Load(baseConfigPath string) (*Config, error) {

path, err := BuildConfigPath(baseConfigPath)
if err != nil {
return nil, err
}
Expand All @@ -62,8 +64,8 @@ func Load() (*Config, error) {
return &cfg, nil
}

func (source *Config) Save() error {
path, err := GetConfigPath()
func (source *Config) Save(configBasePath string) error {
path, err := BuildConfigPath(configBasePath)
if err != nil {
return err
}
Expand Down Expand Up @@ -97,8 +99,8 @@ func (source *Config) SetProfile(name string, p Profile) {
source.Profiles[name] = p
}

func Resolve(profileName string, addrFlag string, portFlag uint, pwFlag string) (string, uint, string, error) {
cfg, err := Load()
func Resolve(configBasePath string, profileName string, addrFlag string, portFlag uint, pwFlag string) (string, uint, string, error) {
cfg, err := Load(configBasePath)
if err != nil {
return "", 0, "", err
}
Expand All @@ -116,10 +118,10 @@ func Resolve(profileName string, addrFlag string, portFlag uint, pwFlag string)
// only override if the flags are still at their default values
// NOTE: this logic assumes defaults are "localhost", 7778, and ""
// TODO: this "default" handling can introduce bugs, rethink this at some point
if finalAddr == "localhost" && p.Address != "" {
if finalAddr == DefaultAddr && p.Address != "" {
finalAddr = p.Address
}
if finalPort == 7778 && p.Port != 0 {
if finalPort == DefaultPort && p.Port != 0 {
finalPort = p.Port
}
if finalPw == "" && p.Password != "" {
Expand Down
Loading