Enha: simplier guesser prompt; player team-role recovery
This commit is contained in:
@ -275,6 +275,24 @@ func listBots() map[string]map[string]string {
|
||||
return resp
|
||||
}
|
||||
|
||||
// get players
|
||||
func listPlayers() map[string]map[string]string {
|
||||
cacheMap := memcache.GetAll()
|
||||
resp := make(map[string]map[string]string)
|
||||
// no way to know if room is public until unmarshal -_-;
|
||||
for key, value := range cacheMap {
|
||||
if strings.HasPrefix(key, models.CacheStatePrefix) {
|
||||
playerMap := make(map[string]string)
|
||||
if err := json.Unmarshal(value, &playerMap); err != nil {
|
||||
log.Warn("failed to unmarshal player", "error", err)
|
||||
continue
|
||||
}
|
||||
resp[playerMap["Username"]] = playerMap
|
||||
}
|
||||
}
|
||||
return resp
|
||||
}
|
||||
|
||||
func notify(event, msg string) {
|
||||
Notifier.Notifier <- broker.NotificationEvent{
|
||||
EventName: event,
|
||||
@ -317,3 +335,34 @@ func recoverBot(bm map[string]string) error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func recoverPlayers() {
|
||||
players := listPlayers()
|
||||
for playerName, playerMap := range players {
|
||||
if err := recoverPlayer(playerMap); err != nil {
|
||||
log.Warn("failed to recover player", "playerName", playerName, "error", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func recoverPlayer(pm map[string]string) error {
|
||||
// check if room still exists
|
||||
room, err := getRoomByID(pm["RoomID"])
|
||||
if err != nil {
|
||||
return fmt.Errorf("no such room: %s; err: %w", pm["RoomID"], err)
|
||||
}
|
||||
log.Debug("recovering player", "player", pm)
|
||||
role, team, ok := room.GetPlayerByName(pm["Username"])
|
||||
if !ok {
|
||||
return fmt.Errorf("failed to find player %s in the room %v", pm["Username"], room)
|
||||
}
|
||||
// pm["Role"] = string(role)
|
||||
// pm["Team"] = string(team)
|
||||
us := &models.UserState{
|
||||
Username: pm["Username"],
|
||||
RoomID: pm["RoomID"],
|
||||
Team: team,
|
||||
Role: role,
|
||||
}
|
||||
return saveState(pm["Username"], us)
|
||||
}
|
||||
|
@ -96,7 +96,7 @@ func HandleFrontLogin(w http.ResponseWriter, r *http.Request) {
|
||||
abortWithError(w, err.Error())
|
||||
return
|
||||
}
|
||||
room.PlayerList = append(room.PlayerList, fi.State.Username)
|
||||
// room.PlayerList = append(room.PlayerList, fi.State.Username)
|
||||
fi.State.RoomID = room.ID
|
||||
fi.Room = room
|
||||
fi.List = nil
|
||||
|
@ -204,7 +204,7 @@ func HandleJoinRoom(w http.ResponseWriter, r *http.Request) {
|
||||
// abortWithError(w, err.Error())
|
||||
return
|
||||
}
|
||||
room.PlayerList = append(room.PlayerList, fi.State.Username)
|
||||
// room.PlayerList = append(room.PlayerList, fi.State.Username)
|
||||
fi.State.RoomID = room.ID
|
||||
fi.Room = room
|
||||
fi.List = nil
|
||||
|
@ -31,6 +31,8 @@ func init() {
|
||||
// bot loader
|
||||
// check the rooms if it has bot_{digits} in them, create bots if have
|
||||
recoverBots()
|
||||
// if player has a roomID, but no team and role, try to recover
|
||||
recoverPlayers()
|
||||
}
|
||||
|
||||
func HandlePing(w http.ResponseWriter, r *http.Request) {
|
||||
@ -85,7 +87,7 @@ func HandleExit(w http.ResponseWriter, r *http.Request) {
|
||||
abortWithError(w, err.Error())
|
||||
return
|
||||
}
|
||||
if len(exitedRoom.PlayerList) == 0 || creatorLeft {
|
||||
if creatorLeft {
|
||||
removeRoom(exitedRoom.ID)
|
||||
// TODO: notify users if creator left
|
||||
// and throw them away
|
||||
|
Reference in New Issue
Block a user