diff --git a/src/parser/mod.rs b/src/parser/mod.rs index bdd885d4..5153ccaf 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -1,16 +1,17 @@ use std::sync::Arc; use log::debug; -use twilight::model::gateway::payload::MessageCreate; +use twilight::cache::twilight_cache_inmemory::model::CachedMember; +use twilight::model::{ + id::{GuildId, UserId}, + user::User, + gateway::payload::MessageCreate, +}; use crate::commands; use crate::commands::meta::nodes::CommandNode; use crate::core::Context; use crate::utils::{matchers, Error, ParseError}; -use twilight::model::{ - id::{GuildId, UserId}, - user::User, -}; #[derive(Clone)] pub struct Parser { @@ -138,6 +139,33 @@ impl Parser { } } + pub async fn get_member(&mut self, gid: GuildId) -> Result, Error> { + let input = self.get_next()?; + let mention = matchers::get_mention(input); + match mention { + // we got a mention + Some(uid) => match self.ctx.cache.member(gid, UserId(uid)).await? { + Some(member) => Ok(member), + None => Err(Error::ParseError(ParseError::MemberNotFoundById(uid))), + }, + None => { + // is it a userid? + match input.parse::() { + Ok(uid) => match self.ctx.cache.member(gid, UserId(uid)).await? { + Some(member) => Ok(member), + None => Err(Error::ParseError(ParseError::MemberNotFoundById(uid))), + }, + Err(_) => { + //nope, must be a partial name + Err(Error::ParseError(ParseError::MemberNotFoundByName( + "not implemented yet".to_string(), + ))) + } + } + } + } + } + pub async fn get_user_or(&mut self, alternative: User) -> Result, Error> { if self.has_next() { Ok(self.get_user().await?)