aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Perry <np@nathanperry.dev>2019-11-17 22:51:59 -0500
committerNathan Perry <np@nathanperry.dev>2019-11-17 22:51:59 -0500
commit8b2ccf363ac6894c21e256844948c8327645f0db (patch)
treef6742f2d7905613b8c0404bba46e237f984a8da2
parent2a38c282dd57c2051a568549d62c80d6036e8920 (diff)
mostly fixed
-rw-r--r--Cargo.lock7
-rw-r--r--Cargo.toml2
-rw-r--r--src/audio/play_queue.rs5
-rw-r--r--src/audio/timeutil.rs9
-rw-r--r--src/commands/meme/create.rs18
-rw-r--r--src/commands/meme/delete.rs12
-rw-r--r--src/commands/meme/history.rs25
-rw-r--r--src/commands/meme/invoke.rs27
-rw-r--r--src/commands/meme/mod.rs23
-rw-r--r--src/commands/mod.rs65
-rw-r--r--src/commands/playback.rs46
-rw-r--r--src/commands/roll.rs15
-rw-r--r--src/commands/sound_levels.rs18
-rw-r--r--src/db/mod.rs3
-rw-r--r--src/db/models.rs11
-rw-r--r--src/game.rs54
-rw-r--r--src/main.rs40
-rw-r--r--src/util.rs3
18 files changed, 246 insertions, 137 deletions
diff --git a/Cargo.lock b/Cargo.lock
index ffa40e7..7a8c179 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1986,6 +1986,11 @@ version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
+name = "static-cond"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
+[[package]]
name = "statrs"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2177,6 +2182,7 @@ dependencies = [
"serde_json 1.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
"serenity 0.7.2 (git+https://github.com/mammothbane/serenity)",
"sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "static-cond 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"statrs 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
"thiserror 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
"time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -2962,6 +2968,7 @@ dependencies = [
"checksum sodiumoxide 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "585232e78a4fc18133eef9946d3080befdf68b906c51b621531c37e91787fa2b"
"checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3"
"checksum spin 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+"checksum static-cond 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9aec68100e00aeda0e22498f9892aa4b3a3d6b2c366d44262a2a1a08a62531e0"
"checksum statrs 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "10102ac8d55e35db2b3fafc26f81ba8647da2e15879ab686a67e6d19af2685e8"
"checksum string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d"
"checksum stringprep 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1"
diff --git a/Cargo.toml b/Cargo.toml
index cdc0213..41b6f12 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -2,6 +2,7 @@
name = "thulani"
version = "0.1.6"
authors = ["Nathan Perry <avaglir@gmail.com>"]
+edition = "2018"
[features]
default = ["db", "games"]
@@ -37,6 +38,7 @@ pest = "~2.1"
pest_derive = "~2.1"
postgres = { version = "^0.15", optional = true, features = ["with-chrono"] }
r2d2_postgres = { version = "^0.14", optional = true }
+static-cond = "^0.2"
[dependencies.serenity]
default-features = false
diff --git a/src/audio/play_queue.rs b/src/audio/play_queue.rs
index 1f80961..273f07b 100644
--- a/src/audio/play_queue.rs
+++ b/src/audio/play_queue.rs
@@ -8,6 +8,11 @@ use std::{
};
use either::{Left, Right};
+use log::{
+ debug,
+ error,
+ trace,
+};
use serenity::{
CacheAndHttp,
client::bridge::voice::ClientVoiceManager,
diff --git a/src/audio/timeutil.rs b/src/audio/timeutil.rs
index b2232de..c9b38dd 100644
--- a/src/audio/timeutil.rs
+++ b/src/audio/timeutil.rs
@@ -1,8 +1,10 @@
+use chrono::Duration;
use regex::{
- Regex,
Match,
+ Regex,
};
-use chrono::Duration;
+
+use lazy_static::lazy_static;
lazy_static! {
static ref START_REGEX: Regex =
@@ -47,9 +49,10 @@ pub fn parse_times<A: AsRef<str>>(s: A) -> (Option<Duration>, Option<Duration>)
#[cfg(test)]
mod test {
- use super::*;
use time::Duration;
+ use super::*;
+
#[test]
fn test_start() {
let captures = START_REGEX.captures("start 1h2m3s").unwrap();
diff --git a/src/commands/meme/create.rs b/src/commands/meme/create.rs
index 0851961..7f590b1 100644
--- a/src/commands/meme/create.rs
+++ b/src/commands/meme/create.rs
@@ -7,13 +7,25 @@ use std::{
};
use diesel::result::Error as DieselError;
+use log::{
+ debug,
+ error,
+ warn,
+};
use serenity::{
- framework::standard::{Args, Delimiter},
+ framework::standard::{
+ Args, CommandResult,
+ Delimiter,
+ macros::command,
+ },
model::channel::Message,
prelude::*,
};
use url::Url;
+use anyhow::anyhow;
+use lazy_static::lazy_static;
+
use crate::{
audio::{
parse_times,
@@ -34,7 +46,7 @@ lazy_static! {
}
#[command]
-pub fn addmeme(ctx: &mut Context, msg: &Message, args: Args) -> Result<()> {
+pub fn addmeme(ctx: &mut Context, msg: &Message, args: Args) -> CommandResult {
let mut args = Args::new(args.rest(), delims.as_ref());
let title = args.single_quoted::<String>()?;
@@ -81,7 +93,7 @@ pub fn addmeme(ctx: &mut Context, msg: &Message, args: Args) -> Result<()> {
}
#[command]
-pub fn addaudiomeme(ctx: &mut Context, msg: &Message, args: Args) -> Result<()> {
+pub fn addaudiomeme(ctx: &mut Context, msg: &Message, args: Args) -> CommandResult {
let mut args = Args::new(args.rest(), delims.as_ref());
let title = args.single_quoted::<String>()?;
diff --git a/src/commands/meme/delete.rs b/src/commands/meme/delete.rs
index 72226e5..148dfd6 100644
--- a/src/commands/meme/delete.rs
+++ b/src/commands/meme/delete.rs
@@ -2,8 +2,13 @@ use diesel::{
NotFound,
result::Error as DieselError,
};
+use log::info;
use serenity::{
- framework::standard::Args,
+ framework::standard::{
+ Args,
+ CommandResult,
+ macros::command,
+ },
model::channel::Message,
prelude::*,
};
@@ -19,7 +24,7 @@ use crate::{
#[command]
#[aliases("delmem")]
-pub fn delmeme(ctx: &mut Context, msg: &Message, mut args: Args) -> Result<()> {
+pub fn delmeme(ctx: &mut Context, msg: &Message, mut args: Args) -> CommandResult {
let title = args.single_quoted::<String>()?;
let conn = connection()?;
@@ -34,7 +39,8 @@ pub fn delmeme(ctx: &mut Context, msg: &Message, mut args: Args) -> Result<()> {
return Ok(());
}
- Err(e)
+ Err(e)?;
+ Ok(())
}
}
}
diff --git a/src/commands/meme/history.rs b/src/commands/meme/history.rs
index 6c03bef..5921e1a 100644
--- a/src/commands/meme/history.rs
+++ b/src/commands/meme/history.rs
@@ -2,8 +2,17 @@ use diesel::{
NotFound,
result::Error as DieselError,
};
+use log::{
+ debug,
+ error,
+ info,
+};
use serenity::{
- framework::standard::Args,
+ framework::standard::{
+ Args,
+ CommandResult,
+ macros::command,
+ },
model::channel::Message,
prelude::*,
};
@@ -12,8 +21,12 @@ use timeago::{
TimeUnit,
};
+use anyhow::anyhow;
+use lazy_static::lazy_static;
+
use crate::{
db::{
+ self,
connection,
InvocationRecord,
Meme,
@@ -38,7 +51,7 @@ static CLEAN_DATE_FORMAT: &'static str = "%b %-e %Y";
#[command]
#[aliases("what")]
-pub fn wat(ctx: &mut Context, msg: &Message, _: Args) -> Result<()> {
+pub fn wat(ctx: &mut Context, msg: &Message, _: Args) -> CommandResult {
let conn = connection()?;
let record = match InvocationRecord::last(&conn) {
@@ -80,7 +93,7 @@ pub fn wat(ctx: &mut Context, msg: &Message, _: Args) -> Result<()> {
}
#[command]
-pub fn history(ctx: &mut Context, msg: &Message, mut args: Args) -> Result<()> {
+pub fn history(ctx: &mut Context, msg: &Message, mut args: Args) -> CommandResult {
use itertools::Itertools;
lazy_static! {
@@ -143,7 +156,7 @@ pub fn history(ctx: &mut Context, msg: &Message, mut args: Args) -> Result<()> {
#[command]
#[aliases("stat")]
-pub fn stats(ctx: &mut Context, msg: &Message, _: Args) -> Result<()> {
+pub fn stats(ctx: &mut Context, msg: &Message, _: Args) -> CommandResult {
use db;
use serenity::model::{
id::UserId,
@@ -206,7 +219,7 @@ and *{}* was the most-memed overall ({})"#,
}
#[command]
-pub fn memers(ctx: &mut Context, msg: &Message, _args: Args) -> Result<()> {
+pub fn memers(ctx: &mut Context, msg: &Message, _args: Args) -> CommandResult {
use db;
use itertools::Itertools;
use serenity::model::{
@@ -240,7 +253,7 @@ pub fn memers(ctx: &mut Context, msg: &Message, _args: Args) -> Result<()> {
}
#[command]
-pub fn query(ctx: &mut Context, msg: &Message, mut args: Args) -> Result<()> {
+pub fn query(ctx: &mut Context, msg: &Message, mut args: Args) -> CommandResult {
use std::borrow::Borrow;
use itertools::Itertools;
diff --git a/src/commands/meme/invoke.rs b/src/commands/meme/invoke.rs
index 89ca999..93c5141 100644
--- a/src/commands/meme/invoke.rs
+++ b/src/commands/meme/invoke.rs
@@ -3,8 +3,13 @@ use diesel::{
result::Error as DieselError,
};
use itertools::Itertools;
+use log::info;
use serenity::{
- framework::standard::Args,
+ framework::standard::{
+ Args,
+ CommandResult,
+ macros::command,
+ },
model::channel::Message,
prelude::*,
};
@@ -23,22 +28,19 @@ use crate::{
#[command]
#[aliases("mem")]
-#[inline]
-pub fn meme(ctx: &mut Context, msg: &Message, args: Args) -> Result<()> {
+pub fn meme(ctx: &mut Context, msg: &Message, args: Args) -> CommandResult {
_meme(ctx, msg, args, AudioPlayback::Optional)
}
#[command]
#[aliases("audiomeme", "audiomem")]
-#[inline]
-pub fn audio_meme(ctx: &mut Context, msg: &Message, args: Args) -> Result<()> {
+pub fn audio_meme(ctx: &mut Context, msg: &Message, args: Args) -> CommandResult {
_meme(ctx, msg, args, AudioPlayback::Required)
}
#[command]
#[aliases("silentmeme", "silentmem")]
-#[inline]
-pub fn silent_meme(ctx: &mut Context, msg: &Message, args: Args) -> Result<()> {
+pub fn silent_meme(ctx: &mut Context, msg: &Message, args: Args) -> CommandResult {
_meme(ctx, msg, args, AudioPlayback::Prohibited)
}
@@ -49,7 +51,7 @@ enum AudioPlayback {
Prohibited,
}
-fn _meme(ctx: &mut Context, msg: &Message, args: Args, audio_playback: AudioPlayback) -> Result<()> {
+fn _meme(ctx: &mut Context, msg: &Message, args: Args, audio_playback: AudioPlayback) -> CommandResult {
if args.len() == 0 || audio_playback != AudioPlayback::Optional {
return rand_meme(ctx, msg, audio_playback);
}
@@ -77,9 +79,7 @@ fn _meme(ctx: &mut Context, msg: &Message, args: Args, audio_playback: AudioPlay
send_meme(ctx, &mem, &conn, msg)
}
-#[command]
-#[aliases("rarememe", "raremem")]
-fn rand_meme(ctx: &Context, message: &Message, audio_playback: AudioPlayback) -> Result<()> {
+fn rand_meme(ctx: &Context, message: &Message, audio_playback: AudioPlayback) -> CommandResult {
let conn = connection()?;
let should_audio = ctx.users_listening()?;
@@ -93,7 +93,8 @@ fn rand_meme(ctx: &Context, message: &Message, audio_playback: AudioPlayback) ->
match mem {
Ok(mem) => {
InvocationRecord::create(&conn, message.author.id.0, message.id.0, mem.id, true)?;
- send_meme(ctx, &mem, &conn, message).map_err(Error::from)
+ send_meme(ctx, &mem, &conn, message)?;
+ Ok(())
},
Err(e) => {
match e.downcast_ref::<DieselError>() {
@@ -112,7 +113,7 @@ fn rand_meme(ctx: &Context, message: &Message, audio_playback: AudioPlayback) ->
#[command]
#[aliases("rarememe", "raremem")]
-pub fn rare_meme(ctx: &mut Context, msg: &Message, _args: Args) -> Result<()> {
+pub fn rare_meme(ctx: &mut Context, msg: &Message, _args: Args) -> CommandResult {
let should_audio = ctx.users_listening()?;
let conn = connection()?;
diff --git a/src/commands/meme/mod.rs b/src/commands/meme/mod.rs
index e5244aa..1761ab1 100644
--- a/src/commands/meme/mod.rs
+++ b/src/commands/meme/mod.rs
@@ -1,7 +1,9 @@
use diesel::PgConnection;
+use log::debug;
use rand::{Rng, thread_rng};
use serenity::{
builder::CreateMessage,
+ framework::standard::macros::group,
http::AttachmentType,
model::channel::Message,
prelude::*,
@@ -28,6 +30,27 @@ mod create;
mod invoke;
mod delete;
+group!({
+ name: "memes",
+ options: {
+ only_in: "guild",
+ },
+ commands: [
+ meme,
+ audio_meme,
+ silent_Meme,
+ addmeme,
+ addaudiomeme,
+ delmeme,
+ wat,
+ stats,
+ history,
+ rare_meme,
+ memers,
+ query,
+ ],
+});
+
fn send_meme(ctx: &Context, t: &Meme, conn: &PgConnection, msg: &Message) -> Result<()> {
let should_tts = t.content.as_ref().map(|t| t.len() > 0).unwrap_or(false) &&
thread_rng().gen::<u32>() % 25 == 0;
diff --git a/src/commands/mod.rs b/src/commands/mod.rs
index 619335c..5c23418 100644
--- a/src/commands/mod.rs
+++ b/src/commands/mod.rs
@@ -1,5 +1,9 @@
+use log::info;
use serenity::{
- framework::StandardFramework,
+ framework::{
+ StandardFramework,
+ standard::macros::group,
+ },
};
use crate::{
@@ -19,42 +23,27 @@ pub(crate) mod playback;
pub(crate) mod sound_levels;
pub(crate) mod roll;
-group!("playback", {
- options: {
- only_in: "guild",
- },
- commands: [
- skip,
- pause,
- resume,
- list,
- die,
- mute,
- unmute,
- play,
- volume,
- ],
-});
-group!("general", {
+group!({
+ name: "general",
options: {
only_in: "guild",
},
commands: [
- roll,
+ roll::roll,
],
});
pub fn register_commands(f: StandardFramework) -> StandardFramework {
let result = f
- .group(&PLAYBACK_GROUP)
+ .group(&self::playback::PLAYBACK_GROUP)
.group(&GENERAL_GROUP);
#[cfg(feature = "diesel")]
- let result = result.group(&MEMES_GROUP);
+ let result = result.group(&self::meme::MEMES_GROUP);
#[cfg(feature = "games")]
- let result = result.group(&GAME_GROUP);
+ let result = result.group(&crate::game::GAME_GROUP);
result.unrecognised_command(|ctx, msg, unrec| {
let url = match msg.content.split_whitespace().skip(1).next() {
@@ -70,38 +59,6 @@ pub fn register_commands(f: StandardFramework) -> StandardFramework {
})
}
-#[cfg(feature = "games")]
-group!("game", {
- options: {
- only_in: "guild",
- },
- commands: [
- installedgame,
- ownedgame,
- updategaem,
- ],
-});
#[cfg(feature = "diesel")]
mod meme;
-
-#[cfg(feature = "diesel")]
-group!("memes", {
- options: {
- only_in: "guild",
- },
- commands: [
- meme,
- audio_meme,
- silent_Meme,
- addmeme,
- addaudiomeme,
- delmeme,
- wat,
- stats,
- history,
- rare_meme,
- memers,
- query,
- ],
-});
diff --git a/src/commands/playback.rs b/src/commands/playback.rs
index 49ff44c..a54e937 100644
--- a/src/commands/playback.rs
+++ b/src/commands/playback.rs
@@ -1,6 +1,16 @@
use either::{Left, Right};
+use log::{
+ debug,
+ error,
+ info,
+ warn,
+};
use serenity::{
- framework::standard::Args,
+ framework::standard::{
+ Args,
+ CommandResult,
+ macros::{command, group},
+ },
model::channel::Message,
prelude::*,
};
@@ -17,7 +27,25 @@ use crate::{
util::CtxExt,
};
-pub fn _play(ctx: &Context, msg: &Message, url: &str) -> Result<()> {
+group!({
+ name: "playback",
+ options: {
+ only_in: "guild",
+ },
+ commands: [
+ skip,
+ pause,
+ resume,
+ list,
+ die,
+ mute,
+ unmute,
+ play,
+ volume,
+ ],
+});
+
+pub fn _play(ctx: &Context, msg: &Message, url: &str) -> CommandResult {
use url::{Url, Host};
debug!("playing '{}'", url);
@@ -69,7 +97,7 @@ pub fn _play(ctx: &Context, msg: &Message, url: &str) -> Result<()> {
}
#[command]
-pub fn play(ctx: &mut Context, msg: &Message, mut args: Args) -> Result<()> {
+pub fn play(ctx: &mut Context, msg: &Message, mut args: Args) -> CommandResult {
if args.len() == 0 {
return _resume(ctx, msg);
}
@@ -86,7 +114,7 @@ pub fn play(ctx: &mut Context, msg: &Message, mut args: Args) -> Result<()> {
}
#[command]
-pub fn pause(ctx: &mut Context, msg: &Message, _: Args) -> Result<()> {
+pub fn pause(ctx: &mut Context, msg: &Message, _: Args) -> CommandResult {
let queue_lock = ctx.data.write().get::<PlayQueue>().cloned().unwrap();
let done = || ctx.send(msg.channel_id, "r u srs", msg.tts);
@@ -119,11 +147,11 @@ pub fn pause(ctx: &mut Context, msg: &Message, _: Args) -> Result<()> {
#[command]
#[aliases("continue")]
-pub fn resume(ctx: &mut Context, msg: &Message, _: Args) -> Result<()> {
+pub fn resume(ctx: &mut Context, msg: &Message, _: Args) -> CommandResult {
_resume(ctx, msg)
}
-fn _resume(ctx: &mut Context, msg: &Message) -> Result<()> {
+fn _resume(ctx: &mut Context, msg: &Message) -> CommandResult {
let queue_lock = ctx.data.write().get::<PlayQueue>().cloned().unwrap();
let done = || ctx.send(msg.channel_id, "r u srs", msg.tts);
@@ -160,7 +188,7 @@ fn _resume(ctx: &mut Context, msg: &Message) -> Result<()> {
#[command]
#[aliases("next")]
-pub fn skip(ctx: &mut Context, _msg: &Message, _args: Args) -> Result<()> {
+pub fn skip(ctx: &mut Context, _msg: &Message, _args: Args) -> CommandResult {
let data = ctx.data.write();
let mgr_lock = data.get::<VoiceManager>().cloned().unwrap();
@@ -182,7 +210,7 @@ pub fn skip(ctx: &mut Context, _msg: &Message, _args: Args) -> Result<()> {
#[command]
#[aliases("sudoku", "fuckoff", "stop")]
-pub fn die(ctx: &mut Context, msg: &Message, _: Args) -> Result<()> {
+pub fn die(ctx: &mut Context, msg: &Message, _: Args) -> CommandResult {
let data = ctx.data.write();
let mgr_lock = data.get::<VoiceManager>().cloned().unwrap();
@@ -212,7 +240,7 @@ pub fn die(ctx: &mut Context, msg: &Message, _: Args) -> Result<()> {
#[command]
#[aliases("queue")]
-pub fn list(ctx: &mut Context, msg: &Message, _: Args) -> Result<()> {
+pub fn list(ctx: &mut Context, msg: &Message, _: Args) -> CommandResult {
let queue_lock = ctx.data.write().get::<PlayQueue>().cloned().unwrap();
let play_queue = queue_lock.read().unwrap();
diff --git a/src/commands/roll.rs b/src/commands/roll.rs
index 3df91d0..1544654 100644
--- a/src/commands/roll.rs
+++ b/src/commands/roll.rs
@@ -1,12 +1,23 @@
use std::result::Result as StdResult;
+use log::{
+ debug,
+ error,
+};
use rand::prelude::*;
use serenity::{
- framework::standard::Args,
+ framework::standard::{
+ Args,
+ CommandResult,
+ macros::command,
+ },
model::channel::Message,
prelude::*,
};
use statrs;
+use thiserror::Error;
+
+use lazy_static::lazy_static;
use crate::{
Result,
@@ -198,7 +209,7 @@ mod test {
#[command]
#[aliases("calc", "calculate")]
-pub fn roll(ctx: &mut Context, msg: &Message, args: Args) -> Result<()> {
+pub fn roll(ctx: &mut Context, msg: &Message, args: Args) -> CommandResult {
match Calc::eval(args.rest()) {
Ok(result) => {
debug!("got calc result '{}'", result);
diff --git a/src/commands/sound_levels.rs b/src/commands/sound_levels.rs
index 81508a6..8add787 100644
--- a/src/commands/sound_levels.rs
+++ b/src/commands/sound_levels.rs
@@ -1,5 +1,15 @@
+use log::{
+ error,
+ info,
+ trace,
+ warn,
+};
use serenity::{
- framework::standard::Args,
+ framework::standard::{
+ Args,
+ CommandResult,
+ macros::command,
+ },
model::channel::Message,
prelude::*,
};
@@ -14,7 +24,7 @@ use crate::{
pub const DEFAULT_VOLUME: f32 = 0.10;
#[command]
-pub fn mute(ctx: &mut Context, _: &Message, _: Args) -> Result<()> {
+pub fn mute(ctx: &mut Context, _: &Message, _: Args) -> CommandResult {
let mgr_lock = ctx.data.write().get::<VoiceManager>().cloned().unwrap();
let mut manager = mgr_lock.lock();
@@ -32,7 +42,7 @@ pub fn mute(ctx: &mut Context, _: &Message, _: Args) -> Result<()> {
}
#[command]
-pub fn unmute(ctx: &mut Context, msg: &Message, _: Args) -> Result<()> {
+pub fn unmute(ctx: &mut Context, msg: &Message, _: Args) -> CommandResult {
let mgr_lock = ctx.data.write().get::<VoiceManager>().cloned().unwrap();
let mut manager = mgr_lock.lock();
@@ -51,7 +61,7 @@ pub fn unmute(ctx: &mut Context, msg: &Message, _: Args) -> Result<()> {
}
#[command]
-pub fn volume(ctx: &mut Context, msg: &Message, mut args: Args) -> Result<()> {
+pub fn volume(ctx: &mut Context, msg: &Message, mut args: Args) -> CommandResult {
if args.len() == 0 {
let vol = {
let queue_lock = ctx.data.write().get::<PlayQueue>().cloned().unwrap();
diff --git a/src/db/mod.rs b/src/db/mod.rs
index 2a6d1f4..db6cfb8 100644
--- a/src/db/mod.rs
+++ b/src/db/mod.rs
@@ -19,6 +19,9 @@ use r2d2_postgres::{
TlsMode,
};
+use anyhow::anyhow;
+use lazy_static::lazy_static;
+
use crate::{Error, Result};
pub use self::models::*;
diff --git a/src/db/models.rs b/src/db/models.rs
index a01a9c1..95acb16 100644
--- a/src/db/models.rs
+++ b/src/db/models.rs
@@ -1,5 +1,10 @@
use chrono::naive::NaiveDateTime;
-use diesel::prelude::*;
+use diesel::{
+ Identifiable,
+ Insertable,
+ prelude::*,
+ Queryable,
+};
use crate::{
db::schema::*,
@@ -57,7 +62,7 @@ impl NewMeme {
#[derive(Queryable, Identifiable, PartialEq, Debug)]
-#[table_name="audio"]
+#[table_name = "audio"]
pub struct Audio {
pub id: i32,
pub data: Vec<u8>,
@@ -97,7 +102,7 @@ impl Audio {
}
#[derive(Insertable, PartialEq, Debug)]
-#[table_name="audio"]
+#[table_name = "audio"]
pub struct NewAudio {
pub data: Vec<u8>,
pub metadata_id: i32,
diff --git a/src/game.rs b/src/game.rs
index 5ca5c72..224ca46 100644
--- a/src/game.rs
+++ b/src/game.rs
@@ -8,16 +8,26 @@ use std::{
},
};
-use anyhow::Error;
use fnv::{
FnvHashMap,
FnvHashSet,
};
use itertools::Itertools;
+use log::{
+ debug,
+ error,
+ info,
+};
+use serde::{
+ Deserialize,
+ Serialize,
+};
use serenity::{
framework::standard::{
ArgError,
Args,
+ CommandResult,
+ macros::{command, group},
},
model::{
channel::Message,
@@ -28,6 +38,12 @@ use serenity::{
};
use url::Url;
+use anyhow::{
+ anyhow,
+ Error,
+};
+use lazy_static::lazy_static;
+
use crate::{
must_env_lookup,
Result,
@@ -35,6 +51,20 @@ use crate::{
VOICE_CHANNEL_ID,
};
+pub use self::GAME_GROUP as GROUP;
+
+group!({
+ name: "game",
+ options: {
+ only_in: "guild",
+ },
+ commands: [
+ installedgame,
+ ownedgame,
+ updategaem,
+ ],
+});
+
lazy_static! {
static ref SHEETS_API_KEY: String = must_env_lookup("SHEETS_API_KEY");
static ref STEAM_API_KEY: String = must_env_lookup("STEAM_API_KEY");
@@ -123,17 +153,17 @@ impl FromStr for GameStatus {
#[command]
#[aliases("installedgaem")]
-pub fn installedgame(ctx: &mut Context, msg: &Message, args: Args) -> Result<()> {
- game(ctx, msg, args, GameStatus::Installed)
+pub fn installedgame(ctx: &mut Context, msg: &Message, args: Args) -> CommandResult {
+ _game(ctx, msg, args, GameStatus::Installed)
}
#[command]
#[aliases("ownedgaem")]
-pub fn ownedgame(ctx: &mut Context, msg: &Message, args: Args) -> Result<()> {
- game(ctx, msg, args, GameStatus::NotInstalled)
+pub fn ownedgame(ctx: &mut Context, msg: &Message, args: Args) -> CommandResult {
+ _game(ctx, msg, args, GameStatus::NotInstalled)
}
-#[derive(Copy, Clone, Debug, Error, PartialEq, Eq, Hash)]
+#[derive(Copy, Clone, Debug, thiserror::Error, PartialEq, Eq, Hash)]
pub enum UserLookupError {
#[error("too many possible options ({}) for query", _0)]
Ambiguous(usize),
@@ -186,7 +216,11 @@ pub fn get_user_id<S: AsRef<str>>(g: &Guild, s: S) -> StdResult<UserId, UserLook
#[command]
#[aliases("gaem")]
-pub fn game(ctx: &mut Context, msg: &Message, mut args: Args, min_status: GameStatus) -> Result<()> {
+fn game(ctx: &mut Context, msg: &Message, args: Args) -> CommandResult {
+ _game(ctx, msg, args, GameStatus::Installed)
+}
+
+fn _game(ctx: &mut Context, msg: &Message, mut args: Args, min_status: GameStatus) -> CommandResult {
let guild = msg.channel_id.to_channel(ctx)?
.guild()
.ok_or(anyhow!("couldn't find guild"))?;
@@ -337,7 +371,9 @@ pub fn game(ctx: &mut Context, msg: &Message, mut args: Args, min_status: GameSt
games_formatted = "**LITERALLY NOTHING**".to_owned();
}
- ctx.send(msg.channel_id, &games_formatted, msg.tts)
+ ctx.send(msg.channel_id, &games_formatted, msg.tts)?;
+
+ Ok(())
}
fn load_spreadsheet() -> Result<Vec<Vec<String>>> {
@@ -372,7 +408,7 @@ fn load_spreadsheet() -> Result<Vec<Vec<String>>> {
#[command]
#[aliases("updategame")]
-pub fn updategaem(ctx: &mut Context, msg: &Message, mut args: Args) -> Result<()> {
+pub fn updategaem(ctx: &mut Context, msg: &Message, mut args: Args) -> CommandResult {
use regex::Regex;
let arg_user = args.single_quoted::<String>();
diff --git a/src/main.rs b/src/main.rs
index 6af4660..720e830 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -6,35 +6,10 @@
#![feature(box_syntax, box_patterns)]
-#[macro_use] extern crate anyhow;
-extern crate chrono;
-#[cfg(feature = "db")]
+// trash dependencies that can't be fucked to upgrade to ed. 2018
#[macro_use] extern crate diesel;
-extern crate dotenv;
#[macro_use] extern crate dotenv_codegen;
-extern crate either;
-extern crate fern;
-extern crate fnv;
-#[cfg_attr(test, macro_use)] extern crate itertools;
-#[macro_use] extern crate lazy_static;
-#[macro_use] extern crate log;
-extern crate pest;
#[macro_use] extern crate pest_derive;
-#[cfg(feature = "db")] extern crate postgres;
-#[cfg(feature = "db")] extern crate r2d2_postgres;
-extern crate rand;
-extern crate regex;
-extern crate reqwest;
-#[macro_use] extern crate serde;
-extern crate serde_json;
-#[macro_use] extern crate serenity;
-extern crate sha1;
-extern crate statrs;
-#[macro_use] extern crate thiserror;
-extern crate time;
-extern crate timeago;
-extern crate typemap;
-extern crate url;
use std::{
default::Default,
@@ -47,8 +22,13 @@ use std::{
};
use chrono::Datelike;
-use dotenv::dotenv;
use fnv::{FnvHashMap, FnvHashSet};
+use log::{
+ debug,
+ error,
+ info,
+ trace,
+};
use serenity::{
framework::StandardFramework,
model::{
@@ -58,6 +38,10 @@ use serenity::{
prelude::*,
};
+use anyhow::anyhow;
+use dotenv::{dotenv, var as dvar};
+use lazy_static::lazy_static;
+
use self::commands::register_commands;
pub use self::util::*;
@@ -130,7 +114,7 @@ lazy_static! {
fn run() -> Result<()> {
- let token = &dotenv::var("THULANI_TOKEN").map_err(|_| format_err!("missing token"))?;
+ let token = &dvar("THULANI_TOKEN").map_err(|_| anyhow!("missing token"))?;
let mut client = Client::new(token, Handler)?;
audio::VoiceManager::register(&mut client);
diff --git a/src/util.rs b/src/util.rs
index 1e478d3..eb38d9c 100644
--- a/src/util.rs
+++ b/src/util.rs
@@ -3,6 +3,7 @@ use std::{
str::FromStr,
};
+use dotenv;
use serenity::{
client::Context,
model::{
@@ -15,6 +16,8 @@ use serenity::{
};
use url::Url;
+use lazy_static::lazy_static;
+
use crate::{
audio::PlayQueue,
Result,