Skip to content

Commit b205d73

Browse files
committed
feat: show list of batches on break for status update report
1 parent 7a4fbbd commit b205d73

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/tasks/status_update.rs

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ GNU General Public License for more details.
1515
You should have received a copy of the GNU General Public License
1616
along with this program. If not, see <https://www.gnu.org/licenses/>.
1717
*/
18-
use std::collections::HashMap;
18+
use std::collections::{HashMap, HashSet};
1919

2020
use serenity::all::{CacheHttp, ChannelId, Context, CreateEmbed, CreateMessage};
2121
use 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

9197
async 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+
136166
fn format_defaulters(naughty_list: &GroupedMember) -> String {
137167
let mut description = String::new();
138168
for (track, missed_members) in naughty_list {

0 commit comments

Comments
 (0)