Поиск по группам
This commit is contained in:
parent
e07e1a25b2
commit
0f528ee9fa
40
app/util.go
40
app/util.go
@ -66,12 +66,35 @@ func (s skunkyart) ConvertDeviantArtUrlToSkunkyArt(url string) (output string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func BuildUserPlate(name string) string {
|
||||||
|
var htm strings.Builder
|
||||||
|
htm.WriteString(`<div class="user-plate"><img src="`)
|
||||||
|
htm.WriteString(UrlBuilder("media", "emojitar", name, "?type=a"))
|
||||||
|
htm.WriteString(`"><a href="`)
|
||||||
|
htm.WriteString(UrlBuilder("group_user", "?type=about&q=", name))
|
||||||
|
htm.WriteString(`">`)
|
||||||
|
htm.WriteString(name)
|
||||||
|
htm.WriteString(`</a></div>`)
|
||||||
|
return htm.String()
|
||||||
|
}
|
||||||
|
|
||||||
type text struct {
|
type text struct {
|
||||||
TXT string
|
TXT string
|
||||||
from int
|
from int
|
||||||
to 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 {
|
func ParseDescription(dscr devianter.Text) string {
|
||||||
var parseddescription strings.Builder
|
var parseddescription strings.Builder
|
||||||
TagBuilder := func(tag string, content string) string {
|
TagBuilder := func(tag string, content string) string {
|
||||||
@ -182,20 +205,7 @@ func ParseDescription(dscr devianter.Text) string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if dl != 0 {
|
} else if dl != 0 {
|
||||||
tagval := func(t *html.Tokenizer) string {
|
for tt := html.NewTokenizer(strings.NewReader(dscr.Html.Markup)); ; {
|
||||||
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 {
|
|
||||||
t := tt.Next()
|
t := tt.Next()
|
||||||
switch t {
|
switch t {
|
||||||
case html.ErrorToken:
|
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)
|
prevrev("| Next =>", p+1, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.macaw.me/skunky/devianter"
|
"git.macaw.me/skunky/devianter"
|
||||||
|
"golang.org/x/net/html"
|
||||||
)
|
)
|
||||||
|
|
||||||
var wr = io.WriteString
|
var wr = io.WriteString
|
||||||
@ -131,13 +132,7 @@ func (s skunkyart) GRUser() {
|
|||||||
case "group_admins":
|
case "group_admins":
|
||||||
var htm strings.Builder
|
var htm strings.Builder
|
||||||
for _, z := range x.ModuleData.GroupAdmins.Results {
|
for _, z := range x.ModuleData.GroupAdmins.Results {
|
||||||
htm.WriteString(`<div class="admin"><img src="`)
|
htm.WriteString(BuildUserPlate(z.User.Username))
|
||||||
htm.WriteString(UrlBuilder("media", "emojitar", z.User.Username, "?type=a"))
|
|
||||||
htm.WriteString(`"><a href="`)
|
|
||||||
htm.WriteString(UrlBuilder("group_user", "?type=about&q=", z.User.Username))
|
|
||||||
htm.WriteString(`">`)
|
|
||||||
htm.WriteString(z.User.Username)
|
|
||||||
htm.WriteString(`</a></div>`)
|
|
||||||
}
|
}
|
||||||
group.Admins += htm.String()
|
group.Admins += htm.String()
|
||||||
}
|
}
|
||||||
@ -270,15 +265,62 @@ func (s skunkyart) Search() {
|
|||||||
ss.Content, e = devianter.SearchFunc(s.Query, s.Page, s.Type)
|
ss.Content, e = devianter.SearchFunc(s.Query, s.Page, s.Type)
|
||||||
case 'g':
|
case 'g':
|
||||||
ss.Content, e = devianter.SearchFunc(s.Query, s.Page, s.Type, s.Args.Get("usr"))
|
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 += `<div class="content plates">`
|
||||||
|
for x := 0; x < len(usernames); x++ {
|
||||||
|
ss.List += BuildUserPlate(usernames[x])
|
||||||
|
}
|
||||||
|
ss.List += `</div>`
|
||||||
|
ss.List += s.NavBase(dlist{})
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
s.ReturnHTTPError(400)
|
s.ReturnHTTPError(400)
|
||||||
}
|
}
|
||||||
err(e)
|
err(e)
|
||||||
|
|
||||||
ss.List = s.DeviationList(ss.Content.Results, dlist{
|
if s.Type != 'r' {
|
||||||
Pages: ss.Content.Pages,
|
ss.List = s.DeviationList(ss.Content.Results, dlist{
|
||||||
More: ss.Content.HasMore,
|
Pages: ss.Content.Pages,
|
||||||
})
|
More: ss.Content.HasMore,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
s.ExecuteTemplate("html/search.htm", &s)
|
s.ExecuteTemplate("html/search.htm", &s)
|
||||||
}
|
}
|
||||||
|
@ -82,7 +82,7 @@ form input, button, select {
|
|||||||
border: 3px solid #4d27d6;
|
border: 3px solid #4d27d6;
|
||||||
transition: 400ms;
|
transition: 400ms;
|
||||||
}
|
}
|
||||||
.block img, .admins .admin img{
|
.block img, .plates .user-plate img{
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
.block p {
|
.block p {
|
||||||
@ -103,16 +103,20 @@ form input, button, select {
|
|||||||
background-color: #060820;
|
background-color: #060820;
|
||||||
border: 3px solid #060820;
|
border: 3px solid #060820;
|
||||||
}
|
}
|
||||||
.admins {
|
.plates {
|
||||||
display: flex
|
display: flex
|
||||||
}
|
}
|
||||||
.admins .admin {
|
.admins .user-plate {
|
||||||
margin-left: 1%;
|
width: 5%;
|
||||||
background-color: #011522;
|
background-color: #011522;
|
||||||
|
}
|
||||||
|
.plates .user-plate {
|
||||||
|
margin-left: 1%;
|
||||||
|
background-color: #091f19;
|
||||||
padding: 3px;
|
padding: 3px;
|
||||||
word-break: break-all;
|
word-break: break-all;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
width: 5%;
|
max-width: 15%;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (orientation: portrait) {
|
@media screen and (orientation: portrait) {
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
<select name="type">
|
<select name="type">
|
||||||
<option value="all">All</option>
|
<option value="all">All</option>
|
||||||
<option value="tag">Tag</option>
|
<option value="tag">Tag</option>
|
||||||
|
<option value="r">Groups</option>
|
||||||
</select>
|
</select>
|
||||||
<button type="submit">Search!</button>
|
<button type="submit">Search!</button>
|
||||||
</form>
|
</form>
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
<select name="type">
|
<select name="type">
|
||||||
<option value="all">All</option>
|
<option value="all">All</option>
|
||||||
<option value="tag">Tag</option>
|
<option value="tag">Tag</option>
|
||||||
|
<option value="r">Groups</option>
|
||||||
</select>
|
</select>
|
||||||
<button type="submit">Search!</button>
|
<button type="submit">Search!</button>
|
||||||
</form>
|
</form>
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
<option value="gallery">Gallery</option>
|
<option value="gallery">Gallery</option>
|
||||||
<option value="all">All</option>
|
<option value="all">All</option>
|
||||||
<option value="tag">Tag</option>
|
<option value="tag">Tag</option>
|
||||||
|
<option value="r">Groups</option>
|
||||||
</select>
|
</select>
|
||||||
<button type="submit">Search!</button>
|
<button type="submit">Search!</button>
|
||||||
</form> <h1>| {{.Templates.GroupUser.GR.Owner.Username}}</h1>
|
</form> <h1>| {{.Templates.GroupUser.GR.Owner.Username}}</h1>
|
||||||
@ -57,7 +58,7 @@
|
|||||||
|
|
||||||
{{if ne .Templates.GroupUser.Admins ""}}
|
{{if ne .Templates.GroupUser.Admins ""}}
|
||||||
<h3 id="admins"><a href="#admins">#</a> Group admins</h3>
|
<h3 id="admins"><a href="#admins">#</a> Group admins</h3>
|
||||||
<div class="admins">
|
<div class="plates admins">
|
||||||
{{.Templates.GroupUser.Admins}}
|
{{.Templates.GroupUser.Admins}}
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
<select name="type">
|
<select name="type">
|
||||||
<option value="all">All</option>
|
<option value="all">All</option>
|
||||||
<option value="tag">Tag</option>
|
<option value="tag">Tag</option>
|
||||||
|
<option value="r">Groups</option>
|
||||||
</select>
|
</select>
|
||||||
<button type="submit">Search!</button>
|
<button type="submit">Search!</button>
|
||||||
</form>
|
</form>
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
<select name="type">
|
<select name="type">
|
||||||
<option value="all">All</option>
|
<option value="all">All</option>
|
||||||
<option value="tag">Tag</option>
|
<option value="tag">Tag</option>
|
||||||
|
<option value="r">Groups</option>
|
||||||
</select>
|
</select>
|
||||||
<button type="submit">Search!</button>
|
<button type="submit">Search!</button>
|
||||||
</form>
|
</form>
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
<select name="type">
|
<select name="type">
|
||||||
<option value="all">All</option>
|
<option value="all">All</option>
|
||||||
<option value="tag">Tag</option>
|
<option value="tag">Tag</option>
|
||||||
|
<option value="r">Groups</option>
|
||||||
</select>
|
</select>
|
||||||
<button type="submit">Search!</button>
|
<button type="submit">Search!</button>
|
||||||
</form>
|
</form>
|
||||||
|
Loading…
Reference in New Issue
Block a user