Draft: feat login

This commit is contained in:
2025-09-05 03:59:25 +08:00
parent 6d7074198f
commit 3a9ffe7857
43 changed files with 1894 additions and 91 deletions

44
cmd/play/root.go Normal file
View File

@@ -0,0 +1,44 @@
package play
import (
"gitea.konchin.com/ytshih/inp2025/game/plays"
"gitea.konchin.com/ytshih/inp2025/game/tracing"
tea "github.com/charmbracelet/bubbletea"
"github.com/go-resty/resty/v2"
"github.com/spf13/cobra"
)
var RootCmd = &cobra.Command{
Use: "play",
Short: "Play game",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {
appname := "game-tui"
tracing.InitTracer(appname)
client := resty.New().
SetBaseURL(args[0]).
SetDisableWarn(true)
queue := []*tea.Program{}
queue = append(queue,
tea.NewProgram(plays.NewLanding(plays.NewBase(client))))
for len(queue) > 0 {
program := queue[0]
queue = queue[1:]
res, err := program.Run()
if err != nil {
panic(err)
}
err = res.(plays.Next).Next(&queue)
if err != nil {
panic(err)
}
}
},
}
func init() {
}

View File

@@ -3,7 +3,9 @@ package cmd
import (
"strings"
"gitea.konchin.com/ytshih/inp2025/game/cmd/play"
"gitea.konchin.com/ytshih/inp2025/game/cmd/serve"
"gitea.konchin.com/ytshih/inp2025/game/utils"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
@@ -12,10 +14,12 @@ var RootCmd = &cobra.Command{
Use: "game",
Short: "Game for Intro. to Network Programming 2025",
PersistentPreRun: func(cmd *cobra.Command, args []string) {
ctx := cmd.Context()
viper.AutomaticEnv()
viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
viper.SetEnvKeyReplacer(strings.NewReplacer("_", "-"))
viper.BindPFlags(cmd.PersistentFlags())
viper.BindPFlags(cmd.Flags())
utils.ReadConfig(ctx)
},
}
@@ -23,4 +27,5 @@ func init() {
cobra.EnableTraverseRunHooks = true
RootCmd.AddCommand(serve.RootCmd)
RootCmd.AddCommand(play.RootCmd)
}

View File

@@ -1,23 +1,32 @@
package serve
import (
"database/sql"
"log"
"net/http"
"github.com/spf13/cobra"
"github.com/spf13/viper"
httpSwagger "github.com/swaggo/http-swagger"
"github.com/uptrace/bun"
"github.com/uptrace/bun/dialect/sqlitedialect"
"github.com/uptrace/bun/driver/sqliteshim"
"github.com/uptrace/bun/extra/bunotel"
"github.com/uptrace/bunrouter"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"go.uber.org/zap"
_ "gitea.konchin.com/ytshih/inp2025/game/backend/docs"
"gitea.konchin.com/ytshih/inp2025/game/backend/handlers/api"
"gitea.konchin.com/ytshih/inp2025/game/backend/handlers/auth"
"gitea.konchin.com/ytshih/inp2025/game/backend/middlewares"
"gitea.konchin.com/ytshih/inp2025/game/implements"
"gitea.konchin.com/ytshih/inp2025/game/tracing"
"gitea.konchin.com/ytshih/inp2025/game/utils"
)
// @title NASAOJ v3
// @version 2.0
// @title Intro. to Network Programming Game
// @version 0.0.1-alpha
// @license.name 0BSD
// @BasePath /
var backendCmd = &cobra.Command{
@@ -27,22 +36,60 @@ var backendCmd = &cobra.Command{
ctx := cmd.Context()
tracing.InitTracer("game backend")
router := bunrouter.New()
backend := router.NewGroup("").
Use(middlewares.ErrorHandler).
Use(middlewares.BunrouterOtel).
Use(middlewares.AccessLog)
tracing.Logger.Ctx(ctx).
Debug("nmsl",
zap.Bool("swagger", viper.GetBool("swagger")))
Debug("connect to sql",
zap.String("sql.url",
"file:"+viper.GetString("sqlite-file")+"?cache=shared&mode=rwc"))
sqldb, err := sql.Open(sqliteshim.ShimName,
"file:"+viper.GetString("sqlite-file")+"?cache=shared&mode=rwc")
if err != nil {
tracing.Logger.Ctx(ctx).
Panic("failed to init sqlite",
zap.Error(err))
panic(err)
}
bunDB := bun.NewDB(sqldb, sqlitedialect.New())
bunDB.AddQueryHook(bunotel.NewQueryHook(bunotel.WithDBName("sqlite")))
if err := utils.InitDB(ctx, bunDB); err != nil {
tracing.Logger.Ctx(ctx).
Panic("failed to init db schema",
zap.Error(err))
panic(err)
}
db := implements.NewBunDatabase(bunDB)
authHandlers := auth.NewHandlers(db)
apiHandlers := api.NewHandlers(db)
middlewareHandlers := middlewares.NewHandlers(db)
router := bunrouter.New()
if viper.GetBool("swagger") {
backend.GET("/swagger/*any",
router.GET("/swagger/*any",
bunrouter.HTTPHandlerFunc(
httpSwagger.Handler()))
}
backend := router.NewGroup("").
Use(middlewareHandlers.ErrorHandler).
Use(middlewareHandlers.BunrouterOtel).
Use(middlewareHandlers.AccessLog)
authGroup := backend.NewGroup("/auth")
authGroup.GET("/login",
middlewareHandlers.Auth(
authHandlers.GetLogin))
authGroup.POST("/logout",
middlewareHandlers.Auth(
authHandlers.PostLogout))
authGroup.POST("/register",
authHandlers.PostRegister)
apiGroup := backend.NewGroup("/api").
Use(middlewareHandlers.Auth)
apiGroup.GET("/lobby/users",
apiHandlers.GetLobbyUsers)
tracing.Logger.Ctx(ctx).
Info("http server up",
zap.String("http.port", viper.GetString("port")))
@@ -57,4 +104,6 @@ func init() {
String("port", "8080", "Port to listen on")
backendCmd.Flags().
Bool("swagger", false, "Enable swagger")
backendCmd.Flags().
String("sqlite-file", ":memory:", "File for sqlite")
}