|
|
@@ -1,16 +1,30 @@
|
|
|
use actix_web::{HttpResponse, HttpRequest, web, post};
|
|
|
use sqlx::PgPool;
|
|
|
use uuid::Uuid;
|
|
|
+use serde::Serialize;
|
|
|
use crate::{
|
|
|
http_error::HttpError,
|
|
|
auth::user_auth,
|
|
|
models::{
|
|
|
+ user::User,
|
|
|
game::Game,
|
|
|
character::Character,
|
|
|
- session::Session
|
|
|
+ session::Session,
|
|
|
+ turn::Turn
|
|
|
+ },
|
|
|
+ logic::prompt::{
|
|
|
+ PromptMessage,
|
|
|
+ PromptRole,
|
|
|
+ send_message
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+#[derive(Serialize)]
|
|
|
+struct Response {
|
|
|
+ session: Session,
|
|
|
+ turn: Turn
|
|
|
+}
|
|
|
+
|
|
|
#[post("/game/{game_id}/session")]
|
|
|
pub async fn route(
|
|
|
db: web::Data<PgPool>,
|
|
|
@@ -19,17 +33,32 @@ pub async fn route(
|
|
|
) -> Result<HttpResponse, HttpError> {
|
|
|
let user = user_auth(&db, &req, true).await?;
|
|
|
let game_id = Uuid::parse_str(&path.into_inner())?;
|
|
|
- let (game, mut characters, sessions) = Game::get_full_game(&db, game_id, Some(user.id)).await?;
|
|
|
- let text = new_session_text(game.game_context.clone(), characters.remove(0), sessions);
|
|
|
+ let (game, mut characters, sessions) = Game::get_full_game(&db, game_id.clone(), Some(user.id)).await?;
|
|
|
+ let prompt = new_session_prompt(game.game_context.clone(), characters.remove(0), sessions);
|
|
|
+ let response = send_message(prompt).await?;
|
|
|
+ let session = Session::new(game_id);
|
|
|
+ let turn = Turn::new(
|
|
|
+ session.id,
|
|
|
+ response.input_tokens,
|
|
|
+ response.output_tokens,
|
|
|
+ "".to_string(),
|
|
|
+ response.message
|
|
|
+ );
|
|
|
+ session.insert(&db).await?;
|
|
|
+ turn.insert(&db).await?;
|
|
|
+ User::add_tokens(&db, user.id, -turn.tokens_used).await?;
|
|
|
|
|
|
- Ok(HttpResponse::Ok().json(game))
|
|
|
+ Ok(HttpResponse::Ok().json(Response {
|
|
|
+ session: session,
|
|
|
+ turn: turn
|
|
|
+ }))
|
|
|
}
|
|
|
|
|
|
-fn new_session_text(
|
|
|
+fn new_session_prompt(
|
|
|
game_context: String,
|
|
|
character: Character,
|
|
|
sessions: Vec<Session>
|
|
|
-) -> String {
|
|
|
+) -> Vec<PromptMessage> {
|
|
|
let mut text = "".to_string();
|
|
|
|
|
|
text += "You are acting as a game master for an RPG and running the game.\n";
|
|
|
@@ -44,11 +73,17 @@ fn new_session_text(
|
|
|
text += "This is the first session in this game, there have been no previous sessions\n";
|
|
|
} else {
|
|
|
for (i, session) in sessions.iter().enumerate() {
|
|
|
- text += &format!("Summary of session {}: {}\n", i, session.summary);
|
|
|
+ match &session.summary {
|
|
|
+ Some(s) => {text += &format!("Summary of session {}: {}\n", i, s)},
|
|
|
+ None => ()
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
text += "Start off a new session for the player";
|
|
|
|
|
|
- text
|
|
|
+ vec![PromptMessage {
|
|
|
+ role: PromptRole::System,
|
|
|
+ content: text
|
|
|
+ }]
|
|
|
}
|