aboutsummaryrefslogtreecommitdiff
path: root/src/wisp.rs
blob: e1f23105733aea4bb7bbb7ae7080fd72c340fdb8 (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
use crate::core::{
    api,
    handler::Handler,
    model::*,
    framework::WispFramework,
    timers
};
use serenity::Error as SerenityError;
use serenity::http;
use serenity::model::id::UserId;
use serenity::prelude::{Client, Mutex};
// use serenity::voice;
use std::collections::HashSet;
use std::env;
use std::sync::Arc;

pub struct WispClient(Client);
impl WispClient {
    pub fn new() -> Self {
        let token = env::var("DISCORD_TOKEN").expect("Expected Discord bot token in environment.");
        let mut client = Client::new(&token, Handler).expect("Unable to initialize Wisp client.");
        {
            let mut data = client.data.lock();
            let api_client = api::ApiClient::new();
            let tc = timers::TimerClient::new();
            data.insert::<SerenityShardManager>(Arc::clone(&client.shard_manager));
            data.insert::<ApiClient>(Arc::new(api_client));
            data.insert::<TC>(Arc::new(Mutex::new(tc)));
            // data.insert::<VoiceManager>(Arc::clone(&client.voice_manager));
        }
        let owners = match http::get_current_application_info() {
            Ok(info) => {
                let mut set = HashSet::new();
                let mut data = client.data.lock();
                data.insert::<Owner>(info.owner.id);
                set.insert(info.owner.id);
                set
            },
            Err(why) => panic!("Couldn't get the application info: {:?}", why),
        };
        client.with_framework(WispFramework::new(owners));
        WispClient(client)
    }

    pub fn new_with_owners(owners: HashSet<UserId>) -> Self {
        let token = env::var("DISCORD_TOKEN").expect("Expected Discord bot token in environment.");
        let mut client = Client::new(&token, Handler).expect("Unable to initialize Wisp client.");
        {
            let mut data = client.data.lock();
            let api_client = api::ApiClient::new();
            let tc = timers::TimerClient::new();
            data.insert::<SerenityShardManager>(Arc::clone(&client.shard_manager));
            data.insert::<ApiClient>(Arc::new(api_client));
            data.insert::<TC>(Arc::new(Mutex::new(tc)));
            // data.insert::<VoiceManager>(Arc::clone(&client.voice_manager));
        }
        client.with_framework(WispFramework::new(owners));
        WispClient(client)
    }

    pub fn start(&mut self) -> Result<(), SerenityError> { self.start_autosharded() }
    pub fn start_autosharded(&mut self) -> Result<(), SerenityError> { self.0.start_autosharded() }
}