@@ -15,7 +15,7 @@ GNU General Public License for more details.
1515You should have received a copy of the GNU General Public License
1616along with this program. If not, see <https://www.gnu.org/licenses/>.
1717*/
18- use std:: collections:: HashMap ;
18+ use std:: collections:: { HashMap , HashSet } ;
1919
2020use serenity:: all:: { CacheHttp , ChannelId , Context , CreateEmbed , CreateMessage } ;
2121use serenity:: async_trait;
@@ -57,9 +57,9 @@ pub async fn status_update_check(ctx: Context, client: GraphQLClient) -> anyhow:
5757 members. retain ( |member| member. year != 4 ) ;
5858
5959 // naughty_list -> members who did not send updates
60- let naughty_list = categorize_members ( & members) ;
60+ let ( naughty_list, years_on_break ) = categorize_members ( & members) ;
6161
62- let embed = generate_embed ( members, naughty_list) . await ?;
62+ let embed = generate_embed ( members, naughty_list, years_on_break ) . await ?;
6363 let msg = CreateMessage :: new ( ) . embed ( embed) ;
6464
6565 let status_update_channel = ChannelId :: new ( STATUS_UPDATE_CHANNEL_ID ) ;
@@ -68,8 +68,9 @@ pub async fn status_update_check(ctx: Context, client: GraphQLClient) -> anyhow:
6868 Ok ( ( ) )
6969}
7070
71- fn categorize_members ( members : & Vec < Member > ) -> GroupedMember {
71+ fn categorize_members ( members : & Vec < Member > ) -> ( GroupedMember , Vec < i32 > ) {
7272 let mut naughty_list: HashMap < Option < String > , Vec < Member > > = HashMap :: new ( ) ;
73+ let mut years_on_break: HashSet < i32 > = HashSet :: new ( ) ;
7374
7475 for member in members {
7576 let Some ( status) = & member. status else {
@@ -79,18 +80,24 @@ fn categorize_members(members: &Vec<Member>) -> GroupedMember {
7980 continue ;
8081 } ;
8182
82- if !on_date. on_break && !on_date. is_sent {
83+ if on_date. on_break {
84+ years_on_break. insert ( member. year ) ;
85+ continue ;
86+ }
87+
88+ if !on_date. is_sent {
8389 let track = member. track . clone ( ) ;
8490 naughty_list. entry ( track) . or_default ( ) . push ( member. clone ( ) ) ;
8591 }
8692 }
8793
88- naughty_list
94+ ( naughty_list, years_on_break . into_iter ( ) . collect ( ) )
8995}
9096
9197async fn generate_embed (
9298 members : Vec < Member > ,
9399 naughty_list : GroupedMember ,
100+ years_on_break : Vec < i32 > ,
94101) -> anyhow:: Result < CreateEmbed > {
95102 let ( all_time_high, all_time_high_members, current_highest, current_highest_members) =
96103 get_leaderboard_stats ( members) . await ?;
@@ -106,6 +113,11 @@ async fn generate_embed(
106113 ) ) ;
107114 description. push_str ( & format_members ( & current_highest_members) ) ;
108115
116+ if !years_on_break. is_empty ( ) {
117+ description. push_str ( "## The Following Batches Are On Break:\n " ) ;
118+ description. push_str ( & format_breaks ( years_on_break) ) ;
119+ }
120+
109121 if !naughty_list. is_empty ( ) {
110122 description. push_str ( "# Defaulters\n " ) ;
111123 description. push_str ( & format_defaulters ( & naughty_list) ) ;
@@ -133,6 +145,24 @@ fn format_members(members: &[Member]) -> String {
133145 }
134146}
135147
148+ fn format_breaks ( mut years_on_break : Vec < i32 > ) -> String {
149+ years_on_break. sort ( ) ;
150+ let list = years_on_break
151+ . iter ( )
152+ . map ( |& year| {
153+ let year_label = match year {
154+ 1 => "First Years" ,
155+ 2 => "Second Years" ,
156+ 3 => "Third Years" ,
157+ _ => return format ! ( "Year {}" , year) ,
158+ } ;
159+ format ! ( "- {}" , year_label)
160+ } )
161+ . collect :: < Vec < _ > > ( )
162+ . join ( "\n " ) ;
163+ format ! ( "{list}\n " )
164+ }
165+
136166fn format_defaulters ( naughty_list : & GroupedMember ) -> String {
137167 let mut description = String :: new ( ) ;
138168 for ( track, missed_members) in naughty_list {
0 commit comments