krz/skunky-art

Alternative privacy frontend for DeviantArt.

clone: git clone https://gitbay.org/krz/skunky-art.git

v1.3.2: app/cli.go · raw

  1package app
  2
  3import (
  4	"bufio"
  5	"bytes"
  6	"encoding/json"
  7	"html/template"
  8	"os"
  9	"time"
 10)
 11
 12func ExecuteCommandLineArguments() {
 13	var helpmsg = `SkunkyArt v{{.Version}} [{{.Description}}]
 14Usage:
 15	- [-c|--config] 	| path to config
 16	- [-a|--add-instance]	| generates 'instances.json' and 'INSTANCES.md' files with ur instance
 17	- [-h|--help]		| returns this message
 18Example:
 19	./skunkyart -c config.json
 20Copyright lost+skunk, X11. https://git.macaw.me/skunky/skunkyart/src/tag/v{{.Version}}`
 21
 22	a := os.Args[1:]
 23	for n, x := range a {
 24		switch x {
 25		case "-c", "--config":
 26			if len(a) >= 2 {
 27				CFG.cfg = a[n+1]
 28			} else {
 29				exit("Not enought arguments", 1)
 30			}
 31		case "-h", "--help":
 32			var buf bytes.Buffer
 33			t := template.New("help")
 34			t.Parse(helpmsg)
 35			t.Execute(&buf, &Release)
 36			exit(buf.String(), 0)
 37		case "-a", "--add-instance":
 38			addInstance()
 39		}
 40	}
 41}
 42
 43type settingsUrls struct {
 44	I2P      string `json:"i2p,omitempty"`
 45	Ygg      string `json:"ygg,omitempty"`
 46	Tor      string `json:"tor,omitempty"`
 47	Clearnet string `json:"clearnet,omitempty"`
 48}
 49
 50type settingsParams struct {
 51	Nsfw  bool `json:"nsfw"`
 52	Proxy bool `json:"proxy"`
 53}
 54
 55type settings struct {
 56	Title       string         `json:"title"`
 57	Country     string         `json:"country"`
 58	ModifiedSrc string         `json:"modified-src,omitempty"`
 59	Urls        settingsUrls   `json:"urls"`
 60	Settings    settingsParams `json:"settings"`
 61}
 62
 63func addInstance() {
 64	prompt := func(txt string, necessary bool) string {
 65		input := bufio.NewScanner(os.Stdin)
 66		for {
 67			print(txt)
 68			print(": ")
 69			input.Scan()
 70
 71			if i := input.Text(); necessary && i == "" {
 72				println("Please specify the", txt)
 73			} else {
 74				return i
 75			}
 76		}
 77	}
 78
 79	var settingsVar struct {
 80		Instances []settings `json:"instances"`
 81	}
 82	instancesJson, err := os.OpenFile("instances.json", os.O_CREATE|os.O_WRONLY, 0644)
 83	try(err)
 84	defer instancesJson.Close()
 85
 86	instancesFile, err := os.OpenFile("INSTANCES.md", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
 87	try(err)
 88	defer instancesFile.Close()
 89
 90	for {
 91		if string(instances) == "" {
 92			print("\rDownloading instance list...")
 93		} else {
 94			println("\r\033[2KDownloaded!")
 95			try(json.Unmarshal(instances, &settingsVar))
 96
 97			settingsVar.Instances = append(settingsVar.Instances, settings{
 98				Title:       prompt("Title", true),
 99				Country:     prompt("Country", true),
100				ModifiedSrc: prompt("Link to modified sources", false),
101				Settings: settingsParams{
102					Nsfw:  CFG.Nsfw,
103					Proxy: CFG.Proxy,
104				},
105				Urls: settingsUrls{
106					Clearnet: prompt("Clearnet link", false),
107					Ygg:      prompt("Yggdrasil link", false),
108					Tor:      prompt("Onion link", false),
109					I2P:      prompt("I2P link", false),
110				},
111			})
112
113			j, err := json.MarshalIndent(&settingsVar, "", "    ")
114			try(err)
115
116			instancesJson.Write(j)
117
118			settingsVar := &settingsVar.Instances[len(settingsVar.Instances)-1]
119			var mdstr bytes.Buffer
120
121			mdbuilder := func(yes bool, link string, title string) {
122				switch {
123				case yes && (title != "" && link != ""):
124					mdstr.WriteString("[")
125					mdstr.WriteString(title)
126					mdstr.WriteString("](")
127					mdstr.WriteString(link)
128					mdstr.WriteString(")")
129				case yes && link != "":
130					mdstr.WriteString("[Yes](")
131					mdstr.WriteString(link)
132					mdstr.WriteString(")")
133				case yes:
134					mdstr.WriteString("Yes")
135				default:
136					mdstr.WriteString("No")
137				}
138				mdstr.WriteString("|")
139			}
140
141			mdstr.WriteString("\n|")
142			mdbuilder(settingsVar.Urls.Clearnet != "", settingsVar.Urls.Clearnet, settingsVar.Title)
143
144			urls := []string{settingsVar.Urls.Ygg, settingsVar.Urls.I2P, settingsVar.Urls.Tor}
145			for i, l := 0, len(urls); i < l; i++ {
146				url := urls[i]
147				mdbuilder(url != "", url, "")
148			}
149
150			settings := []bool{settingsVar.Settings.Nsfw, settingsVar.Settings.Proxy}
151			for i, l := 0, len(settings); i < l; i++ {
152				mdbuilder(settings[i], "", "")
153			}
154
155			mdbuilder(settingsVar.ModifiedSrc != "", settingsVar.ModifiedSrc, "")
156
157			mdstr.WriteString(settingsVar.Country)
158			mdstr.WriteString("|")
159
160			instancesFile.Write(mdstr.Bytes())
161			break
162		}
163		time.Sleep(500 * time.Millisecond)
164	}
165	exit("Done! Now add the files 'instances.json' and 'INSTANCES.md' to the 'master' branch in the repository https://git.macaw.me/skunky/SkunkyArt", 0)
166}