Add CHATTERINO_HAVE_PLUGINS define

This commit is contained in:
Mm2PL 2023-02-02 13:06:29 +01:00
parent a61bc4d6d1
commit c7f47df827
No known key found for this signature in database
GPG key ID: 94AC9B80EFA15ED9
16 changed files with 110 additions and 72 deletions

View file

@ -24,6 +24,12 @@ option(CHATTERINO_GENERATE_COVERAGE "Generate coverage files" OFF)
option(BUILD_TRANSLATIONS "" OFF) option(BUILD_TRANSLATIONS "" OFF)
option(BUILD_SHARED_LIBS "" OFF) option(BUILD_SHARED_LIBS "" OFF)
option(CHATTERINO_LTO "Enable LTO for all targets" OFF) option(CHATTERINO_LTO "Enable LTO for all targets" OFF)
option(CHATTERINO_PLUGINS "Enable EXPERIMENTAL plugin support in Chatterino" OFF)
if(CHATTERINO_PLUGINS)
add_definitions(-DCHATTERINO_HAVE_PLUGINS)
message(STATUS "Building Chatterino with lua plugin support enabled.")
endif()
if(CHATTERINO_LTO) if(CHATTERINO_LTO)
include(CheckIPOSupported) include(CheckIPOSupported)
@ -148,9 +154,10 @@ else()
add_subdirectory("${CMAKE_SOURCE_DIR}/lib/settings" EXCLUDE_FROM_ALL) add_subdirectory("${CMAKE_SOURCE_DIR}/lib/settings" EXCLUDE_FROM_ALL)
endif() endif()
if (CHATTERINO_PLUGINS)
set(LUA_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/lib/lua/src") set(LUA_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/lib/lua/src")
add_subdirectory(lib/lua) add_subdirectory(lib/lua)
endif()
set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)

View file

