Add version check system
This commit is contained in:
@ -3,12 +3,13 @@ use crate::server;
|
||||
use futures::stream::{SplitSink, SplitStream};
|
||||
use futures::{SinkExt, StreamExt};
|
||||
use hyper_rustls::ConfigBuilderExt;
|
||||
use sea_battle_backend::data::GameRules;
|
||||
use sea_battle_backend::data::*;
|
||||
use sea_battle_backend::human_player_ws::{ClientMessage, ServerMessage};
|
||||
use sea_battle_backend::server::{
|
||||
AcceptInviteQuery, BotPlayQuery, CreateInviteQuery, PlayRandomQuery,
|
||||
};
|
||||
use sea_battle_backend::utils::res_utils::{boxed_error, Res};
|
||||
use std::error::Error;
|
||||
use std::fmt::Display;
|
||||
use std::sync::mpsc::TryRecvError;
|
||||
use std::sync::{mpsc, Arc};
|
||||
@ -18,6 +19,11 @@ use tokio_tungstenite::{MaybeTlsStream, WebSocketStream};
|
||||
|
||||
type WsStream = WebSocketStream<MaybeTlsStream<TcpStream>>;
|
||||
|
||||
pub enum GetRemoteVersionError {
|
||||
ConnectionFailed,
|
||||
Other(Box<dyn Error>),
|
||||
}
|
||||
|
||||
/// Connection client
|
||||
///
|
||||
/// This structure acts as a wrapper around websocket connection that handles automatically parsing
|
||||
@ -28,6 +34,24 @@ pub struct Client {
|
||||
}
|
||||
|
||||
impl Client {
|
||||
/// Get remote server version
|
||||
pub async fn get_server_version() -> Result<VersionInfo, GetRemoteVersionError> {
|
||||
let url = format!("{}/version", cli_args().remote_server);
|
||||
log::debug!("Getting remote information from {} ...", url);
|
||||
|
||||
let res = match reqwest::get(url).await {
|
||||
Ok(r) => r,
|
||||
Err(e) if e.is_timeout() || e.is_connect() => {
|
||||
return Err(GetRemoteVersionError::ConnectionFailed)
|
||||
}
|
||||
Err(e) => return Err(GetRemoteVersionError::Other(Box::new(e))),
|
||||
};
|
||||
|
||||
res.json()
|
||||
.await
|
||||
.map_err(|e| GetRemoteVersionError::Other(Box::new(e)))
|
||||
}
|
||||
|
||||
/// Start to play against a bot
|
||||
///
|
||||
/// When playing against a bot, local server is always used
|
||||
@ -51,7 +75,7 @@ impl Client {
|
||||
/// Start to play against a random player
|
||||
pub async fn start_random_play<D: Display>(player_name: D) -> Res<Self> {
|
||||
Self::connect_url(
|
||||
&cli_args().remote_server_uri,
|
||||
&cli_args().remote_server,
|
||||
&format!(
|
||||
"/play/random?{}",
|
||||
serde_urlencoded::to_string(&PlayRandomQuery {
|
||||
@ -66,7 +90,7 @@ impl Client {
|
||||
/// Start a play by creating an invite
|
||||
pub async fn start_create_invite<D: Display>(rules: &GameRules, player_name: D) -> Res<Self> {
|
||||
Self::connect_url(
|
||||
&cli_args().remote_server_uri,
|
||||
&cli_args().remote_server,
|
||||
&format!(
|
||||
"/play/create_invite?{}",
|
||||
serde_urlencoded::to_string(&CreateInviteQuery {
|
||||
@ -82,7 +106,7 @@ impl Client {
|
||||
/// Start a play by accepting an invite
|
||||
pub async fn start_accept_invite<D: Display>(code: String, player_name: D) -> Res<Self> {
|
||||
Self::connect_url(
|
||||
&cli_args().remote_server_uri,
|
||||
&cli_args().remote_server,
|
||||
&format!(
|
||||
"/play/accept_invite?{}",
|
||||
serde_urlencoded::to_string(&AcceptInviteQuery {
|
||||
|
Reference in New Issue
Block a user