#include "dropshell.hpp" #include "init_user_directory.hpp" #include "config.hpp" #include #include #include namespace fs = boost::filesystem; namespace dropshell { std::vector autocomplete_list_servers() { std::vector servers; std::string user_dir; if (!get_user_directory(user_dir)) { std::cerr << "Error: User directory not set" << std::endl; return servers; } fs::path servers_dir = fs::path(user_dir) / "servers"; if (!fs::exists(servers_dir)) { std::cerr << "Error: Servers directory not found" << std::endl; return servers; } // List all server directories for (const auto& entry : fs::directory_iterator(servers_dir)) { if (fs::is_directory(entry)) { servers.push_back(entry.path().filename().string()); } } return servers; } std::vector autocomplete_list_services(const std::string& server_name) { std::vector services; std::string user_dir; if (!get_user_directory(user_dir)) { std::cerr << "Error: User directory not set" << std::endl; return services; } fs::path server_dir = fs::path(user_dir) / "servers" / server_name; if (!fs::exists(server_dir)) { std::cerr << "Error: Server directory not found" << std::endl; return services; } // Look for .env files in the server directory for (const auto& entry : fs::directory_iterator(server_dir)) { if (entry.path().extension() == ".env" && entry.path().filename().string() != "_server.env") { services.push_back(entry.path().stem().string()); } } return services; } std::vector autocomplete_list_commands() { std::vector commands; std::set unique_commands; // To ensure deduplication // System templates directory const std::string system_templates_dir = "/opt/dropshell/templates"; // User templates directory std::string user_templates_dir; if (!get_user_directory(user_templates_dir)) { std::cerr << "Error: User directory not set" << std::endl; return commands; } user_templates_dir += "/usertemplates"; // Helper function to add commands from a directory auto add_commands_from_dir = [&unique_commands](const std::string& dir_path) { if (!fs::exists(dir_path)) { return; } // Iterate through all template directories for (const auto& template_entry : fs::directory_iterator(dir_path)) { if (!fs::is_directory(template_entry)) { continue; } // Look for shell files in each template directory for (const auto& file_entry : fs::directory_iterator(template_entry.path())) { if (fs::is_regular_file(file_entry) && file_entry.path().extension() == ".sh" && file_entry.path().filename().string()[0] != '_') { unique_commands.insert(file_entry.path().stem().string()); } } } }; // Add commands from both template locations add_commands_from_dir(system_templates_dir); add_commands_from_dir(user_templates_dir); // Convert set to vector for return commands.assign(unique_commands.begin(), unique_commands.end()); return commands; } } // namespace dropshell