Skip to content

Commit bd87a2d

Browse files
committed
Fix deadlock in exact message length April fools channel code
1 parent c9f46c2 commit bd87a2d

File tree

1 file changed

+19
-31
lines changed

1 file changed

+19
-31
lines changed

src/discord_bot/april_fools_channel/exact_message_length.rs

Lines changed: 19 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,62 +21,50 @@ pub(crate) struct ExactMessageLengthData {
2121
#[async_trait]
2222
impl AprilFoolsChannel for ExactMessageLength {
2323
async fn get_error(&self, context: &AprilFoolsMessageContext<'_>) -> Option<String> {
24-
let mut storage = GuildStorage::get_mut(context.guild_id).await;
25-
let Some(expected_length_data) = &mut storage.april_fools_channels.exact_message_length
26-
else {
27-
storage.discard();
24+
let storage = GuildStorage::get(context.guild_id).await;
25+
let Some(expected_length_data) = &storage.april_fools_channels.exact_message_length else {
2826
return None;
2927
};
3028

3129
if expected_length_data.last_inform_message == Some(context.message_id) {
32-
storage.discard();
3330
return None;
3431
}
3532

3633
let message_length = context.content.chars().count();
37-
let mut just_had_67 = false;
3834

3935
if let Some(expected_length) = expected_length_data.expected_length {
4036
if expected_length as usize != message_length {
41-
storage.discard();
4237
return Some(format!("Your message was the wrong length! Expected length {expected_length} but it was {message_length}."));
4338
}
44-
45-
just_had_67 = expected_length == 67;
4639
}
4740

48-
let new_length = reroll_message_length(just_had_67);
49-
expected_length_data.expected_length = Some(new_length);
50-
storage.save().await;
5141
None
5242
}
5343

5444
async fn on_success(&self, context: &AprilFoolsMessageContext<'_>) -> crate::Result<()> {
55-
let mut storage = GuildStorage::get_mut(context.guild_id).await;
56-
let Some(expected_length_data) = &mut storage.april_fools_channels.exact_message_length
57-
else {
58-
storage.discard();
59-
return Ok(());
60-
};
61-
let Some(expected_length) = expected_length_data.expected_length else {
62-
storage.discard();
63-
return Ok(());
64-
};
65-
let message = match context
45+
let just_had_67 = GuildStorage::get(context.guild_id)
46+
.await
47+
.april_fools_channels
48+
.exact_message_length
49+
.as_ref()
50+
.and_then(|exact_message_length| exact_message_length.expected_length)
51+
== Some(67);
52+
let new_length = reroll_message_length(just_had_67);
53+
let message = context
6654
.channel_id
6755
.send_message(
6856
&context.context,
6957
CreateMessage::new()
70-
.content(format!("Now expecting message length of {expected_length}")),
58+
.content(format!("Now expecting message length of {new_length}")),
7159
)
72-
.await
73-
{
74-
Ok(message) => message,
75-
Err(err) => {
76-
storage.discard();
77-
return Err(err.into());
78-
}
60+
.await?;
61+
let mut storage = GuildStorage::get_mut(context.guild_id).await;
62+
let Some(expected_length_data) = &mut storage.april_fools_channels.exact_message_length
63+
else {
64+
storage.discard();
65+
return Ok(());
7966
};
67+
expected_length_data.expected_length = Some(new_length);
8068
expected_length_data.last_inform_message = Some(message.id);
8169
storage.save().await;
8270
Ok(())

0 commit comments

Comments
 (0)