aboutsummaryrefslogtreecommitdiff
path: root/src/wisp.rs
blob: d7f88c32490152c76ad2d256f80fcdc455353f9e (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
use crate::core::{
    api,
    handler::Handler,
    model::*,
    framework::WispFramework,
    timers
};
// use crate::webserver::rocket::*;
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;
// use std::thread;

pub struct WispClient(Client);
impl WispClient {
    // #[tokio::main]
    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),
        };

        // let bot = WispData {
        //     data: Arc::new(Mutex::new(TypeMap::new()))
        // };
        // let bot_clone = bot.clone();
        // unsafe {
        //     tokio::spawn(async move {
        //         let _ = start_rocket(bot_clone);
        //     });
        // }
        // thread::spawn(move || {
        //     let _ = start_rocket();
        // });

        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 enviroment.");
        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() }
}