Skip to content

Commit efeb946

Browse files
committed
Add welcome message option
1 parent 15190e0 commit efeb946

File tree

4 files changed

+104
-6
lines changed

4 files changed

+104
-6
lines changed

src/discord_bot/commands.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::discord_bot::guild_storage::GuildStorage;
22
use crate::discord_bot::{
33
brainfuck, chess, counter, mood, permanent_latest, reaction_role_toggle, role, roletoggle,
4-
social_credit, storage, support,
4+
social_credit, storage, support, welcome_message,
55
};
66
use chrono::Datelike;
77
use log::info;
@@ -76,6 +76,7 @@ declare_commands! {
7676
"storage" => (storage::run, "Admin commands to directly manipulate guild storage"),
7777
"support" => (support::run, "Use on people who are asking for support without using the support channel"),
7878
"trick" => (trick, "Adds a trick"),
79+
"welcome_message" => (welcome_message::run, "Sets the welcome message for new users in this discord"),
7980
}
8081

8182
pub(crate) async fn run(

src/discord_bot/guild_storage.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::discord_bot::chess::ChessState;
22
use crate::discord_bot::permanent_latest::PermanentLatestInfo;
33
use crate::discord_bot::role::RoleData;
44
use crate::discord_bot::roletoggle::RoleToggleInfo;
5+
use crate::discord_bot::welcome_message::WelcomeMessageData;
56
use dashmap::mapref::entry::Entry;
67
use dashmap::mapref::one::{Ref, RefMut};
78
use dashmap::DashMap;
@@ -32,6 +33,8 @@ pub struct GuildStorage {
3233
#[serde(default)]
3334
pub join_log_channel: Option<ChannelId>,
3435
#[serde(default)]
36+
pub welcome_message: Option<WelcomeMessageData>,
37+
#[serde(default)]
3538
pub role_toggles: HashMap<String, RoleToggleInfo>,
3639
#[serde(default)]
3740
pub tricks: HashMap<String, String>,
@@ -57,6 +60,7 @@ impl Default for GuildStorage {
5760
role_data: RoleData::default(),
5861
log_channel: None,
5962
join_log_channel: None,
63+
welcome_message: None,
6064
role_toggles: HashMap::new(),
6165
tricks: HashMap::new(),
6266
permanent_latest: PermanentLatestInfo::default(),

src/discord_bot/mod.rs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ mod social_credit;
1313
mod storage;
1414
mod support;
1515
mod update_copy;
16+
mod welcome_message;
1617

1718
use crate::config;
1819
use crate::discord_bot::april_fools_channel::{get_april_fools_channel, AprilFoolsChannel};
@@ -237,13 +238,12 @@ async fn send_chatbridge_message_to_discord(
237238
#[async_trait]
238239
impl EventHandler for Handler {
239240
async fn guild_member_addition(&self, ctx: Context, new_member: Member) {
240-
if let Some(join_log_channel) = GuildStorage::get(new_member.guild_id)
241-
.await
242-
.join_log_channel
243-
{
241+
let storage = GuildStorage::get(new_member.guild_id).await;
242+
243+
if let Some(join_log_channel) = storage.join_log_channel {
244244
if let Err(err) = join_log_channel
245245
.send_message(
246-
ctx,
246+
&ctx,
247247
CreateMessage::new().content(format!(
248248
"{} has risen from the dead.",
249249
new_member.display_name()
@@ -254,6 +254,23 @@ impl EventHandler for Handler {
254254
error!("Failed to send message in join log channel: {}", err);
255255
}
256256
}
257+
258+
if let Some(welcome_message_data) = &storage.welcome_message {
259+
if let Err(err) = welcome_message_data
260+
.channel
261+
.send_message(
262+
&ctx,
263+
CreateMessage::new().content(
264+
welcome_message_data
265+
.message
266+
.replace("[user]", &format!("<@{}>", new_member.user.id)),
267+
),
268+
)
269+
.await
270+
{
271+
error!("Failed to send welcome message: {}", err);
272+
}
273+
}
257274
}
258275

259276
async fn guild_member_removal(

src/discord_bot/welcome_message.rs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
use crate::discord_bot::commands::check_admin;
2+
use crate::discord_bot::guild_storage::GuildStorage;
3+
use serde::{Deserialize, Serialize};
4+
use serenity::client::Context;
5+
use serenity::model::channel::Message;
6+
use serenity::model::id::{ChannelId, GuildId};
7+
8+
#[derive(Debug, Clone, PartialEq, Eq, Hash, Deserialize, Serialize)]
9+
pub struct WelcomeMessageData {
10+
pub channel: ChannelId,
11+
pub message: String,
12+
}
13+
14+
async fn print_usage(guild_id: GuildId, ctx: Context, message: &Message) -> crate::Result<()> {
15+
let prefix = GuildStorage::get(guild_id).await.command_prefix.clone();
16+
message
17+
.reply(
18+
ctx,
19+
format!(
20+
"{prefix}welcome_message <channel_id> [message]\nUse [user] as a placeholder for a ping to the user."
21+
),
22+
)
23+
.await?;
24+
Ok(())
25+
}
26+
27+
pub(crate) async fn run(
28+
args: &str,
29+
guild_id: GuildId,
30+
ctx: Context,
31+
message: &Message,
32+
) -> crate::Result<()> {
33+
if !check_admin(&ctx, message).await? {
34+
return Ok(());
35+
}
36+
37+
let first_arg_end = args.find(char::is_whitespace).unwrap_or(args.len());
38+
let second_arg_begin = first_arg_end
39+
+ args[first_arg_end..]
40+
.find(|c: char| !c.is_whitespace())
41+
.unwrap_or_default();
42+
let Ok(channel_id) = args[..first_arg_end].parse::<ChannelId>() else {
43+
return print_usage(guild_id, ctx, message).await;
44+
};
45+
46+
if !guild_id.channels(&ctx).await?.contains_key(&channel_id) {
47+
message
48+
.reply(ctx, "That channel is not in this discord")
49+
.await?;
50+
return Ok(());
51+
}
52+
53+
let welcome_message = args[second_arg_begin..].trim();
54+
let mut storage = GuildStorage::get_mut(guild_id).await;
55+
if welcome_message.is_empty() {
56+
storage.welcome_message = None;
57+
storage.save().await;
58+
message
59+
.reply(&ctx, "Successfully removed the welcome message")
60+
.await?;
61+
} else {
62+
storage.welcome_message = Some(WelcomeMessageData {
63+
channel: channel_id,
64+
message: welcome_message.to_owned(),
65+
});
66+
storage.save().await;
67+
message
68+
.reply(
69+
&ctx,
70+
format!("Set the welcome message to {welcome_message}"),
71+
)
72+
.await?;
73+
}
74+
75+
Ok(())
76+
}

0 commit comments

Comments
 (0)