krz/skunky-art
Alternative privacy frontend for DeviantArt.
clone: git clone https://gitbay.org/krz/skunky-art.git
1package app
2
3import (
4 "encoding/json"
5 "math/rand"
6 "strings"
7
8 "git.macaw.me/skunky/devianter"
9)
10
11type API struct {
12 main *skunkyart
13}
14
15type info struct {
16 Version string `json:"version"`
17 Settings settingsParams `json:"settings"`
18}
19
20func (a API) Info() {
21 json, err := json.Marshal(info{
22 Version: a.main.Version,
23 Settings: settingsParams{
24 Nsfw: CFG.Nsfw,
25 Proxy: CFG.Proxy,
26 },
27 })
28 try(err)
29 a.main.Writer.Write(json)
30}
31
32func (a API) Error(description string, status int) {
33 a.main.Writer.WriteHeader(status)
34 var response strings.Builder
35 response.WriteString(`{"error":"`)
36 response.WriteString(description)
37 response.WriteString(`"}`)
38 wr(a.main.Writer, response.String())
39}
40
41func (a API) sendMedia(d *devianter.Deviation) {
42 mediaUrl, name := devianter.UrlFromMedia(d.Media)
43 a.main.SetFilename(name)
44
45 if len(mediaUrl) != 0 {
46 mediaUrl = mediaUrl[21:]
47 dot := strings.Index(mediaUrl, ".")
48 a.main.Writer.Header().Del("Content-Type")
49 a.main.DownloadAndSendMedia(mediaUrl[:dot], mediaUrl[dot+11:])
50 }
51}
52
53// TODO: сделать фильтры
54func (a API) Random() {
55 for attempt := 1; ; {
56 if attempt > 3 {
57 a.Error("Sorry, butt NSFW on this are disabled, and the instance failed to find a random art without NSFW", 500)
58 }
59
60 s, err, daErr := devianter.PerformSearch(string(rand.Intn(999)), rand.Intn(30), 'a')
61 try(err)
62 if daErr.RAW != nil {
63 continue
64 }
65
66 deviation := &s.Results[rand.Intn(len(s.Results))]
67
68 if deviation.NSFW && !CFG.Nsfw {
69 attempt++
70 continue
71 }
72
73 a.sendMedia(deviation)
74 return
75 }
76}