Commit 68248094e8

68248094e89b6af134147668a9add429b9a6fa77

parent: ed031b3530

Unsigned

lost+skunk <skunky@ebloid.ru> · 2024-07-04 08:26 UTC

Галерея, папки и группы

Layout: unified · split

app/router.go +26 −15
@@ -13,22 +13,34 @@ const addr string = "0.0.0.0:3003"
13 13
14// роутер 14// роутер
15func Router() { 15func Router() {
16 // расшифровка эндпоинта из урл 16 parsepath := func(path string) map[int]string {
17 endpoint := func(url string) (string, string) { 17 parsedpath := make(map[int]string)
18 if CFG.Base_uri != "" { 18 for x := 0; true; x++ {
19 url = strings.Replace(url, CFG.Base_uri, "/", 1) 19 slash := strings.Index(path, "/") + 1
20 content := path[:slash]
21 path = path[slash:]
22 if slash == 0 {
23 parsedpath[x] = path
24 break
25 }
26 parsedpath[x] = content[:slash-1]
20 } 27 }
28 return parsedpath
29 }
21 30
22 end := strings.Index(url[1:], "/") 31 next := func(path map[int]string, from int) (out string) {
23 if end == -1 { 32 for x, l := from, len(path)-1; x <= l; x++ {
24 return url[1:], "" 33 out += path[x]
34 if x != l {
35 out += "/"
36 }
25 } 37 }
26 return url[1 : end+1], url[end+2:] 38 return
27 } 39 }
28 40
29 // функция, что управляет всем 41 // функция, что управляет всем
30 handle := func(w http.ResponseWriter, r *http.Request) { 42 handle := func(w http.ResponseWriter, r *http.Request) {
31 e, url := endpoint(r.URL.Path) 43 path := parsepath(r.URL.Path)
32 var wr = io.WriteString 44 var wr = io.WriteString
33 open_n_send := func(name string) { 45 open_n_send := func(name string) {
34 f, e := os.ReadFile(name) 46 f, e := os.ReadFile(name)
@@ -50,14 +62,13 @@ func Router() {
50 skunky.Page = p 62 skunky.Page = p
51 63
52 // пути 64 // пути
53 switch e { 65 switch path[1] {
54 default: 66 default:
55 skunky.ReturnHTTPError(404) 67 skunky.ReturnHTTPError(404)
56 case "/", "": 68 case "":
57 open_n_send("html/index.htm") 69 open_n_send("html/index.htm")
58 case "post": 70 case "post":
59 slash := strings.Index(url, "/") 71 skunky.Deviation(path[2], path[3])
60 skunky.Deviation(url[:slash], url[slash+1:])
61 case "search": 72 case "search":
62 skunky.Search() 73 skunky.Search()
63 case "dd": 74 case "dd":
@@ -66,12 +77,12 @@ func Router() {
66 skunky.GRUser() 77 skunky.GRUser()
67 78
68 case "media": 79 case "media":
69 skunky.Emojitar(url) 80 skunky.Emojitar(path[2])
70 case "about": 81 case "about":
71 open_n_send("html/about.htm") 82 open_n_send("html/about.htm")
72 case "gui": 83 case "gui":
73 w.Header().Add("content-type", "text/css") 84 w.Header().Add("content-type", "text/css")
74 open_n_send(url) 85 open_n_send(next(path, 2))
75 } 86 }
76 } 87 }
77 88
app/util.go +13
@@ -19,6 +19,15 @@ func (s skunkyart) ExecuteTemplate(file string, data any) {
19 wr(s.Writer, buf.String()) 19 wr(s.Writer, buf.String())
20} 20}
21 21
22func (s skunkyart) UrlBuilder(strs ...string) string {
23 var str strings.Builder
24 for _, x := range strs {
25 str.WriteString(x)
26 str.WriteString("/")
27 }
28 return str.String()
29}
30
22func (s skunkyart) ReturnHTTPError(status int) { 31func (s skunkyart) ReturnHTTPError(status int) {
23 s.Writer.WriteHeader(status) 32 s.Writer.WriteHeader(status)
24 33
@@ -142,6 +151,10 @@ func (s skunkyart) NavBase(c dlist) string {
142 list.WriteString("&q=") 151 list.WriteString("&q=")
143 list.WriteString(s.Query) 152 list.WriteString(s.Query)
144 } 153 }
154 if f := s.Args.Get("folder"); f != "" {
155 list.WriteString("&folder=")
156 list.WriteString(f)
157 }
145 list.WriteString(`">`) 158 list.WriteString(`">`)
146 list.WriteString(msg) 159 list.WriteString(msg)
147 list.WriteString("</a> ") 160 list.WriteString("</a> ")
app/wraper.go +82 −27
@@ -1,7 +1,6 @@
1package app 1package app
2 2
3import ( 3import (
4 "fmt"
5 "io" 4 "io"
6 "net/http" 5 "net/http"
7 "net/url" 6 "net/url"
@@ -24,6 +23,8 @@ type skunkyart struct {
24 Templates struct { 23 Templates struct {
25 GroupUser struct { 24 GroupUser struct {
26 GR devianter.GRuser 25 GR devianter.GRuser
26 Admins string
27 Group bool
27 CreationDate string 28 CreationDate string
28 29
29 About struct { 30 About struct {
@@ -37,8 +38,9 @@ type skunkyart struct {
37 } 38 }
38 39
39 Gallery struct { 40 Gallery struct {
40 Pages int 41 Folders string
41 List string 42 Pages int
43 List string
42 } 44 }
43 } 45 }
44 Search struct { 46 Search struct {
@@ -61,19 +63,22 @@ func (s skunkyart) GRUser() {
61 63
62 switch s.Type { 64 switch s.Type {
63 case 'a': 65 case 'a':
64 if g := group.GR; !g.Owner.Group { 66 g := group.GR
65 for _, x := range g.Gruser.Page.Modules { 67 for _, x := range g.Gruser.Page.Modules {
66 switch x.Name { 68 switch x.Name {
67 case "about": 69 case "about", "group_about":
70 switch g.Owner.Group {
71 case true:
72 var about = &x.ModuleData.GroupAbout
73 group.Group = true
74 group.CreationDate = x.ModuleData.GroupAbout.FoundatedAt.UTC().String()
75 group.About.DescriptionFormatted = ParseDescription(about.Description)
76 case false:
68 group.About.A = x.ModuleData.About 77 group.About.A = x.ModuleData.About
69 var about = group.About.A 78 var about = &group.About.A
79 group.CreationDate = time.Unix(time.Now().Unix()-x.ModuleData.About.RegDate, 0).UTC().String()
80
70 group.About.DescriptionFormatted = ParseDescription(about.Description) 81 group.About.DescriptionFormatted = ParseDescription(about.Description)
71 group.About.Comments = s.ParseComments(devianter.CommentsFunc(
72 strconv.Itoa(group.GR.Gruser.ID),
73 "",
74 s.Page,
75 4,
76 ))
77 82
78 for _, val := range x.ModuleData.About.SocialLinks { 83 for _, val := range x.ModuleData.About.SocialLinks {
79 var social strings.Builder 84 var social strings.Builder
@@ -93,25 +98,76 @@ func (s skunkyart) GRUser() {
93 interest.WriteString("</b><br>") 98 interest.WriteString("</b><br>")
94 group.About.Interests += interest.String() 99 group.About.Interests += interest.String()
95 } 100 }
101 }
102 group.About.Comments = s.ParseComments(devianter.CommentsFunc(
103 strconv.Itoa(group.GR.Gruser.ID),
104 "",
105 s.Page,
106 4,
107 ))
96 108
97 if rd := x.ModuleData.About.RegDate; rd != 0 { 109 case "cover_deviation":
98 group.CreationDate = time.Unix(time.Now().Unix()-rd, 0).UTC().String() 110 group.About.BGMeta = x.ModuleData.CoverDeviation.Deviation
99 } 111 group.About.BG = devianter.UrlFromMedia(group.About.BGMeta.Media)
100 case "cover_deviation": 112 case "group_admins":
101 group.About.BGMeta = x.ModuleData.CoverDeviation.Deviation 113 var htm strings.Builder
102 group.About.BG = devianter.UrlFromMedia(group.About.BGMeta.Media) 114 for _, z := range x.ModuleData.GroupAdmins.Results {
115 htm.WriteString(`<p><img src="`)
116 htm.WriteString("/media/")
117 htm.WriteString(z.User.Username)
118 htm.WriteString("?type=a")
119 htm.WriteString(`"><a href="`)
120 htm.WriteString("/group_user?type=about&q=")
121 htm.WriteString(z.User.Username)
122 htm.WriteString(`">`)
123 htm.WriteString(z.User.Username)
124 htm.WriteString(`</a></p>`)
103 } 125 }
126 group.Admins += htm.String()
104 } 127 }
105 } else {
106 128
107 } 129 }
108 case 'g': 130 case 'g':
109 gallery := g.Gallery(s.Page) 131 folderid, _ := strconv.Atoi(s.Args.Get("folder"))
110 fmt.Println(gallery) 132 if s.Page == 0 {
111 for _, x := range gallery.Content.Gruser.Page.Modules { 133 s.Page++
112 group.Gallery.List = s.DeviationList(x.ModuleData.Folder.Deviations, dlist{ 134 }
113 Pages: x.ModuleData.Folder.Pages, 135
136 gallery := g.Gallery(s.Page, folderid)
137 if folderid > 0 {
138 group.Gallery.List = s.DeviationList(gallery.Content.Results, dlist{
139 More: gallery.Content.HasMore,
114 }) 140 })
141 } else {
142 for _, x := range gallery.Content.Gruser.Page.Modules {
143 if l := len(x.ModuleData.Folders.Results); l != 0 {
144 var folders strings.Builder
145 folders.WriteString(`<h3 class="folders">Folders: `)
146 for n, x := range x.ModuleData.Folders.Results {
147 folders.WriteString(`<a href="?folder=`)
148 folders.WriteString(strconv.Itoa(x.FolderId))
149 folders.WriteString("&q=")
150 folders.WriteString(s.Query)
151 folders.WriteString("&type=")
152 folders.WriteString(string(s.Type))
153 folders.WriteString(`">`)
154 folders.WriteString(x.Name)
155 folders.WriteString(`</a>`)
156 if n+1 < l {
157 folders.WriteString(" | ")
158 }
159 }
160 folders.WriteString("</h3>")
161 group.Gallery.Folders = folders.String()
162 }
163
164 if x.Name == "folder_deviations" {
165 group.Gallery.List = s.DeviationList(x.ModuleData.Folder.Deviations, dlist{
166 Pages: x.ModuleData.Folder.Pages,
167 More: x.ModuleData.Folder.HasMore,
168 })
169 }
170 }
115 } 171 }
116 default: 172 default:
117 s.ReturnHTTPError(400) 173 s.ReturnHTTPError(400)
@@ -193,7 +249,6 @@ func (s skunkyart) Emojitar(name string) {
193 ae, e := devianter.AEmedia(name, s.Type) 249 ae, e := devianter.AEmedia(name, s.Type)
194 if e != nil { 250 if e != nil {
195 s.ReturnHTTPError(404) 251 s.ReturnHTTPError(404)
196 println(e.Error())
197 } 252 }
198 wr(s.Writer, ae) 253 wr(s.Writer, ae)
199 } else { 254 } else {
css/skunky.css +1
@@ -13,6 +13,7 @@ a:hover {
13} 13}
14header h1 { 14header h1 {
15 padding-right: 0.2%; 15 padding-right: 0.2%;
16 padding-left: 0.2%;
16} 17}
17header form { 18header form {
18 align-self: center; 19 align-self: center;
html/gruser.htm +17 −4
@@ -19,12 +19,12 @@
19 <input type="gallery" name="q" placeholder="Search for ..." autocomplete="off" autocapitalize="none" spellcheck="false"> 19 <input type="gallery" name="q" placeholder="Search for ..." autocomplete="off" autocapitalize="none" spellcheck="false">
20 <input type="hidden" name="usr" value="{{.Templates.GroupUser.GR.Owner.Username}}"> 20 <input type="hidden" name="usr" value="{{.Templates.GroupUser.GR.Owner.Username}}">
21 <select name="type"> 21 <select name="type">
22 <option value="gallery">Gallery</option>
22 <option value="all">All</option> 23 <option value="all">All</option>
23 <option value="tag">Tag</option> 24 <option value="tag">Tag</option>
24 <option value="gallery">Gallery</option>
25 </select> 25 </select>
26 <button type="submit">Search!</button> 26 <button type="submit">Search!</button>
27 </form> 27 </form> <h1>| {{.Templates.GroupUser.GR.Owner.Username}}</h1>
28 </header> 28 </header>
29 {{if eq .Type 'a'}} 29 {{if eq .Type 'a'}}
30 {{if ne .Templates.GroupUser.About.BG ""}} 30 {{if ne .Templates.GroupUser.About.BG ""}}
@@ -42,12 +42,24 @@
42 [<span title="UID">{{.Templates.GroupUser.GR.Gruser.ID}}</span>] 42 [<span title="UID">{{.Templates.GroupUser.GR.Gruser.ID}}</span>]
43 [<span title="Registration date">{{.Templates.GroupUser.CreationDate}}</span>] 43 [<span title="Registration date">{{.Templates.GroupUser.CreationDate}}</span>]
44 {{if ne .Templates.GroupUser.GR.Extra.Tag ""}} 44 {{if ne .Templates.GroupUser.GR.Extra.Tag ""}}
45 <i title="User's Tag">"{{.Templates.GroupUser.GR.Extra.Tag}}"</i>{{end}} (<b>{{.Templates.GroupUser.About.A.Country}}</b>) 45 <i title="User's Tag">"{{.Templates.GroupUser.GR.Extra.Tag}}"</i>{{end}} {{if ne .Templates.GroupUser.About.A.Country ""}}
46 (<b>{{.Templates.GroupUser.About.A.Country}}</b>)
47 {{end}}
46 48
49 {{if .Templates.GroupUser.Group}}
50 <h3 id="stats"><a href="#stats">#</a> Statistics</h3>
51 <p>Watchers: <b>{{.Templates.GroupUser.GR.Extra.Stats.Watchers}}</b>; Pageviews: <b>{{.Templates.GroupUser.GR.Extra.Stats.Pageviews}}</b></b>
52 {{else}}
47 <h3 id="stats"><a href="#stats">#</a> Statistics</h3> 53 <h3 id="stats"><a href="#stats">#</a> Statistics</h3>
48 <p>Favourites: <b>{{.Templates.GroupUser.GR.Extra.Stats.Favourites}}</b>; Deviations: <b>{{.Templates.GroupUser.GR.Extra.Stats.Deviations}}</b>; Watchers: <b>{{.Templates.GroupUser.GR.Extra.Stats.Watchers}}</b> 54 <p>Favourites: <b>{{.Templates.GroupUser.GR.Extra.Stats.Favourites}}</b>; Deviations: <b>{{.Templates.GroupUser.GR.Extra.Stats.Deviations}}</b>; Watchers: <b>{{.Templates.GroupUser.GR.Extra.Stats.Watchers}}</b>
49 <p>Watching: <b>{{.Templates.GroupUser.GR.Extra.Stats.Watching}}</b>; Pageviews: <b>{{.Templates.GroupUser.GR.Extra.Stats.Pageviews}}</b>; Comments Made: <b>{{.Templates.GroupUser.GR.Extra.Stats.CommentsMade}}</b>; Friends: <b>{{.Templates.GroupUser.GR.Extra.Stats.Friends}}</b></p> 55 <p>Watching: <b>{{.Templates.GroupUser.GR.Extra.Stats.Watching}}</b>; Pageviews: <b>{{.Templates.GroupUser.GR.Extra.Stats.Pageviews}}</b>; Comments Made: <b>{{.Templates.GroupUser.GR.Extra.Stats.CommentsMade}}</b>; Friends: <b>{{.Templates.GroupUser.GR.Extra.Stats.Friends}}</b></p>
50 56 {{end}}
57
58 {{if ne .Templates.GroupUser.Admins ""}}
59 <h3 id="admins"><a href="#admins">#</a> Group admins</h3>
60 {{.Templates.GroupUser.Admins}}
61 {{end}}
62
51 {{if ne .Templates.GroupUser.About.Interests ""}} 63 {{if ne .Templates.GroupUser.About.Interests ""}}
52 <h3 id="interests"><a href="#interests">#</a> Interests</h3> 64 <h3 id="interests"><a href="#interests">#</a> Interests</h3>
53 {{.Templates.GroupUser.About.Interests}} 65 {{.Templates.GroupUser.About.Interests}}
@@ -68,6 +80,7 @@
68 {{.Templates.GroupUser.About.Comments}} 80 {{.Templates.GroupUser.About.Comments}}
69 {{end}} 81 {{end}}
70 {{else}} 82 {{else}}
83 {{.Templates.GroupUser.Gallery.Folders}}
71 {{.Templates.GroupUser.Gallery.List}} 84 {{.Templates.GroupUser.Gallery.List}}
72 {{end}} 85 {{end}}
73 </main> 86 </main>