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 "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}