diff --git a/.woodpecker/cargo-checks.yml b/.woodpecker/cargo-checks.yml
index 1d698f2..fa5ecae 100644
--- a/.woodpecker/cargo-checks.yml
+++ b/.woodpecker/cargo-checks.yml
@@ -1,5 +1,5 @@
 when:
-  branch: main
+  branch: master
   event: [push, pull_request]
   path:
     include:
diff --git a/.woodpecker/flake-update.yml b/.woodpecker/flake-update.yml
index 56c672a..37d88de 100644
--- a/.woodpecker/flake-update.yml
+++ b/.woodpecker/flake-update.yml
@@ -37,7 +37,7 @@ steps:
       owner: ${CI_REPO_OWNER}
       repo: ${CI_REPO_NAME}
       branch: flake-lock-update
-      base_branch: main
+      base_branch: master
       pr_title: "flake.lock: update"
       pr_body: PR automatically created by Woodpecker CI
       close_pr_if_empty: true
diff --git a/README.md b/README.md
index 3b200de..dafeb69 100644
--- a/README.md
+++ b/README.md
@@ -9,9 +9,10 @@ test ModulatingForceBot
 
 ```
 login_name = <botname>
-access_token = <oath token>
+access_token = <oauth token>
 bot_channels = <chnl1>,<chnl2>
 prefix = <prefix>
+bot_admins = <admins>
 ```
 
 
