1#![allow(clippy::needless_return)]
2#![deny(clippy::implicit_return)]
3use yttrium_key_base as key_base;
4use key_base::environment::events::*;
5use serenity::model::id::UserId;
6#[cfg(feature = "loader")]
7#[no_mangle]
8pub fn key_create() -> *mut dyn key_base::Key {
9 return Box::into_raw(Box::new(std_user {
10 info: create_key_info(),
11 function: key_function,
12 }));
13}
14
15pub fn safe_create() -> Box<dyn key_base::Key> {
16 return Box::new(std_user {
17 info: create_key_info(),
18 function: key_function,
19 });
20}
21
22fn create_key_info() -> key_base::KeyInfo {
28 return key_base::KeyInfo {
29 name: String::from("user"),
30 parameters_required: vec![2],
31 };
32}
33
34#[allow(non_camel_case_types)]
35struct std_user {
36 pub info: key_base::KeyInfo,
37 pub function: fn(parameter: &[String], environment: &mut key_base::environment::Environment) -> Result<String, String>,
38}
39
40impl key_base::Key for std_user {
41 fn get_key_info(&self) -> &key_base::KeyInfo {
42 return &self.info;
43 }
44
45 fn get_key_function(&self) -> fn(parameter: &[String], environment: &mut key_base::environment::Environment) -> Result<String, String> {
46 return self.function;
47 }
48}
49
50fn key_function(parameter: &[String], environment: &mut key_base::environment::Environment) -> Result<String, String> {
51 let guild_id = environment.guild_id.clone();
52 let user_id;
53 if parameter.len() == 2 {
54 let matcher = regex::Regex::new(key_base::regexes::DISCORD_ID).unwrap();
55 if matcher.is_match(¶meter[1]) {
56 user_id = UserId::from(parameter[1].parse::<u64>().unwrap());
57 } else {
58 return Err(String::from("Invalid user ID passed to `user`"));
59 }
60 } else {
61 match &environment.event_info {
62 EventType::MemberJoin(event) => {
63 user_id = event.user_id.clone();
64 }
65 EventType::MemberLeave(event) => {
66 user_id = event.user_id.clone();
67 }
68 EventType::MemberUpdate(event) => {
69 user_id = event.user_id.clone();
70 }
71 EventType::Message(event) => {
72 user_id = event.user_id.clone();
73 }
74 EventType::VoiceUpdate(event) => {
75 user_id = event.user_id.clone();
76 }
77 EventType::ReactionAdd(event) => {
78 user_id = event.user_id.clone();
79 }
80 EventType::ReactionRemove(event) => {
81 user_id = event.user_id.clone();
82 }
83 _ => {
84 return Err(String::from("`user` was called on an invalid event with no ID"));
85 }
86 }
87 }
88 match futures::executor::block_on(environment.discord_context.cache.member(guild_id, user_id)) {
89 Some(user) => {
90 match parameter[0].as_str() {
91 "id" => {
92 return Ok(user.user.id.to_string());
93 }
94 "nickname" => {
95 match user.nick {
96 Some(nick) => {
97 return Ok(nick);
98 }
99 None => {
100 return Ok(user.user.name);
101 }
102 }
103 }
104 "username" => {
105 return Ok(user.user.name);
106 }
107 "avatar" => {
108 match user.user.avatar_url() {
109 Some(url) => {
110 return Ok(url);
111 }
112 None => {
113 return Ok(String::new());
114 }
115 }
116 }
117 "discriminator" => {
118 return Ok(user.user.discriminator.to_string());
119 }
120 _ => {
121 return Err(String::from("Invalid property passed to `user`"));
122 }
123 }
124 }
125 None => {
126 return Err(String::from("Could not find the member in `user"));
127 }
128 }
129}