File tree 3 files changed +76
-0
lines changed
3 files changed +76
-0
lines changed Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change @@ -66,6 +66,7 @@ impl Task for StatusUpdateCheck {
66
66
67
67
pub async fn check_status_updates ( ctx : Context ) -> anyhow:: Result < ( ) > {
68
68
trace ! ( "Starting check_status_updates" ) ;
69
+ let excluded_members = get_excluded_members ( ) . unwrap_or_default ( ) ;
69
70
let members = fetch_members ( )
70
71
. await
71
72
. context ( "Failed to fetch members from Root." ) ?;
@@ -79,6 +80,12 @@ pub async fn check_status_updates(ctx: Context) -> anyhow::Result<()> {
79
80
send_and_save_limiting_messages ( & channel_ids, & ctx)
80
81
. await
81
82
. 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
+
82
89
let embed = generate_embed ( members, updates)
83
90
. await
84
91
. context ( "Failed to generate embed" ) ?;
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments