yttrium_std_joined/
lib.rs1#![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}