mirror of
https://github.com/ultrasn0w/huso.git
synced 2025-12-13 08:49:53 +01:00
186 lines
5.1 KiB
Go
186 lines
5.1 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"os/signal"
|
|
"runtime"
|
|
"syscall"
|
|
"time"
|
|
|
|
"github.com/allegro/bigcache/v3"
|
|
"github.com/bwmarrin/discordgo"
|
|
_ "github.com/go-sql-driver/mysql"
|
|
"github.com/gookit/color"
|
|
"github.com/xujiajun/nutsdb"
|
|
"golang.org/x/time/rate"
|
|
)
|
|
|
|
const (
|
|
husoVersion = "1.7.1"
|
|
registerSecret = "綾波レイ"
|
|
seasonStrJikan = "seasons/"
|
|
userApiJikan = "users/"
|
|
userApiMal = "users/"
|
|
animeApiMal = "anime/"
|
|
searchApiMal = "anime?q="
|
|
malApiStatusP = "plan_to_watch"
|
|
malApiStatusW = "watching"
|
|
malApiStatusC = "completed"
|
|
malApiStatusH = "on_hold"
|
|
malApiStatusD = "dropped"
|
|
bucketUsers = "users"
|
|
bucketAnime = "anime"
|
|
bucketMedia = "media"
|
|
bucketAppoint = "appoint"
|
|
bucketChat = "chat"
|
|
bucketStash = "stash"
|
|
AppointSplit = "§"
|
|
chatLength = 10101
|
|
)
|
|
|
|
var (
|
|
webServerPort = flag.Int("port", 4876, "Port used by internal webserver")
|
|
malApiBaseUri = flag.String("malApiBaseUri", "https://api.myanimelist.net/v2/", "MyAnimeList 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")
|
|
localServer = flag.Bool("localServer", false, "Set varius headers for running locally")
|
|
mmDbServer = flag.String("mmDbServer", "hanami.family:3306", "MovieManager db server")
|
|
mmDbUser = flag.String("mmDbUser", "yui", "MovieManager db user")
|
|
discordToken = flag.String("discordToken", "OTk4MTk3MTMzNjE2MzUzMzUw.GKPdLt.zaMvvlikffjBxJO-Qx69A5nQNQxtA-FmkH2yTA", "Discord bot auth token")
|
|
discordChannel = flag.String("discordChannel", "998277590609559632", "Discord bot channel id")
|
|
husoWebAnimeUri = flag.String("husoWebAnimeUri", "https://anime.hanami.family/anime/", "HusoWeb Anime base URL")
|
|
husoWebUserUri = flag.String("husoWebUserUri", "https://anime.hanami.family/user/", "HusoWeb User base URL")
|
|
animeCache *bigcache.BigCache
|
|
seasoncache *bigcache.BigCache
|
|
userCache *bigcache.BigCache
|
|
searchCache *bigcache.BigCache
|
|
animeListCache *bigcache.BigCache
|
|
mmCache *bigcache.BigCache
|
|
db *nutsdb.DB
|
|
mmDb *sql.DB
|
|
discc *discordgo.Session
|
|
jikanLimiter *rate.Limiter
|
|
logOut *RingBuf
|
|
buildTime string
|
|
buildCommit string
|
|
lastAnnounce *SomewhatThreadSafeTime
|
|
)
|
|
|
|
func main() {
|
|
// lese Flaggen
|
|
flag.Parse()
|
|
// bleib bei uns
|
|
sc := make(chan os.Signal, 1)
|
|
signal.Notify(sc, syscall.SIGINT, syscall.SIGTERM, os.Interrupt)
|
|
|
|
logOut = NewRingBuf(101010)
|
|
|
|
color.Notice.Printf("huso %s built on %s with %s\n", husoVersion, buildTime, runtime.Version())
|
|
color.Notice.Printf("Last git commit: %s\n", buildCommit)
|
|
logOut.WriteLine(fmt.Sprintf("🎉 huso %s built on %s with %s", husoVersion, buildTime, runtime.Version()))
|
|
logOut.WriteLine(fmt.Sprintf("🪄 Last git commit: %s", buildCommit))
|
|
|
|
jikanLimiter = rate.NewLimiter(rate.Every(time.Second+(time.Millisecond*420)), 1)
|
|
|
|
// cache init
|
|
var err error
|
|
animeCache, err = bigcache.NewBigCache(bigcache.DefaultConfig(7 * time.Hour))
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer animeCache.Close()
|
|
seasoncache, err = bigcache.NewBigCache(bigcache.DefaultConfig(7 * time.Hour))
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer seasoncache.Close()
|
|
userCache, err = bigcache.NewBigCache(bigcache.DefaultConfig(5 * time.Hour))
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer userCache.Close()
|
|
searchCache, err = bigcache.NewBigCache(bigcache.DefaultConfig(7 * time.Minute))
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer searchCache.Close()
|
|
animeListCache, err = bigcache.NewBigCache(bigcache.DefaultConfig(15 * time.Minute))
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer animeListCache.Close()
|
|
mmCache, err = bigcache.NewBigCache(bigcache.DefaultConfig(time.Minute))
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer mmCache.Close()
|
|
|
|
nutsOpt := nutsdb.DefaultOptions
|
|
nutsOpt.Dir = "nuts"
|
|
db, err = nutsdb.Open(nutsOpt)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer db.Close()
|
|
|
|
lastAnnounce = &SomewhatThreadSafeTime{
|
|
stamp: time.Now().Add(-1 * time.Hour),
|
|
}
|
|
|
|
color.Infoln("NutsDB connected")
|
|
logOut.WriteLine("🗃️ NutsDB connected")
|
|
|
|
conns, err := GetMmConnString()
|
|
if err != nil {
|
|
color.Errorln(err.Error())
|
|
} else {
|
|
mmDb, err = sql.Open("mysql", conns)
|
|
if err != nil {
|
|
color.Errorln(err.Error())
|
|
} else {
|
|
mmDb.SetConnMaxLifetime(time.Minute * 3)
|
|
mmDb.SetMaxOpenConns(10)
|
|
mmDb.SetMaxIdleConns(10)
|
|
defer mmDb.Close()
|
|
|
|
err = mmDb.Ping()
|
|
if err != nil {
|
|
color.Errorln(err.Error())
|
|
} else {
|
|
color.Infoln("MovieManager DB connected")
|
|
logOut.WriteLine("🗃️ MovieManager DB connected")
|
|
}
|
|
}
|
|
}
|
|
|
|
discc, err = discordgo.New("Bot " + *discordToken)
|
|
if err != nil {
|
|
color.Errorln(err.Error())
|
|
} else {
|
|
err = discc.Open()
|
|
if err != nil {
|
|
color.Errorln(err.Error())
|
|
} else {
|
|
defer discc.Close()
|
|
color.Infoln("Discord huso online")
|
|
logOut.WriteLine("📯 Discord huso online")
|
|
}
|
|
}
|
|
|
|
Arbeit()
|
|
BissleArbeit()
|
|
LangeArbeit()
|
|
|
|
go Arbeiten()
|
|
go BissleArbeiten()
|
|
go LangeArbeiten()
|
|
|
|
go RunWebserv()
|
|
|
|
<-sc
|
|
}
|