Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions src/commands/command.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
use serenity::async_trait;
use serenity::model::prelude::*;
use serenity::prelude::*;
use std::collections::HashSet;
use std::fs::{OpenOptions};
use std::io::{self, Write};

#[async_trait]
impl Command for ToggleExclusionCommand {
fn name(&self) -> &str {
"toggle_exclusion"
}

fn description(&self) -> &str {
"Toggles exclusion of a user from the status update report."
}

async fn execute(&self, ctx: &Context, msg: &Message) -> anyhow::Result<()> {
let args: Vec<String> = msg.content.split_whitespace().map(|s| s.to_string()).collect();
if args.len() < 2 {
msg.reply(ctx, "Please specify a user to toggle exclusion").await?;
return Ok(());
}
let user_id = args[1].parse::<u64>().unwrap_or(0);
if user_id == 0 {
msg.reply(ctx, "Invalid user ID").await?;
return Ok(());
}

let mut excluded_members = get_excluded_members()?;
if excluded_members.contains(&user_id) {
excluded_members.remove(&user_id);
msg.reply(ctx, "User has been removed from the exclusion list").await?;
} else {
excluded_members.insert(user_id);
msg.reply(ctx, "User has been added to the exclusion list").await?;
}

save_excluded_members(excluded_members)?;
Ok(())
}
}
7 changes: 7 additions & 0 deletions src/tasks/status_update.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ impl Task for StatusUpdateCheck {

pub async fn check_status_updates(ctx: Context) -> anyhow::Result<()> {
trace!("Starting check_status_updates");
let excluded_members = get_excluded_members().unwrap_or_default();
let members = fetch_members()
.await
.context("Failed to fetch members from Root.")?;
Expand All @@ -79,6 +80,12 @@ pub async fn check_status_updates(ctx: Context) -> anyhow::Result<()> {
send_and_save_limiting_messages(&channel_ids, &ctx)
.await
.context("Failed to send and save limiting messages")?;

let members: Vec<Member> = members
.into_iter()
.filter(|m| !excluded_members.contains(&m.discord_id.parse::<u64>().unwrap_or(0)))
.collect();

let embed = generate_embed(members, updates)
.await
.context("Failed to generate embed")?;
Expand Down
27 changes: 27 additions & 0 deletions src/utils/storage.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
use std::collections::HashSet;
use std::fs::{File, OpenOptions};
use std::io::{self, BufRead, Write};
use std::path::Path;

pub fn get_excluded_members() -> io::Result<HashSet<u64>> {
let path = Path::new("excluded_members.json");
let file = OpenOptions::new().read(true).create(true).open(path)?;
let reader = io::BufReader::new(file);
let excluded_members = reader
.lines()
.filter_map(|line| line.ok().and_then(|l| l.parse::<u64>().ok()))
.collect::<HashSet<u64>>();

Ok(excluded_members)
}

pub fn save_excluded_members(excluded_members: HashSet<u64>) -> io::Result<()> {
let path = Path::new("excluded_members.json");
let mut file = OpenOptions::new().write(true).create(true).truncate(true).open(path)?;

for user_id in excluded_members {
writeln!(file, "{}", user_id)?;
}

Ok(())
}