krz/skunky-art

Alternative privacy frontend for DeviantArt.

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

v1.3.1: app/cli.go · raw

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