blob: 41c690c73f8f97bdc441526992e73f3eed5adb01 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
#include "Plugin.hpp"
#include <vector>
#include <easylogging++.h>
#include <sol.hpp>
struct Plugin {
const std::string name;
const std::string displayName;
const std::function<void()> onLoad;
const std::function<void()> onUnload;
const std::function<void(std::string)> onChangeState;
};
std::vector<Plugin> plugins;
sol::state lua;
namespace PluginApi {
void RegisterPlugin(sol::table self, sol::table plugin) {
Plugin nativePlugin {
plugin["name"].get_or<std::string>("75"),
plugin["displayName"].get_or<std::string>(""),
plugin["onLoad"].get_or(std::function<void()>()),
plugin["onUnload"].get_or(std::function<void()>()),
plugin["onChangeState"].get_or(std::function<void(std::string)>())
};
plugins.push_back(nativePlugin);
nativePlugin.onLoad();
LOG(INFO) << "Loaded plugin " << (!nativePlugin.displayName.empty() ? nativePlugin.displayName : nativePlugin.name);
}
void LogWarning(sol::table self, std::string text) {
LOG(WARNING) << text;
}
}
void PluginSystem::Init()
{
LOG(INFO) << "Initializing plugin system";
for (Plugin &plugin : plugins) {
if (plugin.onUnload)
plugin.onUnload();
}
plugins.clear();
lua = sol::state();
lua.open_libraries();
sol::table apiTable = lua["AC"].get_or_create<sol::table>();
apiTable["RegisterPlugin"] = PluginApi::RegisterPlugin;
apiTable["LogWarning"] = PluginApi::LogWarning;
}
void PluginSystem::Execute(const std::string &luaCode)
{
try {
lua.safe_script(luaCode);
} catch (sol::error &e) {
LOG(ERROR) << e.what();
}
}
void PluginSystem::CallOnChangeState(std::string newState)
{
for (Plugin &plugin : plugins) {
if (plugin.onChangeState)
try {
plugin.onChangeState(newState);
}
catch (sol::error &e) {
LOG(ERROR) << e.what();
}
}
}
|