Spin up Webserver
Also, actually read minecraft's op/whitelist files
This commit is contained in:
		
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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")
 | 
				
			||||||
					mm.Tell(i.User.Name, "!set home -- Set your 'home' to your current position.", "white")
 | 
										numFeatures := 0
 | 
				
			||||||
					mm.Tell(i.User.Name, "!home -- Request a teleport to your 'home' position.", "white")
 | 
										if c.FeatureTPHome == true {
 | 
				
			||||||
					mm.Tell(i.User.Name, "!set porch -- Set your 'porch' to your current position.", "white")
 | 
											numFeatures++
 | 
				
			||||||
					mm.Tell(i.User.Name, "!visit <username> -- Request a teleport to <username>'s 'porch' position.", "white")
 | 
											mm.Tell(i.User.Name, "!set home -- Set your 'home' to your current position.", "white")
 | 
				
			||||||
					mm.Tell(i.User.Name, "!switch day -- Ask the server to switch the time to 'day'.", "white")
 | 
											mm.Tell(i.User.Name, "!home -- Request a teleport to your 'home' position.", "white")
 | 
				
			||||||
					mm.Tell(i.User.Name, "!switch night -- Ask the server to switch the time to 'night'.", "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, "!visit <username> -- Request a teleport to <username>'s 'porch' position.", "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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
									
								
							
							
						
						
									
										126
									
								
								util/webserver.go
									
									
									
									
									
										Normal 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>
 | 
				
			||||||
 | 
					`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user