Good enough for now, more later.
All checks were successful
Build and push container image / build (push) Successful in 9m55s
All checks were successful
Build and push container image / build (push) Successful in 9m55s
This commit is contained in:
parent
dd9ee41287
commit
8ecc3ff4ef
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -822,7 +822,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "kon"
|
name = "kon"
|
||||||
version = "0.1.11"
|
version = "0.1.12"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cargo_toml",
|
"cargo_toml",
|
||||||
"gamedig",
|
"gamedig",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "kon"
|
name = "kon"
|
||||||
version = "0.1.11"
|
version = "0.1.12"
|
||||||
rust-version = "1.74"
|
rust-version = "1.74"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
|
160
src/commands/gameserver.rs
Normal file
160
src/commands/gameserver.rs
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
use crate::{
|
||||||
|
Error,
|
||||||
|
EMBED_COLOR,
|
||||||
|
models::gameservers::Gameservers
|
||||||
|
};
|
||||||
|
|
||||||
|
use serenity::{
|
||||||
|
all::Mentionable,
|
||||||
|
builder::CreateActionRow,
|
||||||
|
builder::CreateEmbed
|
||||||
|
};
|
||||||
|
use poise::{
|
||||||
|
CreateReply,
|
||||||
|
serenity_prelude,
|
||||||
|
serenity_prelude::ButtonStyle
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Manage the game servers for this guild
|
||||||
|
#[poise::command(slash_command, subcommands("add", "remove", "update", "list"), subcommand_required, guild_only)]
|
||||||
|
pub async fn gameserver(_: poise::Context<'_, (), Error>) -> Result<(), Error> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Add a game server to the database
|
||||||
|
#[poise::command(slash_command)]
|
||||||
|
pub async fn add(
|
||||||
|
ctx: poise::Context<'_, (), Error>,
|
||||||
|
#[description = "Server name as shown in-game or friendly name"] server_name: String,
|
||||||
|
#[description = "Which game is this server running?"] game_name: String,
|
||||||
|
#[channel_types("Text")] #[description = "Which channel should this server be restricted to?"] guild_channel: serenity_prelude::GuildChannel,
|
||||||
|
#[description = "IP address/domain of the server (Include the port if it has one, e.g 127.0.0.1:8080)"] ip_address: String
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
let unsupported_games_list = [
|
||||||
|
"ATS",
|
||||||
|
"ETS2",
|
||||||
|
"Euro Truck Simulator 2",
|
||||||
|
"American Truck Simulator",
|
||||||
|
];
|
||||||
|
if unsupported_games_list.contains(&game_name.as_str()) {
|
||||||
|
ctx.send(CreateReply::default()
|
||||||
|
.ephemeral(true)
|
||||||
|
.content(format!("Sorry, `{}` is not supported yet due to database design.", game_name))
|
||||||
|
).await?;
|
||||||
|
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
let action_row = CreateActionRow::Buttons(vec![
|
||||||
|
serenity_prelude::CreateButton::new("confirm")
|
||||||
|
.style(ButtonStyle::Success)
|
||||||
|
.label("Yes"),
|
||||||
|
serenity_prelude::CreateButton::new("cancel")
|
||||||
|
.style(ButtonStyle::Danger)
|
||||||
|
.label("No")
|
||||||
|
]);
|
||||||
|
|
||||||
|
let reply = CreateReply::default()
|
||||||
|
.embed(CreateEmbed::new()
|
||||||
|
.title("Does this look correct?")
|
||||||
|
.description(format!("
|
||||||
|
**Server name:** `{}`
|
||||||
|
**Game name:** `{}`
|
||||||
|
**Channel:** {}
|
||||||
|
**IP Address:** `{}`
|
||||||
|
", server_name, game_name, guild_channel.mention(), ip_address))
|
||||||
|
.color(EMBED_COLOR)
|
||||||
|
)
|
||||||
|
.components(vec![action_row]);
|
||||||
|
|
||||||
|
ctx.send(reply).await?;
|
||||||
|
|
||||||
|
while let Some(collector) = serenity_prelude::ComponentInteractionCollector::new(ctx)
|
||||||
|
.channel_id(ctx.channel_id())
|
||||||
|
.guild_id(ctx.guild_id().unwrap())
|
||||||
|
.author_id(ctx.author().id)
|
||||||
|
.timeout(std::time::Duration::from_secs(30))
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
if collector.data.custom_id == "confirm" {
|
||||||
|
let result = Gameservers::add_server(
|
||||||
|
ctx.guild_id().unwrap().into(),
|
||||||
|
server_name.as_str(),
|
||||||
|
game_name.as_str(),
|
||||||
|
guild_channel.id.into(),
|
||||||
|
ip_address.as_str()
|
||||||
|
).await;
|
||||||
|
|
||||||
|
let mut msg = collector.message.clone();
|
||||||
|
|
||||||
|
match result {
|
||||||
|
Ok(_) => {
|
||||||
|
msg.edit(
|
||||||
|
ctx,
|
||||||
|
serenity_prelude::EditMessage::new()
|
||||||
|
.content("*Confirmed, added the server to database*")
|
||||||
|
.components(Vec::new())
|
||||||
|
).await?;
|
||||||
|
},
|
||||||
|
Err(y) => {
|
||||||
|
msg.edit(
|
||||||
|
ctx,
|
||||||
|
serenity_prelude::EditMessage::new()
|
||||||
|
.content(format!("*Error adding server to database: {:?}*", y))
|
||||||
|
.components(Vec::new())
|
||||||
|
).await?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if collector.data.custom_id == "cancel" {
|
||||||
|
let mut msg = collector.message.clone();
|
||||||
|
|
||||||
|
msg.edit(
|
||||||
|
ctx,
|
||||||
|
serenity_prelude::EditMessage::new()
|
||||||
|
.content("*Command cancelled*")
|
||||||
|
.components(Vec::new())
|
||||||
|
).await?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Remove a game server from the database
|
||||||
|
#[poise::command(slash_command)]
|
||||||
|
pub async fn remove(ctx: poise::Context<'_, (), Error>) -> Result<(), Error> {
|
||||||
|
ctx.send(CreateReply::default().content("Yet to be implemented.")).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Update a game server in the database
|
||||||
|
#[poise::command(slash_command)]
|
||||||
|
pub async fn update(ctx: poise::Context<'_, (), Error>) -> Result<(), Error> {
|
||||||
|
ctx.send(CreateReply::default().content("Yet to be implemented.")).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// List all the available game servers for this guild
|
||||||
|
#[poise::command(slash_command)]
|
||||||
|
pub async fn list(ctx: poise::Context<'_, (), Error>) -> Result<(), Error> {
|
||||||
|
let servers = Gameservers::list_servers(ctx.guild_id().unwrap().into()).await?;
|
||||||
|
|
||||||
|
let mut embed_fields = Vec::new();
|
||||||
|
for server in servers {
|
||||||
|
embed_fields.push(
|
||||||
|
(server.server_name, format!("Game: `{}`\nIP: `{}`", server.game_name, server.ip_address), true)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.send(CreateReply::default()
|
||||||
|
.embed(CreateEmbed::new()
|
||||||
|
.title("List of registered gameservers")
|
||||||
|
.fields(embed_fields)
|
||||||
|
.color(EMBED_COLOR)
|
||||||
|
)
|
||||||
|
).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
@ -1,3 +1,4 @@
|
|||||||
pub mod ping;
|
pub mod ping;
|
||||||
pub mod status;
|
pub mod status;
|
||||||
pub mod uptime;
|
pub mod uptime;
|
||||||
|
pub mod gameserver;
|
||||||
|
@ -31,6 +31,17 @@ impl DatabaseController {
|
|||||||
);
|
);
|
||||||
").await?;
|
").await?;
|
||||||
|
|
||||||
|
// Gameservers
|
||||||
|
client.batch_execute("
|
||||||
|
CREATE TABLE IF NOT EXISTS gameservers (
|
||||||
|
server_name VARCHAR(255) NOT NULL PRIMARY KEY,
|
||||||
|
game_name VARCHAR(255) NOT NULL,
|
||||||
|
guild_owner BIGINT NOT NULL,
|
||||||
|
guild_channel BIGINT NOT NULL,
|
||||||
|
ip_address VARCHAR(255) NOT NULL
|
||||||
|
);
|
||||||
|
").await?;
|
||||||
|
|
||||||
Ok(DatabaseController { client })
|
Ok(DatabaseController { client })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,8 @@ async fn main() {
|
|||||||
commands: vec![
|
commands: vec![
|
||||||
commands::ping::ping(),
|
commands::ping::ping(),
|
||||||
commands::uptime::uptime(),
|
commands::uptime::uptime(),
|
||||||
commands::status::status()
|
commands::status::status(),
|
||||||
|
commands::gameserver::gameserver()
|
||||||
],
|
],
|
||||||
pre_command: |ctx| Box::pin(async move {
|
pre_command: |ctx| Box::pin(async move {
|
||||||
let get_guild_name = match ctx.guild() {
|
let get_guild_name = match ctx.guild() {
|
||||||
|
87
src/models/gameservers.rs
Normal file
87
src/models/gameservers.rs
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
use crate::controllers::database::DatabaseController;
|
||||||
|
|
||||||
|
pub struct Gameservers {
|
||||||
|
pub server_name: String,
|
||||||
|
pub game_name: String,
|
||||||
|
pub guild_owner: i64,
|
||||||
|
pub guild_channel: i64,
|
||||||
|
pub ip_address: String
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
impl Gameservers {
|
||||||
|
pub async fn list_servers(guild_id: u64) -> Result<Vec<Self>, tokio_postgres::Error> {
|
||||||
|
let client = DatabaseController::new().await?.client;
|
||||||
|
let rows = client.query("
|
||||||
|
SELECT * FROM gameservers
|
||||||
|
WHERE guild_owner = $1
|
||||||
|
", &[&(guild_id as i64)]).await?;
|
||||||
|
|
||||||
|
let mut servers = Vec::new();
|
||||||
|
for row in rows {
|
||||||
|
servers.push(Self {
|
||||||
|
server_name: row.get("server_name"),
|
||||||
|
game_name: row.get("game_name"),
|
||||||
|
guild_owner: row.get("guild_owner"),
|
||||||
|
guild_channel: row.get("guild_channel"),
|
||||||
|
ip_address: row.get("ip_address")
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(servers)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn add_server(
|
||||||
|
guild_id: u64,
|
||||||
|
server_name: &str,
|
||||||
|
game_name: &str,
|
||||||
|
guild_channel: u64,
|
||||||
|
ip_address: &str
|
||||||
|
) -> Result<(), tokio_postgres::Error> {
|
||||||
|
let client = DatabaseController::new().await?.client;
|
||||||
|
client.execute("
|
||||||
|
INSERT INTO gameservers (server_name, game_name, guild_owner, guild_channel, ip_address)
|
||||||
|
VALUES ($1, $2, $3, $4, $5)
|
||||||
|
", &[&server_name, &game_name, &(guild_id as i64), &(guild_channel as i64), &ip_address]).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn remove_server(guild_id: u64, server_name: &str) -> Result<(), tokio_postgres::Error> {
|
||||||
|
let client = DatabaseController::new().await?.client;
|
||||||
|
client.execute("
|
||||||
|
DELETE FROM gameservers
|
||||||
|
WHERE guild_owner = $1 AND server_name = $2
|
||||||
|
", &[&(guild_id as i64), &server_name]).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn update_server(
|
||||||
|
guild_id: u64,
|
||||||
|
server_name: &str,
|
||||||
|
game_name: &str,
|
||||||
|
guild_channel: u64,
|
||||||
|
ip_address: &str
|
||||||
|
) -> Result<(), tokio_postgres::Error> {
|
||||||
|
let client = DatabaseController::new().await?.client;
|
||||||
|
client.execute("
|
||||||
|
UPDATE gameservers
|
||||||
|
SET game_name = $1, guild_channel = $2, ip_address = $3
|
||||||
|
WHERE guild_owner = $4 AND server_name = $5
|
||||||
|
", &[&game_name, &(guild_channel as i64), &ip_address, &(guild_id as i64), &server_name]).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn update_name(guild_id: u64, server_name: &str, new_name: &str) -> Result<(), tokio_postgres::Error> {
|
||||||
|
let client = DatabaseController::new().await?.client;
|
||||||
|
client.execute("
|
||||||
|
UPDATE gameservers
|
||||||
|
SET server_name = $1
|
||||||
|
WHERE guild_owner = $2 AND server_name = $3
|
||||||
|
", &[&new_name, &(guild_id as i64), &server_name]).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
@ -1 +1,2 @@
|
|||||||
pub mod mpservers;
|
pub mod mpservers;
|
||||||
|
pub mod gameservers;
|
||||||
|
Loading…
Reference in New Issue
Block a user