@ -10,7 +10,9 @@
#include "controllers/hotkeys/HotkeyController.hpp" #include "controllers/hotkeys/HotkeyController.hpp"
#include "controllers/ignores/IgnoreController.hpp" #include "controllers/ignores/IgnoreController.hpp"
#include "controllers/notifications/NotificationController.hpp" #include "controllers/notifications/NotificationController.hpp"
#include "controllers/plugins/PluginController.hpp" #ifdef CHATTERINO_HAVE_PLUGINS
# include "controllers/plugins/PluginController.hpp"
#endif
#include "controllers/sound/SoundController.hpp" #include "controllers/sound/SoundController.hpp"
#include "controllers/userdata/UserDataController.hpp" #include "controllers/userdata/UserDataController.hpp"
#include "debug/AssertInGuiThread.hpp" #include "debug/AssertInGuiThread.hpp"
@ -85,7 +87,9 @@ Application::Application(Settings &_settings, Paths &_paths)
, seventvBadges(&this->emplace<SeventvBadges>()) , seventvBadges(&this->emplace<SeventvBadges>())
, userData(&this->emplace<UserDataController>()) , userData(&this->emplace<UserDataController>())
, sound(&this->emplace<SoundController>()) , sound(&this->emplace<SoundController>())
#ifdef CHATTERINO_HAVE_PLUGINS
, plugins(&this->emplace<PluginController>()) , plugins(&this->emplace<PluginController>())
#endif
, logging(&this->emplace<Logging>()) , logging(&this->emplace<Logging>())
{ {
this->instance = this; this->instance = this;

View file

@ -20,7 +20,9 @@ class HotkeyController;
class IUserDataController; class IUserDataController;
class UserDataController; class UserDataController;
class SoundController; class SoundController;
#ifdef CHATTERINO_HAVE_PLUGINS
class PluginController; class PluginController;
#endif
class Theme; class Theme;
class WindowManager; class WindowManager;
@ -96,7 +98,9 @@ public:
UserDataController *const userData{}; UserDataController *const userData{};
SoundController *const sound{}; SoundController *const sound{};
#ifdef CHATTERINO_HAVE_PLUGINS
PluginController *const plugins{}; PluginController *const plugins{};
#endif
/*[[deprecated]]*/ Logging *const logging{}; /*[[deprecated]]*/ Logging *const logging{};

View file

@ -625,8 +625,10 @@ target_link_libraries(${LIBRARY_PROJECT}
RapidJSON::RapidJSON RapidJSON::RapidJSON
LRUCache LRUCache
MagicEnum MagicEnum
lua
) )
if (CHATTERINO_PLUGINS)
target_link_libraries(${LIBRARY_PROJECT} PUBLIC lua)
endif()
if (BUILD_WITH_QTKEYCHAIN) if (BUILD_WITH_QTKEYCHAIN)
target_link_libraries(${LIBRARY_PROJECT} target_link_libraries(${LIBRARY_PROJECT}

View file

@ -230,11 +230,12 @@ void CompletionModel::refresh(const QString &prefix, bool isFirstWord)
{ {
addString(emote.first.string, TaggedString::Type::BTTVGlobalEmote); addString(emote.first.string, TaggedString::Type::BTTVGlobalEmote);
} }
#ifdef CHATTERINO_HAVE_PLUGINS
for (const auto &command : getApp()->commands->pluginCommands()) for (const auto &command : getApp()->commands->pluginCommands())
{ {
addString(command, TaggedString::PluginCommand); addString(command, TaggedString::PluginCommand);
} }
#endif
// Custom Chatterino commands // Custom Chatterino commands
for (const auto &command : getApp()->commands->items) for (const auto &command : getApp()->commands->items)
{ {

View file

@ -34,7 +34,9 @@ class CompletionModel : public QAbstractListModel
CustomCommand, CustomCommand,
ChatterinoCommand, ChatterinoCommand,
TwitchCommand, TwitchCommand,
#ifdef CHATTERINO_HAVE_PLUGINS
PluginCommand, PluginCommand,
#endif
}; };
TaggedString(QString _string, Type type); TaggedString(QString _string, Type type);

View file

@ -3220,7 +3220,7 @@ QString CommandController::execCommand(const QString &textNoEmoji,
return text; return text;
} }
#ifdef CHATTERINO_HAVE_PLUGINS
bool CommandController::registerPluginCommand(const QString &commandName) bool CommandController::registerPluginCommand(const QString &commandName)
{ {
if (this->commands_.contains(commandName)) if (this->commands_.contains(commandName))
@ -3244,6 +3244,7 @@ bool CommandController::unregisterPluginCommand(const QString &commandName)
this->pluginCommands_.removeAll(commandName); this->pluginCommands_.removeAll(commandName);
return this->commands_.erase(commandName) != 0; return this->commands_.erase(commandName) != 0;
} }
#endif
void CommandController::registerCommand(const QString &commandName, void CommandController::registerCommand(const QString &commandName,
CommandFunctionVariants commandFunction) CommandFunctionVariants commandFunction)

View file

@ -42,7 +42,7 @@ public:
const QStringList &words, const Command &command, bool dryRun, const QStringList &words, const Command &command, bool dryRun,
ChannelPtr channel, const Message *message = nullptr, ChannelPtr channel, const Message *message = nullptr,
std::unordered_map<QString, QString> context = {}); std::unordered_map<QString, QString> context = {});
#ifdef CHATTERINO_HAVE_PLUGINS
bool registerPluginCommand(const QString &commandName); bool registerPluginCommand(const QString &commandName);
bool unregisterPluginCommand(const QString &commandName); bool unregisterPluginCommand(const QString &commandName);
@ -50,6 +50,7 @@ public:
{ {
return this->pluginCommands_; return this->pluginCommands_;
} }
#endif
private: private:
void load(Paths &paths); void load(Paths &paths);
@ -81,7 +82,9 @@ private:
commandsSetting_; commandsSetting_;
QStringList defaultChatterinoCommandAutoCompletions_; QStringList defaultChatterinoCommandAutoCompletions_;
#ifdef CHATTERINO_HAVE_PLUGINS
QStringList pluginCommands_; QStringList pluginCommands_;
#endif
}; };
} // namespace chatterino } // namespace chatterino

View file

