diff --git a/crates/core/database/src/models/server_members/ops.rs b/crates/core/database/src/models/server_members/ops.rs index 51ddd574..83eb332a 100644 --- a/crates/core/database/src/models/server_members/ops.rs +++ b/crates/core/database/src/models/server_members/ops.rs @@ -79,7 +79,7 @@ pub trait AbstractServerMembers: Sync + Send { async fn fetch_member(&self, server_id: &str, user_id: &str) -> Result; /// Fetch all members in a server - async fn fetch_all_members<'a>(&self, server_id: &str) -> Result>; + async fn fetch_all_members(&self, server_id: &str) -> Result>; /// Fetch all members in a server as an iterator async fn fetch_all_members_chunked( @@ -100,10 +100,10 @@ pub trait AbstractServerMembers: Sync + Send { ) -> Result; /// Fetch all memberships for a user - async fn fetch_all_memberships<'a>(&self, user_id: &str) -> Result>; + async fn fetch_all_memberships(&self, user_id: &str) -> Result>; /// Fetch multiple members by their ids - async fn fetch_members<'a>(&self, server_id: &str, ids: &'a [String]) -> Result>; + async fn fetch_members(&self, server_id: &str, ids: &[String]) -> Result>; /// Fetch member count of a server async fn fetch_member_count(&self, server_id: &str) -> Result; diff --git a/crates/core/database/src/models/server_members/ops/mongodb.rs b/crates/core/database/src/models/server_members/ops/mongodb.rs index 07d8a819..f8cd325d 100644 --- a/crates/core/database/src/models/server_members/ops/mongodb.rs +++ b/crates/core/database/src/models/server_members/ops/mongodb.rs @@ -31,7 +31,7 @@ impl AbstractServerMembers for MongoDb { } /// Fetch all members in a server - async fn fetch_all_members<'a>(&self, server_id: &str) -> Result> { + async fn fetch_all_members(&self, server_id: &str) -> Result> { Ok(self .col::(COL) .find(doc! { @@ -139,7 +139,7 @@ impl AbstractServerMembers for MongoDb { } /// Fetch all memberships for a user - async fn fetch_all_memberships<'a>(&self, user_id: &str) -> Result> { + async fn fetch_all_memberships(&self, user_id: &str) -> Result> { Ok(self .col::(COL) .find(doc! { @@ -159,7 +159,7 @@ impl AbstractServerMembers for MongoDb { } /// Fetch multiple members by their ids - async fn fetch_members<'a>(&self, server_id: &str, ids: &'a [String]) -> Result> { + async fn fetch_members(&self, server_id: &str, ids: &[String]) -> Result> { Ok(self .col::(COL) .find(doc! { diff --git a/crates/core/database/src/models/server_members/ops/reference.rs b/crates/core/database/src/models/server_members/ops/reference.rs index ac15d977..b69f548e 100644 --- a/crates/core/database/src/models/server_members/ops/reference.rs +++ b/crates/core/database/src/models/server_members/ops/reference.rs @@ -31,7 +31,7 @@ impl AbstractServerMembers for ReferenceDb { } /// Fetch all members in a server - async fn fetch_all_members<'a>(&self, server_id: &str) -> Result> { + async fn fetch_all_members(&self, server_id: &str) -> Result> { let server_members = self.server_members.lock().await; Ok(server_members .values() @@ -105,7 +105,7 @@ impl AbstractServerMembers for ReferenceDb { } /// Fetch all memberships for a user - async fn fetch_all_memberships<'a>(&self, user_id: &str) -> Result> { + async fn fetch_all_memberships(&self, user_id: &str) -> Result> { let server_members = self.server_members.lock().await; Ok(server_members .values() @@ -115,7 +115,7 @@ impl AbstractServerMembers for ReferenceDb { } /// Fetch multiple members by their ids - async fn fetch_members<'a>(&self, server_id: &str, ids: &'a [String]) -> Result> { + async fn fetch_members(&self, server_id: &str, ids: &[String]) -> Result> { let server_members = self.server_members.lock().await; Ok(ids .iter() diff --git a/crates/core/parser/src/lib.rs b/crates/core/parser/src/lib.rs index 191540c1..4ebbac63 100644 --- a/crates/core/parser/src/lib.rs +++ b/crates/core/parser/src/lib.rs @@ -4,15 +4,18 @@ use logos::Logos; #[derive(Debug, Clone, Logos, PartialEq)] #[logos(skip "\n")] -pub enum MessageToken { +#[logos(subpattern id="[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}")] +pub enum MessageToken<'a> { #[token("\\")] Escape, - #[regex("(```[^`\n]*)|(``)|`", |lex| lex.slice().to_owned().chars().filter(|&c| c == '`').count())] + #[regex("```[^`\n]*", |_| 3)] + #[regex("``", |_| 2)] + #[regex("`", |_| 1)] CodeblockMarker(usize), - #[regex("<@[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}>", |lex| lex.slice()[2..lex.slice().len() - 1].to_owned())] - UserMention(String), - #[regex("<%[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}>", |lex| lex.slice()[2..lex.slice().len() - 1].to_owned())] - RoleMention(String), + #[regex("<@(?&id)>", |lex| &lex.slice()[2..lex.slice().len() - 1])] + UserMention(&'a str), + #[regex("<%(?&id)>", |lex| &lex.slice()[2..lex.slice().len() - 1],)] + RoleMention(&'a str), #[token("@everyone")] MentionEveryone, #[token("@online")] @@ -27,13 +30,13 @@ pub struct MessageResults { pub mentions_online: bool } -struct MessageParserIterator { +struct MessageParserIterator<'a, I> { inner: I, - temp: VecDeque + temp: VecDeque> } -impl> Iterator for MessageParserIterator { - type Item = MessageToken; +impl<'a, I: Iterator>> Iterator for MessageParserIterator<'a, I> { + type Item = MessageToken<'a>; fn next(&mut self) -> Option { if !self.temp.is_empty() { @@ -80,8 +83,8 @@ pub fn parse_message(text: &str) -> MessageResults { match token { MessageToken::Escape => {} MessageToken::CodeblockMarker(_) => {}, - MessageToken::UserMention(id) => { results.user_mentions.insert(id); }, - MessageToken::RoleMention(id) => { results.role_mentions.insert(id); }, + MessageToken::UserMention(id) => { results.user_mentions.insert(id.to_string()); }, + MessageToken::RoleMention(id) => { results.role_mentions.insert(id.to_string()); }, MessageToken::MentionEveryone => results.mentions_everyone = true, MessageToken::MentionOnline => results.mentions_online = true, }; @@ -106,7 +109,7 @@ mod tests { let output = parse_message_iter("Hello <@01FD58YK5W7QRV5H3D64KTQYX3>.").collect::>(); assert_eq!(output.len(), 1); - assert_eq!(output[0], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); + assert_eq!(output[0], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3")); } #[test] @@ -114,7 +117,7 @@ mod tests { let output = parse_message_iter("Hello <%01FD58YK5W7QRV5H3D64KTQYX3>.").collect::>(); assert_eq!(output.len(), 1); - assert_eq!(output[0], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); + assert_eq!(output[0], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3")); } #[test] @@ -138,8 +141,8 @@ mod tests { let output = parse_message_iter("Hello <@01FD58YK5W7QRV5H3D64KTQYX3>, <%01FD58YK5W7QRV5H3D64KTQYX3>, @everyone and @online.").collect::>(); assert_eq!(output.len(), 4); - assert_eq!(output[0], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); - assert_eq!(output[1], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); + assert_eq!(output[0], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3")); + assert_eq!(output[1], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3")); assert_eq!(output[2], MessageToken::MentionEveryone); assert_eq!(output[3], MessageToken::MentionOnline); } @@ -149,8 +152,8 @@ mod tests { let output = parse_message_iter("<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online").collect::>(); assert_eq!(output.len(), 4); - assert_eq!(output[0], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); - assert_eq!(output[1], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); + assert_eq!(output[0], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3")); + assert_eq!(output[1], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3")); assert_eq!(output[2], MessageToken::MentionEveryone); assert_eq!(output[3], MessageToken::MentionOnline); } @@ -170,15 +173,14 @@ mod tests { assert_eq!(output.len(), 5); assert_eq!(output[0], MessageToken::CodeblockMarker(3)); - assert_eq!(output[1], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); - assert_eq!(output[2], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); + assert_eq!(output[1], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3")); + assert_eq!(output[2], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3")); assert_eq!(output[3], MessageToken::MentionEveryone); assert_eq!(output[4], MessageToken::MentionOnline); } #[test] fn test_inline_codeblock_no_mentions() { - let output = parse_message_iter("`<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online`").collect::>(); assert_eq!(output.len(), 2); @@ -192,12 +194,21 @@ mod tests { assert_eq!(output.len(), 5); assert_eq!(output[0], MessageToken::CodeblockMarker(1)); - assert_eq!(output[1], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); - assert_eq!(output[2], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3".to_string())); + assert_eq!(output[1], MessageToken::UserMention("01FD58YK5W7QRV5H3D64KTQYX3")); + assert_eq!(output[2], MessageToken::RoleMention("01FD58YK5W7QRV5H3D64KTQYX3")); assert_eq!(output[3], MessageToken::MentionEveryone); assert_eq!(output[4], MessageToken::MentionOnline); } + #[test] + fn test_codeblock_with_language_no_mentions() { + let output = parse_message_iter("```rust\n<@01FD58YK5W7QRV5H3D64KTQYX3><%01FD58YK5W7QRV5H3D64KTQYX3>@everyone@online```").collect::>(); + + assert_eq!(output.len(), 2); + assert_eq!(output[0], MessageToken::CodeblockMarker(3)); + assert_eq!(output[1], MessageToken::CodeblockMarker(3)); + } + #[test] fn test_double_inline_codeblock() { let output = parse_message_iter("``this should not ping @everyone``").collect::>();