{"id":42914638,"url":"https://github.com/hardcpp/questchatplexsdk-bs","last_synced_at":"2026-01-30T17:04:46.597Z","repository":{"id":201071841,"uuid":"706693489","full_name":"hardcpp/QuestChatPlexSDK-BS","owner":"hardcpp","description":"C++ ChatPlex BeatSaber SDK","archived":false,"fork":false,"pushed_at":"2025-09-23T20:11:34.000Z","size":53732,"stargazers_count":9,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-09-23T22:08:52.195Z","etag":null,"topics":["beatsaber","beatsaber-quest","il2cpp","il2cpp-modding","quest","unity"],"latest_commit_sha":null,"homepage":"https://chatplex.org","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hardcpp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":null,"patreon":"BeatSaberPlus","open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"lfx_crowdfunding":null,"custom":null}},"created_at":"2023-10-18T12:51:48.000Z","updated_at":"2025-09-17T17:00:19.000Z","dependencies_parsed_at":"2023-10-21T18:31:41.542Z","dependency_job_id":"94697f7c-296c-4e15-9cbf-50ad293fe0f3","html_url":"https://github.com/hardcpp/QuestChatPlexSDK-BS","commit_stats":null,"previous_names":["hardcpp/questchatplexsdk-bs"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/hardcpp/QuestChatPlexSDK-BS","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hardcpp%2FQuestChatPlexSDK-BS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hardcpp%2FQuestChatPlexSDK-BS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hardcpp%2FQuestChatPlexSDK-BS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hardcpp%2FQuestChatPlexSDK-BS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hardcpp","download_url":"https://codeload.github.com/hardcpp/QuestChatPlexSDK-BS/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hardcpp%2FQuestChatPlexSDK-BS/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28915942,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-30T16:37:38.804Z","status":"ssl_error","status_checked_at":"2026-01-30T16:37:37.878Z","response_time":66,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["beatsaber","beatsaber-quest","il2cpp","il2cpp-modding","quest","unity"],"created_at":"2026-01-30T17:04:45.887Z","updated_at":"2026-01-30T17:04:46.579Z","avatar_url":"https://github.com/hardcpp.png","language":"C","funding_links":["https://patreon.com/BeatSaberPlus"],"categories":[],"sub_categories":[],"readme":"Quest version of ChatPlex SDK for BeatSaber\n\nThis SDK was created to simplify and streamline mods creation for multiple games. It mostly provides generic components and utilities for Unity modding and also specific components and utilities for BeatSaber\n\nEach mods using ChatPlexSDK-BS can declare a module (optional, described below), this module is like an interface for the SDK to manage your mod, show settings UI and a enable/disable toggle if the module `Type` is defined as `Integrated`\n\nComponents (Full list in documentation):\n- **CP_SDK** *ChatPlex SDK game agnostic namepace*\n  * **Animation** *Animated image loading and processing*\n  * **Chat** *Chat service for connecting to various live streaming platforms chat*\n  * **Config** *Json configuration utilities*\n  * **Logging** *Logging utilities*\n  * **Network** *Network and HTTP utilities*\n  * **Pool** *Memory management \u0026 pools utilities*\n  * **UI** *User interface components, views, flow coordinator, builders and factories*\n  * **Unity** *Tools and extensions to interact with Unity on different layer \u0026 threads, load fonts/sprites/textures*\n  * **Utils** *Various platform utils like Delegate/Action/Function/Event system*\n  * **XUI** *Tree like syntax CP_SDK::UI builder*\n- **CP_SDK_BS** *ChatPlex SDK BeatSaber specific*\n  * **Game** *Game specific helper and utilities*\n  * **UI** *BeatSaber specific UI compoenents and utilities*\n\n# Documentation\n[Doxygen Documentation](https://documentation.chatplex.org/QuestChatPlexSDK-BS/namespaces.html)\n\n# Getting the SDK\nTo get the library, simply head over to the [releases](https://github.com/hardcpp/QuestChatPlexSDK-BS/releases) section, or build it yourself.\nIf you want to develop with the SDK simply follow the instructions below in `# How to use (As a dependency)`\n\n# Building the library\nTo build the library, make sure you have QPM, CMake, Ninja installed\n```sh\ngit clone https://github.com/hardcpp/QuestChatPlexSDK-BS.git --recursive\ncd QuestChatPlexSDK-BS\nqpm restore\nqpm qmod build\ncmake -G \"Ninja\" -DCMAKE_BUILD_TYPE=\"RelWithDebInfo\" -B build\ncmake --build ./build\n```\n\n# How to use (As a dependency)\nAdd this project as a dependence with QPM\n```\nqpm dependency add chatplex-sdk-bs\nqpm restore\nqpm qmod build\n```\n\nAdd include path in `CMakeLists.txt` after `# codegen includes`\n```cmake\n# chatplex-sdk-bs includes\ntarget_include_directories(${COMPILE_ID} PRIVATE ${EXTERN_DIR}/includes/chatplex-sdk-bs/shared)\n```\n\n# How to use (As a module)\nAdd this project as a dependence with QPM\n```\nqpm dependency add chatplex-sdk-bs\nqpm restore\nqpm qmod build\n```\n\nAdd defines in `CMakeLists.txt` after `include(qpm_defines.cmake)`\n```cmake\nadd_definitions(-DCP_SDK_BMBF)\n```\n\nAdd include path in `CMakeLists.txt` after `# codegen includes`\n```cmake\n# chatplex-sdk-bs includes\ntarget_include_directories(${COMPILE_ID} PRIVATE ${EXTERN_DIR}/includes/chatplex-sdk-bs/shared)\n```\n\nCreate your logger handler\n```cpp\n#pragma once\n\n#include \u003cCP_SDK/Logging/ILogger.hpp\u003e\n\nnamespace MyModNamespace {\n\n    /// @brief Logger instance holder\n    class Logger\n    {\n        public:\n            /// @brief Logger instance\n            static CP_SDK::Logging::ILogger* Instance;\n\n    };\n\n}   ///\u003c namespace MyModNamespace\n```\n\nCreate your module declaration\n`MyModule.hpp`\n```cpp\n#pragma once\n\n#include \"UI/SettingsLeftView.hpp\"\n#include \"UI/SettingsMainView.hpp\"\n#include \"MPConfig.hpp\"\n\n#include \u003cCP_SDK/ModuleBase.hpp\u003e\n#include \u003cCP_SDK/ChatPlexSDK.hpp\u003e\n\nnamespace MyModNamespace {\n\n    /// @brief My Module\n    class MyModule : public CP_SDK::ModuleBase\u003cMultiplayer\u003e\n    {\n        CP_SDK_MODULE_BASE_INSTANCE_DECL(MyModule);\n\n        public:\n            CP_SDK::EIModuleBaseType            Type()                      const override { return CP_SDK::EIModuleBaseType::External;                     }\n            std::u16string_view                 Name()                      const override { return u\"MyModule\";                                            }\n            std::u16string_view                 FancyName()                 const override { return u\"MyModule\";                                            }\n            std::u16string_view                 Description()               const override { return u\"My description\";                                      }\n            std::u16string_view                 DocumentationURL()          const override { return u\"MyModule documentation URL\";                          }\n            bool                                UseChatFeatures()           const override { return false;                                                  }\n            bool                                IsEnabled()                 const override { return true;                                                   }\n            void                                IsEnabled(bool p_Enabled)         override {                                                                }\n            CP_SDK::EIModuleBaseActivationType  ActivationType()            const override { return CP_SDK::EIModuleBaseActivationType::OnMenuSceneLoaded;  }\n\n        public:\n            /// @brief Constructor\n            MyModule();\n\n        protected:\n            /// @brief Enable the Module\n            void OnEnable() override;\n            /// @brief Disable the Module\n            void OnDisable() override;\n\n        public:\n            /// @brief Get Module settings UI\n            t_InitialViews GetSettingsViewControllers() override;\n\n    };\n\n}   ///\u003c namespace MyModNamespace\n```\n\nCreate your module implementation\n`MyModule.cpp`\n```cpp\n#include \"Multiplayer.hpp\"\n#include \"Logger.hpp\"\n\nnamespace MyModNamespace {\n\n    CP_SDK_MODULE_BASE_INSTANCE_IMPL(MyModule);\n\n    ////////////////////////////////////////////////////////////////////////////\n    ////////////////////////////////////////////////////////////////////////////\n\n    /// Constructor\n    MyModule::MyModule()\n    {\n\n    }\n\n    ////////////////////////////////////////////////////////////////////////////\n    ////////////////////////////////////////////////////////////////////////////\n\n    /// @brief Enable the Module\n    void MyModule::OnEnable()\n    {\n\n    }\n    /// @brief Disable the Module\n    void MyModule::OnDisable()\n    {\n\n    }\n\n    ////////////////////////////////////////////////////////////////////////////\n    ////////////////////////////////////////////////////////////////////////////\n\n    /// @brief Get Module settings UI\n    MyModule::t_InitialViews MyModule::GetSettingsViewControllers()\n    {\n        return { nullptr, nullptr, nullptr};\n    }\n\n}   ///\u003c namespace MyModNamespace\n```\n\nAnd to initilize the module\n`main.cpp`\n```cpp\n#include \"Logger.hpp\"\n#include \"MyModule.hpp\"\n\n#include \u003cCP_SDK/ChatPlexSDK.hpp\u003e\n#include \u003cCP_SDK/Logging/PaperLogger.hpp\u003e\n\n#include \u003cbeatsaber-hook/shared/utils/il2cpp-functions.hpp\u003e\n#include \u003ccustom-types/shared/register.hpp\u003e\n\nModInfo s_ModInfo;\n\n////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////\n\n// Called at the early stages of game loading\nextern \"C\" void setup(ModInfo\u0026 p_ModInfo)\n{\n    p_ModInfo.id        = MOD_ID;\n    p_ModInfo.version   = VERSION;\n\n    s_ModInfo = p_ModInfo;\n\n    auto l_Logger = new CP_SDK::Logging::BMBFLogger(new Logger(p_ModInfo, LoggerOptions(false, true)));\n\n    l_Logger-\u003eError(u\"MyModule Setuping!\");\n\n    MyModNamespace::Logger::Instance = l_Logger;\n    CP_SDK::ChatPlexSDK::RegisterModule(new MyModNamespace::MyModule());\n\n    l_Logger-\u003eError(u\"MyModule Completed setup!\");\n}\n\n////////////////////////////////////////////////////////////////////////////\n////////////////////////////////////////////////////////////////////////////\n\n// Called later on in the game loading - a good time to install function hooks\nextern \"C\" void load()\n{\n    il2cpp_functions::Init();\n\n    MyModNamespace::Logger::Instance-\u003eError(u\"Registering custom types.\");\n    custom_types::Register::AutoRegister();\n}\n```\n\n# Credits / Thanks\n- Fern\n- Pink\n- RedBrumbler\n- Sc2ad\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhardcpp%2Fquestchatplexsdk-bs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhardcpp%2Fquestchatplexsdk-bs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhardcpp%2Fquestchatplexsdk-bs/lists"}