1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
use diesel::result::Error as DieselError;
use failure::Error;
use serenity::{
framework::standard::Args,
model::channel::Message,
prelude::*,
};
use crate::{
audio::CtxExt,
commands::{
meme::send_meme,
send,
},
db::{
connection,
find_meme,
InvocationRecord,
rand_audio_meme as db_rand_audio_meme,
rand_meme as db_rand_meme,
rand_silent_meme as db_rand_silent_meme,
},
Result,
};
#[inline]
pub fn meme(ctx: &mut Context, msg: &Message, args: Args) -> Result<()> {
_meme(ctx, msg, args, AudioPlayback::Optional)
}
#[inline]
pub fn audio_meme(ctx: &mut Context, msg: &Message, args: Args) -> Result<()> {
_meme(ctx, msg, args, AudioPlayback::Required)
}
#[inline]
pub fn silent_meme(ctx: &mut Context, msg: &Message, args: Args) -> Result<()> {
_meme(ctx, msg, args, AudioPlayback::Prohibited)
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
enum AudioPlayback {
Required,
Optional,
Prohibited,
}
fn _meme(ctx: &mut Context, msg: &Message, args: Args, audio_playback: AudioPlayback) -> Result<()> {
if args.len() == 0 || audio_playback != AudioPlayback::Optional {
return rand_meme(ctx, msg, audio_playback);
}
let search = args.full();
let conn = connection()?;
let mem = match find_meme(&conn, search) {
Ok(x) => {
InvocationRecord::create(&conn, msg.author.id.0, msg.id.0, x.id, false)?;
x
},
Err(e) => {
return if let Some(NotFound) = e.downcast_ref::<DieselError>() {
info!("requested meme not found in database");
send(msg.channel_id, "c'mon baby, guesstimate", msg.tts)
} else {
send(msg.channel_id, "what in ryan's name", msg.tts)?;
Err(e)
};
},
};
send_meme(ctx, &mem, &conn, msg)
}
fn rand_meme(ctx: &Context, message: &Message, audio_playback: AudioPlayback) -> Result<()> {
let conn = connection()?;
let should_audio = ctx.users_listening()?;
let mem = match audio_playback {
AudioPlayback::Required => db_rand_audio_meme(&conn),
AudioPlayback::Optional => db_rand_meme(&conn, should_audio),
AudioPlayback::Prohibited => db_rand_silent_meme(&conn),
};
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)
},
Err(e) => {
match e.downcast_ref::<DieselError>() {
Some(NotFound) => {
info!("random meme not found");
return send(message.channel_id, "i don't know any :(", message.tts)
},
_ => {},
}
send(message.channel_id, "HELP", message.tts)?;
return Err(e);
},
}
}
|