krz/skunky-art

Alternative privacy frontend for DeviantArt.

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

v1.3.2: app/api.go · raw

 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}