This commit is contained in:
parent
8bbccfcfea
commit
5e1b9b7e60
3 changed files with 74 additions and 2 deletions
1
go.mod
1
go.mod
|
@ -5,6 +5,7 @@ go 1.18
|
||||||
require (
|
require (
|
||||||
git.sr.ht/~adnano/go-gemini v0.2.3
|
git.sr.ht/~adnano/go-gemini v0.2.3
|
||||||
github.com/flosch/pongo2/v6 v6.0.0
|
github.com/flosch/pongo2/v6 v6.0.0
|
||||||
|
github.com/gorilla/feeds v1.1.1
|
||||||
google.golang.org/grpc v1.48.0
|
google.golang.org/grpc v1.48.0
|
||||||
google.golang.org/protobuf v1.28.1
|
google.golang.org/protobuf v1.28.1
|
||||||
)
|
)
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -48,11 +48,11 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
|
||||||
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
|
github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
|
||||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/gorilla/feeds v1.1.1 h1:HwKXxqzcRNg9to+BbvJog4+f3s/xzvtZXICcQGutYfY=
|
||||||
|
github.com/gorilla/feeds v1.1.1/go.mod h1:Nk0jZrvPFZX1OBe5NPiddPw7CfwF6Q9eqzaBbaightA=
|
||||||
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
|
||||||
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
|
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||||
github.com/n0x1m/md2gmi v1.0.0 h1:T4FTIjojSutOvyh7okIO7N59sk7KD9XyQMx35JX5jjA=
|
|
||||||
github.com/n0x1m/md2gmi v1.0.0/go.mod h1:q5iY7/I5QlC5bUrqmkXVA2FR2HOB9+PmqDhpCNHF/vc=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
|
||||||
|
|
71
main.go
71
main.go
|
@ -13,6 +13,7 @@ import (
|
||||||
"git.sr.ht/~adnano/go-gemini"
|
"git.sr.ht/~adnano/go-gemini"
|
||||||
"git.sr.ht/~adnano/go-gemini/certificate"
|
"git.sr.ht/~adnano/go-gemini/certificate"
|
||||||
"github.com/flosch/pongo2/v6"
|
"github.com/flosch/pongo2/v6"
|
||||||
|
"github.com/gorilla/feeds"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -64,6 +65,8 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func processRebuild(ctx context.Context, w gemini.ResponseWriter, r *gemini.Request) {
|
func processRebuild(ctx context.Context, w gemini.ResponseWriter, r *gemini.Request) {
|
||||||
|
log.Println("REBUILD")
|
||||||
|
|
||||||
q, err := gemini.QueryUnescape(r.URL.RawQuery)
|
q, err := gemini.QueryUnescape(r.URL.RawQuery)
|
||||||
if err != nil || q != key {
|
if err != nil || q != key {
|
||||||
w.WriteHeader(gemini.StatusServerUnavailable, "Don't wake up the dragons :-*")
|
w.WriteHeader(gemini.StatusServerUnavailable, "Don't wake up the dragons :-*")
|
||||||
|
@ -86,6 +89,7 @@ func processRebuild(ctx context.Context, w gemini.ResponseWriter, r *gemini.Requ
|
||||||
if err != nil {
|
if err != nil {
|
||||||
w.WriteHeader(gemini.StatusTemporaryFailure, "Internal server error")
|
w.WriteHeader(gemini.StatusTemporaryFailure, "Internal server error")
|
||||||
}
|
}
|
||||||
|
log.Println("REBUILD: success")
|
||||||
} else {
|
} else {
|
||||||
w.WriteHeader(gemini.StatusNotFound, "Out of space")
|
w.WriteHeader(gemini.StatusNotFound, "Out of space")
|
||||||
}
|
}
|
||||||
|
@ -121,6 +125,8 @@ func process(_ context.Context, w gemini.ResponseWriter, r *gemini.Request) {
|
||||||
w.WriteHeader(gemini.StatusPermanentRedirect, "/sgs")
|
w.WriteHeader(gemini.StatusPermanentRedirect, "/sgs")
|
||||||
case regexp.MustCompile(`^/(sgs|en)/?$`).MatchString(r.URL.Path):
|
case regexp.MustCompile(`^/(sgs|en)/?$`).MatchString(r.URL.Path):
|
||||||
renderIndex(lang, w, client)
|
renderIndex(lang, w, client)
|
||||||
|
case regexp.MustCompile(`^/(sgs|en)/atom.xml$`).MatchString(r.URL.Path):
|
||||||
|
renderFeed(lang, w, r, client)
|
||||||
case regexp.MustCompile(`^/(sgs|en)/a/?$`).MatchString(r.URL.Path):
|
case regexp.MustCompile(`^/(sgs|en)/a/?$`).MatchString(r.URL.Path):
|
||||||
renderAbout(lang, w)
|
renderAbout(lang, w)
|
||||||
case regexp.MustCompile(`^/(sgs|en)/s/?$`).MatchString(r.URL.Path):
|
case regexp.MustCompile(`^/(sgs|en)/s/?$`).MatchString(r.URL.Path):
|
||||||
|
@ -168,6 +174,71 @@ func renderIndex(lang string, w gemini.ResponseWriter, client TreeManagerClient)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func renderFeed(lang string, w gemini.ResponseWriter, r *gemini.Request, client TreeManagerClient) {
|
||||||
|
langFilter := TreeRequest_Filter{Key: "lang", Value: lang}
|
||||||
|
filters := []*TreeRequest_Filter{&langFilter}
|
||||||
|
|
||||||
|
path := ""
|
||||||
|
tr := TreeRequest{Path: &path, Filter: filters}
|
||||||
|
|
||||||
|
tree, err := client.GetSummery(context.Background(), &tr)
|
||||||
|
if err != nil {
|
||||||
|
w.WriteHeader(gemini.StatusTemporaryFailure, "Internal server error")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
w.SetMediaType("application/atom+xml")
|
||||||
|
now := time.Now()
|
||||||
|
language := "Samogitian"
|
||||||
|
if lang == "en" {
|
||||||
|
language = "English"
|
||||||
|
}
|
||||||
|
feed := &feeds.Feed{
|
||||||
|
Title: "\U0001F31B Arna alkierios [" + lang + "]",
|
||||||
|
Link: &feeds.Link{Href: "gemini://arns.lt/" + lang},
|
||||||
|
Description: "personal gemini capsule by Arns Udovič [" + language + " version]",
|
||||||
|
Author: &feeds.Author{Name: "Arns Udovič", Email: "zordsdavini@arns.lt"},
|
||||||
|
Created: now,
|
||||||
|
}
|
||||||
|
for _, file := range GetLastFiles(tree.Files) {
|
||||||
|
created, err := time.Parse("2006-01-02", file.Created)
|
||||||
|
if err != nil {
|
||||||
|
created = time.Now()
|
||||||
|
}
|
||||||
|
feed.Add(
|
||||||
|
&feeds.Item{
|
||||||
|
Title: file.Description,
|
||||||
|
Link: &feeds.Link{Href: fmt.Sprintf("gemini://%s/%s/f%s/%s/%s",
|
||||||
|
r.URL.Host,
|
||||||
|
lang,
|
||||||
|
file.CategoryPath(),
|
||||||
|
file.Id,
|
||||||
|
file.GmiName(),
|
||||||
|
)},
|
||||||
|
Description: fmt.Sprintf("%s %s [%s]",
|
||||||
|
file.Description,
|
||||||
|
file.CategoryPath(),
|
||||||
|
strings.Join(file.Tags, ","),
|
||||||
|
),
|
||||||
|
Author: &feeds.Author{Name: "Arns Udovič", Email: "zordsdavini@arns.lt"},
|
||||||
|
Created: created,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
atom, err := feed.ToAtom()
|
||||||
|
if err != nil {
|
||||||
|
w.WriteHeader(gemini.StatusTemporaryFailure, "Internal server error")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = w.Write([]byte(atom))
|
||||||
|
if err != nil {
|
||||||
|
w.WriteHeader(gemini.StatusTemporaryFailure, "Internal server error")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func renderAbout(lang string, w gemini.ResponseWriter) {
|
func renderAbout(lang string, w gemini.ResponseWriter) {
|
||||||
w.SetMediaType("text/gemini")
|
w.SetMediaType("text/gemini")
|
||||||
tpl := pongo2.Must(pongo2.FromFile(fmt.Sprintf("templates/%s/about.gmi", lang)))
|
tpl := pongo2.Must(pongo2.FromFile(fmt.Sprintf("templates/%s/about.gmi", lang)))
|
||||||
|
|
Loading…
Reference in a new issue