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}