Files
inp2025/handlers/wordle/handlers.go
2025-10-16 07:12:01 +08:00

104 lines
2.0 KiB
Go

package wordle
import (
"fmt"
"net/http"
"gitea.konchin.com/ytshih/inp2025/types"
"github.com/gorilla/websocket"
)
type Operation interface {
Run(self *Handlers) error
}
type OperationSubs struct {
Username string
SubsCh *chan types.WordleState
}
func (op *OperationSubs) Run(self *Handlers) error {
_, ok := self.state.History[op.Username]
if !ok {
self.state.History[op.Username] = [types.GUESS_COUNT_LIMIT]types.Guess{}
}
self.subs = append(self.subs, op.SubsCh)
return nil
}
type OperationGuess struct {
Username string
Guess string
}
func (op *OperationGuess) Run(self *Handlers) error {
self.state.CurrentGuess[op.Username] = op.Guess
if len(self.state.CurrentGuess) < len(self.state.History) {
return nil
}
for user, guess := range self.state.CurrentGuess {
if guess == self.ans {
self.state.GameEnd = true
}
guesses := self.state.History[user]
guesses[self.state.Round] = types.NewGuess(guess, self.ans)
self.state.History[user] = guesses
}
self.state.CurrentGuess = make(map[types.UsernameType]string)
self.state.Round++
if self.state.Round >= types.GUESS_COUNT_LIMIT {
self.state.GameEnd = true
}
return nil
}
type OperationEnd struct{}
func (op *OperationEnd) Run(self *Handlers) error {
self.state.GameEnd = true
return nil
}
type Handlers struct {
ans string
state types.WordleState
upgrader websocket.Upgrader
subs []*chan types.WordleState
opCh chan Operation
}
func NewHandlers(ans string) *Handlers {
ret := &Handlers{
ans: ans,
state: types.NewWordleState(),
upgrader: websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
return true
},
},
opCh: make(chan Operation),
}
go ret.GameFlow()
return ret
}
func (self *Handlers) GameFlow() {
for op := range self.opCh {
if err := op.Run(self); err != nil {
panic(fmt.Errorf("game flow operation failed, %w", err))
}
for _, ch := range self.subs {
*ch <- self.state
}
}
}