Chore: solved some todos
This commit is contained in:
@ -10,7 +10,7 @@ import (
|
||||
type Config struct {
|
||||
ServerConfig ServerConfig `toml:"SERVICE"`
|
||||
BaseURL string `toml:"BASE_URL"`
|
||||
SessionLifetime int `toml:"SESSION_LIFETIME_SECONDS"`
|
||||
SessionLifetime int64 `toml:"SESSION_LIFETIME_SECONDS"`
|
||||
CookieSecret string `toml:"COOKIE_SECRET"`
|
||||
LLMConfig LLMConfig `toml:"LLM"`
|
||||
}
|
||||
|
@ -183,17 +183,6 @@ func cacheSetSession(key string, session *models.Session) error {
|
||||
return err
|
||||
}
|
||||
memcache.Set(key, sesb)
|
||||
// TODO: to config
|
||||
memcache.Expire(key, 60*60)
|
||||
memcache.Expire(key, cfg.SessionLifetime)
|
||||
return nil
|
||||
}
|
||||
|
||||
// unused
|
||||
// func updateRoomInSession(ctx context.Context, roomID string) (context.Context, error) {
|
||||
// s, ok := ctx.Value(models.CtxSessionKey).(*models.Session)
|
||||
// if !ok {
|
||||
// return context.TODO(), errors.New("failed to extract session from ctx")
|
||||
// }
|
||||
// s.CurrentRoom = roomID
|
||||
// return context.WithValue(ctx, "session", s), nil
|
||||
// }
|
||||
|
@ -167,8 +167,6 @@ func HandleAddBot(w http.ResponseWriter, r *http.Request) {
|
||||
abortWithError(w, err.Error())
|
||||
return
|
||||
}
|
||||
// TODO: what if bot exists already?
|
||||
// control number and names of bots
|
||||
botname := fmt.Sprintf("bot_%d", len(llmapi.SignalChanMap)+1) // what if many rooms?
|
||||
bot, err := llmapi.NewBot(role, team, botname, fi.Room.ID, cfg)
|
||||
if err != nil {
|
||||
|
@ -135,11 +135,14 @@ func HandleStartGame(w http.ResponseWriter, r *http.Request) {
|
||||
abortWithError(w, err.Error())
|
||||
return
|
||||
}
|
||||
// TODO: check if enough players; also button should be hidden if already running
|
||||
// check if enough players
|
||||
if err := fi.Room.CanStart(); err != nil {
|
||||
abortWithError(w, err.Error())
|
||||
return
|
||||
}
|
||||
fi.Room.IsRunning = true
|
||||
fi.Room.IsOver = false
|
||||
fi.Room.TeamTurn = "blue"
|
||||
// fi.Room.LoadTestCards()
|
||||
loadCards(fi.Room)
|
||||
fi.Room.UpdateCounter()
|
||||
fi.Room.TeamWon = ""
|
||||
|
@ -26,7 +26,6 @@ func init() {
|
||||
memcache = cache.MemCache
|
||||
cfg = config.LoadConfigOrDefault("")
|
||||
Notifier = broker.Notifier
|
||||
// go Notifier.Listen()
|
||||
}
|
||||
|
||||
func HandlePing(w http.ResponseWriter, r *http.Request) {
|
||||
@ -84,6 +83,7 @@ func HandleExit(w http.ResponseWriter, r *http.Request) {
|
||||
if len(exitedRoom.PlayerList) == 0 || creatorLeft {
|
||||
removeRoom(exitedRoom.ID)
|
||||
// TODO: notify users if creator left
|
||||
// and throw them away
|
||||
notify(models.NotifyRoomListUpdate, "")
|
||||
}
|
||||
if err := saveState(fi.State.Username, fi.State); err != nil {
|
||||
|
@ -26,9 +26,7 @@ func LogRequests(next http.Handler) http.Handler {
|
||||
|
||||
func GetSession(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
// TODO: move
|
||||
cookieName := "session_token"
|
||||
sessionCookie, err := r.Cookie(cookieName)
|
||||
sessionCookie, err := r.Cookie(models.AuthCookie)
|
||||
if err != nil {
|
||||
msg := "auth failed; failed to get session token from cookies"
|
||||
log.Debug(msg, "error", err)
|
||||
@ -54,7 +52,7 @@ func GetSession(next http.Handler) http.Handler {
|
||||
sessionToken := cookieValue[sha256.Size:]
|
||||
//verify signature
|
||||
mac := hmac.New(sha256.New, []byte(cfg.CookieSecret))
|
||||
mac.Write([]byte(cookieName))
|
||||
mac.Write([]byte(models.AuthCookie))
|
||||
mac.Write([]byte(sessionToken))
|
||||
expectedSignature := mac.Sum(nil)
|
||||
if !hmac.Equal([]byte(signature), expectedSignature) {
|
||||
|
@ -15,13 +15,6 @@ import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
// TODO: config for url and token
|
||||
// completion prompt
|
||||
// MIME: llm needs to know all the cards, colors and previous actions
|
||||
// GUESSER: llm needs to know all the cards and previous actions
|
||||
|
||||
// channels are not serializable
|
||||
|
||||
var (
|
||||
// botname -> channel
|
||||
SignalChanMap = make(map[string]chan bool)
|
||||
@ -29,7 +22,6 @@ var (
|
||||
// got prompt: control character (\\u0000-\\u001F) found while parsing a string at line 4 column 0
|
||||
MimePrompt = `we are playing alias;\nyou are a mime (player who gives a clue of one noun word and number of cards you expect them to open) of the %s team (people who would guess by your clue want open the %s cards);\nplease return your clue, number of cards to open and what words you mean them to find using that clue in json like:\n{\n\"clue\": \"one-word-noun\",\n\"number\": \"number-from-0-to-9\",\n\"words_I_mean_my_team_to_open\": [\"this\", \"that\", ...]\n}\nthe team who openes all their cards first wins.\nplease return json only.\nunopen Blue cards left: %d;\nunopen Red cards left: %d;\nhere is the game info in json:\n%s`
|
||||
GuesserPrompt = `we are playing alias;\nyou are to guess words of the %s team (people who would guess by your clue want open the %s cards) by given clue and a number of meant guesses;\nplease return your guesses and words that you did not wish to open, but think that they could be also meant by the clue in json like:\n{\n\"guesses\": [\"word1\", \"word2\", ...],\n\"could_be\": [\"this\", \"that\", ...]\n}\nthe team who openes all their cards first wins.\nplease return json only.\nunopen Blue cards left: %d;\nunopen Red cards left: %d;\nhere is the game info in json:\n%s`
|
||||
// notifier =
|
||||
)
|
||||
|
||||
type DSResp struct {
|
||||
@ -245,6 +237,13 @@ func NewBot(role, team, name, roomID string, cfg *config.Config) (*Bot, error) {
|
||||
Role: models.StrToUserRole(role),
|
||||
Team: models.StrToUserTeam(team),
|
||||
}
|
||||
// check if already has the same team-role bot
|
||||
// only one is allowed
|
||||
for n, p := range room.BotMap {
|
||||
if p.Role == bp.Role && p.Team == bp.Team {
|
||||
return nil, fmt.Errorf("already has such bot with name: %s", n)
|
||||
}
|
||||
}
|
||||
room.BotMap[name] = bp
|
||||
switch team {
|
||||
case "red":
|
||||
@ -385,11 +384,5 @@ func (b *Bot) CallLLM(prompt string) ([]byte, error) {
|
||||
return nil, err
|
||||
}
|
||||
b.log.Debug("llm resp", "body", string(body))
|
||||
// TODO: case where it has other text, not only json
|
||||
// TODO: how to know which resp it is? mime or guessser?
|
||||
// resp := &MimeResp{}
|
||||
// if err := json.Unmarshal(body, &resp); err != nil {
|
||||
// return nil, err
|
||||
// }
|
||||
return body, nil
|
||||
}
|
||||
|
18
main.go
18
main.go
@ -1,20 +1,27 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"golias/config"
|
||||
"golias/handlers"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
"time"
|
||||
)
|
||||
|
||||
// TODO: add config as param
|
||||
var cfg *config.Config
|
||||
|
||||
func init() {
|
||||
cfg = config.LoadConfigOrDefault("")
|
||||
}
|
||||
|
||||
func ListenToRequests(port string) error {
|
||||
mux := http.NewServeMux()
|
||||
server := &http.Server{
|
||||
Handler: handlers.LogRequests(handlers.GetSession(mux)),
|
||||
Addr: port,
|
||||
ReadTimeout: time.Second * 5,
|
||||
WriteTimeout: 0, // sse streaming
|
||||
Addr: fmt.Sprintf(":%s", port),
|
||||
ReadTimeout: time.Second * 5, // TODO: to cfg
|
||||
WriteTimeout: 0, // sse streaming
|
||||
}
|
||||
fs := http.FileServer(http.Dir("assets/"))
|
||||
mux.Handle("GET /assets/", http.StripPrefix("/assets/", fs))
|
||||
@ -43,8 +50,7 @@ func ListenToRequests(port string) error {
|
||||
}
|
||||
|
||||
func main() {
|
||||
port := ":3000"
|
||||
err := ListenToRequests(port)
|
||||
err := ListenToRequests(cfg.ServerConfig.Port)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package models
|
||||
|
||||
var (
|
||||
AuthCookie = "session_token"
|
||||
CtxRoomIDKey = "current_room"
|
||||
CtxUsernameKey = "username"
|
||||
CtxSessionKey = "session"
|
||||
|
@ -1,6 +1,7 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"golias/utils"
|
||||
"time"
|
||||
@ -83,6 +84,25 @@ type Room struct {
|
||||
TeamWon UserTeam // blue | red
|
||||
}
|
||||
|
||||
func (r *Room) CanStart() error {
|
||||
if r.IsRunning {
|
||||
return errors.New("cannot start; game is already running")
|
||||
}
|
||||
if r.RedTeam.Mime == "" {
|
||||
return errors.New("cannot start; red team has no mime")
|
||||
}
|
||||
if r.BlueTeam.Mime == "" {
|
||||
return errors.New("cannot start; blue team has no mime")
|
||||
}
|
||||
if len(r.RedTeam.Guessers) == 0 {
|
||||
return errors.New("cannot start; red team has no guessers")
|
||||
}
|
||||
if len(r.BlueTeam.Guessers) == 0 {
|
||||
return errors.New("cannot start; blue team has no guessers")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// WhichBotToMove returns bot name that have to move or empty string
|
||||
func (r *Room) WhichBotToMove() string {
|
||||
fmt.Println("looking for bot to move", "team-turn", r.TeamTurn, "mime-done", r.MimeDone, "bot-map", r.BotMap, "is_running", r.IsRunning)
|
||||
@ -141,46 +161,6 @@ func (r *Room) UpdateCounter() {
|
||||
r.BlueCounter = blueCounter
|
||||
}
|
||||
|
||||
// func (r *Room) LoadTestCards() {
|
||||
// // TODO: pass room settings
|
||||
// // TODO: map language to path
|
||||
// wl := wordloader.InitDefaultLoader("assets/words/en_nouns.txt")
|
||||
// cards, err := wl.Load()
|
||||
// if err != nil {
|
||||
// // no logger
|
||||
// fmt.Println("failed to load cards", "error", err)
|
||||
// }
|
||||
// r.Cards = cards
|
||||
// // cards := []WordCard{
|
||||
// // {Word: "hamster", Color: "blue"},
|
||||
// // {Word: "child", Color: "red"},
|
||||
// // {Word: "wheel", Color: "white"},
|
||||
// // {Word: "condition", Color: "black"},
|
||||
// // {Word: "test", Color: "white"},
|
||||
// // {Word: "ball", Color: "blue"},
|
||||
// // {Word: "violin", Color: "red"},
|
||||
// // {Word: "rat", Color: "white"},
|
||||
// // {Word: "perplexity", Color: "blue"},
|
||||
// // {Word: "notion", Color: "red"},
|
||||
// // {Word: "guitar", Color: "blue"},
|
||||
// // {Word: "ocean", Color: "blue"},
|
||||
// // {Word: "moon", Color: "blue"},
|
||||
// // {Word: "coffee", Color: "blue"},
|
||||
// // {Word: "mountain", Color: "blue"},
|
||||
// // {Word: "book", Color: "blue"},
|
||||
// // {Word: "camera", Color: "blue"},
|
||||
// // {Word: "apple", Color: "red"},
|
||||
// // {Word: "fire", Color: "red"},
|
||||
// // {Word: "rose", Color: "red"},
|
||||
// // {Word: "sun", Color: "red"},
|
||||
// // {Word: "cherry", Color: "red"},
|
||||
// // {Word: "heart", Color: "red"},
|
||||
// // {Word: "tomato", Color: "red"},
|
||||
// // {Word: "cloud", Color: "white"},
|
||||
// // }
|
||||
// // r.Cards = cards
|
||||
// }
|
||||
|
||||
func (r *Room) ChangeTurn() {
|
||||
switch r.TeamTurn {
|
||||
case "blue":
|
||||
|
Reference in New Issue
Block a user