package main import ( "fmt" "log" "github.com/gin-gonic/gin" socketio "github.com/googollee/go-socket.io" eventemitter "github.com/hyperzlib/go-event-emitter" "github.com/hyperzlib/isekai-remote-playback/context" "github.com/hyperzlib/isekai-remote-playback/middleware" "github.com/hyperzlib/isekai-remote-playback/routes" "github.com/hyperzlib/isekai-remote-playback/store" "github.com/spf13/viper" ) func initConfig() { viper.SetConfigName("config") viper.SetConfigType("yaml") viper.AddConfigPath(".") viper.SetDefault("debug", true) viper.SetDefault("http.baseurl", "") viper.SetDefault("http.listen", "0.0.0.0") viper.SetDefault("http.port", 8913) viper.SetDefault("http.origins", []string{}) viper.SetDefault("redis.prefix", "irp") err := viper.ReadInConfig() if err != nil { panic(fmt.Errorf("fatal error config file: %w", err)) } } func main() { ctx := context.NewServerContext() initConfig() // 初始化存储 store.InitStore() // 创建事件系统 ctx.EventSource = eventemitter.NewEmitter(true) // Socket.IO服务器 sockets := socketio.NewServer(nil) ctx.Sockets = sockets if viper.GetString("redis.addr") != "" { _, err := sockets.Adapter(&socketio.RedisAdapterOptions{ Addr: viper.GetString("redis.addr"), Prefix: viper.GetString("redis.prefix"), Password: viper.GetString("redis.password"), Network: viper.GetString("redis.network"), }) if err != nil { log.Fatalf("socket.io redis adaper error: %s\n", err) } } sockets, err := routes.CreateSocketRouter(sockets, ctx) if err != nil { log.Fatal("Cannot create websocket httpApp", err) } go func() { if err := sockets.Serve(); err != nil { log.Fatalf("socket.io listen error: %s\n", err) } }() defer sockets.Close() // HTTP服务器 httpApp := gin.New() ctx.HttpServer = httpApp httpApp.Use(middleware.Handler) httpApp.Use(middleware.CORSMiddleware(viper.GetStringSlice("http.origins"))) httpApp.GET("/socket.io/*any", gin.WrapH(sockets)) httpApp.POST("/socket.io/*any", gin.WrapH(sockets)) httpApp = routes.CreateWebRouter(httpApp) if viper.GetBool("debug") { gin.SetMode(gin.DebugMode) } else { gin.SetMode(gin.ReleaseMode) } hostAddr := viper.GetString("http.listen") + ":" + viper.GetString("http.port") if err := httpApp.Run(hostAddr); err != nil { log.Fatal("failed run app: ", err) } }