personal/q3k: add minecraft plugins

Also drive-by modify WORKSPACE to add required deps.

Also drive-by update deps in WORKSPACE.

Also drive-by remove old stackb/proto library from WORKSPACE (only used
in cccampix, which is dead, and stackb/proto should be replaceable by
the main grpc lib by this point).

Change-Id: I7ac7fe2237e859dc1c45bf41a016174ed8e9ee71
diff --git a/personal/q3k/minecraft/plugin/genpluginyml.go b/personal/q3k/minecraft/plugin/genpluginyml.go
new file mode 100644
index 0000000..1174f8f
--- /dev/null
+++ b/personal/q3k/minecraft/plugin/genpluginyml.go
@@ -0,0 +1,76 @@
+package main
+
+import (
+	"encoding/json"
+	"flag"
+	"fmt"
+	"io/ioutil"
+	"log"
+	"strings"
+)
+
+var (
+	flagName    string
+	flagAuthor  string
+	flagMain    string
+	flagVersion string
+
+	flagStatusFile string
+	flagOutFile    string
+)
+
+func main() {
+	flag.StringVar(&flagName, "name", "", "plugin name")
+	flag.StringVar(&flagAuthor, "author", "", "plugin author")
+	flag.StringVar(&flagMain, "main", "", "plugin main class")
+	flag.StringVar(&flagVersion, "version", "", "plugin version, if not given, workspace status will be used")
+	flag.StringVar(&flagStatusFile, "status_file", "", "path to workspace status file for version generation")
+	flag.StringVar(&flagOutFile, "out_file", "plugin.yml", "path to output plugin.yml")
+	flag.Parse()
+
+	if flagVersion == "" {
+		status, err := ioutil.ReadFile(flagStatusFile)
+		if err != nil {
+			log.Fatalf("ReadFile(%q): %v", flagStatusFile, err)
+		}
+
+		for _, line := range strings.Split(string(status), "\n") {
+			line = strings.TrimSpace(line)
+			parts := strings.Fields(line)
+			if len(parts) != 2 {
+				continue
+			}
+			if parts[0] == "STABLE_GIT_VERSION" {
+				flagVersion = fmt.Sprintf("hscloud-git-%s", parts[1])
+			}
+		}
+	}
+
+	if flagVersion == "" {
+		log.Fatalf("could not determine version from status")
+	}
+
+	// a yaml is a json, a json is a yaml
+	yml := struct {
+		Name       string `json:"name"`
+		Version    string `json:"version"`
+		Author     string `json:"author"`
+		Main       string `json:"main"`
+		APIVersion string `json:"api-version"`
+	}{
+		Name:       flagName,
+		Version:    flagVersion,
+		Author:     flagAuthor,
+		Main:       flagMain,
+		APIVersion: "1.15",
+	}
+
+	out, err := json.Marshal(&yml)
+	if err != nil {
+		log.Fatalf("marshal: %v", err)
+	}
+	err = ioutil.WriteFile(flagOutFile, out, 0644)
+	if err != nil {
+		log.Fatalf("WriteFile(%q): %v", out, err)
+	}
+}