Skip to content

Commit 6d2239d

Browse files
committed
track edits and deletions
1 parent 35e62df commit 6d2239d

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

src/api.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,36 @@ use crate::{
22
commands::{Args, Result},
33
db::DB,
44
schema::roles,
5+
CommandHistory,
56
};
67
use diesel::prelude::*;
78
use serenity::{model::prelude::*, utils::parse_username};
89

910
/// Send a reply to the channel the message was received on.
1011
pub(crate) fn send_reply(args: &Args, message: &str) -> Result<()> {
11-
args.msg.channel_id.say(&args.cx, message)?;
12+
if let Some(response_id) = response_exists(args) {
13+
info!("editing message: {:?}", response_id);
14+
args.msg
15+
.channel_id
16+
.edit_message(&args.cx, response_id, |msg| msg.content(message))?;
17+
} else {
18+
let command_id = args.msg.id;
19+
let response = args.msg.channel_id.say(&args.cx, message)?;
20+
21+
let mut data = args.cx.data.write();
22+
let history = data.get_mut::<CommandHistory>().unwrap();
23+
history.insert(command_id, response.id);
24+
}
25+
1226
Ok(())
1327
}
1428

29+
fn response_exists(args: &Args) -> Option<MessageId> {
30+
let data = args.cx.data.read();
31+
let history = data.get::<CommandHistory>().unwrap();
32+
history.get(&args.msg.id).cloned()
33+
}
34+
1535
/// Determine if a member sending a message has the `Role`.
1636
pub(crate) fn has_role(args: &Args, role: &RoleId) -> Result<bool> {
1737
Ok(args

src/main.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use commands::{Args, Commands, GuardFn, Result};
2424
use diesel::prelude::*;
2525
use envy;
2626
use indexmap::IndexMap;
27+
use std::collections::HashMap;
2728
use serde::Deserialize;
2829
use serenity::{model::prelude::*, prelude::*};
2930

@@ -221,6 +222,11 @@ fn main() {
221222
}
222223
}
223224

225+
struct CommandHistory {}
226+
impl TypeMapKey for CommandHistory {
227+
type Value = HashMap<MessageId, MessageId>;
228+
}
229+
224230
struct Events {
225231
cmds: Commands,
226232
}
@@ -230,11 +236,34 @@ impl RawEventHandler for Events {
230236
match event {
231237
Event::Ready(ev) => {
232238
info!("{} connected to discord", ev.ready.user.name);
239+
let mut data = cx.data.write();
240+
data.insert::<CommandHistory>(HashMap::new());
241+
drop(data);
242+
233243
ban::start_unban_thread(cx);
234244
}
235245
Event::MessageCreate(ev) => {
236246
self.cmds.execute(cx, &ev.message);
237247
}
248+
Event::MessageUpdate(ev) => {
249+
use serenity::utils::CustomMessage;
250+
let mut msg = CustomMessage::new();
251+
252+
msg.id(ev.id)
253+
.channel_id(ev.channel_id)
254+
.content(ev.content.unwrap_or_else(|| String::new()));
255+
256+
let msg = msg.build();
257+
self.cmds.execute(cx, msg);
258+
}
259+
Event::MessageDelete(ev) => {
260+
let mut data = cx.data.write();
261+
let history = data.get_mut::<CommandHistory>().unwrap();
262+
if let Some(response_id) = history.remove(&ev.message_id) {
263+
info!("deleting message: {:?}", response_id);
264+
let _ = ev.channel_id.delete_message(&cx, response_id);
265+
}
266+
}
238267
Event::ReactionAdd(ev) => {
239268
if let Err(e) = welcome::assign_talk_role(&cx, &ev) {
240269
error!("{}", e);

0 commit comments

Comments
 (0)