116 lines
1.9 KiB
Go
116 lines
1.9 KiB
Go
package rcon
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"github.com/tystuyfzand/mcgorcon"
|
|
"log"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
pingDuration = 30 * time.Second
|
|
)
|
|
|
|
type Session struct {
|
|
host string
|
|
port int
|
|
password string
|
|
|
|
Debug bool
|
|
|
|
client *mcgorcon.Client
|
|
lastUse time.Time
|
|
}
|
|
|
|
func NewSession(host string, port int, password string) *Session {
|
|
return &Session{host: host, port: port, password: password}
|
|
}
|
|
|
|
func (r *Session) Disconnect() {
|
|
if r.client != nil {
|
|
r.client.Close()
|
|
}
|
|
}
|
|
|
|
func (r *Session) connection() *mcgorcon.Client {
|
|
if r.client != nil {
|
|
if time.Since(r.lastUse) > pingDuration {
|
|
_, err := r.client.SendCommand("seed")
|
|
|
|
if err == nil {
|
|
r.lastUse = time.Now()
|
|
return r.client
|
|
}
|
|
} else {
|
|
return r.client
|
|
}
|
|
}
|
|
|
|
// Open new connection
|
|
r.client = r.openConnection()
|
|
r.lastUse = time.Now()
|
|
|
|
return r.client
|
|
}
|
|
|
|
func (r *Session) openConnection() *mcgorcon.Client {
|
|
var c *mcgorcon.Client
|
|
var err error
|
|
|
|
for c == nil || err != nil {
|
|
c, err = mcgorcon.Dial(r.host, r.port, r.password)
|
|
|
|
if err == nil {
|
|
break
|
|
}
|
|
|
|
<-time.After(10 * time.Second)
|
|
}
|
|
|
|
log.Println("Connection opened")
|
|
|
|
return c
|
|
}
|
|
|
|
func (r *Session) SendCommand(command string) (string, error) {
|
|
if r.Debug {
|
|
log.Println("Send command: " + command)
|
|
}
|
|
|
|
return r.connection().SendCommand(command)
|
|
}
|
|
|
|
func (r *Session) ServerMessage(message string) error {
|
|
_, err := r.SendCommand(fmt.Sprintf("say %s", message))
|
|
|
|
return err
|
|
}
|
|
|
|
func (r *Session) SendMessage(user, message string) error {
|
|
_, err := r.SendCommand(fmt.Sprintf("msg %s %s", user, message))
|
|
|
|
return err
|
|
}
|
|
|
|
type colorMessage struct {
|
|
Text string `json:"text"`
|
|
Color string `json:"color"`
|
|
}
|
|
|
|
func (r *Session) SendColorfulMessage(target, color, message string) error {
|
|
messages := []colorMessage{
|
|
{Text: message, Color: color},
|
|
}
|
|
|
|
b, err := json.Marshal(messages)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = r.SendCommand(fmt.Sprintf("tellraw %s %s", target, string(b)))
|
|
|
|
return err
|
|
}
|