diff --git a/flake.lock b/flake.lock
index cf7dd31..7da4bc6 100644
--- a/flake.lock
+++ b/flake.lock
@@ -109,11 +109,11 @@
     },
     "nixpkgs_2": {
       "locked": {
-        "lastModified": 1712543224,
-        "narHash": "sha256-9RSfZL1TKYdGxZwgDxwtBtsKMGR4Zgn+DAnF9s71/lU=",
+        "lastModified": 1712573573,
+        "narHash": "sha256-xxon7WwNm4/EadMKg1eF40/5s0O78nXUy2ILZt6vT7E=",
         "owner": "NixOS",
         "repo": "nixpkgs",
-        "rev": "b0dab7cc34ef4d8a1b2de36178da801090bcb271",
+        "rev": "0d28066770464d19d637f6e8e42e8688420b6ac6",
         "type": "github"
       },
       "original": {
diff --git a/src/core/identity.rs b/src/core/identity.rs
index 726bbdf..61c09dc 100644
--- a/src/core/identity.rs
+++ b/src/core/identity.rs
@@ -8,6 +8,7 @@ use std::sync::Arc;
 
 use tokio::sync::RwLock;
 
+use tokio::time::{sleep,Duration};
 use twitch_irc::message::PrivmsgMessage;
 
 use casual_logger::Log;
@@ -17,12 +18,20 @@ use crate::core::bot_actions::ExecBodyParams;
 use crate::core::botinstance::{Channel,ChangeResult};
 use crate::core::botlog;
 use crate::core::botmodules::{BotActionTrait, BotCommand, BotModule, ModulesManager};
-
 use dotenv::dotenv;
 use std::env;
 
 fn adminvector() -> Vec<String> {
-    vec![String::from("ModulatingForce")]
+    dotenv().ok();
+    let mut admins = Vec::new();
+
+    if let Ok(value) = env::var("bot_admins") {
+        for admin in value.split(',') {
+            admins.push(String::from(admin))        
+        }
+    }
+
+    admins
 }
 
 
@@ -59,7 +68,10 @@ pub async fn init(mgr: Arc<ModulesManager>) {
     let tempb = BotCommand {
         module: BotModule(String::from("identity")),
         command: String::from("promote"), // command call name
-        alias: vec![],                    // String of alternative names
+        alias: vec![
+            "cucked".to_string(),
+            "cuck".to_string(),
+        ],                    // String of alternative names
         exec_body: actions_util::asyncbox(cmd_promote),
         help: String::from("promote"),
         required_roles: vec![
@@ -164,7 +176,7 @@ async fn cmd_promote(params : ExecBodyParams) {
 
     let mut argv = params.msg.message_text.split(' ');
 
-    argv.next(); // Skip the command name
+    let cmdname = argv.next(); // Skip the command name
 
     let arg1 = argv.next();
 
@@ -202,7 +214,7 @@ async fn cmd_promote(params : ExecBodyParams) {
     // [x] 1. Get trgusr (regardless of -admin flag)
 
     // let targetusr = if arg1 == Some("-admin") { arg2 } else { arg1 };
-    let targetusr = if 
+    let mut targetusr = if 
             arg1 == Some("-admin") 
             || arg1 == Some("-v") 
             || arg1 == Some("-vip") 
@@ -222,6 +234,50 @@ async fn cmd_promote(params : ExecBodyParams) {
             }
             else { arg1 };
 
+
+    // [x] Check if target is an existing user
+    targetusr = if let Some(chkusr) = targetusr {
+        match twitch_irc::validate::validate_login(chkusr.to_lowercase().as_str()) {
+            Ok(_) => Some(chkusr),
+            Err(_) => None,
+        }
+    } else { None } ;
+
+
+    // [x] Check if cmd passed is cucked, then go through special cucked handling
+    if let Some(cmd_to_check) = cmdname {
+        if cmd_to_check.to_lowercase() == String::from(botlock.get_prefix()) + "cucked" 
+        || cmd_to_check.to_lowercase() == String::from(botlock.get_prefix()) + "cuck"
+        {
+
+            let idlock = botlock.botmgrs.identity.read().await;
+            let senderroles = idlock.getspecialuserroles(sendername.clone(), Some(Channel(targetchnl.to_lowercase()))).await;
+
+            if senderroles.contains(&UserRole::BotAdmin) && targetusr.is_none() {
+                targetusr = Some(sendername.as_str())
+            }
+
+            botlock.botmgrs.chat.send_botmsg(super::chat::BotMsgType::Notif(
+                "uuh ".to_string()
+                ),
+            params.clone(),
+            ).await;
+
+            sleep(Duration::from_secs_f64(2.0)).await;
+
+            
+            botlock.botmgrs.chat.send_botmsg(super::chat::BotMsgType::Notif(
+                "... chatter getting cucked ...".to_string()
+                ),
+            params.clone(),
+            ).await;
+
+            sleep(Duration::from_secs_f64(1.0)).await;
+
+        }
+    }
+
+
     // [x] 2. promote trguser
 
     // [x] Get a required lock first
@@ -272,14 +328,23 @@ async fn cmd_promote(params : ExecBodyParams) {
     // [x] 3. Output resulting change
 
     let outmsg = match rslt {
-        ChangeResult::Success(a) => {
-            format!("o7 Successfully promoted : {a}")
+        ChangeResult::Success(rsltstr) => {
+            format!("o7 Successfully promoted {} : {}",
+            targetusr.unwrap(),
+            rsltstr
+            )
         }
-        ChangeResult::Failed(a) => {
-            format!("PoroSad failed to promote : {a}")
+        ChangeResult::Failed(rsltstr) => {
+            format!("PoroSad failed to promote {} : {}",
+            targetusr.unwrap(),
+            rsltstr
+            )
         }
-        ChangeResult::NoChange(a) => {
-            format!("uuh No Promotion Change : {a}")
+        ChangeResult::NoChange(rsltstr) => {
+            format!("uuh No Promotion Change {} : {}",
+            targetusr.unwrap(),
+            rsltstr
+            )
         }
     };
 
@@ -499,14 +564,23 @@ async fn cmd_demote(params : ExecBodyParams) {
      */
 
     let outmsg = match rslt {
-        ChangeResult::Success(a) => {
-            format!("o7 Successfully demoted : {a}")
+        ChangeResult::Success(rsltstr) => {
+            format!("o7 Successfully demoted {} : {}",
+            targetusr.unwrap(),
+            rsltstr
+            )
         }
-        ChangeResult::Failed(a) => {
-            format!("PoroSad failed to demote : {a}")
+        ChangeResult::Failed(rsltstr) => {
+            format!("PoroSad failed to demote {} : {}",
+            targetusr.unwrap(),
+            rsltstr
+            )
         }
-        ChangeResult::NoChange(a) => {
-            format!("uuh No Demotion Change : {a}")
+        ChangeResult::NoChange(rsltstr) => {
+            format!("uuh No Demotion Change {} : {}",
+            targetusr.unwrap(),
+            rsltstr
+            )
         }
     };
 
@@ -542,6 +616,8 @@ async fn getroles(params : ExecBodyParams) {
 
      */
 
+    let sendername = params.msg.clone().sender.name;
+
 
     let mut argv = params.msg.message_text.split(' ');
 
@@ -549,11 +625,17 @@ async fn getroles(params : ExecBodyParams) {
 
     let arg1 = argv.next();
 
-    let targetuser = match arg1 {
-        None => return, // exit if no arguments
+    let mut targetuser = match arg1 {
+        // None => return, // exit if no arguments
+        None => sendername.as_str(), // self-invoke in this case
         Some(arg) => arg,
     };
 
+    targetuser = match twitch_irc::validate::validate_login(targetuser.to_lowercase().as_str()) {
+        Ok(_) => targetuser,
+        Err(_) => sendername.as_str(), // self-invoke in this case
+    };
+
     let arg2 = argv.next();
 
     let targetchnl = arg2;
@@ -637,7 +719,9 @@ async fn getroles(params : ExecBodyParams) {
             params.msg.channel_login.to_lowercase(),
         ))) || sproles.contains(&UserRole::BotAdmin)
         {
-            outmsg += format!("Target chatter's user roles are : {:?}", sproles).as_str();
+            // targetuser
+            // outmsg += format!("Target chatter's user roles are : {:?}", sproles).as_str();
+            outmsg += format!("{}'s user roles are : {:?}", targetuser, sproles).as_str();
         }
         outmsg
     } else if sproles.contains(&UserRole::Mod(Channel(
@@ -646,9 +730,10 @@ async fn getroles(params : ExecBodyParams) {
         params.msg.channel_login.to_lowercase(),
     ))) || sproles.contains(&UserRole::BotAdmin)
     {
-        format!("Target chatter's user roles are : {:?}", sproles)
+        // format!("Target chatter's user roles are : {:?}", sproles)
+        format!("{}'s user roles are : {:?}", targetuser, sproles)
     } else {
-        "Target chatter has no special roles LULE ".to_string()
+        format!("{} has no special roles LULE ",targetuser)
     };
 
     botlog::debug(
diff --git a/src/custom.rs b/src/custom.rs
index 6107797..56c6257 100644
--- a/src/custom.rs
+++ b/src/custom.rs
@@ -13,6 +13,7 @@ pub use crate::core::botmodules::ModulesManager;
 
 // mod experiments;
 mod experimental;
+mod thisguy;
 
 // [ ] init() function that accepts bot instance - this is passed to init() on submodules
 
@@ -21,5 +22,6 @@ pub async fn init(mgr: Arc<ModulesManager>) {
     // this is achieved by calling submodules that also have fn init() defined
 
     // experiments::init(mgr).await
-    experimental::init(mgr).await;
+    experimental::init(mgr.clone()).await;
+    thisguy::init(&mgr).await;
 }
diff --git a/src/custom/experimental/experiment001.rs b/src/custom/experimental/experiment001.rs
index 18d7aaa..18ef6f6 100644
--- a/src/custom/experimental/experiment001.rs
+++ b/src/custom/experimental/experiment001.rs
@@ -163,6 +163,7 @@ async fn good_girl(params : ExecBodyParams) {
 
     if params.msg.sender.name.to_lowercase() == "ModulatingForce".to_lowercase()
         || params.msg.sender.name.to_lowercase() == "mzNToRi".to_lowercase()
+        || params.msg.sender.name.to_lowercase() == "haruyuumei".to_lowercase()
     {
         botlog::debug(
             "Good Girl Detected > Pausechamp",
@@ -180,8 +181,6 @@ async fn good_girl(params : ExecBodyParams) {
             );
 
             let bot = Arc::clone(&params.bot);
-
-
             let botlock = bot.read().await;
 
             // uses chat.say_in_reply_to() for the bot controls for messages
@@ -194,8 +193,6 @@ async fn good_girl(params : ExecBodyParams) {
                 String::from("GoodGirl xdd "),
                 params.clone()
             ).await;
-
-
         }
     }
 }
diff --git a/src/custom/thisguy.rs b/src/custom/thisguy.rs
new file mode 100644
index 0000000..cc53129
--- /dev/null
+++ b/src/custom/thisguy.rs
@@ -0,0 +1,62 @@
+use crate::core::bot_actions::*;
+use crate::core::botinstance::Channel;
+use crate::core::botlog;
+use crate::core::botmodules::{BotActionTrait, BotCommand, BotModule, ModulesManager};
+use crate::core::identity::UserRole::*;
+use rand::Rng;
+use twitch_irc::message::ReplyToMessage;
+use std::sync::Arc;
+use tokio::time::{sleep, Duration};
+const OF_CMD_CHANNEL:Channel = Channel(String::new());
+
+async fn tsg(params: ExecBodyParams) {
+
+    let phrases: [String; 6] = [
+        "Clueless ".to_string(),
+        "ICANT This guy....".to_string(),
+        "He is right tho".to_string(),
+        "KEKW true!".to_string(),
+        "OMEGALUL wth man...".to_string(),
+        "PepeLaugh El no sabe".to_string(),
+    ];
+
+    let r = rand::thread_rng().gen_range(0..=4);
+    let a = phrases[r].clone();
+
+    botlog::debug(
+        "This guy works!",
+        Some("modules > thisguy()".to_string()),
+        Some(&params.msg),
+    );
+    let bot = Arc::clone(&params.bot);
+    let botlock = bot.read().await;
+
+    // uses chat.say_in_reply_to() for the bot controls for messages
+    botlock
+        .botmgrs
+        .chat
+        .say_in_reply(
+            Channel(params.clone().msg.channel_login().to_string()),
+             a,
+              params.clone()
+            )
+        .await;
+    sleep(Duration::from_secs_f64(0.5)).await;
+}
+
+pub async fn init(mgr: &Arc<ModulesManager>) {
+    BotCommand {
+        module: BotModule(String::from("thisguy")),
+        command: String::from("thisguy"),
+        alias: vec![String::from("Thisguy")],
+        exec_body: actions_util::asyncbox(tsg),
+        help: String::from("test"),
+        required_roles: vec![
+            BotAdmin,
+            Mod(OF_CMD_CHANNEL),
+            Broadcaster
+            ],
+    }
+    .add_to_modmgr(Arc::clone(mgr))
+    .await;
+}
\ No newline at end of file
diff --git a/src/lib.rs b/src/lib.rs
index c5ba775..667ce02 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,2 +1,2 @@
 pub mod core;
-pub mod custom;
+pub mod custom;
\ No newline at end of file