Skip to content

Commit 44ad365

Browse files
authored
feat(pluginmanager): Nested Folders
2 parents 62f983d + d6cfe05 commit 44ad365

File tree

7 files changed

+51
-36
lines changed

7 files changed

+51
-36
lines changed

src/core/commands.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -489,7 +489,7 @@ void SwiftlyPluginManagerReload(CPlayerSlot slot, CCommandContext context, std::
489489
void SwiftlyPluginManagerRefresh(CPlayerSlot slot, CCommandContext context)
490490
{
491491
auto oldPluginsAmount = g_pluginManager->GetPluginsList().size();
492-
g_pluginManager->LoadPlugins();
492+
g_pluginManager->LoadPlugins("");
493493
auto newPluginsAmount = g_pluginManager->GetPluginsList().size();
494494
PrintToClientOrConsole(slot, "Plugin Refresh", "Plugins have been succesfully refreshed. (%d -> %d plugins)\n", oldPluginsAmount, newPluginsAmount);
495495
}

src/entrypoint.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ CGameEntitySystem* GameEntitySystem()
9292
CUtlVector<FuncHookBase*> g_vecHooks;
9393
std::map<std::string, PluginUserMessage> scriptingUserMessages;
9494
std::map<std::string, FakeConVar*> fakeConvars;
95+
std::map<std::string, std::string> pluginBasePaths;
9596

9697
Addons g_addons;
9798
CommandsManager* g_commandsManager = nullptr;
@@ -195,7 +196,7 @@ bool Swiftly::Load(PluginId id, ISmmAPI* ismm, char* error, size_t maxlen, bool
195196
if (g_Config->FetchValue<bool>("core.console_filtering"))
196197
g_conFilter->Toggle();
197198

198-
g_pluginManager->LoadPlugins();
199+
g_pluginManager->LoadPlugins("");
199200
g_pluginManager->StartPlugins();
200201

201202
if (late)

src/plugins/Plugin.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include <string>
55
#include <vector>
6+
#include <map>
67
#include "../types/PluginKind.h"
78
#include "../types/PluginState.h"
89
#include "../types/EventResult.h"
@@ -35,17 +36,19 @@ class Plugin
3536
virtual bool ExecuteStart() = 0;
3637
virtual void ExecuteStop() = 0;
3738

38-
virtual void ExecuteCommand(void *functionPtr, std::string name, int slot, std::vector<std::string> args, bool silent, std::string prefix) = 0;
39+
virtual void ExecuteCommand(void* functionPtr, std::string name, int slot, std::vector<std::string> args, bool silent, std::string prefix) = 0;
3940

40-
virtual void RegisterEventHandler(void *functionPtr) = 0;
41+
virtual void RegisterEventHandler(void* functionPtr) = 0;
4142
virtual void RegisterEventHandling(std::string eventName) = 0;
4243

4344
virtual std::string GetAuthor() = 0;
4445
virtual std::string GetWebsite() = 0;
4546
virtual std::string GetVersion() = 0;
4647
virtual std::string GetPlName() = 0;
4748

48-
virtual EventResult TriggerEvent(std::string invokedBy, std::string eventName, std::string eventPayload, PluginEvent *event) = 0;
49+
virtual EventResult TriggerEvent(std::string invokedBy, std::string eventName, std::string eventPayload, PluginEvent* event) = 0;
4950
};
5051

52+
extern std::map<std::string, std::string> pluginBasePaths;
53+
5154
#endif

src/plugins/PluginManager.cpp

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,39 @@ bool PluginManager::PluginExists(std::string plugin_name)
1717
return (pluginsMap.find(plugin_name) != pluginsMap.end());
1818
}
1919

20-
void PluginManager::LoadPlugins()
20+
void PluginManager::LoadPlugins(std::string directory)
2121
{
22-
if (!Files::ExistsPath("addons/swiftly/plugins"))
23-
Files::CreateDirectory("addons/swiftly/plugins");
22+
std::string baseDir = "addons/swiftly/plugins" + directory;
23+
if (!Files::ExistsPath(baseDir))
24+
Files::CreateDirectory(baseDir);
2425

25-
std::vector<std::string> plugins = Files::FetchDirectories("addons/swiftly/plugins");
26+
std::vector<std::string> plugins = Files::FetchDirectories(baseDir);
2627
for (std::string folder : plugins)
2728
{
2829
// Skips over disabled
2930
if (folder.find("disabled") != std::string::npos)
3031
continue;
3132

32-
folder = replace(folder, "addons/swiftly/plugins", "");
33-
std::string plugin_name = replace(folder, WIN_LINUX("\\", "/"), "");
33+
auto directory_name = explode(folder, WIN_LINUX("\\", "/")).back();
3434

35-
LoadPlugin(plugin_name);
35+
if (directory_name.find("[") != std::string::npos)
36+
LoadPlugins(directory + "/" + directory_name);
37+
else
38+
{
39+
folder = replace(folder, baseDir, "");
40+
std::string plugin_name = replace(folder, WIN_LINUX("\\", "/"), "");
41+
42+
pluginBasePaths[plugin_name] = baseDir;
43+
44+
LoadPlugin(plugin_name);
45+
}
3646
}
3747
}
3848

