- Channel* c = (Channel*)dest;
- if (!c->IsModeSet('C'))
- return MOD_RES_PASSTHRU;
-
- if ((text.empty()) || (text[0] != '\001') || (!strncmp(text.c_str(),"\1ACTION ",8)))
- return MOD_RES_PASSTHRU;
-
- ModResult res = ServerInstance->OnCheckExemption(user,c,"noctcp");
- if (res == MOD_RES_ALLOW)
- return MOD_RES_PASSTHRU;
-
- if (!c->GetExtBanStatus(user, 'C'))
+ case MessageTarget::TYPE_CHANNEL:
+ {
+ if (user->HasPrivPermission("channels/ignore-noctcp"))
+ return MOD_RES_PASSTHRU;
+
+ Channel* c = target.Get<Channel>();
+ const Channel::MemberMap& members = c->GetUsers();
+ for (Channel::MemberMap::const_iterator member = members.begin(); member != members.end(); ++member)
+ {
+ User* u = member->first;
+ if (u->IsModeSet(ncu))
+ details.exemptions.insert(u);
+ }
+
+ ModResult res = CheckExemption::Call(exemptionprov, user, c, "noctcp");
+ if (res == MOD_RES_ALLOW)
+ return MOD_RES_PASSTHRU;
+
+ if (c->IsModeSet(nc))
+ {
+ user->WriteNumeric(Numerics::CannotSendTo(c, "CTCPs", &nc));
+ return MOD_RES_DENY;
+ }
+
+ if (c->GetExtBanStatus(user, 'C') == MOD_RES_DENY)
+ {
+ user->WriteNumeric(Numerics::CannotSendTo(c, "CTCPs", 'C', "noctcp"));
+ return MOD_RES_DENY;
+ }
+ break;
+ }
+ case MessageTarget::TYPE_USER: