ModResult DoMsg(User *user, void *dest, int target_type, std::string &text, char status, CUList &exempt_list, bool privmsg) { if (!IS_LOCAL(user) || target_type != TYPE_CHANNEL || status) return MOD_RES_PASSTHRU; Channel* chan = static_cast<Channel*>(dest); ModResult res = ServerInstance->OnCheckExemption(user,chan,"opmoderated"); if (res == MOD_RES_ALLOW) return MOD_RES_PASSTHRU; if (!chan->GetExtBanStatus(user, 'u').check(!chan->IsModeSet(&mh)) && chan->GetPrefixValue(user) < VOICE_VALUE) { FOREACH_MOD(I_OnText,OnText(user,chan,TYPE_CHANNEL,text,status,exempt_list)); chan->WriteAllExcept(user, false, '@', exempt_list, "%s @%s :%s", privmsg ? "PRIVMSG" : "NOTICE", chan->name.c_str(), text.c_str()); if (privmsg) { FOREACH_MOD(I_OnUserMessage,OnUserMessage(user,chan,TYPE_CHANNEL,text,'@',exempt_list)); } else FOREACH_MOD(I_OnUserNotice,OnUserNotice(user,chan,TYPE_CHANNEL,text,'@',exempt_list)); return MOD_RES_DENY; } return MOD_RES_PASSTHRU; }
ModResult OnUserPreMessage(User* user, const MessageTarget& target, MessageDetails& details) override { if (!IS_LOCAL(user)) return MOD_RES_PASSTHRU; std::string ctcpname; if (!details.IsCTCP(ctcpname) || irc::equals(ctcpname, "ACTION")) return MOD_RES_PASSTHRU; if (target.type == MessageTarget::TYPE_CHANNEL) { Channel* c = target.Get<Channel>(); ModResult res = CheckExemption::Call(exemptionprov, user, c, "noctcp"); if (res == MOD_RES_ALLOW) return MOD_RES_PASSTHRU; if (!c->GetExtBanStatus(user, 'C').check(!c->IsModeSet(nc))) { user->WriteNumeric(ERR_CANNOTSENDTOCHAN, c->name, "Can't send CTCP to channel (+C set)"); return MOD_RES_DENY; } } else if (target.type == MessageTarget::TYPE_USER) { User* u = target.Get<User>(); if (u->IsModeSet(ncu)) { user->WriteNumeric(ERR_CANTSENDTOUSER, u->nick, "Can't send CTCP to user (+T set)"); return MOD_RES_PASSTHRU; } } return MOD_RES_PASSTHRU; }
virtual ModResult OnUserPreNick(User* user, const std::string &newnick) { if (!IS_LOCAL(user)) return MOD_RES_PASSTHRU; // Allow forced nick changes. if (ServerInstance->NICKForced.get(user)) return MOD_RES_PASSTHRU; for (UCListIter i = user->chans.begin(); i != user->chans.end(); i++) { Channel* curr = *i; ModResult res = ServerInstance->OnCheckExemption(user,curr,"nonick"); if (res == MOD_RES_ALLOW) continue; if (override && IS_OPER(user)) continue; if (!curr->GetExtBanStatus(user, 'N').check(!curr->IsModeSet('N'))) { user->WriteNumeric(ERR_CANTCHANGENICK, "%s :Can't change nickname while on %s (+N is set)", user->nick.c_str(), curr->name.c_str()); return MOD_RES_DENY; } } return MOD_RES_PASSTHRU; }
virtual ModResult OnUserPreMessage(User *user, void *dest, int target_type, std::string &text, char status, CUList &exempt_list) { if (!IS_LOCAL(user) || target_type != TYPE_CHANNEL) return MOD_RES_PASSTHRU; Channel* chan = static_cast<Channel*>(dest); if (chan->GetExtBanStatus(user, 'w') == MOD_RES_DENY && chan->GetPrefixValue(user) < VOICE_VALUE) { return MOD_RES_DENY; } return MOD_RES_PASSTHRU; }
virtual ModResult OnUserPreNotice(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list) { ModResult res; if ((target_type == TYPE_CHANNEL) && (IS_LOCAL(user))) { Channel* c = (Channel*)dest; if (!c->GetExtBanStatus(user, 'T').check(!c->IsModeSet('T'))) { res = ServerInstance->OnCheckExemption(user,c,"nonotice"); if (res == MOD_RES_ALLOW) return MOD_RES_PASSTHRU; else { user->WriteNumeric(ERR_CANNOTSENDTOCHAN, "%s %s :Can't send NOTICE to channel (+T set)",user->nick.c_str(), c->name.c_str()); return MOD_RES_DENY; } } } return MOD_RES_PASSTHRU; }
virtual ModResult OnUserPreMessage(User* user,void* dest,int target_type, std::string &text, char status, CUList &exempt_list) { if (target_type == TYPE_CHANNEL) { if ((!IS_LOCAL(user)) || (text.length() < minlen)) return MOD_RES_PASSTHRU; Channel* c = (Channel*)dest; ModResult res = ServerInstance->OnCheckExemption(user,c,"blockcaps"); if (res == MOD_RES_ALLOW) return MOD_RES_PASSTHRU; if (!c->GetExtBanStatus(user, 'B').check(!c->IsModeSet('B'))) { int caps = 0; const char* actstr = "\1ACTION "; int act = 0; for (std::string::iterator i = text.begin(); i != text.end(); i++) { /* Smart fix for suggestion from Jobe, ignore CTCP ACTION (part of /ME) */ if (*actstr && *i == *actstr++ && act != -1) { act++; continue; } else act = -1; caps += capsmap[(unsigned char)*i]; } if ( ((caps*100)/(int)text.length()) >= percent ) { user->WriteNumeric(ERR_CANNOTSENDTOCHAN, "%s %s :Your message cannot contain more than %d%% capital letters if it's longer than %d characters", user->nick.c_str(), c->name.c_str(), percent, minlen); return MOD_RES_DENY; } } } return MOD_RES_PASSTHRU; }