3949
void PluginManager::UnloadPlugins()
4050
{
4151
std::vector<std::string> pluginNames;
42-
for (Plugin *plugin : pluginsList)
52+
for (Plugin* plugin : pluginsList)
4353
pluginNames.push_back(plugin->GetName());
4454

4555
for (std::string plugin_name : pluginNames)
@@ -51,11 +61,11 @@ void PluginManager::LoadPlugin(std::string plugin_name)
5161
if (PluginExists(plugin_name))
5262
return;
5363

54-
std::vector<std::string> files = Files::FetchFileNames("addons/swiftly/plugins/" + plugin_name);
64+
std::vector<std::string> files = Files::FetchFileNames(pluginBasePaths[plugin_name] + "/" + plugin_name);
5565
if (files.size() == 0)
5666
return;
5767

58-
Plugin *plugin = nullptr;
68+
Plugin* plugin = nullptr;
5969

6070
for (std::string file : files)
6171
{
@@ -73,15 +83,15 @@ void PluginManager::LoadPlugin(std::string plugin_name)
7383
}
7484

7585
pluginsList.push_back(plugin);
76-
pluginsMap.insert({plugin_name, plugin});
86+
pluginsMap.insert({ plugin_name, plugin });
7787
}
7888

7989
void PluginManager::UnloadPlugin(std::string plugin_name)
8090
{
8191
if (!PluginExists(plugin_name))
8292
return;
8393

84-
Plugin *plugin = pluginsMap.at(plugin_name);
94+
Plugin* plugin = pluginsMap.at(plugin_name);
8595

8696
auto it = std::find(pluginsList.begin(), pluginsList.end(), plugin);
8797
if (it != pluginsList.end())
@@ -93,7 +103,7 @@ void PluginManager::UnloadPlugin(std::string plugin_name)
93103

94104
void PluginManager::StartPlugins()
95105
{
96-
for (Plugin *plugin : pluginsList)
106+
for (Plugin* plugin : pluginsList)
97107
if (!StartPlugin(plugin->GetName()))
98108
StopPlugin(plugin->GetName());
99109

@@ -102,15 +112,15 @@ void PluginManager::StartPlugins()
102112

103113
msgpack::pack(ss, eventData);
104114

105-
PluginEvent *event = new PluginEvent("core", nullptr, nullptr);
115+
PluginEvent* event = new PluginEvent("core", nullptr, nullptr);
106116
this->ExecuteEvent("core", "OnAllPluginsLoaded", ss.str(), event);
107117
delete event;
108118
AllPluginsStarted = true;
109119
}
110120

111121
void PluginManager::StopPlugins()
112122
{
113-
for (Plugin *plugin : pluginsList)
123+
for (Plugin* plugin : pluginsList)
114124
StopPlugin(plugin->GetName());
115125
}
116126

@@ -119,7 +129,7 @@ bool PluginManager::StartPlugin(std::string plugin_name)
119129
if (!PluginExists(plugin_name))
120130
return false;
121131

122-
Plugin *plugin = pluginsMap.at(plugin_name);
132+
Plugin* plugin = pluginsMap.at(plugin_name);
123133
if (plugin->GetPluginState() == PluginState_t::Started)
124134
return true;
125135

@@ -136,7 +146,7 @@ bool PluginManager::StartPlugin(std::string plugin_name)
136146

137147
msgpack::pack(ss, eventData);
138148

139-
PluginEvent *event = new PluginEvent("core", nullptr, nullptr);
149+
PluginEvent* event = new PluginEvent("core", nullptr, nullptr);
140150
plugin->TriggerEvent("core", "OnAllPluginsLoaded", ss.str(), event);
141151
delete event;
142152
}
@@ -149,7 +159,7 @@ void PluginManager::StopPlugin(std::string plugin_name)
149159
if (!PluginExists(plugin_name))
150160
return;
151161

