syntax = "<remote-server-mask> <servermask>";
}
- void Handle (const char** parameters, int pcnt, userrec *user)
+ CmdResult Handle (const char** parameters, int pcnt, userrec *user)
{
user->WriteServ("NOTICE %s :*** RCONNECT: Sending remote connect to \002%s\002 to connect server \002%s\002.",user->nick,parameters[0],parameters[1]);
/* Is this aimed at our server? */
const char* para[1];
para[0] = parameters[1];
Creator->OnPreCommand("CONNECT", para, 1, user, true);
+
+ return CMD_SUCCESS;
}
+
+ return CMD_FAILURE;
}
};
{
strparams[q] = params[q].c_str();
}
- if (!this->Instance->CallCommandHandler(command.c_str(), strparams, params.size(), who))
+ switch (this->Instance->CallCommandHandler(command.c_str(), strparams, params.size(), who))
{
- this->WriteLine("ERROR :Unrecognised command '"+std::string(command.c_str())+"' -- possibly loaded mismatched modules");
- return false;
+ case CMD_INVALID:
+ this->WriteLine("ERROR :Unrecognised command '"+std::string(command.c_str())+"' -- possibly loaded mismatched modules");
+ return false;
+ break;
+ case CMD_FAILURE:
+ return true;
+ break;
+ default:
+ break;
}
}
else
this->HandleVersion(parameters,pcnt,user);
return 1;
}
- else if (ServerInstance->IsValidModuleCommand(command, pcnt, user))
+
+ return 0;
+ }
+
+ virtual void OnPostCommand(const std::string &command, const char** parameters, int pcnt, userrec *user, CmdResult result)
+ {
+ if ((result == CMD_SUCCESS) && (ServerInstance->IsValidModuleCommand(command, pcnt, user)))
{
// this bit of code cleverly routes all module commands
// to all remote severs *automatically* so that modules
ServerInstance->Log(DEBUG,"Globally route '%s'",command.c_str());
DoOneToMany(user->nick,command,params);
}
- return 0;
}
virtual void OnGetServerDescription(const std::string &servername,std::string &description)
// Only do this for local users
if (IS_LOCAL(user))
{
+ char ts[24];
+ snprintf(ts,24,"%lu",(unsigned long)channel->age);
+
std::deque<std::string> params;
params.clear();
params.push_back(channel->name);
+ /** XXX: The client protocol will IGNORE this parameter.
+ * We could make use of it if we wanted to keep the TS
+ * in step if somehow we lose it.
+ */
+ params.push_back(ts);
+
if (channel->GetUserCounter() > 1)
{
// not the first in the channel
{
// first in the channel, set up their permissions
// and the channel TS with FJOIN.
- char ts[24];
- snprintf(ts,24,"%lu",(unsigned long)channel->age);
params.clear();
params.push_back(channel->name);
params.push_back(ts);
List[I_OnUserQuit] = List[I_OnUserPostNick] = List[I_OnUserKick] = List[I_OnRemoteKill] = List[I_OnRehash] = 1;
List[I_OnOper] = List[I_OnAddGLine] = List[I_OnAddZLine] = List[I_OnAddQLine] = List[I_OnAddELine] = 1;
List[I_OnDelGLine] = List[I_OnDelZLine] = List[I_OnDelQLine] = List[I_OnDelELine] = List[I_ProtoSendMode] = List[I_OnMode] = 1;
- List[I_OnStats] = List[I_ProtoSendMetaData] = List[I_OnEvent] = List[I_OnSetAway] = List[I_OnCancelAway] = 1;
+ List[I_OnStats] = List[I_ProtoSendMetaData] = List[I_OnEvent] = List[I_OnSetAway] = List[I_OnCancelAway] = List[I_OnPostCommand] = 1;
}
/* It is IMPORTANT that m_spanningtree is the last module in the chain