2025-04-17 15:40:54 +00:00
|
|
|
package client
|
|
|
|
|
|
|
|
import (
|
2025-06-16 19:17:52 -04:00
|
|
|
"encoding/base64"
|
2025-04-17 15:40:54 +00:00
|
|
|
"fmt"
|
|
|
|
|
2025-06-16 19:17:52 -04:00
|
|
|
"code.jakeyoungdev.com/jake/mctl/database"
|
2025-06-18 18:38:01 -04:00
|
|
|
"code.jakeyoungdev.com/jake/mctl/model"
|
2025-04-17 15:40:54 +00:00
|
|
|
"github.com/jake-young-dev/mcr"
|
|
|
|
)
|
|
|
|
|
|
|
|
/*
|
2025-06-17 23:12:49 -04:00
|
|
|
This is a simple wrapper for the MCR client to provide easy use of rcon
|
2025-04-17 15:40:54 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
type Client struct {
|
2025-05-31 15:11:03 +00:00
|
|
|
cli mcr.Client
|
2025-04-17 15:40:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type IClient interface {
|
|
|
|
Close()
|
|
|
|
Command(cmd string) (string, error)
|
|
|
|
}
|
|
|
|
|
|
|
|
// creates a new mcr client using saved credentials and decrypted password
|
2025-06-16 19:17:52 -04:00
|
|
|
func New(name string) (*Client, error) {
|
|
|
|
db, err := database.New()
|
2025-04-17 15:40:54 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2025-06-16 19:17:52 -04:00
|
|
|
defer db.Close()
|
|
|
|
|
2025-06-18 18:38:01 -04:00
|
|
|
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
|
|
|
|
}
|
2025-06-16 19:17:52 -04:00
|
|
|
}
|
|
|
|
fmt.Printf("Logging into %s on port %d\n", srv.Server, srv.Port)
|
|
|
|
|
|
|
|
var p []byte
|
|
|
|
_, err = base64.StdEncoding.Decode(p, []byte(srv.Password))
|
2025-04-17 15:40:54 +00:00
|
|
|
|
|
|
|
//connect to game server
|
2025-06-16 19:17:52 -04:00
|
|
|
cli := mcr.NewClient(srv.Server, mcr.WithPort(srv.Port))
|
|
|
|
err = cli.Connect(string(p))
|
2025-04-17 15:40:54 +00:00
|
|
|
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)
|
|
|
|
}
|