diff --git a/app/util.go b/app/util.go index eb1c7ce..645ceb4 100644 --- a/app/util.go +++ b/app/util.go @@ -66,12 +66,35 @@ func (s skunkyart) ConvertDeviantArtUrlToSkunkyArt(url string) (output string) { return } +func BuildUserPlate(name string) string { + var htm strings.Builder + htm.WriteString(`
`) + return htm.String() +} + type text struct { TXT string from int to int } +func tagval(t *html.Tokenizer) string { + for tt := t.Next(); ; { + switch tt { + default: + return "" + case html.TextToken: + return string(t.Text()) + } + } +} + func ParseDescription(dscr devianter.Text) string { var parseddescription strings.Builder TagBuilder := func(tag string, content string) string { @@ -182,20 +205,7 @@ func ParseDescription(dscr devianter.Text) string { } } } else if dl != 0 { - tagval := func(t *html.Tokenizer) string { - for { - tt := t.Next() - switch tt { - case html.ErrorToken: - return "" - case html.TextToken: - return string(t.Text()) - } - } - } - - tt := html.NewTokenizer(strings.NewReader(dscr.Html.Markup)) - for { + for tt := html.NewTokenizer(strings.NewReader(dscr.Html.Markup)); ; { t := tt.Next() switch t { case html.ErrorToken: @@ -314,7 +324,7 @@ func (s skunkyart) NavBase(c dlist) string { } // вперёд-назад - if c.More { + if p != 417 || c.More { prevrev("| Next =>", p+1, false) } diff --git a/app/wrapper.go b/app/wrapper.go index 0340aed..0303c6a 100644 --- a/app/wrapper.go +++ b/app/wrapper.go @@ -10,6 +10,7 @@ import ( "time" "git.macaw.me/skunky/devianter" + "golang.org/x/net/html" ) var wr = io.WriteString @@ -131,13 +132,7 @@ func (s skunkyart) GRUser() { case "group_admins": var htm strings.Builder for _, z := range x.ModuleData.GroupAdmins.Results { - htm.WriteString(``) + htm.WriteString(BuildUserPlate(z.User.Username)) } group.Admins += htm.String() } @@ -270,15 +265,62 @@ func (s skunkyart) Search() { ss.Content, e = devianter.SearchFunc(s.Query, s.Page, s.Type) case 'g': ss.Content, e = devianter.SearchFunc(s.Query, s.Page, s.Type, s.Args.Get("usr")) + case 'r': // скраппер, поскольку девиантартовцы зажопили гостевое API для поиска групп + var ( + usernames = make(map[int]string) + url strings.Builder + num int + ) + + s.Page++ + + url.WriteString("https://www.deviantart.com/groups/?q=") + url.WriteString(s.Query) + if s.Page > 1 { + url.WriteString("&offset=") + url.WriteString(strconv.Itoa(10 * s.Page)) + } + + r, err := http.Get(url.String()) + if err != nil { + s.ReturnHTTPError(502) + } + defer r.Body.Close() + + for z := html.NewTokenizer(r.Body); ; { + if n, token := z.Next(), z.Token(); n == html.StartTagToken && token.Data == "a" { + for _, x := range token.Attr { + if x.Key == "class" && x.Val == "u regular username" { + usernames[num] = tagval(z) + num++ + } + } + } else if n == 0 { + break + } else { + continue + } + } + + if l := len(usernames); l != 0 { + ss.List += `