//! Simple Module with a Command
//! 
//! Adding objects through packages provides controls , 
//! such as moderators, and brodcasters can disable or enable mods
//! 
//! Here, moderators or above can enable or disable the `test` 
//! module with the command `<prefix> disable test`
//! 
//! Be sure the followig is defined in `.env` 
//! - login_name
//! - access_token
//! - bot_channels
//! - prefix
//! - bot_admins
//! 
//! Bot access tokens be generated here - 
//! - Get a Bot Chat Token here - <https://twitchtokengenerator.com>
//! - More Info - <https://dev.twitch.tv/docs/authentication>

use forcebot_rs_v2::Bot;

#[tokio::main]
pub async fn main() {

    /* Create the bot using env */
    let mut bot = Bot::new();

    /* load the Module */
    bot.load_module(custom_mod::new());

    /* Run the bot */
    bot.run().await;

}


pub mod custom_mod {
    use std::sync::Arc;

    use forcebot_rs_v2::{asyncfn_box, Badge, Bot, Command, Module};
    use twitch_irc::message::ServerMessage;


    /// Module definition with a loaded command
    pub fn new() -> Module {
        /* 1. Create a new module */
        let mut custom_mod = Module::new(
            vec!["test".to_string()], 
            "".to_string());

        /* 2. Load the cmd into a new module */
        custom_mod.load_command(cmd_test());

        custom_mod

    }

    /// Command definition 
    pub fn cmd_test() -> Command {
        /* 1. Create a new cmd */
        let mut cmd = Command::new(vec!["test".to_string()],"".to_string());

        /* 2. Define exec callback  */
        async fn execbody(bot:Arc<Bot>,message:ServerMessage) -> Result<String,String> {
            if let ServerMessage::Privmsg(msg) = message {
                let _= bot.client.say_in_reply_to(
                    &msg, "test return".to_string()).await;
            }
            Result::Err("Not Valid message type".to_string()) 
        }

        /* 3. Set Command flags */
        cmd.set_exec_fn(asyncfn_box(execbody));
        cmd.set_admin_only(false);
        cmd.set_min_badge(Badge::Moderator);

        cmd
    }
}