pub mod types;
use serde::de::DeserializeOwned;
use crate::{Error, RequestClient};
use self::types::{
Abilities, ActivePlayer, AllGameData, AllPlayer, Events, FullRunes, GameData, Item, Runes,
Scores, SummonerSpells, TeamID,
};
pub const URL: &str = "127.0.0.1:2999";
pub struct GameClient;
impl GameClient {
#[must_use]
pub fn new() -> GameClient {
GameClient
}
#[must_use]
pub fn url(&self) -> &str {
URL
}
pub async fn all_game_data(
&self,
request_client: &RequestClient,
) -> Result<AllGameData, Error> {
self.live_client("allgamedata", None, request_client).await
}
pub async fn active_player(
&self,
request_client: &RequestClient,
) -> Result<ActivePlayer, Error> {
self.live_client("activeplayer", None, request_client).await
}
pub async fn active_player_name(
&self,
request_client: &RequestClient,
) -> Result<String, Error> {
self.live_client("activeplayername", None, request_client)
.await
}
pub async fn active_player_abilities(
&self,
request_client: &RequestClient,
) -> Result<Abilities, Error> {
self.live_client("activeplayerabilities", None, request_client)
.await
}
pub async fn active_player_runes(
&self,
request_client: &RequestClient,
) -> Result<FullRunes, Error> {
self.live_client("activeplayerrunes", None, request_client)
.await
}
pub async fn player_list(
&self,
team: Option<TeamID>,
request_client: &RequestClient,
) -> Result<Vec<AllPlayer>, Error> {
let team = team.map_or_else(
|| "",
|team| match team {
TeamID::ALL => "?teamID=ALL",
TeamID::UNKNOWN => "?teamID=UNKNOWN",
TeamID::ORDER => "?teamID=ORDER",
TeamID::CHAOS => "?teamID=CHAOS",
TeamID::NEUTRAL => "?teamID=NEUTRAL",
},
);
let endpoint = format!("playerlist{team}");
self.live_client(&endpoint, None, request_client).await
}
pub async fn player_scores(
&self,
summoner: &str,
request_client: &RequestClient,
) -> Result<Scores, Error> {
self.live_client("playerscores", Some(summoner), request_client)
.await
}
pub async fn player_summoner_spells(
&self,
summoner: &str,
request_client: &RequestClient,
) -> Result<SummonerSpells, Error> {
self.live_client("playersummonerspells", Some(summoner), request_client)
.await
}
pub async fn player_main_runes(
&self,
summoner: &str,
request_client: &RequestClient,
) -> Result<Runes, Error> {
self.live_client("playermainrunes", Some(summoner), request_client)
.await
}
pub async fn player_items(
&self,
summoner: &str,
request_client: &RequestClient,
) -> Result<Vec<Item>, Error> {
self.live_client("playeritems", Some(summoner), request_client)
.await
}
pub async fn event_data(
&self,
event_id: Option<i32>,
request_client: &RequestClient,
) -> Result<Events, Error> {
let event_id = if let Some(id) = event_id {
format!("?eventID={id}")
} else {
String::new()
};
let endpoint = format!("eventdata{event_id}");
self.live_client(&endpoint, None, request_client).await
}
pub async fn game_stats(&self, request_client: &RequestClient) -> Result<GameData, Error> {
self.live_client("gamestats", None, request_client).await
}
async fn live_client<R>(
&self,
endpoint: &str,
summoner: Option<&str>,
request_client: &RequestClient,
) -> Result<R, Error>
where
R: DeserializeOwned,
{
let endpoint = if let Some(summoner) = summoner {
format!("/liveclientdata/{endpoint}?summonerName={summoner}")
} else {
format!("/liveclientdata/{endpoint}")
};
request_client
.request_template(URL, &endpoint, "GET", None::<()>, None, |bytes| {
serde_json::from_slice(&bytes).map_err(Error::SerdeJsonError)
})
.await
}
}
impl Default for GameClient {
fn default() -> Self {
GameClient
}
}