krz/skunky-art
Alternative privacy frontend for DeviantArt.
clone: git clone https://gitbay.org/krz/skunky-art.git
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}