krz/devianter
A DeviantArt guest API library for Go.
clone: git clone https://gitbay.org/krz/devianter.git
v0.2.0: misc.go · raw
1package devianter
2
3import (
4 "errors"
5 "log"
6 "math"
7 u "net/url"
8 "strconv"
9 "strings"
10)
11
12/* AVATARS AND EMOJIS */
13func AEmedia(name string, t rune) (string, error) {
14 // список всех возможных расширений
15 var extensions = [3]string{
16 ".jpg",
17 ".png",
18 ".gif",
19 }
20 // надо
21 name = strings.ToLower(name)
22
23 // построение ссылок. билдер потому что он быстрее обычного сложения строк.
24 var b strings.Builder
25 switch t {
26 case 'a':
27 b.WriteString("https://a.deviantart.net/avatars-big/")
28 b.WriteString(name[:1])
29 b.WriteString("/")
30 b.WriteString(name[1:2])
31 b.WriteString("/")
32 case 'e':
33 b.WriteString("https://e.deviantart.net/emoticons/")
34 b.WriteString(name[:1])
35 b.WriteString("/")
36 default:
37 log.Fatalln("Invalid type.\n- 'a' -- avatar;\n- 'e' -- emoji.")
38 }
39 b.WriteString(name)
40
41 // проверка ссылки на доступность
42 for x := 0; x < len(extensions); x++ {
43 req := request(b.String() + extensions[x])
44 if req.Status == 200 {
45 return req.Body, nil
46 }
47 }
48
49 return "", errors.New("user not exists")
50}
51
52/* DAILY DEVIATIONS */
53type DailyDeviations struct {
54 HasMore bool
55 Strips []struct {
56 Codename, Title string
57 TitleType string
58 Deviations []Deviation
59 }
60 Deviations []Deviation
61}
62
63func DailyDeviationsFunc(page int) (dd DailyDeviations) {
64 ujson("dabrowse/networkbar/rfy/deviations?page="+strconv.Itoa(page), &dd)
65 return
66}
67
68/* SEARCH */
69type Search struct {
70 Total int `json:"estTotal"`
71 Pages int // only for 'a' and 'g' scope.
72 HasMore bool
73 Results []Deviation `json:"deviations"`
74 ResultsGalleryTemp []Deviation `json:"results"`
75}
76
77func SearchFunc(query string, page int, scope rune, user ...string) (ss Search, e error) {
78 var url strings.Builder
79 e = nil
80
81 // о5 построение ссылок.
82 switch scope {
83 case 'a': // поиск артов по названию
84 url.WriteString("dabrowse/search/all?q=")
85 case 't': // поиск артов по тегам
86 url.WriteString("dabrowse/networkbar/tag/deviations?tag=")
87 case 'g': // поиск артов пользователя или группы
88 if user != nil {
89 url.WriteString("dashared/gallection/search?username=")
90 for _, a := range user {
91 url.WriteString(a)
92 }
93 url.WriteString("&type=gallery&order=most-recent&init=true&limit=50&q=")
94 } else {
95 e = errors.New("missing username (last argument)")
96 return
97 }
98 default:
99 log.Fatalln("Invalid type.\n- 'a' -- all;\n- 't' -- tag;\n- 'g' - gallery.")
100 }
101
102 url.WriteString(u.QueryEscape(query))
103 if scope != 'g' { // если область поиска не равна поиску по группам, то активируется этот код
104 url.WriteString("&page=")
105 } else { // иначе вместо страницы будет оффсет и страница умножится на 50
106 url.WriteString("&offset=")
107 page = 50 * page
108 }
109 url.WriteString(strconv.Itoa(page))
110
111 ujson(url.String(), &ss)
112
113 if scope == 'g' {
114 ss.Results = ss.ResultsGalleryTemp
115 }
116
117 // расчёт, сколько всего страниц по запросу. без токена 417 страниц - максимум
118 totalfloat := int(math.Round(float64(ss.Total / 25)))
119 for x := 0; x < totalfloat; x++ {
120 if x <= 417 {
121 ss.Pages = x
122 }
123 }
124
125 return
126}