diff --git a/.env.example b/.env.example index 043e271..cebdd5d 100644 --- a/.env.example +++ b/.env.example @@ -1 +1,3 @@ -BOT_TOKEN=YOUR-BOT-TOKEN \ No newline at end of file +BOT_TOKEN=YOUR-BOT-TOKEN +MEMBER_ROLE_ID=123 +WELCOME_CHANNEL_ID=321 \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index 8fa3d0b..9c6257c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,4 +8,6 @@ serenity = "0.12" tokio = { version = "1.21.2", features = ["macros", "rt-multi-thread"] } tracing = "0.1.23" tracing-subscriber = "0.3" +envy = "0.4" +serde = { version = "1.0", features = ["derive"] } dotenv = "0.15" diff --git a/src/config.rs b/src/config.rs index 9a0e567..0219e27 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,3 +1,8 @@ +use serde::Deserialize; + +#[derive(Deserialize, Debug)] pub struct Config { pub bot_token: String, + pub member_role_id: u64, + pub welcome_channel_id: u64, } diff --git a/src/main.rs b/src/main.rs index dbf7f28..abe17e3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,12 @@ mod commands; use dotenv::dotenv; -use std::env; - use serenity::async_trait; use serenity::builder::{CreateInteractionResponse, CreateInteractionResponseMessage}; use serenity::model::application::Interaction; use serenity::model::gateway::Ready; +use serenity::model::guild::Member; +use serenity::model::id::ChannelId; use serenity::model::channel::Message; use serenity::model::user::OnlineStatus; use serenity::gateway::ActivityData; @@ -16,7 +16,9 @@ use tracing::{warn, error, info}; mod config; use config::Config; -struct Handler; +struct Handler { + config: Config +} #[async_trait] impl EventHandler for Handler { @@ -79,6 +81,16 @@ impl EventHandler for Handler { ); } + + async fn guild_member_addition(&self, ctx: Context, new_member: Member) { + if let Err(why) = new_member.add_role(&ctx.http, self.config.member_role_id).await { + error!("Error adding role: {why:?}"); + } + let channel = ChannelId::new(self.config.welcome_channel_id); + if let Err(why) = channel.say(ctx.http, format!("Hello, {}!", new_member.user.name)).await { + error!("Error sending message: {why:?}"); + } + } } #[tokio::main] @@ -87,23 +99,18 @@ async fn main() { dotenv().ok(); - let bot_token = env::var("BOT_TOKEN") - .expect("BOT_TOKEN не найден") - .parse() - .expect("Неверный формат BOT_TOKEN"); - - - let config = Config { - bot_token: bot_token, + let config = match envy::from_env::() { + Ok(config) => config, + Err(error) => panic!("{:#?}", error) }; let intents = GatewayIntents::GUILD_MESSAGES | GatewayIntents::DIRECT_MESSAGES - | GatewayIntents::MESSAGE_CONTENT; + | GatewayIntents::MESSAGE_CONTENT + | GatewayIntents::GUILD_MEMBERS; - let token = &config.bot_token; - let mut client = Client::builder(token, intents) - .event_handler(Handler) + let mut client = Client::builder(&config.bot_token, intents) + .event_handler(Handler { config }) .await .expect("Error creating client");