krz/skunky-art
Alternative privacy frontend for DeviantArt.
clone: git clone https://gitbay.org/krz/skunky-art.git
1package app
2
3import (
4 "io"
5 "net/http"
6 u "net/url"
7 "strconv"
8 "strings"
9)
10
11var Host string
12
13func Router() {
14 parsepath := func(path string) map[int]string {
15 if l := len(CFG.BasePath); len(path) > l {
16 path = path[l-1:]
17 } else {
18 path = "/"
19 }
20
21 parsedpath := make(map[int]string)
22 for x := 0; true; x++ {
23 slash := strings.Index(path, "/") + 1
24 content := path[:slash]
25 path = path[slash:]
26 if slash == 0 {
27 parsedpath[x] = path
28 break
29 }
30 parsedpath[x] = content[:slash-1]
31 }
32 return parsedpath
33 }
34
35 next := func(path map[int]string, from int) (out string) {
36 for x, l := from, len(path)-1; x <= l; x++ {
37 out += path[x]
38 if x != l {
39 out += "/"
40 }
41 }
42 return
43 }
44
45 // функция, что управляет всем
46 handle := func(w http.ResponseWriter, r *http.Request) {
47 if h := r.Header["Scheme"]; len(h) != 0 && h[0] == "https" {
48 Host = h[0] + "://" + r.Host
49 } else {
50 Host = "http://" + r.Host
51 }
52
53 path := parsepath(r.URL.Path)
54 // структура с функциями
55 var skunky skunkyart
56 skunky.Writer = w
57 skunky.Args = r.URL.Query()
58 skunky.BasePath = CFG.BasePath
59
60 arg := skunky.Args.Get
61 skunky.QueryRaw = arg("q")
62 skunky.Query = u.QueryEscape(skunky.QueryRaw)
63
64 if t := arg("type"); len(t) > 0 {
65 skunky.Type = rune(t[0])
66 }
67 p, _ := strconv.Atoi(arg("p"))
68 skunky.Page = p
69
70 if arg("atom") == "true" {
71 skunky.Atom = true
72 }
73
74 // пути
75 switch path[1] {
76 default:
77 skunky.ReturnHTTPError(404)
78 case "":
79 skunky.ExecuteTemplate("index.htm", &CFG.BasePath)
80 case "post":
81 skunky.Deviation(path[2], path[3])
82 case "search":
83 skunky.Search()
84 case "dd":
85 skunky.DD()
86 case "group_user":
87 skunky.GRUser()
88
89 case "media":
90 switch path[2] {
91 case "file":
92 skunky.DownloadAndSendMedia(path[3], next(path, 4))
93 case "emojitar":
94 skunky.Emojitar(path[3])
95 }
96 case "about":
97 skunky.About()
98 case "stylesheet":
99 w.Header().Add("content-type", "text/css")
100 io.WriteString(w, Templates["skunky.css"])
101 }
102 }
103
104 http.HandleFunc("/", handle)
105 try_with_exitstatus(http.ListenAndServe(CFG.Listen, nil), 1)
106}