yttrium_std_joined/
lib.rs

1#![allow(clippy::needless_return)]
2#![deny(clippy::implicit_return)]
3use futures::executor;
4use serenity::model::id::UserId;
5use yttrium_key_base as key_base;
6#[cfg(feature = "loader")]
7#[no_mangle]
8pub fn key_create() -> *mut dyn key_base::Key {
9	return Box::into_raw(Box::new(std_joined {
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_joined {
17		info: create_key_info(),
18		function: key_function,
19	});
20}
21
22fn create_key_info() -> key_base::KeyInfo {
23	return key_base::KeyInfo {
24		name: String::from("joined"),
25		parameters_required: vec![0, 1],
26	};
27}
28
29#[allow(non_camel_case_types)]
30struct std_joined {
31	pub info: key_base::KeyInfo,
32	pub function: fn(parameter: &[String], environment: &mut key_base::environment::Environment) -> Result<String, String>,
33}
34
35impl key_base::Key for std_joined {
36	fn get_key_info(&self) -> &key_base::KeyInfo {
37		return &self.info;
38	}
39
40	fn get_key_function(&self) -> fn(parameter: &[String], environment: &mut key_base::environment::Environment) -> Result<String, String> {
41		return self.function;
42	}
43}
44
45fn key_function(parameter: &[String], environment: &mut key_base::environment::Environment) -> Result<String, String> {
46	let guild_id = environment.guild_id.clone();
47	let user_id;
48	if parameter.is_empty() {
49		match &environment.event_info {
50			key_base::environment::events::EventType::MemberJoin(event) => {
51				user_id = event.user_id.clone();
52			}
53			key_base::environment::events::EventType::Message(event) => {
54				user_id = event.user_id.clone();
55			}
56			key_base::environment::events::EventType::MemberUpdate(event) => {
57				user_id = event.user_id.clone();
58			}
59			key_base::environment::events::EventType::VoiceUpdate(event) => {
60				user_id = event.user_id.clone();
61			}
62			key_base::environment::events::EventType::ReactionAdd(event) => {
63				user_id = event.user_id.clone();
64			}
65			key_base::environment::events::EventType::ReactionRemove(event) => {
66				user_id = event.user_id.clone();
67			}
68			_ => {
69				return Err(String::from("`joined` was called on invalid event type"));
70			}
71		}
72	} else {
73		user_id = UserId::from(parameter[0].parse::<u64>().unwrap());
74	}
75	let member;
76	match executor::block_on(environment.discord_context.cache.member(guild_id, user_id)) {
77		Some(result) => {
78			member = result;
79		}
80		None => {
81			return Err(String::from("Member could not be found"));
82		}
83	}
84	return Ok(member.joined_at.unwrap().timestamp_millis().to_string());
85}