dkforest

A forum and chat platform (onion)
git clone https://git.dasho.dev/n0tr1v/dkforest.git
Log | Files | Refs | LICENSE

commit 4b5fd8682ad6230e06cc5cee5fb2ce5e8bbad3d5
parent d7e004a71b3258074343c66378495c41a6a1a46f
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Tue, 19 Dec 2023 01:01:35 -0500

cleanup

Diffstat:
Mpkg/web/handlers/poker.go | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Mpkg/web/handlers/poker/poker.go | 129+++++++++++++++++++++++--------------------------------------------------------
Mpkg/web/web.go | 13++++++-------
3 files changed, 94 insertions(+), 98 deletions(-)

diff --git a/pkg/web/handlers/poker.go b/pkg/web/handlers/poker.go @@ -22,6 +22,7 @@ import ( "image/png" "math/rand" "net/http" + "strconv" "strings" "time" ) @@ -507,3 +508,52 @@ func PokerFoldHandler(c echo.Context) error { } return c.HTML(http.StatusOK, hutils.HtmlCssReset+`<form method="post"><button>Fold</button></form>`) } + +func PokerDealHandler(c echo.Context) error { + roomID := poker.RoomID(c.Param("roomID")) + authUser := c.Get("authUser").(*database.User) + g := poker.PokerInstance.GetGame(roomID) + if g == nil { + return c.NoContent(http.StatusNotFound) + } + if c.Request().Method == http.MethodPost { + g.Deal(roomID, authUser) + } + html := hutils.HtmlCssReset + html += `<form method="post"><button>Deal</button></form>` + return c.HTML(http.StatusOK, html) +} + +func PokerUnSitHandler(c echo.Context) error { + authUser := c.Get("authUser").(*database.User) + roomID := poker.RoomID(c.Param("roomID")) + html := hutils.HtmlCssReset + `<form method="post"><button>UnSit</button></form>` + g := poker.PokerInstance.GetGame(roomID) + if g == nil { + return c.NoContent(http.StatusNotFound) + } + if c.Request().Method == http.MethodPost { + g.UnSitPlayer(authUser.ID) + } + return c.HTML(http.StatusOK, html) +} + +func PokerSitHandler(c echo.Context) error { + html := hutils.HtmlCssReset + `<form method="post"><button>Sit</button></form>` + authUser := c.Get("authUser").(*database.User) + pos, _ := strconv.Atoi(c.Param("pos")) + if pos < 1 || pos > poker.NbPlayers { + return c.HTML(http.StatusOK, html) + } + pos-- + roomID := poker.RoomID(c.Param("roomID")) + g := poker.PokerInstance.GetGame(roomID) + if g == nil { + return c.HTML(http.StatusOK, html) + } + + if c.Request().Method == http.MethodPost { + g.Sit(authUser.ID, authUser.Username, pos) + } + return c.HTML(http.StatusOK, html) +} diff --git a/pkg/web/handlers/poker/poker.go b/pkg/web/handlers/poker/poker.go @@ -8,11 +8,9 @@ import ( "errors" "fmt" "github.com/chehsunliu/poker" - "github.com/labstack/echo" "github.com/sirupsen/logrus" "math" "math/rand" - "net/http" "sort" "strconv" "strings" @@ -455,7 +453,40 @@ func (g *PokerGame) incrDealerIdx() (smallBlindIdx, bigBlindIdx int) { return } -func (g *PokerGame) UnSitPlayer(userID database.UserID) error { +func (g *PokerGame) Sit(userID database.UserID, username database.Username, pos int) { + pokerTable, err := g.db.GetPokerTableBySlug(g.roomID.String()) + tableID := pokerTable.ID + if err != nil { + return + } + + if err := g.Players.WithE(func(gPlayers *[]*SeatedPlayer) error { + tableAccount, err := g.db.GetPokerTableAccount(userID, tableID) + if err != nil { + return errors.New("failed to get table account") + } + if tableAccount.Amount < pokerTable.MinBet { + return errors.New(fmt.Sprintf("not enough chips to sit. have: %d, need: %d", tableAccount.Amount, pokerTable.MinBet)) + } + if isSeated(*gPlayers, userID) { + return errors.New("player already seated") + } + if (*gPlayers)[pos] != nil { + return errors.New("seat already taken") + } + (*gPlayers)[pos] = &SeatedPlayer{SeatIdx: pos, UserID: userID, Username: username, Cash: utils.NewRWMtx(tableAccount.Amount), LastActionTS: time.Now()} + + PokerPubSub.Pub(g.roomID.Topic(), PokerSeatTakenEvent{}) + g.newLogEvent(fmt.Sprintf("%s sit", username.String())) + + return nil + }); err != nil { + PokerPubSub.Pub(g.roomID.UserTopic(userID), ErrorMsgEvent{Message: err.Error()}) + return + } +} + +func (g *PokerGame) UnSitPlayer(userID database.UserID) { ongoing := g.Ongoing if ongoing != nil { if p := ongoing.getPlayer(userID); p != nil { @@ -463,15 +494,15 @@ func (g *PokerGame) UnSitPlayer(userID database.UserID) error { } } - err := g.Players.WithE(func(gPlayers *[]*SeatedPlayer) error { + g.Players.With(func(gPlayers *[]*SeatedPlayer) { p := getPlayer(*gPlayers, userID) if p == nil { - return errors.New("player is not sit") + return } g.unSitPlayer1(gPlayers, p) - return nil + PokerPubSub.Pub(g.roomID.Topic(), PokerSeatLeftEvent{}) + g.newLogEvent(fmt.Sprintf("%s un-sit", p.Username.String())) }) - return err } func (g *PokerGame) unSitPlayer1(gPlayers *[]*SeatedPlayer, seatedPlayer *SeatedPlayer) { @@ -1463,90 +1494,6 @@ func (r RoomID) UserTopic(userID database.UserID) string { return r.Topic() + "_" + userID.String() } -func PokerDealHandler(c echo.Context) error { - roomID := RoomID(c.Param("roomID")) - authUser := c.Get("authUser").(*database.User) - g := PokerInstance.GetGame(roomID) - if g == nil { - return c.NoContent(http.StatusNotFound) - } - if c.Request().Method == http.MethodPost { - g.Deal(roomID, authUser) - } - html := hutils.HtmlCssReset - html += `<form method="post"><button>Deal</button></form>` - return c.HTML(http.StatusOK, html) -} - -func PokerUnSitHandler(c echo.Context) error { - authUser := c.Get("authUser").(*database.User) - roomID := RoomID(c.Param("roomID")) - html := hutils.HtmlCssReset + `<form method="post"><button>UnSit</button></form>` - roomTopic := roomID.Topic() - g := PokerInstance.GetGame(roomID) - if g == nil { - return c.NoContent(http.StatusNotFound) - } - if c.Request().Method == http.MethodPost { - if err := g.UnSitPlayer(authUser.ID); err == nil { - PokerPubSub.Pub(roomTopic, PokerSeatLeftEvent{}) - g.newLogEvent(fmt.Sprintf("%s un-sit", authUser.Username.String())) - } - } - return c.HTML(http.StatusOK, html) -} - -func PokerSitHandler(c echo.Context) error { - db := c.Get("database").(*database.DkfDB) - html := hutils.HtmlCssReset + `<form method="post"><button>Sit</button></form>` - authUser := c.Get("authUser").(*database.User) - pos, _ := strconv.Atoi(c.Param("pos")) - if pos < 1 || pos > NbPlayers { - return c.HTML(http.StatusOK, html) - } - pos-- - roomID := RoomID(c.Param("roomID")) - roomTopic := roomID.Topic() - roomUserTopic := roomID.UserTopic(authUser.ID) - g := PokerInstance.GetGame(roomID) - if g == nil { - return c.HTML(http.StatusOK, html) - } - - if c.Request().Method == http.MethodPost { - pokerTable, err := db.GetPokerTableBySlug(roomID.String()) - tableID := pokerTable.ID - if err != nil { - return c.HTML(http.StatusOK, html) - } - - if err := g.Players.WithE(func(gPlayers *[]*SeatedPlayer) error { - tableAccount, err := db.GetPokerTableAccount(authUser.ID, tableID) - if err != nil { - return errors.New("failed to get table account") - } - if tableAccount.Amount < pokerTable.MinBet { - return errors.New(fmt.Sprintf("not enough chips to sit. have: %d, need: %d", tableAccount.Amount, pokerTable.MinBet)) - } - if isSeated(*gPlayers, authUser.ID) { - return errors.New("player already seated") - } - if (*gPlayers)[pos] != nil { - return errors.New("seat already taken") - } - (*gPlayers)[pos] = &SeatedPlayer{SeatIdx: pos, UserID: authUser.ID, Username: authUser.Username, Cash: utils.NewRWMtx(tableAccount.Amount), LastActionTS: time.Now()} - return nil - }); err != nil { - PokerPubSub.Pub(roomUserTopic, ErrorMsgEvent{Message: err.Error()}) - return c.HTML(http.StatusOK, html) - } - - PokerPubSub.Pub(roomTopic, PokerSeatTakenEvent{}) - g.newLogEvent(fmt.Sprintf("%s sit", authUser.Username.String())) - } - return c.HTML(http.StatusOK, html) -} - func isHeartOrDiamond(name string) bool { return strings.Contains(name, "♥") || strings.Contains(name, "♦") diff --git a/pkg/web/web.go b/pkg/web/web.go @@ -11,7 +11,6 @@ import ( "dkforest/pkg/web/clientFrontends" "dkforest/pkg/web/handlers" v1 "dkforest/pkg/web/handlers/api/v1" - "dkforest/pkg/web/handlers/poker" "dkforest/pkg/web/middlewares" "fmt" "github.com/labstack/echo" @@ -111,12 +110,12 @@ func getMainServer(db *database.DkfDB, i18nBundle *i18n.Bundle, renderer *tmp.Te authGroup.POST("/poker/:roomID/call", handlers.PokerCallHandler) authGroup.GET("/poker/:roomID/bet", handlers.PokerBetHandler) authGroup.POST("/poker/:roomID/bet", handlers.PokerBetHandler) - authGroup.GET("/poker/:roomID/deal", poker.PokerDealHandler) - authGroup.POST("/poker/:roomID/deal", poker.PokerDealHandler) - authGroup.GET("/poker/:roomID/unsit", poker.PokerUnSitHandler) - authGroup.POST("/poker/:roomID/unsit", poker.PokerUnSitHandler) - authGroup.GET("/poker/:roomID/sit/:pos", poker.PokerSitHandler) - authGroup.POST("/poker/:roomID/sit/:pos", poker.PokerSitHandler) + authGroup.GET("/poker/:roomID/deal", handlers.PokerDealHandler) + authGroup.POST("/poker/:roomID/deal", handlers.PokerDealHandler) + authGroup.GET("/poker/:roomID/unsit", handlers.PokerUnSitHandler) + authGroup.POST("/poker/:roomID/unsit", handlers.PokerUnSitHandler) + authGroup.GET("/poker/:roomID/sit/:pos", handlers.PokerSitHandler) + authGroup.POST("/poker/:roomID/sit/:pos", handlers.PokerSitHandler) authGroup.GET("/chess", handlers.ChessHandler) authGroup.POST("/chess", handlers.ChessHandler) authGroup.GET("/chess/analyze", handlers.ChessAnalyzeHandler)