summaryrefslogtreecommitdiff
path: root/src/modules/m_opermodes.cpp
diff options
context:
space:
mode:
authorw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>2008-01-02 23:34:19 +0000
committerw00t <w00t@e03df62e-2008-0410-955e-edbf42e46eb7>2008-01-02 23:34:19 +0000
commit495261d7ad50c108aa09af2525bace2655aae58e (patch)
tree14376dacad725791ee81266618d0bcb3a363b7e8 /src/modules/m_opermodes.cpp
parentf5c3e3782bfeb3ffb634f86eadb8ffecbc36f176 (diff)
Totally untested patch to add <oper:modes> support. dz, test. Thanks ;p
git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@8616 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src/modules/m_opermodes.cpp')
-rw-r--r--src/modules/m_opermodes.cpp81
1 files changed, 51 insertions, 30 deletions
diff --git a/src/modules/m_opermodes.cpp b/src/modules/m_opermodes.cpp
index 6389b029d..545a3f103 100644
--- a/src/modules/m_opermodes.cpp
+++ b/src/modules/m_opermodes.cpp
@@ -57,47 +57,68 @@ class ModuleModesOnOper : public Module
for (int j =0; j < Conf->Enumerate("type"); j++)
{
std::string typen = Conf->ReadValue("type","name",j);
- if (!strcmp(typen.c_str(),user->oper))
+ if (typen == user->oper)
{
std::string ThisOpersModes = Conf->ReadValue("type","modes",j);
if (!ThisOpersModes.empty())
{
- char first = *(ThisOpersModes.c_str());
- if ((first != '+') && (first != '-'))
- ThisOpersModes = "+" + ThisOpersModes;
+ ApplyModes(user, ThisOpersModes);
+ }
+ break;
+ }
+ }
- std::string buf;
- stringstream ss(ThisOpersModes);
- vector<string> tokens;
+ if (!opername.empty()) // if user is local ..
+ {
+ for (int j = 0; j < Conf->Enumerate("oper"); j++)
+ {
+ if (opername == Conf->ReadValue("oper", "name", j))
+ {
+ std::string ThisOpersModes = Conf->ReadValue("oper", "modes", j);
+ if (!ThisOpersModes.empty())
+ {
+ ApplyModes(user, ThisOpersModes);
+ }
+ break;
+ }
+ }
+ }
+ }
- // split ThisOperModes into modes and mode params
- while (ss >> buf)
- tokens.push_back(buf);
+ void ApplyModes(User *u, std::string &smodes)
+ {
+ char first = *(smodes.c_str());
+ if ((first != '+') && (first != '-'))
+ smodes = "+" + smodes;
- int size = tokens.size() + 1;
- const char** modes = new const char*[size];
- modes[0] = user->nick;
+ std::string buf;
+ stringstream ss(smodes);
+ vector<string> tokens;
- // process mode params
- int i = 1;
- for (unsigned int k = 0; k < tokens.size(); k++)
- {
- modes[i] = tokens[k].c_str();
- i++;
- }
+ // split into modes and mode params
+ while (ss >> buf)
+ tokens.push_back(buf);
- std::deque<std::string> n;
- Event rmode((char *)&n, NULL, "send_mode_explicit");
- for (unsigned int j = 0; j < tokens.size(); j++)
- n.push_back(modes[j]);
+ int size = tokens.size() + 1;
+ const char** modes = new const char*[size];
+ modes[0] = u->nick;
- rmode.Send(ServerInstance);
- ServerInstance->SendMode(modes, size, user);
- delete [] modes;
- }
- break;
- }
+ // process mode params
+ int i = 1;
+ for (unsigned int k = 0; k < tokens.size(); k++)
+ {
+ modes[i] = tokens[k].c_str();
+ i++;
}
+
+ std::deque<std::string> n;
+ Event rmode((char *)&n, NULL, "send_mode_explicit");
+ for (unsigned int j = 0; j < tokens.size(); j++)
+ n.push_back(modes[j]);
+
+ rmode.Send(ServerInstance);
+ ServerInstance->SendMode(modes, size, u);
+ delete [] modes;
}
};