+ for (ModuleManager::ModuleMap::const_iterator i = modlist.begin(); i != modlist.end(); ++i)
+ {
+ Module* const mod = i->second;
+ // 3.0 advertises its settings for the benefit of services
+ // 2.0 would bork on this
+ if (proto_version < PROTO_INSPIRCD_30 && mod->ModuleSourceFile == "m_kicknorejoin.so")
+ continue;
+
+ bool do_compat_include = false;
+ if (proto_version < PROTO_INSPIRCD_30)
+ {
+ for (size_t j = 0; j < sizeof(compatmods)/sizeof(compatmods[0]); j++)
+ {
+ if ((compatmods[j].listflag & filter) && (mod->ModuleSourceFile == compatmods[j].name))
+ {
+ do_compat_include = true;
+ break;
+ }
+ }
+ }
+
+ Version v = mod->GetVersion();
+ if ((!do_compat_include) && (!(v.Flags & filter)))
+ continue;
+
+ capabilities.push_back(' ');
+ capabilities.append(i->first);
+ if (!v.link_data.empty())
+ {
+ capabilities.push_back('=');
+ capabilities.append(v.link_data);
+ }
+ }
+
+ // If we are linked in a 2.0 server and have an ascii casemapping
+ // advertise it as m_ascii.so from inspircd-extras
+ if ((filter & VF_COMMON) && ServerInstance->Config->CaseMapping == "ascii" && proto_version == PROTO_INSPIRCD_20)
+ capabilities.append(" m_ascii.so");
+
+ if (capabilities.empty())
+ return capabilities;
+
+ return capabilities.substr(1);
+}
+
+std::string TreeSocket::BuildModeList(ModeType mtype)
+{
+ 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)