-bool TreeSocket::MetaData(const std::string &prefix, std::deque<std::string> ¶ms)
-{
- if (params.size() < 2)
- return true;
- else if (params.size() < 3)
- params.push_back("");
- TreeServer* ServerSource = Utils->FindServer(prefix);
- if (ServerSource)
+ Channel* c = ServerInstance->FindChan(params[0]);
+ if (!c)
+ return CMD_FAILURE;
+
+ time_t ChanTS = ConvToInt(params[1]);
+ if (!ChanTS)
+ return CMD_INVALID;
+
+ if (c->age < ChanTS)
+ // Their TS is newer than ours, discard this command and do not propagate
+ return CMD_FAILURE;
+
+ std::string value = params.size() < 4 ? "" : params[3];
+
+ ExtensionItem* item = ServerInstance->Extensions.GetItem(params[2]);
+ if (item)
+ item->unserialize(FORMAT_NETWORK, c, value);
+ FOREACH_MOD(I_OnDecodeMetaData,OnDecodeMetaData(c,params[2],value));
+ }
+ else