mctl/client/mcr.go
jake c15c16be8d finishing sqlite changes
- finished default/active server logic
- dev done
- needs testing
2025-06-18 18:38:01 -04:00

71 lines
1.3 KiB
Go

package client
import (
"encoding/base64"
"fmt"
"code.jakeyoungdev.com/jake/mctl/database"
"code.jakeyoungdev.com/jake/mctl/model"
"github.com/jake-young-dev/mcr"
)
/*
This is a simple wrapper for the MCR client to provide easy use of rcon
*/
type Client struct {
cli mcr.Client
}
type IClient interface {
Close()
Command(cmd string) (string, error)
}
// creates a new mcr client using saved credentials and decrypted password
func New(name string) (*Client, error) {
db, err := database.New()
if err != nil {
return nil, err
}
defer db.Close()
var srv model.Server
if name != "" {
srv, err = db.GetServer(name)
if err != nil {
return nil, err
}
} else {
srv, err = db.GetActiveServer()
if err != nil {
return nil, err
}
}
fmt.Printf("Logging into %s on port %d\n", srv.Server, srv.Port)
var p []byte
_, err = base64.StdEncoding.Decode(p, []byte(srv.Password))
//connect to game server
cli := mcr.NewClient(srv.Server, mcr.WithPort(srv.Port))
err = cli.Connect(string(p))
if err != nil {
return nil, err
}
return &Client{
cli: cli,
}, nil
}
// closes client connection
func (c *Client) Close() error {
return c.cli.Close()
}
// sends command to server, only exists to prevent exposing cli field
func (c *Client) Command(cmd string) (string, error) {
return c.cli.Command(cmd)
}