Added discord bot functionality through serenity
This commit is contained in:
parent
56a37a738f
commit
f4ce6a3d81
20
src/lib.rs
20
src/lib.rs
@ -8,7 +8,7 @@ use thiserror::Error;
|
|||||||
mod lib_test;
|
mod lib_test;
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Clone)]
|
#[derive(Debug, PartialEq, Clone)]
|
||||||
enum DiceFilter {
|
pub enum DiceFilter {
|
||||||
DropLowest(usize),
|
DropLowest(usize),
|
||||||
DropHighest(usize),
|
DropHighest(usize),
|
||||||
KeepLowest(usize),
|
KeepLowest(usize),
|
||||||
@ -16,7 +16,7 @@ enum DiceFilter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Clone)]
|
#[derive(Debug, PartialEq, Clone)]
|
||||||
enum Segment {
|
pub enum Segment {
|
||||||
DiceRoll {
|
DiceRoll {
|
||||||
op: char,
|
op: char,
|
||||||
count: i32,
|
count: i32,
|
||||||
@ -166,10 +166,10 @@ fn group_modifiers_to_dicerolls(segments: &[Segment]) -> Vec<RollWithModifier> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Clone)]
|
#[derive(Debug, PartialEq, Clone)]
|
||||||
struct Roll {
|
pub struct Roll {
|
||||||
operator: char,
|
pub operator: char,
|
||||||
results: Vec<i32>,
|
pub results: Vec<i32>,
|
||||||
total: i32,
|
pub total: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Error, Debug, PartialEq, Clone)]
|
#[derive(Error, Debug, PartialEq, Clone)]
|
||||||
@ -265,12 +265,12 @@ fn roll_dice_segments<R: Rng>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq, Clone)]
|
#[derive(Debug, PartialEq, Clone)]
|
||||||
struct RollSet {
|
pub struct RollSet {
|
||||||
total: i32,
|
pub total: i32,
|
||||||
rolls: Vec<(Roll, Vec<Segment>)>,
|
pub rolls: Vec<(Roll, Vec<Segment>)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn roll_dice<R: Rng>(s: &str, mut rng: R) -> Result<RollSet> {
|
pub fn roll_dice<R: Rng>(s: &str, mut rng: R) -> Result<RollSet> {
|
||||||
let segments = parse_dice_segments(s)?;
|
let segments = parse_dice_segments(s)?;
|
||||||
|
|
||||||
let groups = group_modifiers_to_dicerolls(&segments);
|
let groups = group_modifiers_to_dicerolls(&segments);
|
||||||
|
|||||||
87
src/main.rs
87
src/main.rs
@ -1,3 +1,86 @@
|
|||||||
fn main() {
|
mod lib;
|
||||||
println!("Hello, world!");
|
use rand::thread_rng;
|
||||||
|
use serenity::{
|
||||||
|
client::{Context, EventHandler},
|
||||||
|
framework::{
|
||||||
|
standard::{
|
||||||
|
macros::{command, group},
|
||||||
|
CommandResult,
|
||||||
|
},
|
||||||
|
StandardFramework,
|
||||||
|
},
|
||||||
|
model::{prelude::Ready, channel::Message},
|
||||||
|
Client,
|
||||||
|
};
|
||||||
|
|
||||||
|
#[group]
|
||||||
|
#[commands(hi, roll)]
|
||||||
|
struct General;
|
||||||
|
|
||||||
|
#[command]
|
||||||
|
fn hi(ctx: &mut Context, msg: &Message) -> CommandResult {
|
||||||
|
msg.reply(ctx, "Hello world!")?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[command]
|
||||||
|
fn roll(ctx: &mut Context, msg: &Message) -> CommandResult {
|
||||||
|
let content = msg.content_safe(&ctx.cache);
|
||||||
|
let mut rng = thread_rng();
|
||||||
|
|
||||||
|
let roll_result = lib::roll_dice(&content, &mut rng)?;
|
||||||
|
|
||||||
|
let result : String = roll_result.rolls.iter().map(|i| {
|
||||||
|
let operator = &i.0.operator;
|
||||||
|
let rolls = &i.0.results;
|
||||||
|
let modifiers : String = i.1.iter().map(|seg| {
|
||||||
|
match seg {
|
||||||
|
lib::Segment::Modifier {op, amount} => format!("{}{}", op, amount),
|
||||||
|
_ => unreachable!()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>().join("");
|
||||||
|
|
||||||
|
format!("{}{:?} {}", operator, rolls, modifiers)
|
||||||
|
|
||||||
|
}).collect::<Vec<_>>().join(" ");
|
||||||
|
|
||||||
|
let total = roll_result.total;
|
||||||
|
|
||||||
|
let result = format!("{}= {}", result, total);
|
||||||
|
|
||||||
|
if let Err(e) = msg.reply(ctx, result) {
|
||||||
|
eprintln!("Failed to respond to command: {:?}", e)
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Handler;
|
||||||
|
|
||||||
|
impl EventHandler for Handler {
|
||||||
|
|
||||||
|
fn ready(&self, ctx: Context, _: Ready) {
|
||||||
|
use serenity::model::{gateway::Activity, user::OnlineStatus};
|
||||||
|
|
||||||
|
ctx.set_presence(Some(Activity::playing("with dice | /roll")), OnlineStatus::Online);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let discord_token = std::env::var("DISCORD_TOKEN").expect("failed to read DISCORD_TOKEN environment variable");
|
||||||
|
|
||||||
|
let mut client = Client::new(&discord_token, Handler).expect("Error creating client");
|
||||||
|
|
||||||
|
client.with_framework(
|
||||||
|
StandardFramework::new()
|
||||||
|
.configure(|c| c.prefix("/"))
|
||||||
|
.group(&GENERAL_GROUP),
|
||||||
|
);
|
||||||
|
|
||||||
|
if let Err(e) = client.start() {
|
||||||
|
eprintln!("Error occured starting discord client: {:?}", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user