+ bool privdeafuline;
+
+ ModResult HandleChannel(User* source, Channel* target, CUList& exemptions, bool is_bypasschar, bool is_bypasschar_uline)
+ {
+ const Channel::MemberMap& ulist = target->GetUsers();
+ for (Channel::MemberMap::const_iterator i = ulist.begin(); i != ulist.end(); ++i)
+ {
+ User* member = i->first;
+
+ // Allow if the user doesn't have the mode set.
+ if (!member->IsModeSet(deafmode))
+ continue;
+
+ // Allow if the message begins with a uline char and the
+ // user is on a ulined server.
+ if (is_bypasschar_uline && member->server->IsULine())
+ continue;
+
+ // Allow if the prefix begins with a normal char and the
+ // user is not on a ulined server.
+ if (is_bypasschar && !member->server->IsULine())
+ continue;
+
+ exemptions.insert(member);
+ }
+
+ return MOD_RES_PASSTHRU;
+ }
+
+ ModResult HandleUser(User* source, User* target)
+ {
+ // Allow if the mode is not set.
+ if (!target->IsModeSet(privdeafmode))
+ return MOD_RES_PASSTHRU;
+
+ // Reject if the source is ulined and privdeafuline is disaled.
+ if (!privdeafuline && source->server->IsULine())
+ return MOD_RES_DENY;
+
+ // Reject if the source doesn't have the right priv.
+ if (!source->HasPrivPermission("users/ignore-privdeaf"))
+ return MOD_RES_DENY;
+
+ return MOD_RES_ALLOW;
+ }