#include "inspircd.h" #include "inspircd_io.h" #include "inspircd_util.h" #include "inspircd_config.h" #include #include #include #include #include #include #include #include #ifdef GCC3 #include #else #include #endif #include #include #include #include #include #include #include #include #include "connection.h" #include "users.h" #include "servers.h" #include "ctables.h" #include "globals.h" #include "modules.h" #include "dynamic.h" #include "wildcard.h" #include "message.h" #include "mode.h" #include "xline.h" #ifdef GCC3 #define nspace __gnu_cxx #else #define nspace std #endif using namespace std; extern int MODCOUNT; extern vector modules; extern vector factory; extern int LogLevel; extern char ServerName[MAXBUF]; extern char Network[MAXBUF]; extern char ServerDesc[MAXBUF]; extern char AdminName[MAXBUF]; extern char AdminEmail[MAXBUF]; extern char AdminNick[MAXBUF]; extern char diepass[MAXBUF]; extern char restartpass[MAXBUF]; extern char motd[MAXBUF]; extern char rules[MAXBUF]; extern char list[MAXBUF]; extern char PrefixQuit[MAXBUF]; extern char DieValue[MAXBUF]; extern int debugging; extern int WHOWAS_STALE; extern int WHOWAS_MAX; extern int DieDelay; extern time_t startup_time; extern int NetBufferSize; int MaxWhoResults; extern time_t nb_start; extern std::vector fd_reap; extern std::vector module_names; extern int boundPortCount; extern int portCount; extern int UDPportCount; extern int ports[MAXSOCKS]; extern int defaultRoute; extern std::vector auth_cookies; extern std::stringstream config_f; extern serverrec* me[32]; extern FILE *log_file; using namespace std; std::vector custom_mode_params; chanrec::chanrec() { strcpy(name,""); strcpy(custom_modes,""); strcpy(topic,""); strcpy(setby,""); strcpy(key,""); created = topicset = limit = 0; topiclock = noexternal = inviteonly = moderated = secret = c_private = false; } void chanrec::SetCustomMode(char mode,bool mode_on) { if (mode_on) { char m[3]; m[0] = mode; m[1] = '\0'; if (!strchr(this->custom_modes,mode)) { strncat(custom_modes,m,MAXMODES); } log(DEBUG,"Custom mode %c set",mode); } else { char temp[MAXBUF]; int count = 0; for (int q = 0; q < strlen(custom_modes); q++) { if (custom_modes[q] != mode) { temp[count++] = mode; } } temp[count] = '\0'; strncpy(custom_modes,temp,MAXMODES); log(DEBUG,"Custom mode %c removed",mode); this->SetCustomModeParam(mode,"",false); } } void chanrec::SetCustomModeParam(char mode,char* parameter,bool mode_on) { log(DEBUG,"SetCustomModeParam called"); ModeParameter M; M.mode = mode; strcpy(M.channel,this->name); strcpy(M.parameter,parameter); if (mode_on) { log(DEBUG,"Custom mode parameter %c %s added",mode,parameter); custom_mode_params.push_back(M); } else { if (custom_mode_params.size()) { for (vector::iterator i = custom_mode_params.begin(); i < custom_mode_params.end(); i++) { if ((i->mode == mode) && (!strcasecmp(this->name,i->channel))) { log(DEBUG,"Custom mode parameter %c %s removed",mode,parameter); custom_mode_params.erase(i); return; } } } log(DEBUG,"*** BUG *** Attempt to remove non-existent mode parameter!"); } } bool chanrec::IsCustomModeSet(char mode) { log(DEBUG,"Checking ISCustomModeSet: %c %s",mode,this->custom_modes); return (strchr(this->custom_modes,mode) != 0); } std::string chanrec::GetModeParameter(char mode) { if (custom_mode_params.size()) { for (vector::iterator i = custom_mode_params.begin(); i < custom_mode_params.end(); i++) { if ((i->mode == mode) && (!strcasecmp(this->name,i->channel))) { return std::string(i->parameter); } } } return std::string(""); }