+#include "modules/whois.h"
+
+enum
+{
+ // From RFC 1459.
+ RPL_WHOISUSER = 311,
+ RPL_WHOISOPERATOR = 313,
+ RPL_WHOISIDLE = 317,
+ RPL_WHOISCHANNELS = 319,
+
+ // From UnrealIRCd.
+ RPL_WHOISHOST = 378,
+ RPL_WHOISMODES = 379,
+
+ // InspIRCd-specific.
+ RPL_CHANNELSMSG = 651
+};
+
+enum SplitWhoisState
+{
+ // Don't split private/secret channels into a separate RPL_WHOISCHANNELS numeric.
+ SPLITWHOIS_NONE,
+
+ // Split private/secret channels into a separate RPL_WHOISCHANNELS numeric.
+ SPLITWHOIS_SPLIT,
+
+ // Split private/secret channels into a separate RPL_WHOISCHANNELS numeric with RPL_CHANNELSMSG to explain the split.
+ SPLITWHOIS_SPLITMSG
+};
+
+class WhoisContextImpl : public Whois::Context
+{
+ Events::ModuleEventProvider& lineevprov;
+
+ public:
+ WhoisContextImpl(LocalUser* src, User* targ, Events::ModuleEventProvider& evprov)
+ : Whois::Context(src, targ)
+ , lineevprov(evprov)
+ {
+ }
+
+ using Whois::Context::SendLine;
+ void SendLine(Numeric::Numeric& numeric) CXX11_OVERRIDE;
+};
+
+void WhoisContextImpl::SendLine(Numeric::Numeric& numeric)
+{
+ ModResult MOD_RESULT;
+ FIRST_MOD_RESULT_CUSTOM(lineevprov, Whois::LineEventListener, OnWhoisLine, MOD_RESULT, (*this, numeric));
+
+ if (MOD_RESULT != MOD_RES_DENY)
+ source->WriteNumeric(numeric);
+}