aboutsummaryrefslogtreecommitdiff
path: root/src/commands/today/mod.rs
blob: 84f3f1b05c8e7ce3bbcf8f70f1f4d22d450ee3ca (plain) (blame)
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
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 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,

        wednesday::wednesday,

        tomorrow::tomorrow,
    ];
}


#[command]
pub fn today(ctx: &mut Context, msg: &Message, args: Args) -> Result<()> {
    let today = {
        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!("selected {} 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 {
        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(())
}