bhcli

A TUI for chatting on LE PHP Chats
git clone https://git.dasho.dev/bhcli.git
Log | Files | Refs | README

mod.rs (5896B)


      1 //! ChatOps - Developer-focused slash commands for BHCLI
      2 //!
      3 //! This module provides a flexible and extensible slash command system
      4 //! to support advanced developer-focused features.
      5 
      6 pub mod command_router;
      7 pub mod commands;
      8 pub mod registry;
      9 pub mod result;
     10 
     11 pub use command_router::ChatOpsRouter;
     12 pub use registry::CommandRegistry;
     13 pub use result::{ChatOpError, ChatOpResult};
     14 
     15 use crate::ai_service::AIService;
     16 use std::sync::Arc;
     17 use tokio::runtime::Runtime;
     18 
     19 /// Context provided to commands during execution
     20 #[derive(Clone)]
     21 pub struct CommandContext {
     22    pub username: String,
     23    #[allow(dead_code)]
     24    pub room: Option<String>,
     25    pub role: UserRole,
     26 }
     27 
     28 /// User role for permission checking
     29 #[derive(Clone, Debug, PartialEq)]
     30 pub enum UserRole {
     31    Guest,
     32    Member,
     33    Staff,
     34    Admin,
     35 }
     36 
     37 /// Main ChatOps handler trait
     38 pub trait ChatCommand: Send + Sync {
     39    fn name(&self) -> &'static str;
     40    fn description(&self) -> &'static str;
     41    fn usage(&self) -> &'static str;
     42    fn execute(
     43        &self,
     44        args: Vec<String>,
     45        context: &CommandContext,
     46    ) -> Result<ChatOpResult, ChatOpError>;
     47    fn aliases(&self) -> Vec<&'static str> {
     48        vec![]
     49    }
     50    fn required_role(&self) -> UserRole {
     51        UserRole::Guest
     52    }
     53 }
     54 
     55 /// Initialize the ChatOps system with default commands
     56 pub fn init_chatops() -> CommandRegistry {
     57    let mut registry = CommandRegistry::new();
     58 
     59    // Account Management
     60    registry.register(Box::new(commands::account::AccountCommand));
     61    registry.register(Box::new(commands::account::StatusCommand));
     62    registry.register(Box::new(commands::account::TestDelegateCommand));
     63 
     64    // Documentation & Lookup
     65    registry.register(Box::new(commands::doc::ManCommand));
     66    registry.register(Box::new(commands::doc::DocCommand));
     67    registry.register(Box::new(commands::doc::ExplainCommand));
     68    registry.register(Box::new(commands::doc::CheatCommand));
     69    registry.register(Box::new(commands::doc::StackOverflowCommand));
     70    registry.register(Box::new(commands::doc::RefCommand));
     71 
     72    // Tooling & Utilities
     73    registry.register(Box::new(commands::tools::HashCommand));
     74    registry.register(Box::new(commands::tools::UuidCommand));
     75    registry.register(Box::new(commands::tools::Base64Command));
     76    registry.register(Box::new(commands::tools::RegexCommand));
     77    registry.register(Box::new(commands::tools::WhoisCommand));
     78    registry.register(Box::new(commands::tools::DigCommand));
     79    registry.register(Box::new(commands::tools::IpInfoCommand));
     80    registry.register(Box::new(commands::tools::RandCommand));
     81    registry.register(Box::new(commands::tools::TimeCommand));
     82 
     83    // Chat Linking & Session Intelligence
     84    registry.register(Box::new(commands::chat::ChatLinkCommand));
     85    registry.register(Box::new(commands::chat::QuoteCommand));
     86    registry.register(Box::new(commands::chat::RoomsCommand));
     87    registry.register(Box::new(commands::chat::WhereIsCommand));
     88 
     89    // Note: AI commands require dependencies and should be registered via init_chatops_with_ai()
     90 
     91    // GitHub and Git Integration
     92    registry.register(Box::new(commands::github::GitHubCommand));
     93    registry.register(Box::new(commands::github::GistCommand));
     94    registry.register(Box::new(commands::github::CratesCommand));
     95    registry.register(Box::new(commands::github::NpmCommand));
     96    registry.register(Box::new(commands::github::PipCommand));
     97 
     98    // Network & Protocol Diagnostics
     99    registry.register(Box::new(commands::network::PingCommand));
    100    registry.register(Box::new(commands::network::TraceCommand));
    101    registry.register(Box::new(commands::network::PortScanCommand));
    102    registry.register(Box::new(commands::network::HeadersCommand));
    103    registry.register(Box::new(commands::network::CurlCommand));
    104    registry.register(Box::new(commands::network::SslCommand));
    105    registry.register(Box::new(commands::network::TorCheckCommand));
    106 
    107    // Fun & Misc
    108    registry.register(Box::new(commands::misc::AsciiCommand));
    109    registry.register(Box::new(commands::misc::FortuneCommand));
    110    registry.register(Box::new(commands::misc::MotdCommand));
    111    registry.register(Box::new(commands::misc::AfkCommand));
    112    registry.register(Box::new(commands::misc::AliasCommand));
    113 
    114    // Note Management
    115    registry.register(Box::new(commands::notes::ViewNotesCommand));
    116    registry.register(Box::new(commands::notes::EditNotesCommand));
    117 
    118    registry
    119 }
    120 
    121 /// Initialize the ChatOps system with AI service integration
    122 pub fn init_chatops_with_ai(ai_service: Arc<AIService>, runtime: Arc<Runtime>) -> CommandRegistry {
    123    let mut registry = init_chatops(); // Start with base commands
    124 
    125    // Add AI-enhanced commands
    126    registry.register(Box::new(commands::ai::SummarizeCommand::new(
    127        Arc::clone(&ai_service),
    128        Arc::clone(&runtime),
    129    )));
    130    registry.register(Box::new(commands::ai::TranslateCommand::new(
    131        Arc::clone(&ai_service),
    132        Arc::clone(&runtime),
    133    )));
    134    registry.register(Box::new(commands::ai::DetectCommand::new(
    135        Arc::clone(&ai_service),
    136        Arc::clone(&runtime),
    137    )));
    138    registry.register(Box::new(commands::ai::SentimentCommand::new(
    139        Arc::clone(&ai_service),
    140        Arc::clone(&runtime),
    141    )));
    142    registry.register(Box::new(commands::ai::AtmosphereCommand::new(Arc::clone(
    143        &ai_service,
    144    ))));
    145    registry.register(Box::new(commands::ai::ModCheckCommand::new(
    146        Arc::clone(&ai_service),
    147        Arc::clone(&runtime),
    148    )));
    149    registry.register(Box::new(commands::ai::AIStatusCommand::new(Arc::clone(
    150        &ai_service,
    151    ))));
    152    registry.register(Box::new(commands::ai::FixCommand::new(
    153        Arc::clone(&ai_service),
    154        Arc::clone(&runtime),
    155    )));
    156    registry.register(Box::new(commands::ai::ReviewCommand::new(
    157        Arc::clone(&ai_service),
    158        Arc::clone(&runtime),
    159    )));
    160 
    161    registry
    162 }