@ -1,12 +1,13 @@
#include "LuaUtilities.hpp" #include "LuaUtilities.hpp"
#ifdef CHATTERINO_HAVE_PLUGINS
#include "common/Channel.hpp" # include "common/Channel.hpp"
#include "controllers/commands/CommandContext.hpp" # include "controllers/commands/CommandContext.hpp"
#include "lauxlib.h" # include "lauxlib.h"
#include "lua.h" # include "lua.h"
#include <climits> # include <climits>
#include <cstdlib> # include <cstdlib>
namespace chatterino::lua { namespace chatterino::lua {
@ -109,3 +110,4 @@ bool peek(lua_State *L, QString *out, StackIdx idx)
return true; return true;
} }
} // namespace chatterino::lua } // namespace chatterino::lua
#endif

View file

@ -1,10 +1,11 @@
#pragma once #pragma once
#include "lua.h" #ifdef CHATTERINO_HAVE_PLUGINS
# include "lua.h"
#include <qlist.h> # include <qlist.h>
#include <vector> # include <vector>
struct lua_State; struct lua_State;
class QJsonObject; class QJsonObject;
namespace chatterino { namespace chatterino {
@ -73,3 +74,4 @@ bool pop(lua_State *L, T *out, StackIdx idx = -1)
} }
} // namespace chatterino::lua } // namespace chatterino::lua
#endif

View file

@ -1,4 +1,5 @@
#include "Plugin.hpp" #include "Plugin.hpp"
#ifdef CHATTERINO_HAVE_PLUGINS
namespace chatterino { namespace chatterino {
bool Plugin::registerCommand(const QString &name, const QString &functionName) bool Plugin::registerCommand(const QString &name, const QString &functionName)
@ -27,3 +28,4 @@ std::set<QString> Plugin::listRegisteredCommands()
return out; return out;
} }
} // namespace chatterino } // namespace chatterino
#endif

View file

@ -1,28 +1,26 @@
#include "PluginController.hpp" #include "PluginController.hpp"
#ifdef CHATTERINO_HAVE_PLUGINS
#include "Application.hpp" # include "Application.hpp"
#include "common/QLogging.hpp" # include "common/QLogging.hpp"
#include "controllers/commands/CommandContext.hpp" # include "controllers/commands/CommandContext.hpp"
#include "controllers/plugins/LuaUtilities.hpp" # include "controllers/plugins/LuaUtilities.hpp"
#include "messages/MessageBuilder.hpp" # include "lauxlib.h"
#include "providers/twitch/TwitchIrcServer.hpp" # include "lua.h"
#include "singletons/Paths.hpp" # include "lualib.h"
#include "singletons/Settings.hpp" # include "messages/MessageBuilder.hpp"
#include "singletons/WindowManager.hpp" # include "providers/twitch/TwitchIrcServer.hpp"
#include "widgets/Notebook.hpp" # include "singletons/Paths.hpp"
#include "widgets/splits/Split.hpp" # include "singletons/Settings.hpp"
#include "widgets/Window.hpp" # include "singletons/WindowManager.hpp"
# include "widgets/Notebook.hpp"
# include "widgets/splits/Split.hpp"
# include "widgets/Window.hpp"
#include <QJsonDocument> # include <QJsonDocument>
#include <memory> # include <memory>
#include <utility> # include <utility>
//extern "C" {
#include "lauxlib.h"
#include "lua.h"
#include "lualib.h"
//}
namespace chatterino { namespace chatterino {
@ -362,3 +360,4 @@ bool PluginController::isEnabled(const QString &codename)
} }
}; // namespace chatterino }; // namespace chatterino
#endif

View file

