Print out how many commands failed in a multi-command scenario. #52
36
src/bot.rs
36
src/bot.rs
|
@ -89,26 +89,40 @@ async fn handle_single_result(
|
||||||
/// out how many commands succeeded and failed (if any failed).
|
/// out how many commands succeeded and failed (if any failed).
|
||||||
async fn handle_multiple_results(
|
async fn handle_multiple_results(
|
||||||
client: &Client,
|
client: &Client,
|
||||||
results: &[CommandResult],
|
results: &[(&str, CommandResult)],
|
||||||
respond_to: &str,
|
respond_to: &str,
|
||||||
room_id: &RoomId,
|
room_id: &RoomId,
|
||||||
) {
|
) {
|
||||||
// TODO we should also pass in the original command so we can
|
let errors: Vec<(&str, &ExecutionError)> = results
|
||||||
// properly link errors to commands in output.
|
.into_iter()
|
||||||
let errors: Vec<&ExecutionError> = results.iter().filter_map(|r| r.as_ref().err()).collect();
|
.filter_map(|(cmd, result)| match result {
|
||||||
|
Err(e) => Some((*cmd, e)),
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
let message = if errors.len() == 0 {
|
let message = if errors.len() == 0 {
|
||||||
format!("{}: Executed {} commands", respond_to, results.len(),)
|
format!("{}: Executed {} commands", respond_to, results.len())
|
||||||
} else {
|
} else {
|
||||||
|
let failures: String = errors
|
||||||
|
.iter()
|
||||||
|
.map(|&(cmd, err)| format!("{}: {}", cmd, err))
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join("\n");
|
||||||
|
|
||||||
format!(
|
format!(
|
||||||
"{}: Executed {} commands ({} failed)",
|
"{}: Executed {} commands ({} failed)\n\nFailures:\n{}",
|
||||||
respond_to,
|
respond_to,
|
||||||
results.len(),
|
results.len(),
|
||||||
errors.len()
|
errors.len(),
|
||||||
|
failures
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
let response = RoomMessage(Notice(NoticeMessageEventContent::html(&message, &message)));
|
// TODO Need separate code that handles message formatting and
|
||||||
|
// sending so we aren't littering codebase with replace calls.
|
||||||
|
let html = message.replace("\n", "<br/>");
|
||||||
|
let response = RoomMessage(Notice(NoticeMessageEventContent::html(&message, &html)));
|
||||||
|
|
||||||
let result = client.room_send(&room_id, response, None).await;
|
let result = client.room_send(&room_id, response, None).await;
|
||||||
if let Err(e) = result {
|
if let Err(e) = result {
|
||||||
|
@ -175,7 +189,7 @@ impl DiceBot {
|
||||||
let room_name = room.display_name().await.ok().unwrap_or_default();
|
let room_name = room.display_name().await.ok().unwrap_or_default();
|
||||||
let room_id = room.room_id().clone();
|
let room_id = room.room_id().clone();
|
||||||
|
|
||||||
let mut results = Vec::with_capacity(msg_body.lines().count());
|
let mut results: Vec<(&str, CommandResult)> = Vec::with_capacity(msg_body.lines().count());
|
||||||
|
|
||||||
let commands = msg_body.trim().lines().filter(|line| line.starts_with("!"));
|
let commands = msg_body.trim().lines().filter(|line| line.starts_with("!"));
|
||||||
|
|
||||||
|
@ -189,12 +203,12 @@ impl DiceBot {
|
||||||
};
|
};
|
||||||
|
|
||||||
let cmd_result = execute_command(&ctx).await;
|
let cmd_result = execute_command(&ctx).await;
|
||||||
results.push(cmd_result);
|
results.push((&command, cmd_result));
|
||||||
}
|
}
|
||||||
|
|
||||||
if results.len() >= 1 {
|
if results.len() >= 1 {
|
||||||
if results.len() == 1 {
|
if results.len() == 1 {
|
||||||
handle_single_result(&self.client, &results[0], sender_username, &room_id).await;
|
handle_single_result(&self.client, &results[0].1, sender_username, &room_id).await;
|
||||||
} else if results.len() > 1 {
|
} else if results.len() > 1 {
|
||||||
handle_multiple_results(&self.client, &results, sender_username, &room_id).await;
|
handle_multiple_results(&self.client, &results, sender_username, &room_id).await;
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,8 +101,8 @@ impl ResponseExtractor for CommandResult {
|
||||||
/// Error message in bolded HTML.
|
/// Error message in bolded HTML.
|
||||||
fn message_html(&self, username: &str) -> String {
|
fn message_html(&self, username: &str) -> String {
|
||||||
match self {
|
match self {
|
||||||
Ok(resp) => format!("<p>{}</p>\n{}", username, resp.html),
|
Ok(resp) => format!("<p>{}</p>\n{}", username, resp.html).replace("\n", "<br/>"),
|
||||||
Err(e) => format!("<p>{}</p>\n{}", username, e.html()),
|
Err(e) => format!("<p>{}</p>\n{}", username, e.html()).replace("\n", "<br/>"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue