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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
use serenity::{
prelude::*,
model::{
channel::Message,
},
framework::standard::{
Args,
macros::command,
},
};
use chrono::{Duration};
use either::Left;
use lazy_static::lazy_static;
use rand::{
thread_rng,
seq::SliceRandom,
};
use log::debug;
use crate::{
Result,
CtxExt,
audio::{
PlayArgs,
PlayQueue,
},
};
mod prelude;
mod sept_21;
mod nov_5;
mod halloween;
mod ussr;
mod france;
mod shrek;
mod wednesday;
mod tomorrow;
pub type TodayIter = Box<dyn Iterator<Item=TodayArgs>>;
#[derive(Clone, Debug, Hash, Default)]
pub struct TodayArgs {
pub url: &'static str,
pub start: Option<Duration>,
pub end: Option<Duration>,
}
impl TodayArgs {
#[inline]
pub fn as_play_args(&self, msg: &Message) -> PlayArgs {
PlayArgs {
initiator: "you have done this to yourself :^)".to_string(),
data: Left(self.url.to_owned()),
sender_channel: msg.channel_id,
start: self.start,
end: self.end,
}
}
}
lazy_static! {
static ref ALL: Vec<fn(chrono::NaiveDate) -> TodayIter> = vec! [
sept_21::sept_21,
nov_5::nov_5,
halloween::halloween,
ussr::ussr,
france::france,
shrek::shrek,
wednesday::wednesday,
tomorrow::tomorrow,
];
}
#[command]
pub fn today(ctx: &mut Context, msg: &Message, _args: Args) -> Result<()> {
let today = {
#[allow(unused_mut)]
let mut result = chrono::Local::today().naive_local();
#[cfg(debug_assertions)] {
match _args.parse::<chrono::NaiveDate>() {
Ok(date) => {
log::debug!("overriding with date: {}", date);
result = date;
},
Err(e) => {
log::debug!("parsing date: {:?}", e);
}
};
}
result
};
let options: Vec<TodayArgs> = ALL.iter()
.flat_map(|f| f(today))
.collect();
debug!("{} options for {}", options.len(), today);
let play_args = options.choose(&mut thread_rng())
.map(|x| x.as_play_args(msg));
if let Some(play_args) = play_args {
play_args.data.as_ref().left().iter().for_each(|url| {
debug!("today selected: {}", url);
});
let queue_lock = ctx.data.write().get::<PlayQueue>().cloned().unwrap();
let mut play_queue = queue_lock.write().unwrap();
play_queue.general_queue.push_front(play_args);
} else {
ctx.send(msg.channel_id, "no", false)?;
ctx.send(msg.channel_id, ":angry:", false)?;
}
Ok(())
}
|