From 7f1ab1b73d1e7a0d8a730354bbc3136c5584fea3 Mon Sep 17 00:00:00 2001 From: lost+skunk Date: Sat, 6 Jul 2024 00:46:25 +0300 Subject: Реализация конфига MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/util.go | 257 +++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 186 insertions(+), 71 deletions(-) (limited to 'app/util.go') diff --git a/app/util.go b/app/util.go index 0d36fd8..9e1784d 100644 --- a/app/util.go +++ b/app/util.go @@ -1,11 +1,17 @@ package app import ( + "encoding/base64" "encoding/json" + "io" "net/http" + u "net/url" + "os" "strconv" "strings" + "syscall" "text/template" + "time" "git.macaw.me/skunky/devianter" ) @@ -19,11 +25,15 @@ func (s skunkyart) ExecuteTemplate(file string, data any) { wr(s.Writer, buf.String()) } -func (s skunkyart) UrlBuilder(strs ...string) string { +func UrlBuilder(strs ...string) string { var str strings.Builder - for _, x := range strs { + l := len(strs) + str.WriteString(CFG.BasePath) + for n, x := range strs { str.WriteString(x) - str.WriteString("/") + if n+1 < l && !(strs[n+1][0] == '?' || strs[n+1][0] == '&') && !(x[0] == '?' || x[0] == '&') { + str.WriteString("/") + } } return str.String() } @@ -31,10 +41,10 @@ func (s skunkyart) UrlBuilder(strs ...string) string { func (s skunkyart) ReturnHTTPError(status int) { s.Writer.WriteHeader(status) - // пострйока с помощью strings.Builder, потому что такой метод быстрее обычного сложения var msg strings.Builder - msg.WriteString(``) - msg.WriteString("

") + msg.WriteString(`

`) msg.WriteString(strconv.Itoa(status)) msg.WriteString(" - ") msg.WriteString(http.StatusText(status)) @@ -43,6 +53,15 @@ func (s skunkyart) ReturnHTTPError(status int) { wr(s.Writer, msg.String()) } +func (s skunkyart) ConvertDeviantArtUrlToSkunkyArt(url string) (output string) { + if len(url) > 32 && url[27:32] != "stash" { + url = url[27:] + toart := strings.Index(url, "/art/") + output = UrlBuilder("post", url[:toart], url[toart+5:]) + } + return +} + type text struct { TXT string from int @@ -200,80 +219,78 @@ func (s skunkyart) NavBase(c dlist) string { func (s skunkyart) DeviationList(devs []devianter.Deviation, content ...dlist) string { var list strings.Builder - if !s.atom { - list.WriteString(`
`) - } else { - list.WriteString(``) + if s.Atom && s.Page > 1 { + s.ReturnHTTPError(400) + return "" + } else if s.Atom { + list.WriteString(``) list.WriteString(`SkunkyArt`) // list.WriteString(``) + } else { + list.WriteString(`
`) } for _, data := range devs { - url := devianter.UrlFromMedia(data.Media) - if s.atom { - id := strconv.Itoa(data.ID) - list.WriteString(``) - list.WriteString(data.Author.Username) - list.WriteString(``) - list.WriteString(data.Title) - list.WriteString(``) - list.WriteString(id) - list.WriteString(``) - list.WriteString(data.PublishedTime.UTC().Format("Mon, 02 Jan 2006 15:04:05 -0700")) - list.WriteString(``) - list.WriteString(``) - list.WriteString(data.Title) - list.WriteString(`

`) - list.WriteString(ParseDescription(data.TextContent)) - list.WriteString(`

`) - } else { - list.WriteString(`") } } - if s.atom { + if s.Atom { list.WriteString("") s.Writer.Write([]byte(list.String())) return "" @@ -301,10 +318,10 @@ func (s skunkyart) ParseComments(c devianter.Comments) string { } cmmts.WriteString(`">

") return cmmts.String() } + +func (s skunkyart) ParseMedia(media devianter.Media) string { + url := devianter.UrlFromMedia(media) + if len(url) != 0 { + url = url[21:] + dot := strings.Index(url, ".") + + return UrlBuilder("media", "file", url[:dot], "/", url[dot+10:]) + } + return "" +} + +func (s skunkyart) DownloadAndSendMedia(subdomain, path string) { + var url strings.Builder + url.WriteString("https://images-wixmp-") + url.WriteString(subdomain) + url.WriteString(".wixmp.com/") + url.WriteString(path) + url.WriteString("?token=") + url.WriteString(s.Args.Get("token")) + + download := func() (body []byte, status int, headers http.Header) { + cli := &http.Client{} + if CFG.WixmpProxy != "" { + u, e := u.Parse(CFG.WixmpProxy) + err(e) + cli.Transport = &http.Transport{Proxy: http.ProxyURL(u)} + } + + req, e := http.NewRequest("GET", url.String(), nil) + err(e) + req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:123.0) Gecko/20100101 Firefox/123.0.0") + + resp, e := cli.Do(req) + err(e) + defer resp.Body.Close() + + b, e := io.ReadAll(resp.Body) + err(e) + return b, resp.StatusCode, resp.Header + } + + if CFG.Cache.Enabled { + os.Mkdir(CFG.Cache.Path, 0700) + fname := CFG.Cache.Path + "/" + base64.StdEncoding.EncodeToString([]byte(subdomain+path)) + file, e := os.Open(fname) + + if e != nil { + b, status, headers := download() + if status == 200 && headers["Content-Type"][0][:5] == "image" { + err(os.WriteFile(fname, b, 0700)) + s.Writer.Write(b) + } + } else { + file, e := io.ReadAll(file) + err(e) + s.Writer.Write(file) + } + } else if CFG.Proxy { + b, _, _ := download() + s.Writer.Write(b) + } else { + s.Writer.Write([]byte("Sorry, butt proxy on this instance disabled.")) + } +} + +func InitCacheSystem() { + c := &CFG.Cache + for { + dir, e := os.Open(c.Path) + err(e) + stat, e := dir.Stat() + err(e) + + dirnames, e := dir.Readdirnames(-1) + err(e) + for _, a := range dirnames { + a = c.Path + "/" + a + if c.Lifetime != 0 { + now := time.Now().UnixMilli() + + f, _ := os.Stat(a) + stat := f.Sys().(*syscall.Stat_t) + time := time.Unix(stat.Ctim.Unix()).UnixMilli() + + if time+c.Lifetime <= now { + os.RemoveAll(a) + } + } + if c.MaxSize != 0 && stat.Size() > c.MaxSize { + os.RemoveAll(a) + } + } + + dir.Close() + time.Sleep(time.Second) + } +} -- cgit v1.2.3