Enha: bot guesser
This commit is contained in:
		| @@ -27,8 +27,8 @@ var ( | ||||
| 	SignalChanMap = make(map[string]chan bool) | ||||
| 	DoneChanMap   = make(map[string]chan bool) | ||||
| 	// 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 red team (people who would guess by your clue want open the red 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 red team (people who would guess by your clue want open the red 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` | ||||
| 	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 = | ||||
| ) | ||||
|  | ||||
| @@ -142,12 +142,57 @@ func (b *Bot) StartBot() { | ||||
| 				room.MimeDone = true | ||||
| 				eventPayload = mimeResp.Clue + mimeResp.Number | ||||
| 			case models.UserRoleGuesser: | ||||
| 				gr := GusserResp{} | ||||
| 				if err := json.Unmarshal([]byte(sj), &gr); err != nil { | ||||
| 					b.log.Error("failed to unmarshal guesser resp", "error", err) | ||||
| 					return | ||||
| 				for _, word := range tempMap["guesses"].([]string) { | ||||
| 					color, exists := room.WCMap[word] | ||||
| 					b.log.Debug("bot trying to open card", "word", word, "color", | ||||
| 						color, "exists", exists) | ||||
| 					if !exists { | ||||
| 						return | ||||
| 					} | ||||
| 					room.RevealSpecificWord(word) | ||||
| 					room.UpdateCounter() | ||||
| 					action := models.Action{ | ||||
| 						Actor:      b.BotName, | ||||
| 						ActorColor: b.Team, | ||||
| 						WordColor:  string(color), | ||||
| 						Action:     "guessed", | ||||
| 						Word:       word, | ||||
| 					} | ||||
| 					room.ActionHistory = append(room.ActionHistory, action) | ||||
| 					// if opened card is of color of opp team, change turn | ||||
| 					oppositeColor := room.GetOppositeTeamColor() | ||||
| 					switch string(color) { | ||||
| 					case "black": | ||||
| 						// game over | ||||
| 						room.IsRunning = false | ||||
| 						room.IsOver = true | ||||
| 						room.TeamWon = oppositeColor | ||||
| 					case "white", string(oppositeColor): | ||||
| 						// end turn | ||||
| 						room.TeamTurn = oppositeColor | ||||
| 						room.MimeDone = false | ||||
| 					} | ||||
| 					// check if no cards left => game over | ||||
| 					if room.BlueCounter == 0 { | ||||
| 						// blue won | ||||
| 						room.IsRunning = false | ||||
| 						room.IsOver = true | ||||
| 						room.TeamWon = "blue" | ||||
| 					} | ||||
| 					if room.RedCounter == 0 { | ||||
| 						// red won | ||||
| 						room.IsRunning = false | ||||
| 						room.IsOver = true | ||||
| 						room.TeamWon = "red" | ||||
| 					} | ||||
| 					if err := saveRoom(room); err != nil { | ||||
| 						b.log.Error("failed to save room", "room", room) | ||||
| 						return | ||||
| 					} | ||||
| 				} | ||||
| 				b.log.Info("mime resp log", "guesserResp", gr) | ||||
| 				b.log.Info("mime resp log", "guesserResp", tempMap) | ||||
| 				eventName = models.NotifyRoomUpdatePrefix + room.ID | ||||
| 				eventPayload = "" | ||||
| 			default: | ||||
| 				b.log.Error("unexpected role", "role", b.Role, "llmResp", sj) | ||||
| 				return | ||||
| @@ -157,6 +202,9 @@ func (b *Bot) StartBot() { | ||||
| 				b.log.Error("failed to save room", "error", err) | ||||
| 				return | ||||
| 			} | ||||
| 			if botName := room.WhichBotToMove(); botName != "" { | ||||
| 				SignalChanMap[botName] <- true | ||||
| 			} | ||||
| 			broker.Notifier.Notifier <- broker.NotificationEvent{ | ||||
| 				EventName: eventName, | ||||
| 				Payload:   eventPayload, | ||||
| @@ -291,11 +339,10 @@ func (b *Bot) BuildPrompt(room *models.Room) string { | ||||
| 	// Escape the JSON string for inclusion in another JSON field | ||||
| 	escapedData := strings.ReplaceAll(string(data), `"`, `\"`) | ||||
| 	if b.Role == models.UserRoleMime { | ||||
| 		return fmt.Sprintf(MimePrompt, room.BlueCounter, room.RedCounter, escapedData) | ||||
| 		return fmt.Sprintf(MimePrompt, b.Team, b.Team, room.BlueCounter, room.RedCounter, escapedData) | ||||
| 	} | ||||
| 	if b.Role == models.UserRoleMime { | ||||
| 		// TODO: | ||||
| 		return "" | ||||
| 	if b.Role == models.UserRoleGuesser { | ||||
| 		return fmt.Sprintf(GuesserPrompt, b.Team, b.Team, room.BlueCounter, room.RedCounter, escapedData) | ||||
| 	} | ||||
| 	return "" | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Grail Finder
					Grail Finder