X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules.cpp;h=f5129c83724389877f26ce08bb6cf0133fa9b262;hb=6b43da7511ca875b64e58b84f72dd89485c0e7fd;hp=1d20239d7f6c1a0c4caa3b4fa0ba0f862c4af4b8;hpb=7e6dfdf2118d4db84b85d19278a83186046ea2bb;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules.cpp b/src/modules.cpp index 1d20239d7..f5129c837 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -231,11 +231,12 @@ int Module::OnExtendedMode(userrec* user, void* target, char modechar, int type void Module::OnMode(userrec* user, void* dest, int target_type, std::string text) { }; Version Module::GetVersion() { return Version(1,0,0,0,VF_VENDOR); } void Module::OnOper(userrec* user, std::string opertype) { }; +void Module::OnPostOper(userrec* user, std::string opertype) { }; void Module::OnInfo(userrec* user) { }; void Module::OnWhois(userrec* source, userrec* dest) { }; int Module::OnUserPreInvite(userrec* source,userrec* dest,chanrec* channel) { return 0; }; -int Module::OnUserPreMessage(userrec* user,void* dest,int target_type, std::string &text) { return 0; }; -int Module::OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text) { return 0; }; +int Module::OnUserPreMessage(userrec* user,void* dest,int target_type, std::string &text,char status) { return 0; }; +int Module::OnUserPreNotice(userrec* user,void* dest,int target_type, std::string &text,char status) { return 0; }; int Module::OnUserPreNick(userrec* user, std::string newnick) { return 0; }; void Module::OnUserPostNick(userrec* user, std::string oldnick) { }; int Module::OnAccessCheck(userrec* source,userrec* dest,chanrec* channel,int access_type) { return ACR_DEFAULT; }; @@ -270,8 +271,8 @@ void Module::OnRawSocketAccept(int fd, std::string ip, int localport) { }; int Module::OnRawSocketWrite(int fd, char* buffer, int count) { return 0; }; void Module::OnRawSocketClose(int fd) { }; int Module::OnRawSocketRead(int fd, char* buffer, unsigned int count, int &readresult) { return 0; }; -void Module::OnUserMessage(userrec* user, void* dest, int target_type, std::string text) { }; -void Module::OnUserNotice(userrec* user, void* dest, int target_type, std::string text) { }; +void Module::OnUserMessage(userrec* user, void* dest, int target_type, std::string text, char status) { }; +void Module::OnUserNotice(userrec* user, void* dest, int target_type, std::string text, char status) { }; void Module::OnRemoteKill(userrec* source, userrec* dest, std::string reason) { }; void Module::OnUserInvite(userrec* source,userrec* dest,chanrec* channel) { }; void Module::OnPostLocalTopicChange(userrec* user, chanrec* chan, std::string topic) { }; @@ -281,6 +282,7 @@ void Module::OnSyncChannel(chanrec* chan, Module* proto, void* opaque) { }; void Module::ProtoSendMode(void* opaque, int target_type, void* target, std::string modeline) { }; void Module::OnSyncChannelMetaData(chanrec* chan, Module* proto,void* opaque, std::string extname) { }; void Module::OnSyncUserMetaData(userrec* user, Module* proto,void* opaque, std::string extname) { }; +void Module::OnSyncOtherMetaData(Module* proto, void* opaque) { }; void Module::OnDecodeMetaData(int target_type, void* target, std::string extname, std::string extdata) { }; void Module::ProtoSendMetaData(void* opaque, int target_type, void* target, std::string extname, std::string extdata) { }; void Module::OnWallops(userrec* user, std::string text) { }; @@ -298,7 +300,10 @@ void Module::OnDelQLine(userrec* source, std::string nickmask) { }; void Module::OnDelELine(userrec* source, std::string hostmask) { }; void Module::OnCleanup(int target_type, void* item) { }; void Module::Implements(char* Implements) { for (int j = 0; j < 255; j++) Implements[j] = 0; }; +void Module::OnChannelDelete(chanrec* chan) { }; Priority Module::Prioritize() { return PRIORITY_DONTCARE; } +void Module::OnSetAway(userrec* user) { }; +void Module::OnCancelAway(userrec* user) { }; /* server is a wrapper class that provides methods to all of the C-style * exports in the core @@ -334,6 +339,30 @@ void Server::RemoveSocket(InspSocket* sock) } } +long Server::PriorityAfter(std::string modulename) +{ + for (unsigned int j = 0; j < Config->module_names.size(); j++) + { + if (Config->module_names[j] == modulename) + { + return ((j << 8) | PRIORITY_AFTER); + } + } + return PRIORITY_DONTCARE; +} + +long Server::PriorityBefore(std::string modulename) +{ + for (unsigned int j = 0; j < Config->module_names.size(); j++) + { + if (Config->module_names[j] == modulename) + { + return ((j << 8) | PRIORITY_BEFORE); + } + } + return PRIORITY_DONTCARE; +} + void Server::RehashServer() { WriteOpers("*** Rehashing config file"); @@ -362,6 +391,34 @@ void Server::DelSocket(InspSocket* sock) } } +long Server::GetChannelCount() +{ + return (long)chanlist.size(); +} + +/* This is ugly, yes, but hash_map's arent designed to be + * addressed in this manner, and this is a bit of a kludge. + * Luckily its a specialist function and rarely used by + * many modules (in fact, it was specially created to make + * m_safelist possible, initially). + */ + +chanrec* Server::GetChannelIndex(long index) +{ + int target = 0; + for (chan_hash::iterator n = chanlist.begin(); n != chanlist.end(); n++, target++) + { + if (index == target) + return n->second; + } + return NULL; +} + +void Server::AddTimer(InspTimer* T) +{ + ::AddTimer(T); +} + void Server::SendOpers(std::string s) { WriteOpers("%s",s.c_str()); @@ -394,12 +451,9 @@ chanuserlist Server::GetUsers(chanrec* chan) { chanuserlist userl; userl.clear(); - std::map *list = chan->GetUsers(); - for (std::map::iterator i = list->begin(); i != list->end(); i++) - { - char* o = i->second; - userl.push_back((userrec*)o); - } + CUList *list = chan->GetUsers(); + for (CUList::iterator i = list->begin(); i != list->end(); i++) + userl.push_back(i->second); return userl; } void Server::ChangeUserNick(userrec* user, std::string nickname) @@ -407,6 +461,18 @@ void Server::ChangeUserNick(userrec* user, std::string nickname) force_nickchange(user,nickname.c_str()); } +void Server::KickUser(userrec* source, userrec* target, chanrec* chan, std::string reason) +{ + if (source) + { + kick_channel(source,target,chan,(char*)reason.c_str()); + } + else + { + server_kick_channel(target,chan,(char*)reason.c_str(),true); + } +} + void Server::QuitUser(userrec* user, std::string reason) { kill_link(user,reason.c_str()); @@ -417,9 +483,9 @@ bool Server::IsUlined(std::string server) return is_uline(server.c_str()); } -void Server::CallCommandHandler(std::string commandname, char** parameters, int pcnt, userrec* user) +bool Server::CallCommandHandler(std::string commandname, char** parameters, int pcnt, userrec* user) { - ServerInstance->Parser->CallHandler(commandname,parameters,pcnt,user); + return ServerInstance->Parser->CallHandler(commandname,parameters,pcnt,user); } bool Server::IsValidModuleCommand(std::string commandname, int pcnt, userrec* user) @@ -434,7 +500,11 @@ void Server::Log(int level, std::string s) void Server::AddCommand(command_t *f) { - ServerInstance->Parser->CreateCommand(f); + if (!ServerInstance->Parser->CreateCommand(f)) + { + ModuleException err("Command "+std::string(f->command)+" already exists."); + throw (err); + } } void Server::SendMode(char **parameters, int pcnt, userrec *user) @@ -462,7 +532,7 @@ void Server::SendTo(userrec* Source, userrec* Dest, std::string s) if (!Source) { // if source is NULL, then the message originates from the local server - Write(Dest->fd,":%s %s",this->GetServerName().c_str(),s.c_str()); + WriteServ_NoFormat(Dest->fd,s.c_str()); } else { @@ -484,7 +554,7 @@ void Server::SendChannel(userrec* User, chanrec* Channel, std::string s,bool Inc } else { - ChanExceptSender_NoFormat(Channel,User,s.c_str()); + ChanExceptSender_NoFormat(Channel,User,0,s.c_str()); } } @@ -493,6 +563,22 @@ bool Server::CommonChannels(userrec* u1, userrec* u2) return (common_channels(u1,u2) != 0); } +void Server::DumpText(userrec* User, std::string LinePrefix, stringstream &TextStream) +{ + std::string CompleteLine = LinePrefix; + std::string Word = ""; + while (TextStream >> Word) + { + if (CompleteLine.length() + Word.length() + 3 > 500) + { + WriteServ_NoFormat(User->fd,CompleteLine.c_str()); + CompleteLine = LinePrefix; + } + CompleteLine = CompleteLine + Word + " "; + } + WriteServ_NoFormat(User->fd,CompleteLine.c_str()); +} + void Server::SendCommon(userrec* User, std::string text,bool IncludeSender) { if (IncludeSender) @@ -545,11 +631,6 @@ std::string Server::ChanMode(userrec* User, chanrec* Chan) return cmode(User,Chan); } -bool Server::IsOnChannel(userrec* User, chanrec* Chan) -{ - return has_channel(User,Chan); -} - std::string Server::GetServerName() { return Config->ServerName; @@ -578,24 +659,28 @@ bool Server::AddExtendedMode(char modechar, int type, bool requires_oper, int pa { if (type == MT_SERVER) { - log(DEBUG,"*** API ERROR *** Modes of type MT_SERVER are reserved for future expansion"); + ModuleException e("Modes of type MT_SERVER are reserved for future expansion"); + throw(e); return false; } if (((params_when_on>0) || (params_when_off>0)) && (type == MT_CLIENT)) { - log(DEBUG,"*** API ERROR *** Parameters on MT_CLIENT modes are not supported"); + ModuleException e("Parameters on MT_CLIENT modes are not supported"); + throw(e); return false; } if ((params_when_on>1) || (params_when_off>1)) { - log(DEBUG,"*** API ERROR *** More than one parameter for an MT_CHANNEL mode is not yet supported"); + ModuleException e("More than one parameter for an MT_CHANNEL mode is not yet supported"); + throw(e); return false; } return DoAddExtendedMode(modechar,type,requires_oper,params_when_on,params_when_off); } else { - log(DEBUG,"*** API ERROR *** Muppet modechar detected."); + ModuleException e("Muppet modechar detected."); + throw(e); } return false; } @@ -642,16 +727,19 @@ bool Server::PseudoToUser(userrec* alive,userrec* zombie,std::string message) alive->fd = FD_MAGIC_NUMBER; alive->FlushWriteBuf(); alive->ClearBuffer(); - Write(zombie->fd,":%s!%s@%s NICK %s",alive->nick,alive->ident,alive->host,zombie->nick); + // save these for later + std::string oldnick = alive->nick; + std::string oldhost = alive->host; + std::string oldident = alive->ident; kill_link(alive,message.c_str()); - if (find(local_users.begin(),local_users.end(),alive) != local_users.end()) { local_users.erase(find(local_users.begin(),local_users.end(),alive)); log(DEBUG,"Delete local user"); } - + // Fix by brain - cant write the user until their fd table entry is updated fd_ref_table[zombie->fd] = zombie; + Write(zombie->fd,":%s!%s@%s NICK %s",oldnick.c_str(),oldident.c_str(),oldhost.c_str(),zombie->nick); for (unsigned int i = 0; i < zombie->chans.size(); i++) { if (zombie->chans[i].channel != NULL) @@ -734,26 +822,26 @@ long Server::CalcDuration(std::string delta) bool Server::IsValidMask(std::string mask) { - const char* dest = mask.c_str(); + char* dest = (char*)mask.c_str(); if (strchr(dest,'!')==0) return false; if (strchr(dest,'@')==0) return false; - for (unsigned int i = 0; i < strlen(dest); i++) - if (dest[i] < 32) + for (char* i = dest; *i; i++) + if (*i < 32) return false; - for (unsigned int i = 0; i < strlen(dest); i++) - if (dest[i] > 126) + for (char* i = dest; *i; i++) + if (*i > 126) return false; unsigned int c = 0; - for (unsigned int i = 0; i < strlen(dest); i++) - if (dest[i] == '!') + for (char* i = dest; *i; i++) + if (*i == '!') c++; if (c>1) return false; c = 0; - for (unsigned int i = 0; i < strlen(dest); i++) - if (dest[i] == '@') + for (char* i = dest; *i; i++) + if (*i == '@') c++; if (c>1) return false; @@ -849,9 +937,9 @@ long ConfigReader::ReadInteger(std::string tag, std::string name, int index, boo this->error = CONF_VALUE_NOT_FOUND; return 0; } - for (unsigned int i = 0; i < strlen(val); i++) + for (char* i = val; *i; i++) { - if (!isdigit(val[i])) + if (!isdigit(*i)) { this->error = CONF_NOT_A_NUMBER; return 0;