*/
-/* $ModDesc: Provides a spanning tree server link protocol */
-
#include "inspircd.h"
#include "main.h"
#include "utils.h"
#include "treeserver.h"
-#include "treesocket.h"
+#include "commands.h"
-/* $ModDep: m_spanningtree/main.h m_spanningtree/utils.h m_spanningtree/treeserver.h m_spanningtree/treesocket.h */
+CommandMap::CommandMap(Module* Creator)
+ : Command(Creator, "MAP", 0, 1)
+{
+ Penalty = 2;
+}
-const std::string ModuleSpanningTree::MapOperInfo(TreeServer* Current)
+std::string CommandMap::MapOperInfo(TreeServer* Current)
{
time_t secs_up = ServerInstance->Time() - Current->age;
- return " [Up: " + TimeToStr(secs_up) + (Current->rtt == 0 ? "]" : " Lag: " + ConvToStr(Current->rtt) + "ms]");
+ return " [Up: " + ModuleSpanningTree::TimeToStr(secs_up) + (Current->rtt == 0 ? "]" : " Lag: " + ConvToStr(Current->rtt) + "ms]");
}
-void ModuleSpanningTree::ShowMap(TreeServer* Current, User* user, int depth, int &line, char* names, int &maxnamew, char* stats)
+void CommandMap::ShowMap(TreeServer* Current, User* user, int depth, int &line, char* names, int &maxnamew, char* stats)
{
- ServerInstance->Logs->Log("map",LOG_DEBUG,"ShowMap depth %d on line %d", depth, line);
+ ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "ShowMap depth %d on line %d", depth, line);
float percent;
if (ServerInstance->Users->clientlist->size() == 0)
memset(myname, ' ', depth);
int w = depth;
- std::string servername = Current->GetName();
if (user->IsOper())
{
- w += snprintf(myname + depth, 99 - depth, "%s (%s)", servername.c_str(), Current->GetID().c_str());
+ w += snprintf(myname + depth, 99 - depth, "%s (%s)", Current->GetName().c_str(), Current->GetID().c_str());
}
else
{
- w += snprintf(myname + depth, 99 - depth, "%s", servername.c_str());
+ w += snprintf(myname + depth, 99 - depth, "%s", Current->GetName().c_str());
}
memset(myname + w, ' ', 100 - w);
if (w > maxnamew)
// and divisons, we instead render the map onto a backplane of characters
// (a character matrix), then draw the branches as a series of "L" shapes
// from the nodes. This is not only friendlier on CPU it uses less stack.
-bool ModuleSpanningTree::HandleMap(const std::vector<std::string>& parameters, User* user)
+CmdResult CommandMap::Handle(const std::vector<std::string>& parameters, User* user)
{
if (parameters.size() > 0)
{
/* Remote MAP, the server is within the 1st parameter */
TreeServer* s = Utils->FindServerMask(parameters[0]);
- bool ret = false;
if (!s)
{
user->WriteNumeric(ERR_NOSUCHSERVER, "%s %s :No such server", user->nick.c_str(), parameters[0].c_str());
- ret = true;
- }
- else if (s && s != Utils->TreeRoot)
- {
- parameterlist params;
- params.push_back(parameters[0]);
-
- params[0] = s->GetName();
- Utils->DoOneToOne(user->uuid, "MAP", params, s->GetName());
- ret = true;
+ return CMD_FAILURE;
}
- // Don't return if s == Utils->TreeRoot (us)
- if (ret)
- return true;
+ if (!s->IsRoot())
+ return CMD_SUCCESS;
}
// These arrays represent a virtual screen which we will
// "scratch" draw to, as the console device of an irc
// client does not provide for a proper terminal.
int totusers = ServerInstance->Users->clientlist->size();
- int totservers = this->CountServs();
+ int totservers = Utils->serverlist.size();
int maxnamew = 0;
int line = 0;
char* names = new char[totservers * 100];
float avg_users = totusers * 1.0 / line;
- ServerInstance->Logs->Log("map",LOG_DEBUG,"local");
for (int t = 0; t < line; t++)
{
// terminate the string at maxnamew characters
delete[] names;
delete[] stats;
- return true;
+ return CMD_SUCCESS;
}
+RouteDescriptor CommandMap::GetRouting(User* user, const std::vector<std::string>& parameters)
+{
+ if (!parameters.empty())
+ return ROUTE_UNICAST(parameters[0]);
+ return ROUTE_LOCALONLY;
+}