Add page for slow game

O01eg
Sep 12, 2022, 9:40 AM
6NYILMKIHYQMGMCRZANU2FDO66DGINOMCX2J4JFTUI6VL3HZ6D5QC

Dependencies

  • [2] K74N3DFC Display different status of games
  • [3] 3GGMBQ2N Update dependencies and add list of slow games
  • [*] DNFB7TNI Add new pages and links to slow games and reset game password
  • [*] 65A3LIWU Use handlebars to render index
  • [*] EVP2FSBH Split index page
  • [*] WW3KRXX6 Add page for reset game password
  • [*] HZDCKIXQ Use constants for templates
  • [*] 4MZ4VIR7 Initial commit
  • [*] CMA5SKJ3 Copy turns Atom generator
  • [*] ZRU62WXD Send email with change game password link
  • [*] 556ZESEO Add RSS for new games

Change contents

  • replacement in src/templates/slow-games.html at line 35
    [2.239][2.239:268]()
    >{{ game.gameuid }}</li>
    [2.239]
    [3.384]
    ><a href="slow-game-{{ game.gameuidenc }}.html">{{ game.gameuid }}</a></li>
  • file addition: slow-game.html (----------)
    [6.12]
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <link rel="alternate" type="application/rss+xml" href="atoms/{{ gameuidenc }}.xml" title="Multiplayer FreeOrion slow game turns" />
    <link rel="stylesheet" type="text/css" href="static/style.css" />
    <title>Welcome to multiplayer FreeOrion slow games!</title>
    </head>
    <body>
    <div class="navi">
    </div>
    <div class="content">
    <h1>Welcome to FreeOrion slow game {{ gameuid }}!</h1>
    </div>
    {{> footer}}
    </body>
    </html>
  • file addition: slow_game.rs (----------)
    [7.17]
    use actix_web::{web, HttpResponse};
    use crate::pages::insert_security_headers;
    use crate::pages::templates::SLOW_GAME;
    use crate::WebData;
    #[derive(serde_derive::Serialize)]
    struct GameData<'a> {
    gameuid: &'a str,
    gameuidenc: String,
    }
    #[actix_web::get("slow-game-{path}.html")]
    pub async fn slow_game(path: web::Path<String>, data: web::Data<WebData<'_>>) -> HttpResponse {
    let gameuid = path.into_inner();
    let gameuid = match gameuid.char_indices().nth(128) {
    None => gameuid,
    Some((idx, _)) => (&gameuid[..idx]).to_string(),
    };
    let dbclient = match data.pool_ro.get().await {
    Ok(client) => client,
    Err(e) => {
    log::error!("{}", e);
    return HttpResponse::ServiceUnavailable().body(actix_web::body::None::new());
    }
    };
    let stmt = match dbclient.prepare("select g.status, g.notes_html, g.fo_forum_url, (select count(*) from games.players p where p.game_uid = g.game_uid and p.client_type = 'p'), MIN(t.turn_ts), MAX(t.turn_ts), COUNT(t.turn) from games.games g left join games.turns t on t.game_uid = g.game_uid where g.game_uid = $1 group by g.game_uid;").await {
    Ok(stmt) => stmt,
    Err(e) => {
    log::error!("{}", e);
    return HttpResponse::ServiceUnavailable().body(actix_web::body::None::new());
    }
    };
    let rows = match dbclient.query_opt(&stmt, &[&gameuid]).await {
    Ok(rows) => rows,
    Err(e) => {
    log::error!("Pool RO query error {}", e);
    return HttpResponse::ServiceUnavailable().body(actix_web::body::None::new());
    }
    };
    let _row = match rows {
    Some(r) => r,
    None => {
    return HttpResponse::NotFound().body("Not found");
    }
    };
    let body = match data.handlebars_xml.render(
    SLOW_GAME,
    &GameData {
    gameuid: &gameuid,
    gameuidenc: pct_str::PctString::encode(gameuid.chars(), pct_str::URIReserved)
    .into_string(),
    },
    ) {
    Ok(b) => b,
    Err(e) => {
    log::error!("{}", e);
    return HttpResponse::ServiceUnavailable().body(actix_web::body::None::new());
    }
    };
    insert_security_headers(HttpResponse::Ok()).body(body)
    }
  • edit in src/pages/mod.rs at line 11
    [8.1091]
    [5.2174]
    pub mod slow_game;
  • edit in src/pages/mod.rs at line 20
    [5.2242]
    [9.1270]
    pub const SLOW_GAME: &str = "slow-game";
  • edit in src/main.rs at line 19
    [8.1187]
    [5.2243]
    use pages::slow_game::slow_game;
  • edit in src/main.rs at line 125
    [11.3899]
    [12.1099]
    // put it here to include direct HTML notes
    handlebars_xml
    .register_template_string(
    templates::SLOW_GAME,
    include_str!("templates/slow-game.html"),
    )
    .expect("slow game template");
  • edit in src/main.rs at line 193
    [11.3961]
    [13.3370]
    .service(slow_game)