generated from ElnuDev/rust-project
parent
547e15acd5
commit
54de45b58b
@ -0,0 +1,2 @@
|
|||||||
|
DISCORD_TOKEN=
|
||||||
|
PREFIX="-e "
|
@ -1,3 +1,4 @@
|
|||||||
/target
|
/target
|
||||||
.direnv
|
.direnv
|
||||||
result
|
result
|
||||||
|
.env
|
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,112 @@
|
|||||||
fn main() {
|
use std::{env, sync::{Mutex}};
|
||||||
println!("Hello, world!");
|
|
||||||
|
use poise::{serenity_prelude::{self as serenity, GatewayIntents}, Event, command};
|
||||||
|
use regex::Regex;
|
||||||
|
use tts_rust::{ tts::GTTSClient, languages::Languages };
|
||||||
|
use lazy_static::lazy_static;
|
||||||
|
|
||||||
|
type Error = Box<dyn std::error::Error + Send + Sync>;
|
||||||
|
type Context<'a> = poise::Context<'a, Data, Error>;
|
||||||
|
// type PrefixContext<'a> = poise::PrefixContext<'a, Data, Error>;
|
||||||
|
// User data, which is stored and accessible in all command invocations
|
||||||
|
pub struct Data {
|
||||||
|
dnd: Mutex<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lazy_static! {
|
||||||
|
static ref NARRATOR: GTTSClient = GTTSClient {
|
||||||
|
volume: 1.0,
|
||||||
|
language: Languages::English,
|
||||||
|
tld: "com",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn event_handler(
|
||||||
|
ctx: &serenity::Context,
|
||||||
|
event: &Event<'_>,
|
||||||
|
_framework: poise::FrameworkContext<'_, Data, Error>,
|
||||||
|
data: &Data,
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
match event {
|
||||||
|
Event::Ready { data_about_bot } => {
|
||||||
|
println!("Logged in as {}", data_about_bot.user.name);
|
||||||
|
}
|
||||||
|
Event::Message { new_message } => {
|
||||||
|
const PREFIX: &str = "tell elnu";
|
||||||
|
lazy_static! {
|
||||||
|
static ref RE: Regex = Regex::new(r"<a?:([^:]+):\d+>").unwrap();
|
||||||
|
};
|
||||||
|
if new_message.content.to_lowercase().starts_with(PREFIX) {
|
||||||
|
if *data.dnd.lock().unwrap() {
|
||||||
|
new_message.react(&ctx.http, '💤').await?;
|
||||||
|
} else {
|
||||||
|
println!("{}: {}", new_message.author.name, new_message.content);
|
||||||
|
new_message.react(&ctx.http, '✅').await?;
|
||||||
|
NARRATOR.speak(&format!("{} says {}", new_message.author.name, RE.replace_all(&new_message.content[PREFIX.len()..], "$1"))).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[poise::command(prefix_command)]
|
||||||
|
async fn register(ctx: Context<'_>) -> Result<(), Error> {
|
||||||
|
poise::builtins::register_application_commands_buttons(ctx).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[command(slash_command, owners_only)]
|
||||||
|
async fn toggle_dnd(ctx: Context<'_>) -> Result<(), Error> {
|
||||||
|
let dnd = {
|
||||||
|
// Put into closure so Mutex isn't locked across an await point
|
||||||
|
let mut dnd = ctx.data().dnd.lock().unwrap();
|
||||||
|
*dnd = !*dnd;
|
||||||
|
*dnd
|
||||||
|
};
|
||||||
|
ctx.reply(if dnd {
|
||||||
|
"TTS status set to away. 💤"
|
||||||
|
} else {
|
||||||
|
"TTS status set to active. ✅"
|
||||||
|
}).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
|
// This will load the environment variables located at `./.env`, relative to
|
||||||
|
// the CWD. See `./.env.example` for an example on how to structure this.
|
||||||
|
dotenv::dotenv().expect("Failed to load .env file");
|
||||||
|
|
||||||
|
// Initialize the logger to use environment variables.
|
||||||
|
//
|
||||||
|
// In this case, a good default is setting the environment variable
|
||||||
|
// `RUST_LOG` to `debug`.
|
||||||
|
|
||||||
|
let framework = poise::Framework::builder()
|
||||||
|
.options(poise::FrameworkOptions {
|
||||||
|
commands: vec![
|
||||||
|
register(),
|
||||||
|
toggle_dnd(),
|
||||||
|
],
|
||||||
|
event_handler: |_ctx, event, _framework, _data| {
|
||||||
|
Box::pin(event_handler(_ctx, event, _framework, _data))
|
||||||
|
},
|
||||||
|
prefix_options: poise::PrefixFrameworkOptions {
|
||||||
|
prefix: Some(env::var("PREFIX").expect("Expected a prefix in the environment")),
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
..Default::default()
|
||||||
|
})
|
||||||
|
.token(std::env::var("DISCORD_TOKEN").expect("Expected a token in the environment"))
|
||||||
|
.intents(
|
||||||
|
GatewayIntents::GUILD_MESSAGES
|
||||||
|
| GatewayIntents::DIRECT_MESSAGES
|
||||||
|
| GatewayIntents::MESSAGE_CONTENT
|
||||||
|
| GatewayIntents::GUILDS,
|
||||||
|
)
|
||||||
|
.setup(move |_ctx, _ready, _framework| Box::pin(async move { Result::<Data, Error>::Ok(Data { dnd: Mutex::new(false) }) }));
|
||||||
|
|
||||||
|
framework.run().await.unwrap();
|
||||||
|
}
|
Loading…
Reference in new issue