152-
Plugin *plugin = pluginsMap.at(plugin_name);
162+
Plugin* plugin = pluginsMap.at(plugin_name);
153163
if (plugin->GetPluginState() == PluginState_t::Stopped)
154164
return;
155165

@@ -160,17 +170,17 @@ void PluginManager::StopPlugin(std::string plugin_name)
160170
g_MenuManager->UnregisterPluginMenus(plugin_name);
161171
}
162172

163-
Plugin *PluginManager::FetchPlugin(std::string name)
173+
Plugin* PluginManager::FetchPlugin(std::string name)
164174
{
165175
if (!PluginExists(name))
166176
return nullptr;
167177

168178
return pluginsMap.at(name);
169179
}
170180

171-
EventResult PluginManager::ExecuteEvent(std::string invokedBy, std::string eventName, std::string eventPayload, PluginEvent *event)
181+
EventResult PluginManager::ExecuteEvent(std::string invokedBy, std::string eventName, std::string eventPayload, PluginEvent* event)
172182
{
173-
for (Plugin *plugin : this->pluginsList)
183+
for (Plugin* plugin : this->pluginsList)
174184
{
175185
EventResult result = plugin->TriggerEvent(invokedBy, eventName, eventPayload, event);
176186
if (result != EventResult::Continue)
@@ -180,7 +190,7 @@ EventResult PluginManager::ExecuteEvent(std::string invokedBy, std::string event
180190
return EventResult::Continue;
181191
}
182192

183-
std::vector<Plugin *> PluginManager::GetPluginsList()
193+
std::vector<Plugin*> PluginManager::GetPluginsList()
184194
{
185195
return this->pluginsList;
186196
}

src/plugins/PluginManager.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ class PluginEvent;
1515
class PluginManager
1616
{
1717
private:
18-
std::vector<Plugin *> pluginsList;
19-
std::map<std::string, Plugin *> pluginsMap;
18+
std::vector<Plugin*> pluginsList;
19+
std::map<std::string, Plugin*> pluginsMap;
2020

2121
public:
2222
PluginManager();
2323
~PluginManager();
2424

2525
bool PluginExists(std::string plugin_name);
2626

27-
void LoadPlugins();
27+
void LoadPlugins(std::string directory);
2828
void UnloadPlugins();
2929

3030
void LoadPlugin(std::string plugin_name);
@@ -36,13 +36,14 @@ class PluginManager
3636
bool StartPlugin(std::string plugin_name);
3737
void StopPlugin(std::string plugin_name);
3838

39-
Plugin *FetchPlugin(std::string name);
39+
Plugin* FetchPlugin(std::string name);
4040

41-
std::vector<Plugin *> GetPluginsList();
41+
std::vector<Plugin*> GetPluginsList();
4242

43-
EventResult ExecuteEvent(std::string invokedBy, std::string eventName, std::string eventPayload, PluginEvent *event);
43+
EventResult ExecuteEvent(std::string invokedBy, std::string eventName, std::string eventPayload, PluginEvent* event);
4444
};
4545

46-
extern PluginManager *g_pluginManager;
46+
extern PluginManager* g_pluginManager;
47+
extern std::map<std::string, std::string> pluginBasePaths;
4748

4849
#endif

src/plugins/core/scripting/utils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ std::string scripting_GetPluginPath(std::string plugin_name)
4141
Plugin* plugin = g_pluginManager->FetchPlugin(plugin_name);
4242
if (!plugin) return "";
4343

44-
return string_format("addons/swiftly/plugins/%s", plugin->GetName().c_str());
44+
return string_format("%s/%s", pluginBasePaths[plugin_name].c_str(), plugin->GetName().c_str());
4545
}
4646

4747
PluginUserMessage scripting_GetUserMessage(std::string uuid)

src/plugins/lua/LuaPlugin.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ bool LuaPlugin::LoadScriptingEnvironment()
102102

103103
luabridge::setGlobal(this->state, NULL, "AddGlobalEvents");
104104

105-
std::vector<std::string> files = Files::FetchFileNames("addons/swiftly/plugins/" + this->GetName());
105+
std::vector<std::string> files = Files::FetchFileNames(pluginBasePaths[this->GetName()] + "/" + this->GetName());
106106
for (std::string file : files)
107107
{
108108
if (ends_with(file, ".lua"))

0 commit comments

Comments
 (0)