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{} } // fmt.Fprintf(os.Stderr, "[DEBUG] %+v\n", self.state.History) self.subs = append(self.subs, op.SubsCh) return nil } type OperationGuess struct { Username string `msgpack:"username"` Guess string `msgpack:"guess"` } 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 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)) } // fmt.Fprintf(os.Stderr, "[DEBUG] %+v\n", self.state.History) for _, ch := range self.subs { *ch <- self.state } } }