+ std::vector<std::string> modes;
+ const ModeParser::ModeHandlerMap& mhs = ServerInstance->Modes.GetModes(mtype);
+ for (ModeParser::ModeHandlerMap::const_iterator i = mhs.begin(); i != mhs.end(); ++i)
+ {
+ const ModeHandler* const mh = i->second;
+ const PrefixMode* const pm = mh->IsPrefixMode();
+ std::string mdesc;
+ if (proto_version >= PROTO_INSPIRCD_30)
+ {
+ if (pm)
+ mdesc.append("prefix:").append(ConvToStr(pm->GetPrefixRank())).push_back(':');
+ else if (mh->IsListMode())
+ mdesc.append("list:");
+ else if (mh->NeedsParam(true))
+ mdesc.append(mh->NeedsParam(false) ? "param:" : "param-set:");
+ else
+ mdesc.append("simple:");
+ }
+ mdesc.append(mh->name);
+ mdesc.push_back('=');
+ if (pm)
+ {
+ if (pm->GetPrefix())
+ mdesc.push_back(pm->GetPrefix());
+ }
+ mdesc.push_back(mh->GetModeChar());
+ modes.push_back(mdesc);
+ }
+ std::sort(modes.begin(), modes.end());
+ return stdalgo::string::join(modes);
+}
+
+void TreeSocket::SendCapabilities(int phase)
+{
+ if (capab->capab_phase >= phase)