feat: add dms, hieracthical arguments, permission and rank system

This commit is contained in:
Soph :3 2025-09-14 14:59:16 +03:00
parent 544bbf73cb
commit 257bc55b75
25 changed files with 503 additions and 209 deletions

View file

@ -41,27 +41,40 @@ impl Command for BalanceCommand {
arg_type: ArgumentType::String,
required: false,
default: None,
children: &[],
}]
}
async fn constructed(&mut self, _: Client) {}
async fn event(&mut self, _: Client, _: ClientEvent) {}
async fn execute(&mut self, client: Client, player: Player, args: ParsedArguments) {
let id = match args.get("user_id") {
Some(ParsedArgument::String(s)) => s.as_str(),
_ => player._id.as_str(),
async fn execute(
&mut self,
client: Client,
player: Player,
args: ParsedArguments,
command_user: User,
) {
let user = match args.get("user_id") {
Some(ParsedArgument::String(s)) => {
let id = s.as_str();
sqlx::query_as::<_, User>("SELECT * FROM users WHERE _id = $1")
.bind(id)
.fetch_optional(self.pool.as_ref())
.await
.unwrap()
}
_ => Some(command_user),
};
let user = sqlx::query_as::<_, User>("SELECT * FROM users WHERE _id = $1")
.bind(id)
.fetch_optional(self.pool.as_ref())
.await
.unwrap();
match user {
Some(user) => {
let mut who: String = "You have".to_string();
if user._id != player._id.as_str() {
who = format!("{} has ", player._id);
}
client
.message(format!("You have {} coins.", user.balance))
.message(format!("{} {} coins.", who, user.balance))
.await;
}
None => {

View file

@ -47,29 +47,16 @@ impl Command for CoinflipCommand {
arg_type: ArgumentType::Integer,
required: false,
default: None,
children: &[],
}]
}
async fn execute(&mut self, client: Client, player: Player, args: ParsedArguments) {
async fn execute(&mut self, client: Client, _: Player, args: ParsedArguments, mut user: User) {
let bet_amount: Option<i32> = match args.get("bet_amount") {
Some(ParsedArgument::Integer(i)) => Some(*i as i32),
_ => None,
};
let user_opt = sqlx::query_as::<_, User>("SELECT * FROM users WHERE _id = $1")
.bind(&player._id)
.fetch_optional(self.pool.as_ref())
.await
.unwrap();
let mut user = match user_opt {
Some(u) => u,
None => {
client.message("No user found.").await;
return;
}
};
let choice = if rand::rng().random_bool(0.5) {
"Heads"
} else {

View file

@ -272,6 +272,7 @@ impl Command for FarmCommand {
arg_type: ArgumentType::Enum(&["sell", "all", "harvest"]),
required: false,
default: None,
children: &[],
}]
}
@ -384,14 +385,7 @@ impl Command for FarmCommand {
}
async fn event(&mut self, _: Client, _: ClientEvent) {}
async fn execute(&mut self, client: Client, player: Player, args: ParsedArguments) {
let mut user = sqlx::query_as::<_, User>("SELECT * FROM users WHERE _id = $1")
.bind(&player._id)
.fetch_optional(self.pool.as_ref())
.await
.unwrap()
.unwrap();
async fn execute(&mut self, client: Client, _: Player, args: ParsedArguments, mut user: User) {
let command = match args.get("action") {
Some(ParsedArgument::Enum(s)) => s.as_str(),
_ => "",

View file

@ -185,18 +185,18 @@ impl Command for FishCommand {
arg_type: ArgumentType::String,
required: false,
default: None,
children: &[],
}]
}
async fn constructed(&mut self, _: Client) {}
async fn event(&mut self, _: Client, _: ClientEvent) {}
async fn execute(&mut self, client: Client, player: Player, args: ParsedArguments) {
let mut user = sqlx::query_as::<_, User>("SELECT * FROM users WHERE _id = $1")
.bind(&player._id)
.fetch_optional(self.pool.as_ref())
.await
.unwrap()
.unwrap();
async fn execute(
&mut self,
client: Client,
player: Player,
args: ParsedArguments,
mut user: User,
) {
let action = match args.get("action") {
Some(ParsedArgument::String(s)) => s.as_str(),
_ => "",

View file

@ -43,24 +43,32 @@ impl Command for InventoryCommand {
arg_type: ArgumentType::String,
required: false,
default: None,
children: &[],
}]
}
async fn constructed(&mut self, _: Client) {}
async fn event(&mut self, _: Client, _: ClientEvent) {}
async fn execute(&mut self, client: Client, player: Player, args: ParsedArguments) {
let id = match args.get("user_id") {
Some(ParsedArgument::String(s)) => s.as_str(),
_ => player._id.as_str(),
async fn execute(
&mut self,
client: Client,
_: Player,
args: ParsedArguments,
command_user: User,
) {
let user = match args.get("user_id") {
Some(ParsedArgument::String(s)) => {
let id = s.as_str();
sqlx::query_as::<_, User>("SELECT * FROM users WHERE _id = $1")
.bind(id)
.fetch_optional(self.pool.as_ref())
.await
.unwrap()
}
_ => Some(command_user),
};
let user = sqlx::query_as::<_, User>("SELECT * FROM users WHERE _id = $1")
.bind(id)
.fetch_optional(self.pool.as_ref())
.await
.unwrap();
if let Some(user) = user {
if user.items.is_empty() {
client.message("Your inventory is empty.".to_string()).await;

View file

@ -119,24 +119,19 @@ impl Command for ShopCommand {
arg_type: ArgumentType::String,
required: false,
default: None,
children: &[],
},
ArgumentSpec {
name: "quantity",
arg_type: ArgumentType::Integer,
required: false,
default: Some("1"),
children: &[],
},
]
}
async fn execute(&mut self, client: Client, player: Player, args: ParsedArguments) {
let mut user = sqlx::query_as::<_, User>("SELECT * FROM users WHERE _id = $1")
.bind(&player._id)
.fetch_optional(self.pool.as_ref())
.await
.unwrap()
.unwrap();
async fn execute(&mut self, client: Client, _: Player, args: ParsedArguments, mut user: User) {
let item_name = match args.get("item_id") {
Some(ParsedArgument::String(s)) => s.as_str(),
_ => "empty",