/* $ModDesc: Provides a spanning tree server link protocol */
#include "inspircd.h"
-#include "configreader.h"
-#include "users.h"
-#include "channels.h"
-#include "modules.h"
#include "commands/cmd_whois.h"
#include "commands/cmd_stats.h"
#include "socket.h"
std::deque<std::string> params;
params.push_back(found->GetName());
params.push_back(user->uuid);
- Utils->DoOneToOne(ServerInstance->Config->ServerName,"TIME",params,found->GetName());
+ Utils->DoOneToOne(ServerInstance->Config->GetSID(),"TIME",params,found->GetName());
}
else
{
{
if (serv->AnsweredLastPing())
{
- sock->WriteLine(std::string(":")+ServerInstance->Config->ServerName+" PING "+serv->GetName());
+ sock->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" PING "+serv->GetName());
serv->SetNextPingTime(curtime + Utils->PingFreq);
serv->LastPing = curtime;
timeval t;
ServerInstance->SNO->WriteToSnoMask('l', "%s", text);
params.push_back("l");
params.push_back(std::string(":") + text);
- Utils->DoOneToMany(ServerInstance->Config->ServerName, "SNONOTICE", params);
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(), "SNONOTICE", params);
}
else
{
user->WriteServ("NOTICE %s :%s", user->nick, text);
else
{
- params.push_back(user->uid);
+ params.push_back(user->uuid);
params.push_back(std::string("::") + ServerInstance->Config->ServerName + " NOTICE " + user->nick + " :*** From " +
ServerInstance->Config->ServerName+ ": " + text);
- Utils->DoOneToMany(ServerInstance->Config->ServerName, "PUSH", params);
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(), "PUSH", params);
}
}
}
std::deque<std::string> params;
params.push_back(ConvToStr(ServerInstance->Time(false)));
params.push_back("FORCE");
- Utils->DoOneToMany(Utils->TreeRoot->GetName(), "TIMESET", params);
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(), "TIMESET", params);
}
}
{
if ((result == CMD_SUCCESS) && (ServerInstance->IsValidModuleCommand(command, pcnt, user)))
{
+ /* Safe, we know its non-null because IsValidModuleCommand returned true */
+ command_t* thiscmd = ServerInstance->Parser->GetHandler(command);
// this bit of code cleverly routes all module commands
// to all remote severs *automatically* so that modules
// can just handle commands locally, without having
// commands and linking protocols.
std::deque<std::string> params;
params.clear();
+ int n_translate = thiscmd->translation.size();
+ TranslateType translate_to;
+
for (int j = 0; j < pcnt; j++)
{
- /* XXX UID: Translate nicks in this list to UIDs, potentially using some form of lookup
- * table that specifies a value type for each parameter, as part of the command_t.
- */
- if (strchr(parameters[j],' '))
+ std::string target;
+
+ /* Map all items to UUIDs where neccessary */
+ if (j < n_translate)
{
- params.push_back(":" + std::string(parameters[j]));
+ /* We have a translation mapping for this index */
+ translate_to = thiscmd->translation[j] != TR_END ? thiscmd->translation[j] : TR_TEXT;
}
else
- {
- params.push_back(std::string(parameters[j]));
- }
+ translate_to = TR_TEXT;
+
+ ServerInstance->Log(DEBUG,"TRANSLATION: %s - type is %d", parameters[j], translate_to);
+ ServerInstance->Parser->TranslateUIDs(translate_to, parameters[j], target);
+
+ if (strchr(parameters[j],' '))
+ params.push_back(":" + target);
+ else
+ params.push_back(target);
}
Utils->DoOneToMany(user->uuid, command, params);
}
params.push_back(channel->name);
params.push_back(ConvToStr(channel->age));
params.push_back(std::string(channel->GetAllPrefixChars(user))+","+std::string(user->uuid));
- Utils->DoOneToMany(ServerInstance->Config->ServerName,"FJOIN",params);
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(),"FJOIN",params);
/* First user in, sync the modes for the channel */
params.pop_back();
params.push_back(channel->ChanModes(true));
- Utils->DoOneToMany(ServerInstance->Config->ServerName,"FMODE",params);
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(),"FMODE",params);
}
else
{
params.push_back("+"+std::string(user->FormatModes()));
params.push_back(user->GetIPString());
params.push_back(":"+std::string(user->fullname));
- Utils->DoOneToMany(ServerInstance->Config->ServerName, "UID", params);
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(), "UID", params);
// User is Local, change needs to be reflected!
TreeServer* SourceServer = Utils->FindServer(user->server);
if (SourceServer)
{
std::deque<std::string> params;
params.push_back(user->nick);
+
+ /** IMPORTANT: We don't update the TS if the oldnick is just a case change of the newnick!
+ */
+ if (irc::string(user->nick) != assign(oldnick))
+ user->age = ServerInstance->Time(true);
+
+ params.push_back(ConvToStr(user->age));
Utils->DoOneToMany(user->uuid,"NICK",params);
}
}
params.push_back(chan->name);
params.push_back(user->uuid);
params.push_back(":"+reason);
- Utils->DoOneToMany(ServerInstance->Config->ServerName,"KICK",params);
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(),"KICK",params);
}
}
{
std::deque<std::string> params;
params.push_back(parameter);
- Utils->DoOneToMany(user ? user->nick : ServerInstance->Config->ServerName, "REHASH", params);
+ Utils->DoOneToMany(user ? user->nick : ServerInstance->Config->GetSID(), "REHASH", params);
// check for self
if (ServerInstance->MatchText(ServerInstance->Config->ServerName,parameter))
{
(unsigned long)duration, reason.c_str());
std::deque<std::string> params;
params.push_back(data);
- Utils->DoOneToMany(ServerInstance->Config->ServerName, "ADDLINE", params);
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(), "ADDLINE", params);
}
else
{
{
std::deque<std::string> params;
std::string command;
+ std::string output_text;
+
+ ServerInstance->Parser->TranslateUIDs(TR_SPACENICKLIST, text, output_text);
if (target_type == TYPE_USER)
{
userrec* u = (userrec*)dest;
params.push_back(u->uuid);
- params.push_back(text);
+ params.push_back(output_text);
command = "MODE";
}
else
chanrec* c = (chanrec*)dest;
params.push_back(c->name);
params.push_back(ConvToStr(c->age));
- params.push_back(text);
+ params.push_back(output_text);
command = "FMODE";
}
- /* XXX UID: Translate nick parameters to uuids */
+
Utils->DoOneToMany(user->uuid, command, params);
}
}
void ModuleSpanningTree::ProtoSendMode(void* opaque, int target_type, void* target, const std::string &modeline)
{
TreeSocket* s = (TreeSocket*)opaque;
+ std::string output_text;
+
+ ServerInstance->Parser->TranslateUIDs(TR_SPACENICKLIST, modeline, output_text);
+
if (target)
{
if (target_type == TYPE_USER)
{
userrec* u = (userrec*)target;
- s->WriteLine(std::string(":")+ServerInstance->Config->ServerName+" FMODE "+u->uuid+" "+ConvToStr(u->age)+" "+modeline);
+ s->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" FMODE "+u->uuid+" "+ConvToStr(u->age)+" "+output_text);
}
else
{
chanrec* c = (chanrec*)target;
- /* XXX UID: Translate nicks in modeline to uids */
- s->WriteLine(std::string(":")+ServerInstance->Config->ServerName+" FMODE "+c->name+" "+ConvToStr(c->age)+" "+modeline);
+ s->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" FMODE "+c->name+" "+ConvToStr(c->age)+" "+output_text);
}
}
}
if (target_type == TYPE_USER)
{
userrec* u = (userrec*)target;
- s->WriteLine(std::string(":")+ServerInstance->Config->ServerName+" METADATA "+u->uuid+" "+extname+" :"+extdata);
+ s->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" METADATA "+u->uuid+" "+extname+" :"+extdata);
}
else if (target_type == TYPE_CHANNEL)
{
chanrec* c = (chanrec*)target;
- s->WriteLine(std::string(":")+ServerInstance->Config->ServerName+" METADATA "+c->name+" "+extname+" :"+extdata);
+ s->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" METADATA "+c->name+" "+extname+" :"+extdata);
}
}
if (target_type == TYPE_OTHER)
{
- s->WriteLine(std::string(":")+ServerInstance->Config->ServerName+" METADATA * "+extname+" :"+extdata);
+ s->WriteLine(std::string(":")+ServerInstance->Config->GetSID()+" METADATA * "+extname+" :"+extdata);
}
}
if (params->size() < 3)
return;
(*params)[2] = ":" + (*params)[2];
- Utils->DoOneToMany(ServerInstance->Config->ServerName,"METADATA",*params);
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(),"METADATA",*params);
}
else if (event->GetEventID() == "send_topic")
{
(*params)[1] = ":" + (*params)[1];
params->insert(params->begin() + 1,ServerInstance->Config->ServerName);
params->insert(params->begin() + 1,ConvToStr(ServerInstance->Time(true)));
- Utils->DoOneToMany(ServerInstance->Config->ServerName,"FTOPIC",*params);
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(),"FTOPIC",*params);
}
else if (event->GetEventID() == "send_mode")
{
return;
// Insert the TS value of the object, either userrec or chanrec
time_t ourTS = 0;
+ std::string output_text;
+
+ /* Warning: in-place translation is only safe for type TR_NICK */
+ for (size_t n = 0; n < params->size(); n++)
+ ServerInstance->Parser->TranslateUIDs(TR_NICK, (*params)[n], (*params)[n]);
+
userrec* a = ServerInstance->FindNick((*params)[0]);
if (a)
{
- *(params)[0] = a->uuid;
ourTS = a->age;
- Utils->DoOneToMany(ServerInstance->Config->ServerName,"MODE",*params);
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(),"MODE",*params);
return;
}
else
{
ourTS = a->age;
params->insert(params->begin() + 1,ConvToStr(ourTS));
- /* XXX UID: Translate modes in string to uids */
- Utils->DoOneToMany(ServerInstance->Config->ServerName,"FMODE",*params);
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(),"FMODE",*params);
}
}
}
{
if (params->size() < 2)
return;
- /* XXX UID: Translate modes in string to uids */
- Utils->DoOneToMany(ServerInstance->Config->ServerName,"MODE",*params);
+ std::string output_text;
+
+ /* Warning: in-place translation is only safe for type TR_NICK */
+ for (size_t n = 0; n < params->size(); n++)
+ ServerInstance->Parser->TranslateUIDs(TR_NICK, (*params)[n], (*params)[n]);
+
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(),"MODE",*params);
}
else if (event->GetEventID() == "send_opers")
{
if (params->size() < 1)
return;
(*params)[0] = ":" + (*params)[0];
- Utils->DoOneToMany(ServerInstance->Config->ServerName,"OPERNOTICE",*params);
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(),"OPERNOTICE",*params);
}
else if (event->GetEventID() == "send_modeset")
{
if (params->size() < 2)
return;
(*params)[1] = ":" + (*params)[1];
- Utils->DoOneToMany(ServerInstance->Config->ServerName,"MODENOTICE",*params);
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(),"MODENOTICE",*params);
}
else if (event->GetEventID() == "send_snoset")
{
if (params->size() < 2)
return;
(*params)[1] = ":" + (*params)[1];
- Utils->DoOneToMany(ServerInstance->Config->ServerName,"SNONOTICE",*params);
+ Utils->DoOneToMany(ServerInstance->Config->GetSID(),"SNONOTICE",*params);
}
else if (event->GetEventID() == "send_push")
{
(*params)[0] = a->uuid;
(*params)[1] = ":" + (*params)[1];
- Utils->DoOneToOne(ServerInstance->Config->ServerName, "PUSH", *params, a->server);
+ Utils->DoOneToOne(ServerInstance->Config->GetSID(), "PUSH", *params, a->server);
}
}