yttrium_std_user/
lib.rs

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
22/*
23Parameters:
24Optional, chooses information to return, possible values: id, nickname, username, avatar, discriminator
25Optional, user ID to target
26*/
27fn 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(&parameter[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}