Skip to content

Commit 7cc0fab

Browse files
committed
1 parent 6925f9e commit 7cc0fab

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

src/commands/command.rs

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
use serenity::async_trait;
2+
use serenity::model::prelude::*;
3+
use serenity::prelude::*;
4+
use std::collections::HashSet;
5+
use std::fs::{OpenOptions};
6+
use std::io::{self, Write};
7+
8+
#[async_trait]
9+
impl Command for ToggleExclusionCommand {
10+
fn name(&self) -> &str {
11+
"toggle_exclusion"
12+
}
13+
14+
fn description(&self) -> &str {
15+
"Toggles exclusion of a user from the status update report."
16+
}
17+
18+
async fn execute(&self, ctx: &Context, msg: &Message) -> anyhow::Result<()> {
19+
let args: Vec<String> = msg.content.split_whitespace().map(|s| s.to_string()).collect();
20+
if args.len() < 2 {
21+
msg.reply(ctx, "Please specify a user to toggle exclusion").await?;
22+
return Ok(());
23+
}
24+
let user_id = args[1].parse::<u64>().unwrap_or(0);
25+
if user_id == 0 {
26+
msg.reply(ctx, "Invalid user ID").await?;
27+
return Ok(());
28+
}
29+
30+
let mut excluded_members = get_excluded_members()?;
31+
if excluded_members.contains(&user_id) {
32+
excluded_members.remove(&user_id);
33+
msg.reply(ctx, "User has been removed from the exclusion list").await?;
34+
} else {
35+
excluded_members.insert(user_id);
36+
msg.reply(ctx, "User has been added to the exclusion list").await?;
37+
}
38+
39+
save_excluded_members(excluded_members)?;
40+
Ok(())
41+
}
42+
}

src/tasks/status_update.rs

+7
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ impl Task for StatusUpdateCheck {
6666

6767
pub async fn check_status_updates(ctx: Context) -> anyhow::Result<()> {
6868
trace!("Starting check_status_updates");
69+
let excluded_members = get_excluded_members().unwrap_or_default();
6970
let members = fetch_members()
7071
.await
7172
.context("Failed to fetch members from Root.")?;
@@ -79,6 +80,12 @@ pub async fn check_status_updates(ctx: Context) -> anyhow::Result<()> {
7980
send_and_save_limiting_messages(&channel_ids, &ctx)
8081
.await
8182
.context("Failed to send and save limiting messages")?;
83+
84+
let members: Vec<Member> = members
85+
.into_iter()
86+
.filter(|m| !excluded_members.contains(&m.discord_id.parse::<u64>().unwrap_or(0)))
87+
.collect();
88+
8289
let embed = generate_embed(members, updates)
8390
.await
8491
.context("Failed to generate embed")?;

src/utils/storage.rs

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use std::collections::HashSet;
2+
use std::fs::{File, OpenOptions};
3+
use std::io::{self, BufRead, Write};
4+
use std::path::Path;
5+
6+
pub fn get_excluded_members() -> io::Result<HashSet<u64>> {
7+
let path = Path::new("excluded_members.json");
8+
let file = OpenOptions::new().read(true).create(true).open(path)?;
9+
let reader = io::BufReader::new(file);
10+
let excluded_members = reader
11+
.lines()
12+
.filter_map(|line| line.ok().and_then(|l| l.parse::<u64>().ok()))
13+
.collect::<HashSet<u64>>();
14+
15+
Ok(excluded_members)
16+
}
17+
18+
pub fn save_excluded_members(excluded_members: HashSet<u64>) -> io::Result<()> {
19+
let path = Path::new("excluded_members.json");
20+
let mut file = OpenOptions::new().write(true).create(true).truncate(true).open(path)?;
21+
22+
for user_id in excluded_members {
23+
writeln!(file, "{}", user_id)?;
24+
}
25+
26+
Ok(())
27+
}

0 commit comments

Comments
 (0)