summaryrefslogtreecommitdiff
path: root/hyprpm/src/main.cpp
diff options
context:
space:
mode:
authorVaxry <43317083+vaxerski@users.noreply.github.com>2023-12-07 10:41:09 +0000
committerGitHub <noreply@github.com>2023-12-07 10:41:09 +0000
commitd36055054651442db19df046cbdd0697b805c541 (patch)
treed66ec48c6a47cd2b331fe133dc43d57e6d1ec376 /hyprpm/src/main.cpp
parent62a8d0be5c1959ade8410f8f964e362288f22175 (diff)
hyprpm: Add hyprpm, a Hyprland Plugin Manager (#4072)
Diffstat (limited to 'hyprpm/src/main.cpp')
-rw-r--r--hyprpm/src/main.cpp144
1 files changed, 144 insertions, 0 deletions
diff --git a/hyprpm/src/main.cpp b/hyprpm/src/main.cpp
new file mode 100644
index 00000000..e6191e66
--- /dev/null
+++ b/hyprpm/src/main.cpp
@@ -0,0 +1,144 @@
+#include "progress/CProgressBar.hpp"
+#include "helpers/Colors.hpp"
+#include "core/PluginManager.hpp"
+
+#include <iostream>
+#include <vector>
+#include <string>
+#include <chrono>
+#include <thread>
+
+const std::string HELP = R"#(┏ hyprpm, a Hyprland Plugin Manager
+┃
+┣ add [url] → Install a new plugin repository from git
+┣ remove [url/name] → Remove an installed plugin repository
+┣ enable [name] → Enable a plugin
+┣ disable [name] → Disable a plugin
+┣ update → Check and update all plugins if needed
+┣ reload → Reload hyprpm state. Ensure all enabled plugins are loaded.
+┣ list → List all installed plugins
+┃
+┣ Flags:
+┃
+┣ --notify | -n → Send a hyprland notification for important events (e.g. load fail)
+┣ --help | -h → Show this menu
+┣ --verbose | -v → Enable too much logging
+┗
+)#";
+
+int main(int argc, char** argv, char** envp) {
+ std::vector<std::string> ARGS{argc};
+ for (int i = 0; i < argc; ++i) {
+ ARGS[i] = std::string{argv[i]};
+ }
+
+ if (ARGS.size() < 2) {
+ std::cout << HELP;
+ return 1;
+ }
+
+ std::vector<std::string> command;
+ bool notify = false, verbose = false;
+
+ for (int i = 1; i < argc; ++i) {
+ if (ARGS[i].starts_with("-")) {
+ if (ARGS[i] == "--help" || ARGS[i] == "-h") {
+ std::cout << HELP;
+ return 0;
+ } else if (ARGS[i] == "--notify" || ARGS[i] == "-n") {
+ notify = true;
+ } else if (ARGS[i] == "--verbose" || ARGS[i] == "-v") {
+ verbose = true;
+ } else {
+ std::cerr << "Unrecognized option " << ARGS[i];
+ return 1;
+ }
+ } else {
+ command.push_back(ARGS[i]);
+ }
+ }
+
+ g_pPluginManager = std::make_unique<CPluginManager>();
+ g_pPluginManager->m_bVerbose = verbose;
+
+ if (command[0] == "add") {
+ if (command.size() < 2) {
+ std::cerr << Colors::RED << "✖" << Colors::RESET << " Not enough args for add.\n";
+ return 1;
+ }
+
+ return g_pPluginManager->addNewPluginRepo(command[1]) ? 0 : 1;
+ } else if (command[0] == "remove") {
+ if (ARGS.size() < 2) {
+ std::cerr << Colors::RED << "✖" << Colors::RESET << " Not enough args for remove.\n";
+ return 1;
+ }
+
+ return g_pPluginManager->removePluginRepo(command[1]) ? 0 : 1;
+ } else if (command[0] == "update") {
+ bool headersValid = g_pPluginManager->headersValid() == HEADERS_OK;
+ bool headers = g_pPluginManager->updateHeaders();
+ if (headers) {
+ bool ret1 = g_pPluginManager->updatePlugins(!headersValid);
+
+ if (!ret1)
+ return 1;
+
+ auto ret2 = g_pPluginManager->ensurePluginsLoadState();
+
+ if (ret2 != LOADSTATE_OK)
+ return 1;
+ } else if (notify)
+ g_pPluginManager->notify(ICON_ERROR, 0, 10000, "[hyprpm] Couldn't update headers");
+ } else if (command[0] == "enable") {
+ if (ARGS.size() < 2) {
+ std::cerr << Colors::RED << "✖" << Colors::RESET << " Not enough args for enable.\n";
+ return 1;
+ }
+
+ if (!g_pPluginManager->enablePlugin(command[1])) {
+ std::cerr << Colors::RED << "✖" << Colors::RESET << " Couldn't enable plugin (missing?)\n";
+ return 1;
+ }
+
+ auto ret = g_pPluginManager->ensurePluginsLoadState();
+ if (ret != LOADSTATE_OK)
+ return 1;
+ } else if (command[0] == "disable") {
+ if (command.size() < 2) {
+ std::cerr << Colors::RED << "✖" << Colors::RESET << " Not enough args for disable.\n";
+ return 1;
+ }
+
+ if (!g_pPluginManager->disablePlugin(command[1])) {
+ std::cerr << Colors::RED << "✖" << Colors::RESET << " Couldn't disable plugin (missing?)\n";
+ return 1;
+ }
+
+ auto ret = g_pPluginManager->ensurePluginsLoadState();
+ if (ret != LOADSTATE_OK)
+ return 1;
+ } else if (command[0] == "reload") {
+ auto ret = g_pPluginManager->ensurePluginsLoadState();
+
+ if (ret != LOADSTATE_OK && notify) {
+ switch (ret) {
+ case LOADSTATE_FAIL:
+ case LOADSTATE_PARTIAL_FAIL: g_pPluginManager->notify(ICON_ERROR, 0, 10000, "[hyprpm] Failed to load plugins"); break;
+ case LOADSTATE_HEADERS_OUTDATED:
+ g_pPluginManager->notify(ICON_ERROR, 0, 10000, "[hyprpm] Failed to load plugins: Outdated headers. Please run hyprpm update manually.");
+ break;
+ default: break;
+ }
+ } else if (notify) {
+ g_pPluginManager->notify(ICON_OK, 0, 4000, "[hyprpm] Loaded plugins");
+ }
+ } else if (command[0] == "list") {
+ g_pPluginManager->listAllPlugins();
+ } else {
+ std::cout << HELP;
+ return 1;
+ }
+
+ return 0;
+} \ No newline at end of file