-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodules.cpp
82 lines (73 loc) · 1.98 KB
/
modules.cpp
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 "modules.h"
#include "irc.h"
#include "game.h"
ModulesClass Modules;
vector<Module*> ModuleList;
bool ModulesClass::LoadModule(string FileName_)
{
FileName_.insert(0, STR_MOD_PATH);
if (FileName.size() > 0) {
for (int i = 0; i < FileName.size(); ++i) {
if (FileName_ == FileName[i]) {
cout << "This module is already loaded.\n";
return false;
}
}
}
LibHandle.push_back(dlopen(FileName_.c_str(), RTLD_LAZY));
if (!LibHandle[LibHandle.size()-1])
{
IRCServer.SendNotice(dlerror(), "GeekyLink");
LibHandle.pop_back();
return false;
}
// This runs the Init(); function
typedef void* InitFunc(int);
InitFunc * InitPoint = (InitFunc*) dlsym(LibHandle[LibHandle.size()-1], "InitModule");
if (!InitPoint) {
IRCServer.SendNotice(dlerror(), "GeekyLink");
LibHandle.pop_back();
return false;
}
ModuleList.push_back((Module *) (*InitPoint)(ModuleList.size()));
FileName.push_back(FileName_);
return true;
}
// Unload the module, and remove its vector entries
bool ModulesClass::UnloadModule(int ID)
{
dlclose(LibHandle[ID]);
LibHandle.erase(LibHandle.begin()+ID);
FileName.erase(FileName.begin()+ID);
ModuleList.erase(ModuleList.begin()+ID);
for (int i = 0; i < Trigger.size();) {
if (Trigger[i].Module == ID) {
Trigger.erase(Trigger.begin()+i);
continue;
}
/* We got to move any triggers for modules loaded after this module back one */
if (Trigger[i].Module > ID) --Trigger[i].Module;
++i;
}
return true;
}
// Find the module from the filename and then unload it
bool ModulesClass::UnloadModule(string FileName_)
{
FileName_.insert(0, STR_MOD_PATH);
if (FileName.size() > 0) {
for (int i = 0; i < FileName.size(); ++i) {
if (FileName[i] == FileName_) return UnloadModule(i);
}
}
return false;
}
//
void ModulesClass::Register(string Trigger_, int ModID)
{
TriggerS TempTrigger;
TempTrigger.Word = Trigger_;
TempTrigger.Module = ModID;
Trigger.push_back(TempTrigger);
cout << "Registering " << Trigger_ << " with mod " << ModID << endl;
}