Initial Commit
For some reason.
This commit is contained in:
commit
6cc194a5d1
134
mc_man.go
Normal file
134
mc_man.go
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/br0xen/mc_man/util"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// Load the Config
|
||||||
|
util.LoadConfig()
|
||||||
|
|
||||||
|
xmxVal := "1024M"
|
||||||
|
xmsVal := "1024M"
|
||||||
|
args := os.Args[1:]
|
||||||
|
if len(args) > 0 {
|
||||||
|
if args[0] == "-help" {
|
||||||
|
fmt.Println("Usage: mc_man <Xmx Value> <Xms Value>")
|
||||||
|
fmt.Println(" <Xmx Value> - The Maximum Memory Allocation Pool for the JVM")
|
||||||
|
fmt.Println(" <Xms Value> - The Initial Memory Allocation Pool")
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
if len(args) > 0 {
|
||||||
|
xmxVal = args[0]
|
||||||
|
if len(args) > 1 {
|
||||||
|
xmsVal = args[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The minecraft server command
|
||||||
|
cmd := exec.Command("java", "-Xmx"+xmxVal, "-Xms"+xmsVal, "-jar", "minecraft_server.jar", "nogui")
|
||||||
|
|
||||||
|
// Control StdIn
|
||||||
|
stdin, err := cmd.StdinPipe()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pipe the process' stdout to stdout for monitoring
|
||||||
|
stdout, err := cmd.StdoutPipe()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Kick off the process
|
||||||
|
if err := cmd.Start(); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build a string channel for stdout
|
||||||
|
ch := make(chan string)
|
||||||
|
|
||||||
|
// And a routine to keep the channel updated
|
||||||
|
go func() {
|
||||||
|
buf := make([]byte, 1024)
|
||||||
|
for {
|
||||||
|
n, err := stdout.Read(buf)
|
||||||
|
if n != 0 {
|
||||||
|
// Something there throw it into the channel
|
||||||
|
ch <- string(buf[:n])
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
// Error, break out of loop
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println("mc_man stopped")
|
||||||
|
close(ch)
|
||||||
|
}()
|
||||||
|
|
||||||
|
listen_for := ""
|
||||||
|
listen_for_user := ""
|
||||||
|
|
||||||
|
// The forever loop to monitor the channel
|
||||||
|
loop:
|
||||||
|
for {
|
||||||
|
s, ok := <-ch
|
||||||
|
if !ok {
|
||||||
|
break loop
|
||||||
|
}
|
||||||
|
m := util.NewMessage(s)
|
||||||
|
// First check for anything we're listening for
|
||||||
|
|
||||||
|
if listen_for != "" && strings.Contains(m.Text, listen_for) {
|
||||||
|
r := strings.Split(m.Text, listen_for)
|
||||||
|
if len(r) > 0 {
|
||||||
|
p_str := r[1]
|
||||||
|
p_str = strings.Replace(p_str, ",", "", -1)
|
||||||
|
util.SetHome(listen_for_user, p_str)
|
||||||
|
stdin.Write([]byte("tell " + listen_for_user + " Set your home to " + p_str))
|
||||||
|
listen_for = ""
|
||||||
|
listen_for_user = ""
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if m.IsStopRequest() {
|
||||||
|
stdin.Write([]byte("stop\n"))
|
||||||
|
} else if m.IsHomeRequest() {
|
||||||
|
home_str, found := util.GetHome(m.User.Name)
|
||||||
|
if found {
|
||||||
|
stdin.Write([]byte("tp " + m.User.Name + " " + home_str + "\n"))
|
||||||
|
}
|
||||||
|
} else if m.IsSetHomeRequest() {
|
||||||
|
listen_for = "Teleported " + m.User.Name + " to "
|
||||||
|
listen_for_user = m.User.Name
|
||||||
|
stdin.Write([]byte("tp " + m.User.Name + " ~ ~ ~\n"))
|
||||||
|
} else if m.IsVisitRequest() {
|
||||||
|
visiting_user, err := m.VisitingUser()
|
||||||
|
if !err {
|
||||||
|
fmt.Printf("\x1b[31;1m%s requested a tp visit to %s\x1b[0m\n", m.User.Name, visiting_user)
|
||||||
|
porch_str, found := util.GetPorch(visiting_user)
|
||||||
|
fmt.Printf(">>> Porch String: " + porch_str)
|
||||||
|
if found {
|
||||||
|
stdin.Write([]byte("tp " + m.User.Name + " " + porch_str + "\n"))
|
||||||
|
} else {
|
||||||
|
stdin.Write([]byte("tell " + m.User.Name + " Couldn't find that user's porch 1\n"))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
stdin.Write([]byte("tell " + m.User.Name + " Couldn't find that user's porch 2\n"))
|
||||||
|
}
|
||||||
|
} else if m.IsSetPorchRequest() {
|
||||||
|
listen_for = "Teleported " + m.User.Name + " to "
|
||||||
|
listen_for_user = m.User.Name
|
||||||
|
stdin.Write([]byte("tp " + m.User.Name + " ~ ~ ~\n"))
|
||||||
|
} else {
|
||||||
|
// fmt.Printf("\x1b[34;1m%s\x1b[0m", m.Output())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Printf("\x1b[34;1m%s\x1b[0m", m.Output())
|
||||||
|
}
|
||||||
|
}
|
160
util/config.go
Normal file
160
util/config.go
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/antonholmquist/jason"
|
||||||
|
"io/ioutil"
|
||||||
|
// "log"
|
||||||
|
// "os"
|
||||||
|
// "bytes"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
// The JSON object of what was read
|
||||||
|
LoadedJson jason.Object
|
||||||
|
Options jason.Object
|
||||||
|
FeatureTPHome bool
|
||||||
|
FeatureTPVisit bool
|
||||||
|
Users []*User
|
||||||
|
U User
|
||||||
|
}
|
||||||
|
|
||||||
|
var c *Config
|
||||||
|
|
||||||
|
func LoadConfig() {
|
||||||
|
c = new(Config)
|
||||||
|
config_str, err := ioutil.ReadFile("mc_man.config")
|
||||||
|
if err == nil {
|
||||||
|
j, _ := jason.NewObjectFromBytes(config_str)
|
||||||
|
o, _ := j.GetObjectArray("options")
|
||||||
|
|
||||||
|
for _, option := range o {
|
||||||
|
opt_name, _ := option.GetString("name")
|
||||||
|
opt_enabled, _ := option.GetBoolean("enabled")
|
||||||
|
if opt_name == "home" {
|
||||||
|
c.FeatureTPHome = opt_enabled
|
||||||
|
} else if opt_name == "visit" {
|
||||||
|
c.FeatureTPVisit = opt_enabled
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Users = make([]*User, 1)
|
||||||
|
u, _ := j.GetObjectArray("users")
|
||||||
|
for _, user := range u {
|
||||||
|
user_name, err := user.GetString("name")
|
||||||
|
if err == nil && user_name != "" {
|
||||||
|
user_home, _ := user.GetString("home")
|
||||||
|
user_porch, _ := user.GetString("porch")
|
||||||
|
us := NewUser(user_name)
|
||||||
|
// TODO: Check if this user is an op on the server
|
||||||
|
us.Home = user_home
|
||||||
|
us.Porch = user_porch
|
||||||
|
c.Users = append(c.Users, us)
|
||||||
|
c.U = *us
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Printf("Loaded %d Users", len(c.Users))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WriteConfig() {
|
||||||
|
// Generate the JSON string for the config file
|
||||||
|
d := "{\"options\":["
|
||||||
|
// Output options array
|
||||||
|
d = d + "{\"name\":\"home\",\"enabled\":"
|
||||||
|
if c.FeatureTPHome {
|
||||||
|
d = d + "true"
|
||||||
|
} else {
|
||||||
|
d = d + "false"
|
||||||
|
}
|
||||||
|
d = d + "},{\"name\":\"visit\",\"enabled\":"
|
||||||
|
if c.FeatureTPVisit {
|
||||||
|
d = d + "true"
|
||||||
|
} else {
|
||||||
|
d = d + "false"
|
||||||
|
}
|
||||||
|
d = d + "}],\"users\":["
|
||||||
|
d = d + c.U.ToJSONString()
|
||||||
|
// Output users array
|
||||||
|
/*
|
||||||
|
num_users := len(c.Users)
|
||||||
|
fmt.Printf("Number of Users: %d", num_users)
|
||||||
|
for i := 0; i < num_users; i++ {
|
||||||
|
user := c.Users[i]
|
||||||
|
// for _, user := range c.Users {
|
||||||
|
fmt.Println(d)
|
||||||
|
num_users--
|
||||||
|
d = d + user.ToJSONString()
|
||||||
|
if user.Name != "" {
|
||||||
|
if num_users > 0 {
|
||||||
|
d = d + ","
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
d = d + "]}"
|
||||||
|
do := []byte(d)
|
||||||
|
ioutil.WriteFile("mc_man.config", do, 0644)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetHome(user string, loc string) {
|
||||||
|
/*
|
||||||
|
u, idx := FindUser(user)
|
||||||
|
if idx == -1 {
|
||||||
|
u = NewUser(user)
|
||||||
|
c.Users = append(c.Users, u)
|
||||||
|
idx = len(c.Users) - 1
|
||||||
|
}
|
||||||
|
u.Home = strings.Replace(loc, "\n", "", -1)
|
||||||
|
// Replace the user in the Users array
|
||||||
|
c.Users[idx] = u
|
||||||
|
*/
|
||||||
|
c.U.Home = strings.Replace(loc, "\n", "", -1)
|
||||||
|
WriteConfig()
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetHome(user string) (string, bool) {
|
||||||
|
/*
|
||||||
|
u, idx := FindUser(user)
|
||||||
|
if idx == -1 || u.Home == "" {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
return c.U.Home, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetPorch(user string, loc string) {
|
||||||
|
/*
|
||||||
|
u, idx := FindUser(user)
|
||||||
|
if idx == -1 {
|
||||||
|
u = NewUser(user)
|
||||||
|
c.Users = append(c.Users, u)
|
||||||
|
idx = len(c.Users) - 1
|
||||||
|
}
|
||||||
|
u.Porch = strings.Replace(loc, "\n", "", -1)
|
||||||
|
c.Users[idx] = u
|
||||||
|
*/
|
||||||
|
c.U.Porch = strings.Replace(loc, "\n", "", -1)
|
||||||
|
WriteConfig()
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetPorch(user string) (string, bool) {
|
||||||
|
/*
|
||||||
|
u, idx := FindUser(user)
|
||||||
|
if idx > -1 || u.Porch == "" {
|
||||||
|
return "", false
|
||||||
|
}
|
||||||
|
return u.Porch, true
|
||||||
|
*/
|
||||||
|
return c.U.Porch, true
|
||||||
|
}
|
||||||
|
|
||||||
|
func FindUser(name string) (*User, int) {
|
||||||
|
for i, user := range c.Users {
|
||||||
|
if user.Name == name {
|
||||||
|
return user, i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, -1
|
||||||
|
}
|
94
util/message.go
Normal file
94
util/message.go
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
//"fmt"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Message struct {
|
||||||
|
User *User
|
||||||
|
Text string
|
||||||
|
|
||||||
|
IsStopRequest func() bool
|
||||||
|
IsHomeRequest func() bool
|
||||||
|
IsSetHomeRequest func() bool
|
||||||
|
IsVisitRequest func() bool
|
||||||
|
IsSetPorchRequest func() bool
|
||||||
|
VisitingUser func() (string, bool)
|
||||||
|
Output func() string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewMessage(t string) *Message {
|
||||||
|
m := new(Message)
|
||||||
|
msg_user := regexp.MustCompile("<[^>]+>")
|
||||||
|
tmpUser := msg_user.FindString(t)
|
||||||
|
tmpUser = strings.Replace(tmpUser, "<", "", -1)
|
||||||
|
tmpUser = strings.Replace(tmpUser, ">", "", -1)
|
||||||
|
m.User = NewUser(tmpUser)
|
||||||
|
if tmpUser == "br0xen" {
|
||||||
|
m.User.IsOp = true
|
||||||
|
}
|
||||||
|
m.Text = t
|
||||||
|
if m.User.Name != "" {
|
||||||
|
res := strings.Split(t, "<"+m.User.Name+"> ")
|
||||||
|
if len(res) > 0 {
|
||||||
|
m.Text = res[1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m.IsStopRequest = func() bool {
|
||||||
|
return (m.User.IsOp && m.Text == "!stop\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
m.IsHomeRequest = func() bool {
|
||||||
|
if m.User.Name != "" {
|
||||||
|
return (m.Text == "!home\n")
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m.IsSetHomeRequest = func() bool {
|
||||||
|
if m.User.Name != "" {
|
||||||
|
return (m.Text == "!set home\n")
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m.IsSetPorchRequest = func() bool {
|
||||||
|
if m.User.Name != "" {
|
||||||
|
return (m.Text == "!set porch\n")
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m.IsVisitRequest = func() bool {
|
||||||
|
if m.User.Name != "" {
|
||||||
|
return strings.HasPrefix(m.Text, "!visit ")
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m.VisitingUser = func() (string, bool) {
|
||||||
|
if m.IsVisitRequest() {
|
||||||
|
s := strings.Replace(m.Text, "!visit ", "", -1)
|
||||||
|
s = strings.Replace(s, "\n", "", -1)
|
||||||
|
return s, false
|
||||||
|
}
|
||||||
|
return "", true
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Output = func() string {
|
||||||
|
if m.User.Name != "" {
|
||||||
|
return "<" + m.User.Name + "> " + m.Text
|
||||||
|
} else {
|
||||||
|
return m.Text
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
41
util/message_manager.go
Normal file
41
util/message_manager.go
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MessageManager struct {
|
||||||
|
/* Process takes a string and returns whether
|
||||||
|
* we did anything with that string or not
|
||||||
|
*/
|
||||||
|
Process func(inp string) bool
|
||||||
|
|
||||||
|
/* listeners is an array of functions that
|
||||||
|
* tell the manager how to listen for specific
|
||||||
|
* text and what to do if we receive it.
|
||||||
|
* Each listener returns true if the input was
|
||||||
|
* "consumed" (i.e. - Don't send to any more
|
||||||
|
* listeners)
|
||||||
|
*/
|
||||||
|
listeners []func(inp string) bool
|
||||||
|
|
||||||
|
/* tempListeners is an array of functions that
|
||||||
|
* work the same as 'listeners', but these are
|
||||||
|
* just temporary and higher priority than
|
||||||
|
* 'listeners'
|
||||||
|
*/
|
||||||
|
tempListeners []func(inp string) bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewManager() *MessageManager {
|
||||||
|
mm := new(MessageManager)
|
||||||
|
mm.Process = func(inp string) bool {
|
||||||
|
// TODO: send to temp listeners
|
||||||
|
for i, listener := range listeners {
|
||||||
|
if listener(inp) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return mm
|
||||||
|
}
|
21
util/user.go
Normal file
21
util/user.go
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package util
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
Name string
|
||||||
|
IsOp bool
|
||||||
|
Home string
|
||||||
|
Porch string
|
||||||
|
ToJSONString func() string
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUser(nm string) *User {
|
||||||
|
m := new(User)
|
||||||
|
m.Name = nm
|
||||||
|
m.IsOp = false
|
||||||
|
m.Home = ""
|
||||||
|
m.Porch = ""
|
||||||
|
m.ToJSONString = func() string {
|
||||||
|
return "{\"name\":\"" + m.Name + "\",\"home\":\"" + m.Home + "\",\"porch\":\"" + m.Porch + "\"}"
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user