@ -1,20 +1,22 @@
#pragma once #pragma once
#include "common/Singleton.hpp" #ifdef CHATTERINO_HAVE_PLUGINS
#include "controllers/plugins/Plugin.hpp"
#include "singletons/Paths.hpp"
#include <QDir> # include "common/Singleton.hpp"
#include <QFileInfo> # include "controllers/plugins/Plugin.hpp"
#include <QJsonArray> # include "singletons/Paths.hpp"
#include <QJsonObject>
#include <QString>
#include <algorithm> # include <QDir>
#include <map> # include <QFileInfo>
#include <memory> # include <QJsonArray>
#include <utility> # include <QJsonObject>
#include <vector> # include <QString>
# include <algorithm>
# include <map>
# include <memory>
# include <utility>
# include <vector>
struct lua_State; struct lua_State;
@ -68,3 +70,4 @@ private:
}; };
}; // namespace chatterino }; // namespace chatterino
#endif

View file

@ -216,7 +216,9 @@ void SettingsDialog::addTabs()
this->addTab([]{return new ModerationPage;}, "Moderation", ":/settings/moderation.svg", SettingsTabId::Moderation); this->addTab([]{return new ModerationPage;}, "Moderation", ":/settings/moderation.svg", SettingsTabId::Moderation);
this->addTab([]{return new NotificationPage;}, "Live Notifications", ":/settings/notification2.svg"); this->addTab([]{return new NotificationPage;}, "Live Notifications", ":/settings/notification2.svg");
this->addTab([]{return new ExternalToolsPage;}, "External tools", ":/settings/externaltools.svg"); this->addTab([]{return new ExternalToolsPage;}, "External tools", ":/settings/externaltools.svg");
#ifdef CHATTERINO_HAVE_PLUGINS
this->addTab([]{return new PluginsPage;}, "Plugins", ":/settings/externaltools.svg"); this->addTab([]{return new PluginsPage;}, "Plugins", ":/settings/externaltools.svg");
#endif
this->ui_.tabContainer->addStretch(1); this->ui_.tabContainer->addStretch(1);
this->addTab([]{return new AboutPage;}, "About", ":/settings/about.svg", SettingsTabId(), Qt::AlignBottom); this->addTab([]{return new AboutPage;}, "About", ":/settings/about.svg", SettingsTabId(), Qt::AlignBottom);
// clang-format on // clang-format on

View file

@ -1,21 +1,22 @@
#include "PluginsPage.hpp" #include "PluginsPage.hpp"
#ifdef CHATTERINO_HAVE_PLUGINS
#include "Application.hpp" # include "Application.hpp"
#include "controllers/plugins/PluginController.hpp" # include "controllers/plugins/PluginController.hpp"
#include "singletons/Paths.hpp" # include "singletons/Paths.hpp"
#include "singletons/Settings.hpp" # include "singletons/Settings.hpp"
#include "util/Helpers.hpp" # include "util/Helpers.hpp"
#include "util/LayoutCreator.hpp" # include "util/LayoutCreator.hpp"
#include "util/RemoveScrollAreaBackground.hpp" # include "util/RemoveScrollAreaBackground.hpp"
#include <QCheckBox> # include <QCheckBox>
#include <QFormLayout> # include <QFormLayout>
#include <QGroupBox> # include <QGroupBox>
#include <QLabel> # include <QLabel>
#include <qobject.h> # include <qobject.h>
#include <QObject> # include <QObject>
#include <QPushButton> # include <QPushButton>
#include <QWidget> # include <QWidget>
namespace chatterino { namespace chatterino {
@ -163,3 +164,4 @@ void PluginsPage::rebuildContent()
} }
} // namespace chatterino } // namespace chatterino
#endif

View file

@ -1,11 +1,12 @@
#pragma once #pragma once
#include "util/LayoutCreator.hpp" #ifdef CHATTERINO_HAVE_PLUGINS
#include "widgets/settingspages/SettingsPage.hpp" # include "util/LayoutCreator.hpp"
# include "widgets/settingspages/SettingsPage.hpp"
#include <QDebug> # include <QDebug>
#include <QFormLayout> # include <QFormLayout>
#include <QGroupBox> # include <QGroupBox>
#include <QWidget> # include <QWidget>
namespace chatterino { namespace chatterino {
class Plugin; class Plugin;
@ -23,3 +24,4 @@ private:
QFrame *dataFrame_; QFrame *dataFrame_;
}; };
} // namespace chatterino } // namespace chatterino
#endif