mirror of
https://github.com/ethanrusz/echbot.git
synced 2024-11-22 04:07:46 -05:00
Refactor for better command structure
This commit is contained in:
parent
a815ca04bb
commit
a3a673c7e6
5 changed files with 75 additions and 38 deletions
16
README.md
16
README.md
|
@ -1,2 +1,18 @@
|
|||
# echbot
|
||||
|
||||
A trash bot for Smite fun.
|
||||
|
||||
## Environment
|
||||
|
||||
You must set the following for the bot to run.
|
||||
|
||||
```yml
|
||||
environment:
|
||||
- DISCORD_TOKEN=your_token_here
|
||||
- GUILD_ID=your_guild_id_here
|
||||
```
|
||||
|
||||
## Quotes
|
||||
|
||||
A `quotes.txt` file must be present in the root directory for the ping command to function. The format is one quote per
|
||||
line.
|
||||
|
|
3
src/commands/mod.rs
Normal file
3
src/commands/mod.rs
Normal file
|
@ -0,0 +1,3 @@
|
|||
// Group all commands for registration
|
||||
pub(crate) mod slur;
|
||||
pub(crate) mod team_up;
|
24
src/commands/slur.rs
Normal file
24
src/commands/slur.rs
Normal file
|
@ -0,0 +1,24 @@
|
|||
use crate::{Context, Error};
|
||||
|
||||
use rand::seq::IteratorRandom;
|
||||
use std::{
|
||||
fs::File,
|
||||
io::{BufRead, BufReader},
|
||||
};
|
||||
|
||||
/// Basically a ping command
|
||||
#[poise::command(slash_command, prefix_command)]
|
||||
pub(crate) async fn slur(
|
||||
ctx: Context<'_>,
|
||||
) -> Result<(), Error> {
|
||||
let file = File::open("quotes.txt")
|
||||
.unwrap_or_else(|_e| panic!("Quote file missing.")); // Open the quotes file
|
||||
let file = BufReader::new(file); // Read the quotes file
|
||||
let quotes = file.lines()
|
||||
.map(|res| res.expect("Failed to read line."));
|
||||
let quote = quotes.choose(&mut rand::thread_rng())
|
||||
.expect("No lines in file."); // Pick a random quote
|
||||
|
||||
ctx.say(quote).await?;
|
||||
Ok(())
|
||||
}
|
17
src/commands/team_up.rs
Normal file
17
src/commands/team_up.rs
Normal file
|
@ -0,0 +1,17 @@
|
|||
use crate::{Context, Error};
|
||||
use crate::serenity;
|
||||
|
||||
/// Split up users for custom joust matches
|
||||
#[poise::command(slash_command, prefix_command)]
|
||||
pub(crate) async fn team_up(
|
||||
ctx: Context<'_>,
|
||||
#[description = "Your voice channel"] channel: Option<serenity::Channel>,
|
||||
) -> Result<(), Error> {
|
||||
let c = channel.as_ref().unwrap(); // Get channel info from object
|
||||
let mut v = ctx.guild().unwrap().voice_states; // Get hashmap of users' voice states within the guild
|
||||
v.retain(|_, s| s.channel_id == Some(c.id())); // Drop users not active in requested voice channel from hashmap
|
||||
let res = format!("Channel {} has {} active users", c.id(), v.keys().len());
|
||||
|
||||
ctx.say(res).await?;
|
||||
Ok(())
|
||||
}
|
53
src/main.rs
53
src/main.rs
|
@ -1,56 +1,33 @@
|
|||
mod commands;
|
||||
|
||||
use poise::serenity_prelude as serenity;
|
||||
use rand::seq::IteratorRandom;
|
||||
use std::{
|
||||
fs::File,
|
||||
io::{BufRead, BufReader},
|
||||
};
|
||||
|
||||
struct Data {}
|
||||
|
||||
type Error = Box<dyn std::error::Error + Send + Sync>;
|
||||
type Context<'a> = poise::Context<'a, Data, Error>;
|
||||
|
||||
/// Basically a ping command.
|
||||
#[poise::command(slash_command, prefix_command)]
|
||||
async fn slur(
|
||||
ctx: Context<'_>,
|
||||
) -> Result<(), Error> {
|
||||
let file = File::open("quotes.txt").unwrap_or_else(|_e| panic!("Quote file missing.")); // Open the quotes file
|
||||
let file = BufReader::new(file); // Read the quotes file
|
||||
let quotes = file.lines().map(|res| res.expect("Failed to read line."));
|
||||
let quote = quotes.choose(&mut rand::thread_rng()).expect("No lines in file."); // Pick a random quote
|
||||
|
||||
ctx.say(quote).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Split up users for custom joust matches.
|
||||
#[poise::command(slash_command, prefix_command)]
|
||||
async fn team_up(
|
||||
ctx: Context<'_>,
|
||||
#[description = "Your voice channel"] channel: Option<serenity::Channel>,
|
||||
) -> Result<(), Error> {
|
||||
let c = channel.as_ref().unwrap(); // Get channel info from object
|
||||
let mut v = ctx.guild().unwrap().voice_states; // Get hashmap of users' voice states within the guild
|
||||
v.retain(|_, s| s.channel_id == Some(c.id())); // Drop users not active in requested voice channel from hashmap
|
||||
let res = format!("Channel {} has {} active users", c.id(), v.keys().len());
|
||||
|
||||
ctx.say(res).await?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
let framework = poise::Framework::builder()
|
||||
.options(poise::FrameworkOptions {
|
||||
commands: vec![slur(), team_up()], // IntelliJ doesn't like this, but it's fine.
|
||||
commands: vec![
|
||||
commands::slur::slur(),
|
||||
commands::team_up::team_up(),
|
||||
], // IntelliJ doesn't like this, but it's fine.
|
||||
..Default::default()
|
||||
})
|
||||
.token(std::env::var("DISCORD_TOKEN").expect("missing DISCORD_TOKEN"))
|
||||
.intents(serenity::GatewayIntents::non_privileged())
|
||||
.token(std::env::var("DISCORD_TOKEN")
|
||||
.expect("Missing DISCORD_TOKEN"))
|
||||
.intents(serenity::GatewayIntents::non_privileged()) // Set intents for Discord dev portal
|
||||
.setup(|ctx, _ready, framework| {
|
||||
Box::pin(async move {
|
||||
poise::builtins::register_globally(ctx, &framework.options().commands).await?;
|
||||
poise::builtins::register_in_guild(
|
||||
ctx,
|
||||
&framework.options().commands,
|
||||
serenity::GuildId(std::env::var("GUILD_ID")
|
||||
.expect("Missing GUILD_ID") // Get GID from env and parse
|
||||
.parse::<u64>().unwrap())).await?; // Update slash commands in GID
|
||||
Ok(Data {})
|
||||
})
|
||||
});
|
||||
|
|
Loading…
Reference in a new issue