Files
huso/huso.go
2022-07-28 00:43:35 +02:00

181 lines
5.0 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.5"
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
)
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(10101)
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(42 * 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()
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
}