use crate::common::Error; use poise::serenity_prelude::{futures::Stream, UserId}; use sqlx::PgExecutor; #[derive(Clone, sqlx::FromRow, Debug, PartialEq, Eq)] pub struct Item { pub id: i64, pub name: String, pub game: i64, pub item: i64, pub data: sqlx::types::JsonValue, } pub struct Inventory { user: UserId, game: Option, } impl Inventory { pub fn new(user: UserId, game: Option) -> Self { Self { user, game, } } pub async fn give_item<'a, E>(&self, db: E, item: Item) -> Result<(), Error> where E: PgExecutor<'a>, { sqlx::query( r#" INSERT INTO items (owner, game, item, data, name) VALUES ($1, $2, $3, $4, $5) "# ) .bind(self.user.get() as i64) .bind(self.game.unwrap() as i64) .bind(item.item) .bind(item.data) .bind(item.name) .execute(db).await?; Ok(()) } pub async fn get_item_of_type<'a, E>(&self, db: E, item: u64) -> Result, Error> where E: PgExecutor<'a>, { let x = sqlx::query_as( r#" SELECT id, name, game, item, data FROM items where item = $1 "# ).bind(item as i64).fetch_one(db).await.ok(); Ok(x) } pub async fn get_item_with_name<'a, E>(&self, db: E, name: &str) -> Result, Error> where E: PgExecutor<'a>, { let x = sqlx::query_as( r#" SELECT id, name, game, item, data FROM items where name = $1 "# ).bind(name).fetch_one(db).await.ok(); Ok(x) } pub async fn remove_item<'a, E>(&self, db: E, item: i64) -> Result<(), Error> where E: PgExecutor<'a>, { sqlx::query( r#" DELETE FROM items WHERE id = $1 "# ).bind(item).execute(db).await?; Ok(()) } pub async fn items<'a, E>(&self, db: E) -> impl Stream> + use<'a, E> where E: PgExecutor<'a> + 'a, { match self.game { Some(game) => sqlx::query_as( r#" SELECT id, name, game, item, data FROM items WHERE owner = $1 AND game = $2 "# ) .bind(self.user.get() as i64) .bind(game as i64) .fetch(db), None => sqlx::query_as( r#" SELECT id, name, game, item, data FROM items WHERE owner = $1 "# ) .bind(self.user.get() as i64) .fetch(db) } } }