diff options
-rw-r--r-- | src/modules/m_opermodes.cpp | 81 |
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; } }; |