cli.go 4.2 KB

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