Переглянути джерело

Example web-server was added

Denis V. Dedkov 9 роки тому
батько
коміт
0d2faf2077
1 змінених файлів з 99 додано та 0 видалено
  1. 99 0
      examples/noolite-web/noolite-web.go

+ 99 - 0
examples/noolite-web/noolite-web.go

@@ -0,0 +1,99 @@
+package main
+
+import (
+	"errors"
+	"flag"
+	"fmt"
+	"github.com/dedkovd/noolite"
+	"net/http"
+	"strconv"
+	"strings"
+)
+
+func sendCommand(n *noolite.NooliteAdapter, command string, channel, value, r, g, b int) error {
+	if channel == -1 {
+		return errors.New("Channel was not set")
+	}
+
+	if command == "" {
+		return errors.New("Command was not set")
+	}
+
+	if command == "set" {
+		if value != 0 {
+			return n.SetBrightnesValue(channel, value)
+		} else if r != 0 || g != 0 || b != 0 {
+			return n.SetBrightnesValues(channel, r, g, b)
+		} else {
+			return errors.New("Need some value")
+		}
+	} else {
+		cmd, ok := n.FindCommand(command)
+
+		if !ok {
+			return errors.New("Command not found")
+		}
+
+		return cmd(channel)
+	}
+}
+
+func parseParams(path string) (string, int, int, int, int, int) {
+	params := strings.Split(path, "/")[1:]
+
+	command := ""
+	channel := -1
+	value := 0
+	r := 0
+	g := 0
+	b := 0
+
+	command = params[0]
+	if len(params) > 1 {
+		channel, _ = strconv.Atoi(params[1])
+	}
+	if len(params) > 2 {
+		value, _ = strconv.Atoi(params[2])
+	}
+	if len(params) == 5 {
+		value = 0
+		r, _ = strconv.Atoi(params[2])
+		g, _ = strconv.Atoi(params[3])
+		b, _ = strconv.Atoi(params[4])
+	}
+
+	return command, channel, value, r, g, b
+}
+
+func main() {
+	binding := *flag.String("bind", ":8080", "Address binding")
+	static_dir := *flag.String("static", "/var/www/static", "Static directory")
+
+	flag.Parse()
+
+	n, err := noolite.DefaultNooliteAdapter()
+
+	if err != nil {
+		panic(err)
+	}
+
+	defer n.Close()
+
+	http.HandleFunc("/noolite/", func(w http.ResponseWriter, r *http.Request) {
+		command, channel, value, red, green, blue := parseParams(r.URL.Path[1:])
+
+		err := sendCommand(n, command, channel, value, red, green, blue)
+
+		if err != nil {
+			fmt.Fprintf(w, "{\"error\": %q}", err)
+		} else {
+			fmt.Fprintf(w, "{\"command\": %q, \"channel\": \"%d\"}", command, channel)
+		}
+	})
+
+	fs := http.FileServer(http.Dir(static_dir))
+
+	http.Handle("/static/", http.StripPrefix("/static/", fs))
+
+	panic(http.ListenAndServe(binding, nil))
+}