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.3" 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" 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") 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 ) 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()) logOut.WriteLine(fmt.Sprintf("🎉 huso %s built on %s with %s", husoVersion, buildTime, runtime.Version())) 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() LangeArbeit() go Arbeiten() go BissleArbeiten() go LangeArbeiten() go RunWebserv() <-sc }