feat: add full player listing command
This commit is contained in:
parent
9b21944624
commit
c2b4c5a6bf
4 changed files with 76 additions and 15 deletions
|
|
@ -34,16 +34,21 @@ fn player_display(
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn list(connection: &Connection, dataset: Option<String>, all: bool) {
|
pub fn list(connection: &Connection, dataset: Option<String>, all: bool) {
|
||||||
if all {
|
let dataset = dataset.unwrap_or_else(|| String::from("default"));
|
||||||
} else {
|
let mut players = list_players(connection, if all { None } else { Some(&dataset) })
|
||||||
let dataset = dataset.unwrap_or_else(|| String::from("default"));
|
.expect("Error communicating with SQLite");
|
||||||
|
|
||||||
|
players.sort_by_cached_key(|data| data.name.clone());
|
||||||
|
|
||||||
|
for player in players {
|
||||||
|
player_display(player, true, false, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn info(connection: &Connection, dataset: Option<String>, player: String) {
|
pub fn info(connection: &Connection, dataset: Option<String>, player: String) {
|
||||||
let dataset = dataset.unwrap_or_else(|| String::from("default"));
|
let dataset = dataset.unwrap_or_else(|| String::from("default"));
|
||||||
|
|
||||||
let player = get_player_from_input(connection, player)
|
let player = get_player_from_input(connection, &dataset, player)
|
||||||
.unwrap_or_else(|_| error("Could not find player", 1));
|
.unwrap_or_else(|_| error("Could not find player", 1));
|
||||||
|
|
||||||
let (won, lost) = get_player_set_counts(connection, &dataset, player.id)
|
let (won, lost) = get_player_set_counts(connection, &dataset, player.id)
|
||||||
|
|
@ -62,11 +67,11 @@ pub fn info(connection: &Connection, dataset: Option<String>, player: String) {
|
||||||
pub fn matchup(connection: &Connection, dataset: Option<String>, player1: String, player2: String) {
|
pub fn matchup(connection: &Connection, dataset: Option<String>, player1: String, player2: String) {
|
||||||
let dataset = dataset.unwrap_or_else(|| String::from("default"));
|
let dataset = dataset.unwrap_or_else(|| String::from("default"));
|
||||||
|
|
||||||
let player1 = get_player_from_input(connection, player1)
|
let player1 = get_player_from_input(connection, &dataset, player1)
|
||||||
.unwrap_or_else(|_| error("Could not find player", 1));
|
.unwrap_or_else(|_| error("Could not find player", 1));
|
||||||
let id1 = player1.id;
|
let id1 = player1.id;
|
||||||
|
|
||||||
let player2 = get_player_from_input(connection, player2)
|
let player2 = get_player_from_input(connection, &dataset, player2)
|
||||||
.unwrap_or_else(|_| error("Could not find player", 1));
|
.unwrap_or_else(|_| error("Could not find player", 1));
|
||||||
let id2 = player2.id;
|
let id2 = player2.id;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -317,8 +317,40 @@ pub fn get_all_players(connection: &Connection, dataset: &str) -> sqlite::Result
|
||||||
.try_collect()
|
.try_collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_player(connection: &Connection, player: PlayerId) -> sqlite::Result<PlayerData> {
|
pub fn list_players(
|
||||||
let query = "SELECT name, prefix, discrim FROM players WHERE id = ?";
|
connection: &Connection,
|
||||||
|
dataset: Option<&str>,
|
||||||
|
) -> sqlite::Result<Vec<PlayerData>> {
|
||||||
|
let query = if let Some(dataset) = dataset {
|
||||||
|
format!(r#"SELECT * FROM "{}_players", players USING (id)"#, dataset,)
|
||||||
|
} else {
|
||||||
|
String::from(r#"SELECT * FROM players"#)
|
||||||
|
};
|
||||||
|
|
||||||
|
connection
|
||||||
|
.prepare(&query)?
|
||||||
|
.into_iter()
|
||||||
|
.map(|r| {
|
||||||
|
let r_ = r?;
|
||||||
|
Ok(PlayerData {
|
||||||
|
id: PlayerId(r_.read::<i64, _>("id") as u64),
|
||||||
|
name: String::from(r_.read::<&str, _>("name")),
|
||||||
|
prefix: r_.read::<Option<&str>, _>("prefix").map(String::from),
|
||||||
|
discrim: String::from(r_.read::<&str, _>("discrim")),
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.try_collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_player(
|
||||||
|
connection: &Connection,
|
||||||
|
dataset: &str,
|
||||||
|
player: PlayerId,
|
||||||
|
) -> sqlite::Result<PlayerData> {
|
||||||
|
let query = format!(
|
||||||
|
r#"SELECT * FROM "{}_players", players USING (id) WHERE id = ?"#,
|
||||||
|
dataset
|
||||||
|
);
|
||||||
|
|
||||||
let mut statement = connection.prepare(&query)?;
|
let mut statement = connection.prepare(&query)?;
|
||||||
statement.bind((1, player.0 as i64))?;
|
statement.bind((1, player.0 as i64))?;
|
||||||
|
|
@ -333,9 +365,13 @@ pub fn get_player(connection: &Connection, player: PlayerId) -> sqlite::Result<P
|
||||||
|
|
||||||
pub fn get_player_from_discrim(
|
pub fn get_player_from_discrim(
|
||||||
connection: &Connection,
|
connection: &Connection,
|
||||||
|
dataset: &str,
|
||||||
discrim: &str,
|
discrim: &str,
|
||||||
) -> sqlite::Result<PlayerData> {
|
) -> sqlite::Result<PlayerData> {
|
||||||
let query = "SELECT id, name, prefix FROM players WHERE discrim = ?";
|
let query = format!(
|
||||||
|
r#"SELECT * FROM "{}_players", players USING (id) WHERE discrim = ?"#,
|
||||||
|
dataset
|
||||||
|
);
|
||||||
|
|
||||||
let mut statement = connection.prepare(&query)?;
|
let mut statement = connection.prepare(&query)?;
|
||||||
statement.bind((1, discrim))?;
|
statement.bind((1, discrim))?;
|
||||||
|
|
@ -348,8 +384,15 @@ pub fn get_player_from_discrim(
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn match_player_name(connection: &Connection, name: &str) -> sqlite::Result<Vec<PlayerData>> {
|
pub fn match_player_name(
|
||||||
let query = "SELECT * FROM players WHERE name LIKE ?";
|
connection: &Connection,
|
||||||
|
dataset: &str,
|
||||||
|
name: &str,
|
||||||
|
) -> sqlite::Result<Vec<PlayerData>> {
|
||||||
|
let query = format!(
|
||||||
|
r#"SELECT * FROM "{}_players", players USING (id) WHERE name LIKE ?"#,
|
||||||
|
dataset
|
||||||
|
);
|
||||||
|
|
||||||
connection
|
connection
|
||||||
.prepare(&query)?
|
.prepare(&query)?
|
||||||
|
|
|
||||||
|
|
@ -98,6 +98,11 @@ enum DatasetSC {
|
||||||
|
|
||||||
#[derive(Subcommand)]
|
#[derive(Subcommand)]
|
||||||
enum PlayerSC {
|
enum PlayerSC {
|
||||||
|
#[command(about = "List all players in a dataset")]
|
||||||
|
List {
|
||||||
|
#[arg(short, long, help = "List all players ever recorded")]
|
||||||
|
all: bool,
|
||||||
|
},
|
||||||
#[command(about = "Get info about a player")]
|
#[command(about = "Get info about a player")]
|
||||||
Info { player: String },
|
Info { player: String },
|
||||||
#[command(about = "Matchup data between two players")]
|
#[command(about = "Matchup data between two players")]
|
||||||
|
|
@ -134,6 +139,10 @@ fn main() {
|
||||||
subcommand: DatasetSC::Rename { old, new },
|
subcommand: DatasetSC::Rename { old, new },
|
||||||
} => dataset::rename(&connection, old, new),
|
} => dataset::rename(&connection, old, new),
|
||||||
|
|
||||||
|
Subcommands::Player {
|
||||||
|
subcommand: PlayerSC::List { all },
|
||||||
|
dataset,
|
||||||
|
} => player::list(&connection, dataset, all),
|
||||||
Subcommands::Player {
|
Subcommands::Player {
|
||||||
subcommand: PlayerSC::Info { player },
|
subcommand: PlayerSC::Info { player },
|
||||||
dataset,
|
dataset,
|
||||||
|
|
|
||||||
12
src/util.rs
12
src/util.rs
|
|
@ -80,12 +80,16 @@ pub fn parse_player_input(input: String) -> PlayerInput {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_player_from_input(connection: &Connection, input: String) -> sqlite::Result<PlayerData> {
|
pub fn get_player_from_input(
|
||||||
|
connection: &Connection,
|
||||||
|
dataset: &str,
|
||||||
|
input: String,
|
||||||
|
) -> sqlite::Result<PlayerData> {
|
||||||
match parse_player_input(input) {
|
match parse_player_input(input) {
|
||||||
PlayerInput::Id(id) => get_player(connection, id),
|
PlayerInput::Id(id) => get_player(connection, dataset, id),
|
||||||
PlayerInput::Discrim(discrim) => get_player_from_discrim(connection, &discrim),
|
PlayerInput::Discrim(discrim) => get_player_from_discrim(connection, dataset, &discrim),
|
||||||
PlayerInput::Name(name) => {
|
PlayerInput::Name(name) => {
|
||||||
let players = match_player_name(connection, &name)?;
|
let players = match_player_name(connection, dataset, &name)?;
|
||||||
|
|
||||||
if players.is_empty() {
|
if players.is_empty() {
|
||||||
error(&format!("Player {:?} not found", name), 1);
|
error(&format!("Player {:?} not found", name), 1);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue