Spin up Webserver

Also, actually read minecraft's op/whitelist files
This commit is contained in:
Brian Buller 2015-04-16 11:57:48 -05:00
parent 45163efa7c
commit 76cc9b7336
5 changed files with 210 additions and 23 deletions

2
.gitignore vendored
View File

@ -1,6 +1,6 @@
# Custom Ignores # Custom Ignores
/mc_man /mc_man
/mc_man_test /live_test
# Vim swap files # Vim swap files
*.swp *.swp

View File

@ -2,7 +2,7 @@ package main
import ( import (
"fmt" "fmt"
"github.com/br0xen/mc_man/util" "gogs.bullercodeworks.com/brian/mc_man/util"
"log" "log"
"os" "os"
"os/exec" "os/exec"
@ -61,11 +61,13 @@ func main() {
ch <- string(buf[:n]) ch <- string(buf[:n])
} }
if err != nil { if err != nil {
fmt.Print("Caught: ", err, "\n")
// Error, break out of loop // Error, break out of loop
break break
} }
} }
fmt.Println("mc_man stopped") fmt.Println("mc_man stopped")
util.StopServer = true
close(ch) close(ch)
}() }()
@ -85,6 +87,11 @@ func main() {
} }
}() }()
// Web Server Routine
go func() {
util.StartServer(ch)
}()
// The forever loop to monitor everything // The forever loop to monitor everything
for { for {
time.Sleep(time.Second) time.Sleep(time.Second)

View File

@ -16,20 +16,53 @@ type Config struct {
FeatureDayNight bool FeatureDayNight bool
Users []*User Users []*User
LoggedInUsers []*User LoggedInUsers []*User
Whitelist []string
Ops []string
} }
var c *Config var c *Config
var StopServer = false var StopServer = false
var message_manager *MessageManager
func LoadConfig(mm *MessageManager) { func LoadConfig(mm *MessageManager) {
message_manager = mm
c = new(Config) c = new(Config)
// Load the whitelist
whitelist_rd, err := ioutil.ReadFile("whitelist.json")
// We have to make it an object to read it...
whitelist_rd = append(append([]byte("{\"whitelist\":"), whitelist_rd...), '}')
if err == nil {
j, _ := jason.NewObjectFromBytes(whitelist_rd)
jo, _ := j.GetObjectArray("whitelist")
for _, wl_u := range jo {
n, _ := wl_u.GetString("name")
fmt.Print("> Whitelisted User ", n, "\n")
c.Whitelist = append(c.Whitelist, n)
}
}
// Load the Op list
oplist_rd, err := ioutil.ReadFile("ops.json")
// We have to make it an object to read it...
oplist_rd = append(append([]byte("{\"ops\":"), oplist_rd...), '}')
if err == nil {
j, _ := jason.NewObjectFromBytes(oplist_rd)
jo, _ := j.GetObjectArray("ops")
for _, ol_u := range jo {
n, _ := ol_u.GetString("name")
fmt.Print("> Opped User ", n, "\n")
c.Ops = append(c.Ops, n)
}
}
config_str, err := ioutil.ReadFile("mc_man.config") config_str, err := ioutil.ReadFile("mc_man.config")
if err == nil { if err == nil {
j, _ := jason.NewObjectFromBytes(config_str) j, _ := jason.NewObjectFromBytes(config_str)
o, _ := j.GetObjectArray("options") o, _ := j.GetObjectArray("options")
// Add the "Stop" listener // Add the "Stop" listener
fmt.Println("Activating 'stop' listener") fmt.Println("> Activating 'stop' listener")
AddListener(func(i *Message) bool { AddListener(func(i *Message) bool {
if i.User.IsOp && i.Text == "!stop\n" { if i.User.IsOp && i.Text == "!stop\n" {
mm.Output("stop") mm.Output("stop")
@ -45,7 +78,7 @@ func LoadConfig(mm *MessageManager) {
if opt_name == "home" { if opt_name == "home" {
c.FeatureTPHome = opt_enabled c.FeatureTPHome = opt_enabled
if opt_enabled { if opt_enabled {
fmt.Println("Activating 'home' listeners") fmt.Println("> Activating 'home' listeners")
// Add !set home listener // Add !set home listener
AddListener(func(i *Message) bool { AddListener(func(i *Message) bool {
if i.User.Name != "" && i.Text == "!set home\n" { if i.User.Name != "" && i.Text == "!set home\n" {
@ -86,7 +119,7 @@ func LoadConfig(mm *MessageManager) {
} else if opt_name == "visit" { } else if opt_name == "visit" {
c.FeatureTPVisit = opt_enabled c.FeatureTPVisit = opt_enabled
if opt_enabled { if opt_enabled {
fmt.Println("Activating 'visit' listeners") fmt.Println("> Activating 'visit' listeners")
// Add !set porch listener // Add !set porch listener
AddListener(func(i *Message) bool { AddListener(func(i *Message) bool {
if i.User.Name != "" && i.Text == "!set porch\n" { if i.User.Name != "" && i.Text == "!set porch\n" {
@ -131,23 +164,23 @@ func LoadConfig(mm *MessageManager) {
} else if opt_name == "daynight" { } else if opt_name == "daynight" {
c.FeatureDayNight = opt_enabled c.FeatureDayNight = opt_enabled
if opt_enabled { if opt_enabled {
fmt.Println("Activating 'daynight' listeners") fmt.Println("> Activating 'time' listeners")
// Add !switch day listener // Add !time day listener
AddListener(func(i *Message) bool { AddListener(func(i *Message) bool {
if i.User.Name != "" && i.Text == "!switch day\n" { if i.User.Name != "" && i.Text == "!time day\n" {
// TODO: Start vote // TODO: Start vote
mm.Output("time set day") mm.Output("time set day")
mm.Tell("@a", "Day Time switch initiated by "+i.User.Name, "yellow") mm.Tell("@a", "Day Time time initiated by "+i.User.Name, "yellow")
return true return true
} }
return false return false
}) })
// Add !switch night listener // Add !time night listener
AddListener(func(i *Message) bool { AddListener(func(i *Message) bool {
if i.User.Name != "" && i.Text == "!switch night\n" { if i.User.Name != "" && i.Text == "!time night\n" {
// TODO: Start vote // TODO: Start vote
mm.Output("time set night") mm.Output("time set night")
mm.Tell("@a", "Night Time switch initiated by "+i.User.Name, "blue") mm.Tell("@a", "Night Time time initiated by "+i.User.Name, "blue")
return true return true
} }
return false return false
@ -198,12 +231,25 @@ func LoadConfig(mm *MessageManager) {
AddListener(func(i *Message) bool { AddListener(func(i *Message) bool {
if i.User.Name != "" && i.Text == "!help\n" { if i.User.Name != "" && i.Text == "!help\n" {
mm.Tell(i.User.Name, "-=( mc_man Manager Help )=-", "blue") mm.Tell(i.User.Name, "-=( mc_man Manager Help )=-", "blue")
numFeatures := 0
if c.FeatureTPHome == true {
numFeatures++
mm.Tell(i.User.Name, "!set home -- Set your 'home' to your current position.", "white") mm.Tell(i.User.Name, "!set home -- Set your 'home' to your current position.", "white")
mm.Tell(i.User.Name, "!home -- Request a teleport to your 'home' position.", "white") mm.Tell(i.User.Name, "!home -- Request a teleport to your 'home' position.", "white")
}
if c.FeatureTPVisit == true {
numFeatures++
mm.Tell(i.User.Name, "!set porch -- Set your 'porch' to your current position.", "white") mm.Tell(i.User.Name, "!set porch -- Set your 'porch' to your current position.", "white")
mm.Tell(i.User.Name, "!visit <username> -- Request a teleport to <username>'s 'porch' position.", "white") mm.Tell(i.User.Name, "!visit <username> -- Request a teleport to <username>'s 'porch' position.", "white")
mm.Tell(i.User.Name, "!switch day -- Ask the server to switch the time to 'day'.", "white") }
mm.Tell(i.User.Name, "!switch night -- Ask the server to switch the time to 'night'.", "white") if c.FeatureDayNight == true {
numFeatures++
mm.Tell(i.User.Name, "!time day -- Ask the server to time the time to 'day'.", "white")
mm.Tell(i.User.Name, "!time night -- Ask the server to time the time to 'night'.", "white")
}
if numFeatures == 0 {
mm.Tell(i.User.Name, "mc_man currently has no user features loaded.", "white")
}
mm.Tell(i.User.Name, "-=========================-", "blue") mm.Tell(i.User.Name, "-=========================-", "blue")
return true return true
} }
@ -219,16 +265,17 @@ func LoadConfig(mm *MessageManager) {
user_home, _ := user.GetString("home") user_home, _ := user.GetString("home")
user_porch, _ := user.GetString("porch") user_porch, _ := user.GetString("porch")
us := NewUser(user_name) us := NewUser(user_name)
// TODO: Check if this user is an op on the server for _, un := range c.Ops {
if user_name == "br0xen" { if un == user_name {
us.IsOp = true us.IsOp = true
} }
}
us.Home = user_home us.Home = user_home
us.Porch = user_porch us.Porch = user_porch
c.Users = append(c.Users, us) c.Users = append(c.Users, us)
} }
} }
fmt.Printf("Loaded %d Users\n", len(c.Users)) fmt.Printf("> Loaded %d Users\n", len(c.Users))
} }
} }
@ -287,8 +334,13 @@ func WriteConfig() {
} }
d = d + "}],\"users\":[" d = d + "}],\"users\":["
// Output users array // Output users array
num_users := 0
for _, u := range c.Users { for _, u := range c.Users {
if num_users > 0 {
d = d + ","
}
d = d + u.ToJSONString() d = d + u.ToJSONString()
num_users++
} }
d = d + "]}" d = d + "]}"
do := []byte(d) do := []byte(d)

View File

@ -25,8 +25,10 @@ func NewUser(nm string) *User {
m.IsOp = false m.IsOp = false
m.Home = "" m.Home = ""
m.Porch = "" m.Porch = ""
m.Quota = 0
m.quotaUsed = 0
m.ToJSONString = func() string { m.ToJSONString = func() string {
return "{\"name\":\"" + m.Name + "\",\"home\":\"" + m.Home + "\",\"porch\":\"" + m.Porch + "\",\"quota\":\"" + string(m.Quota) + "\",\"quota_used\":\"" + string(m.quotaUsed) + "\"}" return "{\"name\":\"" + m.Name + "\",\"home\":\"" + m.Home + "\",\"porch\":\"" + m.Porch + "\",\"quota\":\"" + m.Quota.String() + "\",\"quota_used\":\"" + m.quotaUsed.String() + "\"}"
} }
return m return m
} }

126
util/webserver.go Normal file
View File

@ -0,0 +1,126 @@
package util
import (
"fmt"
"io"
"io/ioutil"
"net/http"
"os"
)
var output_channel chan string
func StartServer(ch chan string) {
output_channel = ch
_, err := os.Stat("mapcrafter/index.html")
if err == nil {
// Looks like mapcrafter is present
output_channel <- "* Mapcrafter Directory is Present, routing to /map\n"
fs := http.FileServer(http.Dir("mapcrafter"))
http.Handle("/map/", http.StripPrefix("/map/", fs))
}
http.HandleFunc("/api/", serveAPI)
http.HandleFunc("/", serveMcMan)
http.ListenAndServe(":8080", nil)
}
func serveMcMan(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, htmlHeader("mc_man - Minecraft Manager"))
fmt.Fprintf(w, "Hey-o! It's the manager!")
fmt.Fprintf(w, htmlFooter())
}
func serveAPI(w http.ResponseWriter, r *http.Request) {
body, err := ioutil.ReadAll(io.LimitReader(r.Body, 1048576))
if err != nil {
panic(err)
}
if err := r.Body.Close(); err != nil {
panic(err)
}
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
// What are we doing with this request?
output_channel <- fmt.Sprint("HTTP Request: (", r.Method, ") ", r.URL, "\n")
the_path = r.URL.Path
output_string = ""
if strings.HasPrefix(the_path, "/api") {
the_path = strings.TrimPrefix(the_path, "/api")
if strings.HasPrefix(the_path, "/v1") {
the_path = strings.TrimPrefix(the_path, "/v1")
if strings.HasPrefix(the_path, "/whitelist") {
output_string = handleWhitelist(r)
} else if strings.HasPrefix(the_path, "/ops") {
output_string = handleOps(r)
}
}
}
}
/* JSON Functions */
func handleOps(r *http.Request) string {
if r.Method == "GET" {
return getOps()
} else if r.Method == "POST" {
// Add posted user to Ops
}
return ""
}
func handleWhitelist(r *http.Request) string {
if r.Method == "GET" {
return getWhitelist()
} else if r.Method == "POST" {
// Add posted user to whitelist
}
return ""
}
func getOps() string {
ret := "["
num_users := 0
for _, op_user := range GetConfig().Ops {
if num_users > 0 {
ret += ","
}
ret += fmt.Sprint("\"", op_user, "\"")
}
ret += "]"
return ret
}
func getWhitelist() string {
ret := "["
num_users := 0
for _, wl_user := range GetConfig().Whitelist {
if num_users > 0 {
ret += ","
}
ret += fmt.Sprint("\"", wl_user, "\"")
}
ret += "]"
return ret
}
/* HTML Functions */
func htmlHeader(title string) string {
head := `
<!DOCTYPE html>
<html>
<head>
<title>`
head += title
head += `
</title>
</head>
<body>
`
return head
}
func htmlFooter() string {
return `
</body>
</html>
`
}