dkforest

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

commit 25f4ddb7a12b80e6dba0608e2c8d0d40b7ef3b02
parent 483a2d951394813b1ede9a3a88a635bc92f6446c
Author: n0tr1v <n0tr1v@protonmail.com>
Date:   Mon,  4 Dec 2023 15:18:26 -0500

poker

Diffstat:
Mpkg/web/handlers/handlers.go | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
1 file changed, 59 insertions(+), 26 deletions(-)

diff --git a/pkg/web/handlers/handlers.go b/pkg/web/handlers/handlers.go @@ -799,11 +799,15 @@ type PokerEvent struct { type PokerSeatTakenEvent struct { } -var PokerPubSub = pubsub.NewPubSub[PokerEvent]() +type PokerSeatLeftEvent struct { +} + +var PokerPubSub = pubsub.NewPubSub[any]() func PokerSitHandler(c echo.Context) error { authUser := c.Get("authUser").(*database.User) pos, _ := strconv.Atoi(c.Param("pos")) + pos-- roomID := c.Param("roomID") PokerInstance.Lock() g, found := PokerInstance.Games[roomID] @@ -816,9 +820,9 @@ func PokerSitHandler(c echo.Context) error { fmt.Println("seat already taken") return c.NoContent(http.StatusNotFound) } - myTopic := "room_" + authUser.ID.String() + "_seats" + myTopic := "room_" + roomID g.Players[pos] = authUser.Username.String() - PokerPubSub.Pub(myTopic, PokerEvent{}) + PokerPubSub.Pub(myTopic, PokerSeatTakenEvent{}) return c.HTML(http.StatusOK, ``) } return c.HTML(http.StatusOK, `<form method="post"><button>SIT</button></form>`) @@ -851,8 +855,7 @@ func PokerHandler(c echo.Context) error { deckSha256 := utils.Sha256([]byte(deckStr)) quit := hutils.CloseSignalChan(c) - myTopic := "room_" + authUser.ID.String() - myTopic1 := "room_" + authUser.ID.String() + "_seats" + myTopic := "room_" + roomID go func() { type Seat struct { @@ -1015,7 +1018,7 @@ func PokerHandler(c echo.Context) error { }) }() - sub := PokerPubSub.Subscribe([]string{myTopic, myTopic1}) + sub := PokerPubSub.Subscribe([]string{myTopic}) defer sub.Close() c.Response().Header().Set(echo.HeaderContentType, echo.MIMETextHTMLCharsetUTF8) @@ -1084,6 +1087,9 @@ body { width: 100px; height: 50px; } +#seat1 { position: absolute; top: 80px; left: 700px; } +#seat2 { position: absolute; top: 200px; left: 670px; } +#seat3 { position: absolute; top: 300px; left: 610px; } .takeSeat1 { position: absolute; top: 80px; left: 700px; } .takeSeat2 { position: absolute; top: 200px; left: 670px; } .takeSeat3 { position: absolute; top: 300px; left: 610px; } @@ -1107,6 +1113,13 @@ body { } } send(takeSeatBtns) + seats := ` +<div> + <div id="seat1"></div> + <div id="seat2"></div> + <div id="seat3"></div> +</div>` + send(seats) turnAction := ` <div style="position: absolute; top: 400px; left: 200px;"> <form><input type="number" /><button>Bet</button></form> @@ -1127,7 +1140,7 @@ Loop: default: } - topic, payload, err := sub.ReceiveTimeout2(1*time.Second, quit) + _, payload, err := sub.ReceiveTimeout2(1*time.Second, quit) if err != nil { if errors.Is(err, pubsub.ErrCancelled) { break Loop @@ -1135,27 +1148,45 @@ Loop: continue } - if topic == myTopic1 { - send(`<style>.takeSeat { display: none; }</style>`) + if _, ok := payload.(PokerSeatTakenEvent); ok { + + isSeated := false + for _, p := range g.Players { + if p == authUser.Username.String() { + isSeated = true + break + } + } + if isSeated { + send(`<style>.takeSeat { display: none; }</style>`) + } + + for i, p := range g.Players { + if p != "" { + send(`<style>.takeSeat` + strconv.Itoa(i+1) + ` { display: none; }</style>`) + send(`<style>#seat` + strconv.Itoa(i+1) + `:before { content: "` + p + `"; }</style>`) + } else { + send(`<style>#seat` + strconv.Itoa(i+1) + `:before { content: ""; }</style>`) + } + } c.Response().Flush() - fmt.Println(g.Players) continue - } - color := "black" - if strings.Contains(payload.Name, "♥") || - strings.Contains(payload.Name, "♦") { - color = "red" - } - transform := `transform: translate(` + strconv.Itoa(payload.Left) + `px, ` + strconv.Itoa(payload.Top) + `px)` - if payload.Angle != "" { - transform += ` rotateZ(` + payload.Angle + `)` - } - if payload.Burn { - transform += ` rotateY(180deg)` - } - transform += ";" - send(`<style> + } else if payload, ok := payload.(PokerEvent); ok { + color := "black" + if strings.Contains(payload.Name, "♥") || + strings.Contains(payload.Name, "♦") { + color = "red" + } + transform := `transform: translate(` + strconv.Itoa(payload.Left) + `px, ` + strconv.Itoa(payload.Top) + `px)` + if payload.Angle != "" { + transform += ` rotateZ(` + payload.Angle + `)` + } + if payload.Burn { + transform += ` rotateY(180deg)` + } + transform += ";" + send(`<style> #` + payload.ID + ` { z-index: ` + strconv.Itoa(payload.Idx) + `; transition: 1s ease-in-out; @@ -1163,7 +1194,9 @@ Loop: } #` + payload.ID + ` .card .inner:before { content: "` + payload.Name + `"; color: ` + color + `; } </style>`) - c.Response().Flush() + c.Response().Flush() + } } + //PokerPubSub.Pub(myTopic, PokerEvent{}) return nil }