use bson::{bson, doc}; use serde::{Deserialize, Serialize}; use super::{get_collection, MemberPermissions}; use mongodb::options::FindOneOptions; pub fn find_member_permissions<C: Into<Option<String>>>( id: String, guild: String, channel: C, ) -> u8 { let col = get_collection("guilds"); match col.find_one( doc! { "_id": &guild, "members": { "$elemMatch": { "id": &id, } } }, FindOneOptions::builder() .projection(doc! { "members.$": 1, "owner": 1, "default_permissions": 1, }) .build(), ) { Ok(result) => { if let Some(doc) = result { if doc.get_str("owner").unwrap() == id { return u8::MAX; } doc.get_i32("default_permissions").unwrap() as u8 } else { 0 } } Err(_) => 0, } } #[derive(Serialize, Deserialize, Debug)] pub struct Member { pub id: String, } #[derive(Serialize, Deserialize, Debug)] pub struct Invite { pub id: String, pub custom: bool, pub channel: String, } #[derive(Serialize, Deserialize, Debug)] pub struct Guild { #[serde(rename = "_id")] pub id: String, // pub nonce: String, used internally pub name: String, pub description: String, pub owner: String, pub channels: Vec<String>, pub members: Vec<Member>, pub invites: Vec<Invite>, pub default_permissions: u32, }