Skip to content

Commit 322c29d

Browse files
committed
Move some code around
1 parent 888e8f6 commit 322c29d

File tree

3 files changed

+106
-123
lines changed

3 files changed

+106
-123
lines changed

src/events.rs

Lines changed: 0 additions & 114 deletions
This file was deleted.

src/main.rs

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ mod api;
1111
mod commands;
1212
mod crates;
1313
mod db;
14-
mod events;
1514
mod schema;
1615
mod state_machine;
1716
mod tags;
@@ -20,8 +19,7 @@ mod welcome;
2019
use crate::db::DB;
2120
use commands::{Args, Commands};
2221
use diesel::prelude::*;
23-
use events::{EventDispatcher, MessageDispatcher};
24-
use serenity::Client;
22+
use serenity::{model::prelude::*, prelude::*};
2523

2624
pub(crate) type Result = crate::commands::Result<()>;
2725

@@ -106,10 +104,11 @@ fn app() -> Result {
106104
Ok(())
107105
});
108106

109-
let messages = MessageDispatcher::new(cmds);
110-
111-
let mut client =
112-
Client::new_with_handlers(&token, Some(messages), Some(EventDispatcher)).unwrap();
107+
let mut client = Client::new_with_extras(&token, |e| {
108+
e.event_handler(Messages { cmds });
109+
e.raw_event_handler(Events);
110+
e
111+
})?;
113112

114113
client.start()?;
115114

@@ -124,3 +123,32 @@ fn main() {
124123
std::process::exit(1);
125124
}
126125
}
126+
127+
struct Events;
128+
129+
impl RawEventHandler for Events {
130+
fn raw_event(&self, cx: Context, event: Event) {
131+
match event {
132+
Event::ReactionAdd(ref ev) => {
133+
if let Err(e) = welcome::assign_talk_role(&cx, ev) {
134+
println!("{}", e);
135+
}
136+
}
137+
_ => (),
138+
}
139+
}
140+
}
141+
142+
struct Messages {
143+
cmds: Commands,
144+
}
145+
146+
impl EventHandler for Messages {
147+
fn message(&self, cx: Context, msg: Message) {
148+
self.cmds.execute(cx, msg);
149+
}
150+
151+
fn ready(&self, _: Context, ready: Ready) {
152+
info!("{} connected to discord", ready.user.name);
153+
}
154+
}

src/welcome.rs

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
use crate::{
22
api,
33
commands::Args,
4-
schema::{messages, users},
4+
schema::{roles, messages, users},
55
db::DB,
66
Result,
77
};
88
use diesel::prelude::*;
9-
use serenity::model::prelude::*;
9+
use serenity::{model::prelude::*, prelude::*};
1010

1111
/// Write the welcome message to the welcome channel.
1212
pub(crate) fn post_message(args: Args) -> Result {
@@ -66,3 +66,72 @@ pub(crate) fn post_message(args: Args) -> Result {
6666
}
6767
Ok(())
6868
}
69+
70+
pub(crate) fn assign_talk_role(cx: &Context, ev: &ReactionAddEvent) -> Result {
71+
let reaction = &ev.reaction;
72+
73+
let channel = reaction.channel(cx)?;
74+
let channel_id = ChannelId::from(&channel);
75+
let message = reaction.message(cx)?;
76+
77+
let conn = DB.get()?;
78+
79+
let (msg, talk_role, me) = conn
80+
.build_transaction()
81+
.read_only()
82+
.run::<_, Box<dyn std::error::Error>, _>(|| {
83+
let msg: Option<_> = messages::table
84+
.filter(messages::name.eq("welcome"))
85+
.first::<(i32, String, String, String)>(&conn)
86+
.optional()?;
87+
88+
let role: Option<_> = roles::table
89+
.filter(roles::name.eq("talk"))
90+
.first::<(i32, String, String)>(&conn)
91+
.optional()?;
92+
93+
let me: Option<_> = users::table
94+
.filter(users::name.eq("me"))
95+
.first::<(i32, String, String)>(&conn)
96+
.optional()?;
97+
98+
Ok((msg, role, me))
99+
})?;
100+
101+
if let Some((_, _, cached_message_id, cached_channel_id)) = msg {
102+
if message.id.0.to_string() == cached_message_id
103+
&& channel_id.0.to_string() == *cached_channel_id
104+
{
105+
if reaction.emoji == ReactionType::from("✅") {
106+
if let Some((_, role_id, _)) = talk_role {
107+
let user_id = reaction.user_id;
108+
109+
let guild = channel
110+
.guild()
111+
.ok_or("Unable to retrieve guild from channel")?;
112+
113+
let mut member = guild
114+
.read()
115+
.guild(&cx)
116+
.ok_or("Unable to access guild")?
117+
.read()
118+
.member(cx, &user_id)?;
119+
120+
use std::str::FromStr;
121+
info!("Assigning talk role to {}", &member.user_id());
122+
member.add_role(&cx, RoleId::from(u64::from_str(&role_id)?))?;
123+
124+
// Requires ManageMessage permission
125+
if let Some((_, _, user_id)) = me {
126+
if ev.reaction.user_id.0.to_string() != user_id {
127+
ev.reaction.delete(cx)?;
128+
}
129+
}
130+
}
131+
} else {
132+
ev.reaction.delete(cx)?;
133+
}
134+
}
135+
}
136+
Ok(())
137+
}

0 commit comments

Comments
 (0)