Files
nostr-webhost/cli/cmd/server/server.go
2023-08-21 10:25:27 +09:00

81 lines
1.9 KiB
Go

package server
import (
"context"
"encoding/base64"
"net/http"
"github.com/gin-gonic/gin"
"github.com/nbd-wtf/go-nostr"
"github.com/studiokaiji/nostr-webhost/cmd/consts"
"github.com/studiokaiji/nostr-webhost/cmd/relays"
)
func Start(port string) {
ctx := context.Background()
allRelays, err := relays.GetAllRelays()
if err != nil {
panic(err)
}
pool := nostr.NewSimplePool(ctx)
r := gin.Default()
r.GET("/e/:idHex", func(ctx *gin.Context) {
// IDを取得
id := ctx.Param("idHex")
// Poolからデータを取得する
ev := pool.QuerySingle(ctx, allRelays, nostr.Filter{
Kinds: []int{consts.KindWebhostHTML, consts.KindWebhostCSS, consts.KindWebhostJS, consts.KindWebhostPicture},
IDs: []string{id},
})
if ev != nil {
switch ev.Kind {
case consts.KindWebhostHTML:
ctx.Data(http.StatusOK, "text/html", []byte(ev.Content))
case consts.KindWebhostCSS:
ctx.Data(http.StatusOK, "text/css", []byte(ev.Content))
case consts.KindWebhostJS:
ctx.Data(http.StatusOK, "text/javascript", []byte(ev.Content))
case consts.KindWebhostPicture:
{
eTag := ev.Tags.GetFirst([]string{"e"})
mTag := ev.Tags.GetFirst([]string{"e"})
if eTag == nil || mTag == nil {
ctx.String(http.StatusBadRequest, http.StatusText((http.StatusBadRequest)))
return
}
evData := pool.QuerySingle(ctx, allRelays, nostr.Filter{
IDs: []string{eTag.Value()},
})
if evData == nil {
ctx.String(http.StatusNotFound, http.StatusText(http.StatusNotFound))
return
}
data, err := base64.StdEncoding.DecodeString(evData.Content)
if err != nil {
ctx.String(http.StatusBadRequest, http.StatusText((http.StatusBadRequest)))
return
}
ctx.Data(http.StatusOK, mTag.Value(), data)
}
default:
ctx.String(http.StatusNotFound, http.StatusText(http.StatusNotFound))
}
}
return
})
r.Run(":" + port)
}