mirror of
https://github.com/ultrasn0w/huso.git
synced 2025-12-13 18:49:53 +01:00
Users + Nuts + Sauce
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -15,3 +15,4 @@
|
|||||||
# vendor/
|
# vendor/
|
||||||
|
|
||||||
huso
|
huso
|
||||||
|
nuts/*
|
||||||
|
|||||||
@@ -2,3 +2,5 @@
|
|||||||
Hanami's universeller Serien Organizer
|
Hanami's universeller Serien Organizer
|
||||||
|
|
||||||
**This is the backend code**
|
**This is the backend code**
|
||||||
|
|
||||||
|
## API
|
||||||
|
|||||||
1
go.sum
1
go.sum
@@ -57,7 +57,6 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||||||
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 h1:nhht2DYV/Sn3qOayu8lM+cU1ii9sTLUeBQwQQfUHtrs=
|
|
||||||
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
|
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
|
||||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
|||||||
22
huso.go
22
huso.go
@@ -11,12 +11,20 @@ import (
|
|||||||
|
|
||||||
"github.com/allegro/bigcache/v3"
|
"github.com/allegro/bigcache/v3"
|
||||||
"github.com/gookit/color"
|
"github.com/gookit/color"
|
||||||
|
"github.com/xujiajun/nutsdb"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
husoVersion = "1.0"
|
husoVersion = "1.0"
|
||||||
|
registerSecret = "綾波レイ"
|
||||||
seasonApiJikan = "seasons/now"
|
seasonApiJikan = "seasons/now"
|
||||||
seasonApiMal = "anime/season/"
|
userApiJikan = "users/"
|
||||||
|
userApiMal = "users/"
|
||||||
|
malApiStatusP = "plan_to_watch"
|
||||||
|
malApiStatusW = "watching"
|
||||||
|
malApiStatusC = "completed"
|
||||||
|
malApiStatusH = "on_hold"
|
||||||
|
malApiStatusD = "dropped"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -25,6 +33,7 @@ var (
|
|||||||
jikanApiBaseUri = flag.String("jikanApiBaseUri", "https://api.jikan.moe/v4/", "Jikan API base URL")
|
jikanApiBaseUri = flag.String("jikanApiBaseUri", "https://api.jikan.moe/v4/", "Jikan API base URL")
|
||||||
malApiId = flag.String("malApiId", "cc17dcf40581b9dfc8a5a12dba458153", "MyAnimeList API Client ID")
|
malApiId = flag.String("malApiId", "cc17dcf40581b9dfc8a5a12dba458153", "MyAnimeList API Client ID")
|
||||||
cache *bigcache.BigCache
|
cache *bigcache.BigCache
|
||||||
|
db *nutsdb.DB
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -44,13 +53,22 @@ func main() {
|
|||||||
}
|
}
|
||||||
defer cache.Close()
|
defer cache.Close()
|
||||||
|
|
||||||
|
nutsOpt := nutsdb.DefaultOptions
|
||||||
|
nutsOpt.Dir = "nuts"
|
||||||
|
db, err = nutsdb.Open(nutsOpt)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
defer db.Close()
|
||||||
|
|
||||||
initSeason()
|
initSeason()
|
||||||
|
|
||||||
go Arbeiten()
|
go Arbeiten()
|
||||||
|
|
||||||
go RunWebserv()
|
go RunWebserv()
|
||||||
|
|
||||||
//fmt.Printf("%+v\n", jik)
|
//list, _, _ := GetUserAnimeListData("ultrasn0w", malApiStatusW)
|
||||||
|
//fmt.Printf("%+v\n", list)
|
||||||
|
|
||||||
<-sc
|
<-sc
|
||||||
}
|
}
|
||||||
|
|||||||
43
klotz.go
43
klotz.go
@@ -2,6 +2,49 @@ package main
|
|||||||
|
|
||||||
import "time"
|
import "time"
|
||||||
|
|
||||||
|
type RegisterData struct {
|
||||||
|
Username string `json:"username"`
|
||||||
|
MalId int `json:"malId"`
|
||||||
|
Sauce string `json:"sauce"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type AnimeListMal struct {
|
||||||
|
Data []struct {
|
||||||
|
Node struct {
|
||||||
|
ID int `json:"id"`
|
||||||
|
Title string `json:"title"`
|
||||||
|
MainPicture struct {
|
||||||
|
Medium string `json:"medium"`
|
||||||
|
Large string `json:"large"`
|
||||||
|
} `json:"main_picture"`
|
||||||
|
} `json:"node"`
|
||||||
|
} `json:"data"`
|
||||||
|
Paging struct {
|
||||||
|
Next string `json:"next"`
|
||||||
|
} `json:"paging"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type UserJikan struct {
|
||||||
|
Data struct {
|
||||||
|
MalID int `json:"mal_id"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
URL string `json:"url"`
|
||||||
|
Images struct {
|
||||||
|
Jpg struct {
|
||||||
|
ImageURL string `json:"image_url"`
|
||||||
|
} `json:"jpg"`
|
||||||
|
Webp struct {
|
||||||
|
ImageURL string `json:"image_url"`
|
||||||
|
} `json:"webp"`
|
||||||
|
} `json:"images"`
|
||||||
|
LastOnline time.Time `json:"last_online"`
|
||||||
|
Gender interface{} `json:"gender"`
|
||||||
|
Birthday interface{} `json:"birthday"`
|
||||||
|
Location string `json:"location"`
|
||||||
|
Joined time.Time `json:"joined"`
|
||||||
|
} `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
type SeasonMal struct {
|
type SeasonMal struct {
|
||||||
Data []struct {
|
Data []struct {
|
||||||
Node struct {
|
Node struct {
|
||||||
|
|||||||
64
knecht.go
64
knecht.go
@@ -11,9 +11,47 @@ import (
|
|||||||
"github.com/valyala/fasthttp"
|
"github.com/valyala/fasthttp"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func GetUserAnimeListData(username, status string) (*AnimeListMal, []byte, error) {
|
||||||
|
var list AnimeListMal
|
||||||
|
body, err := GetUserAnimeListBytes(username, status)
|
||||||
|
if err != nil {
|
||||||
|
return nil, body, err
|
||||||
|
}
|
||||||
|
err = json.Unmarshal(body, &list)
|
||||||
|
return &list, body, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetUserAnimeListBytes(username, status string) ([]byte, error) {
|
||||||
|
return GetDataMal(userApiMal + username + "/animelist?limit=1000&status=" + status)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetUserData(username string) (*UserJikan, []byte, error) {
|
||||||
|
var user UserJikan
|
||||||
|
body, err := GetUserBytesCached(username)
|
||||||
|
if err != nil {
|
||||||
|
return nil, body, err
|
||||||
|
}
|
||||||
|
err = json.Unmarshal(body, &user)
|
||||||
|
return &user, body, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetUserBytesCached(username string) ([]byte, error) {
|
||||||
|
key := userApiJikan + username
|
||||||
|
data, err := cache.Get(key)
|
||||||
|
if err != nil {
|
||||||
|
data, err = GetDataJikan(key)
|
||||||
|
if err != nil {
|
||||||
|
return data, err
|
||||||
|
}
|
||||||
|
cache.Set(key, data)
|
||||||
|
return data, err
|
||||||
|
}
|
||||||
|
return data, err
|
||||||
|
}
|
||||||
|
|
||||||
func GetSeasonDataAll() (*SeasonJikan, []byte, error) {
|
func GetSeasonDataAll() (*SeasonJikan, []byte, error) {
|
||||||
color.Infoln("Aktuelle Season abfragen...")
|
color.Infoln("Aktuelle Season abfragen...")
|
||||||
data, bytes, err := GetSeasonDataJikan(1)
|
data, bytes, err := GetSeasonData(1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return data, bytes, err
|
return data, bytes, err
|
||||||
}
|
}
|
||||||
@@ -21,7 +59,7 @@ func GetSeasonDataAll() (*SeasonJikan, []byte, error) {
|
|||||||
for i := 2; data.Pagination.HasNextPage; i++ {
|
for i := 2; data.Pagination.HasNextPage; i++ {
|
||||||
color.Infof("Seite %d abfragen...\n", i)
|
color.Infof("Seite %d abfragen...\n", i)
|
||||||
time.Sleep(time.Second)
|
time.Sleep(time.Second)
|
||||||
newData, _, err := GetSeasonDataJikan(i)
|
newData, _, err := GetSeasonData(i)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return data, nil, err
|
return data, nil, err
|
||||||
}
|
}
|
||||||
@@ -35,23 +73,23 @@ func GetSeasonDataAll() (*SeasonJikan, []byte, error) {
|
|||||||
return data, bytes, err
|
return data, bytes, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetSeasonBytesJikan(page int) ([]byte, error) {
|
func GetSeasonData(page int) (*SeasonJikan, []byte, error) {
|
||||||
|
var data SeasonJikan
|
||||||
|
body, err := GetSeasonBytes(page)
|
||||||
|
if err != nil {
|
||||||
|
return nil, body, err
|
||||||
|
}
|
||||||
|
err = json.Unmarshal(body, &data)
|
||||||
|
return &data, body, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetSeasonBytes(page int) ([]byte, error) {
|
||||||
if page != 0 {
|
if page != 0 {
|
||||||
return GetDataJikan(seasonApiJikan + "?page=" + strconv.Itoa(page))
|
return GetDataJikan(seasonApiJikan + "?page=" + strconv.Itoa(page))
|
||||||
}
|
}
|
||||||
return GetDataJikan(seasonApiJikan)
|
return GetDataJikan(seasonApiJikan)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetSeasonDataJikan(page int) (*SeasonJikan, []byte, error) {
|
|
||||||
var data SeasonJikan
|
|
||||||
body, err := GetSeasonBytesJikan(page)
|
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
err = json.Unmarshal(body, &data)
|
|
||||||
return &data, body, err
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetDataMal(apiAddr string) ([]byte, error) {
|
func GetDataMal(apiAddr string) ([]byte, error) {
|
||||||
var body []byte
|
var body []byte
|
||||||
req := fasthttp.AcquireRequest()
|
req := fasthttp.AcquireRequest()
|
||||||
|
|||||||
49
nuss.go
49
nuss.go
@@ -4,13 +4,44 @@ import (
|
|||||||
"github.com/xujiajun/nutsdb"
|
"github.com/xujiajun/nutsdb"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Nuss() (*nutsdb.DB, error) {
|
func DbClean() error {
|
||||||
opt := nutsdb.DefaultOptions
|
err := db.Update(
|
||||||
// TODO change
|
func(tx *nutsdb.Tx) error {
|
||||||
opt.Dir = "/tmp/yagoodb"
|
return db.Merge()
|
||||||
db, err := nutsdb.Open(opt)
|
})
|
||||||
if err != nil {
|
return err
|
||||||
return nil, err
|
}
|
||||||
}
|
|
||||||
return db, err
|
func DbSave(bucket, key string, val []byte) error {
|
||||||
|
err := db.Update(
|
||||||
|
func(tx *nutsdb.Tx) error {
|
||||||
|
keyBytes := []byte(key)
|
||||||
|
return tx.Put(bucket, keyBytes, val, 0)
|
||||||
|
})
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func DbRead(bucket, key string) ([]byte, error) {
|
||||||
|
var val []byte
|
||||||
|
err := db.View(
|
||||||
|
func(tx *nutsdb.Tx) error {
|
||||||
|
key := []byte("name1")
|
||||||
|
e, err := tx.Get(bucket, key)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
val = make([]byte, e.Size())
|
||||||
|
copy(val, e.Value)
|
||||||
|
return err
|
||||||
|
})
|
||||||
|
return val, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func DbDelete(bucket, key string, val []byte) error {
|
||||||
|
err := db.Update(
|
||||||
|
func(tx *nutsdb.Tx) error {
|
||||||
|
keyBytes := []byte(key)
|
||||||
|
return tx.Delete(bucket, keyBytes)
|
||||||
|
})
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
33
ober.go
33
ober.go
@@ -1,9 +1,12 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/sha512"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/fasthttp/router"
|
"github.com/fasthttp/router"
|
||||||
"github.com/valyala/fasthttp"
|
"github.com/valyala/fasthttp"
|
||||||
@@ -13,7 +16,7 @@ func RunWebserv() {
|
|||||||
r := router.New()
|
r := router.New()
|
||||||
r.GET("/", Start)
|
r.GET("/", Start)
|
||||||
r.GET("/api/season", Season)
|
r.GET("/api/season", Season)
|
||||||
r.POST("api/register", Register)
|
r.POST("/api/register", Register)
|
||||||
log.Fatal(fasthttp.ListenAndServe(":"+strconv.Itoa(*webServerPort), r.Handler))
|
log.Fatal(fasthttp.ListenAndServe(":"+strconv.Itoa(*webServerPort), r.Handler))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,13 +63,31 @@ func Season(ctx *fasthttp.RequestCtx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func Register(ctx *fasthttp.RequestCtx) {
|
func Register(ctx *fasthttp.RequestCtx) {
|
||||||
_, err := ctx.WriteString("AAA")
|
if string(ctx.Request.Header.ContentType()) != "application/json" {
|
||||||
if err != nil {
|
ctx.SetStatusCode(fasthttp.StatusBadRequest)
|
||||||
addErrorToCtx(ctx, err)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
body := ctx.PostBody()
|
||||||
ctx.SetContentType("application/json; charset=utf-8")
|
var register RegisterData
|
||||||
|
err := json.Unmarshal(body, ®ister)
|
||||||
|
if err != nil {
|
||||||
|
ctx.WriteString(err.Error())
|
||||||
|
ctx.SetStatusCode(fasthttp.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if register.MalId == 0 || register.Username == "" || register.Sauce == "" {
|
||||||
|
ctx.WriteString("Sprich JSON du Hurensohn")
|
||||||
|
ctx.SetStatusCode(fasthttp.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
calcSauce := fmt.Sprintf("%x", sha512.Sum512([]byte(registerSecret+strconv.Itoa(register.MalId)+register.Username)))
|
||||||
|
if calcSauce != strings.ToLower(register.Sauce) {
|
||||||
|
ctx.WriteString("Möge die Sauce mit dir sein")
|
||||||
|
ctx.SetStatusCode(fasthttp.StatusBadRequest)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// TODO REGISTER
|
||||||
|
ctx.SetBody(body)
|
||||||
ctx.SetStatusCode(fasthttp.StatusOK)
|
ctx.SetStatusCode(fasthttp.StatusOK)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,5 +18,10 @@ func Arbeiten() {
|
|||||||
color.Errorln(err.Error())
|
color.Errorln(err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = DbClean()
|
||||||
|
if err != nil {
|
||||||
|
color.Errorln(err.Error())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user