X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmode.cpp;h=7290248619fbf0a631b6d6b7ee56a8d5054c6583;hb=5afabf1b3c0f3aff6c0ed9f9dc568c5895eae417;hp=64552c124a591a56c0d12583b40ddae41cada449;hpb=8c78ebb3e8ecbd98dc0ce894e43222776013cd7c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/mode.cpp b/src/mode.cpp index 64552c124..729024861 100644 --- a/src/mode.cpp +++ b/src/mode.cpp @@ -23,11 +23,7 @@ using namespace std; #include #include #include -#ifdef GCC3 -#include -#else -#include -#endif +#include "hash_map.h" #include #include #include @@ -46,9 +42,14 @@ using namespace std; #include "helperfuncs.h" #include "mode.h" +/* +s (secret) */ #include "modes/cmode_s.h" +/* +p (private) */ #include "modes/cmode_p.h" +/* +b (bans) */ #include "modes/cmode_b.h" +/* +m (moderated) */ +#include "modes/cmode_m.h" extern int MODCOUNT; extern std::vector modules; @@ -58,7 +59,8 @@ extern ServerConfig* Config; extern time_t TIME; -ModeHandler::ModeHandler(char modeletter, int parameters_on, int parameters_off, bool listmode, ModeType type, bool operonly) : mode(modeletter), n_params_on(parameters_on), n_params_off(parameters_off), list(listmode), m_type(type), oper(operonly) +ModeHandler::ModeHandler(char modeletter, int parameters_on, int parameters_off, bool listmode, ModeType type, bool operonly) + : mode(modeletter), n_params_on(parameters_on), n_params_off(parameters_off), list(listmode), m_type(type), oper(operonly) { } @@ -565,6 +567,49 @@ void cmd_mode::Handle (char **parameters, int pcnt, userrec *user) return; } +void ModeParser::CleanMask(std::string &mask) +{ + std::string::size_type pos_of_pling = mask.find_first_of('!'); + std::string::size_type pos_of_at = mask.find_first_of('@'); + std::string::size_type pos_of_dot = mask.find_first_of('.'); + std::string::size_type pos_of_colon = mask.find_first_of(':'); /* Because ipv6 addresses are colon delimited */ + + if ((pos_of_pling == std::string::npos) && (pos_of_at == std::string::npos)) + { + /* Just a nick, or just a host */ + if ((pos_of_dot == std::string::npos) && (pos_of_colon == std::string::npos)) + { + /* It has no '.' in it, it must be a nick. */ + mask.append("!*@*"); + } + else + { + /* Got a dot in it? Has to be a host */ + mask = "*!*@" + mask; + } + } + else if ((pos_of_pling == std::string::npos) && (pos_of_at != std::string::npos)) + { + /* Has an @ but no !, its a user@host */ + mask = "*!" + mask; + } + else if ((pos_of_pling != std::string::npos) && (pos_of_at == std::string::npos)) + { + /* Has a ! but no @, it must be a nick!ident */ + mask.append("@*"); + } + + /* Check for dumb stuff like *@*!* + * swap the two items over so that at least the n!u@h ordering + * is correct even if the elements may not be + */ + if (pos_of_pling > pos_of_at) + { + mask.replace(pos_of_pling, 1, "@"); + mask.replace(pos_of_at, 1, "!"); + } +} + bool ModeParser::AddMode(ModeHandler* mh, unsigned const char modeletter) { unsigned char mask = 0; @@ -584,6 +629,7 @@ bool ModeParser::AddMode(ModeHandler* mh, unsigned const char modeletter) return false; modehandlers[pos] = mh; + log(DEBUG,"ModeParser::AddMode: added mode %c",modeletter); return true; } @@ -597,5 +643,6 @@ ModeParser::ModeParser() this->AddMode(new ModeChannelSecret, 's'); this->AddMode(new ModeChannelPrivate, 'p'); this->AddMode(new ModeChannelBan, 'b'); + this->AddMode(new ModeChannelModerated, 'm'); }