- ExtensionItem* item = Extensible::GetItem(i->first);
- std::string value;
- if (item)
- value = item->serialize(FORMAT_USER, ext, i->second);
- if (value.empty())
- dumpkeys << " " << i->first;
- else
- ServerInstance->DumpText(user, checkstr + " meta:" + i->first + " " + value);
+ CheckContext::List listmode(*this, "listmode");
+ listmode.Add(ConvToStr(mode->GetModeChar()));
+ listmode.Add(i->mask);
+ listmode.Add(i->setter);
+ listmode.Add(FormatTime(i->time));
+ listmode.Flush();
+ }
+ }
+
+ void DumpExt(Extensible* ext)
+ {
+ CheckContext::List extlist(*this, "metadata");
+ for(Extensible::ExtensibleStore::const_iterator i = ext->GetExtList().begin(); i != ext->GetExtList().end(); ++i)
+ {
+ ExtensionItem* item = i->first;
+ std::string value = item->ToHuman(ext, i->second);
+ if (!value.empty())
+ Write("meta:" + item->name, value);
+ else if (!item->name.empty())
+ extlist.Add(item->name);
+ }
+
+ extlist.Flush();
+ }
+
+ class List : public Numeric::GenericBuilder<' ', false, Numeric::WriteRemoteNumericSink>
+ {
+ public:
+ List(CheckContext& context, const char* checktype)
+ : Numeric::GenericBuilder<' ', false, Numeric::WriteRemoteNumericSink>(Numeric::WriteRemoteNumericSink(context.GetUser()), RPL_CHECK, false, (IS_LOCAL(context.GetUser()) ? context.GetUser()->nick.length() : ServerInstance->Config->Limits.NickMax) + strlen(checktype) + 1)
+ {
+ GetNumeric().push(checktype).push(std::string());
+ }
+ };
+};
+
+/** Handle /CHECK
+ */
+class CommandCheck : public Command
+{
+ UserModeReference snomaskmode;
+
+ std::string GetSnomasks(User* user)
+ {
+ std::string ret;
+ if (snomaskmode)
+ ret = snomaskmode->GetUserParameter(user);
+
+ if (ret.empty())
+ ret = "+";
+ return ret;
+ }
+
+ static std::string GetAllowedOperOnlyModes(LocalUser* user, ModeType modetype)
+ {
+ std::string ret;
+ const ModeParser::ModeHandlerMap& modes = ServerInstance->Modes.GetModes(modetype);
+ for (ModeParser::ModeHandlerMap::const_iterator i = modes.begin(); i != modes.end(); ++i)
+ {
+ const ModeHandler* const mh = i->second;
+ if ((mh->NeedsOper()) && (user->HasModePermission(mh)))
+ ret.push_back(mh->GetModeChar());