* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd: (C) 2002-2007 InspIRCd Development Team
+ * InspIRCd: (C) 2002-2008 InspIRCd Development Team
* See: http://www.inspircd.org/wiki/index.php/Credits
*
* This program is free but copyrighted software; see
for (int t = 0; t < depth; t++)
{
matrix[line][t] = ' ';
- }
+ }
+
// For Aligning, we need to work out exactly how deep this thing is, and produce
// a 'Spacer' String to compensate.
char spacer[40];
{
spacer[5] = '\0';
}
+
float percent;
char text[128];
/* Neat and tidy default values, as we're dealing with a matrix not a simple string */
memset(text, 0, 128);
- if (ServerInstance->clientlist->size() == 0) {
+ if (ServerInstance->Users->clientlist->size() == 0)
+ {
// If there are no users, WHO THE HELL DID THE /MAP?!?!?!
percent = 0;
}
else
{
- percent = ((float)Current->GetUserCount() / (float)ServerInstance->clientlist->size()) * 100;
+ percent = ((float)Current->GetUserCount() / (float)ServerInstance->Users->clientlist->size()) * 100;
}
+
const std::string operdata = IS_OPER(user) ? MapOperInfo(Current) : "";
snprintf(text, 126, "%s %s%5d [%5.2f%%]%s", Current->GetName().c_str(), spacer, Current->GetUserCount(), percent, operdata.c_str());
totusers += Current->GetUserCount();
totservers++;
strlcpy(&matrix[line][depth],text,126);
line++;
+
for (unsigned int q = 0; q < Current->ChildCount(); q++)
{
if ((Current->GetChild(q)->Hidden) || ((Utils->HideULines) && (ServerInstance->ULine(Current->GetChild(q)->GetName().c_str()))))
// 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.
-void ModuleSpanningTree::HandleMap(const char** parameters, int pcnt, User* user)
+void ModuleSpanningTree::HandleMap(const char* const* parameters, int pcnt, User* user)
{
// This array represents a virtual screen which we will
// "scratch" draw to, as the console device of an irc
float totusers = 0;
float totservers = 0;
char matrix[128][128];
+
for (unsigned int t = 0; t < 128; t++)
{
matrix[t][0] = '\0';
}
+
line = 0;
+
// The only recursive bit is called here.
ShowMap(Utils->TreeRoot,user,0,matrix,totusers,totservers);
+
// Process each line one by one. The algorithm has a limit of
// 128 servers (which is far more than a spanning tree should have
// anyway, so we're ok). This limit can be raised simply by making
// the servers at indented positions depending on what they
// are related to)
int first_nonspace = 0;
+
while (matrix[l][first_nonspace] == ' ')
{
first_nonspace++;
}
+
first_nonspace--;
+
// Draw the `- (corner) section: this may be overwritten by
// another L shape passing along the same vertical pane, becoming
// a |- (branch) section instead.
+
matrix[l][first_nonspace] = '-';
matrix[l][first_nonspace-1] = '`';
int l2 = l - 1;
+
// Draw upwards until we hit the parent server, causing possibly
// other corners (`-) to become branches (|-)
while ((matrix[l2][first_nonspace-1] == ' ') || (matrix[l2][first_nonspace-1] == '`'))
l2--;
}
}
+
// dump the whole lot to the user. This is the easy bit, honest.
for (int t = 0; t < line; t++)
{
- user->WriteServ("006 %s :%s",user->nick,&matrix[t][0]);
+ user->WriteNumeric(6, "%s :%s",user->nick,&matrix[t][0]);
}
float avg_users = totusers / totservers;
- user->WriteServ("270 %s :%.0f server%s and %.0f user%s, average %.2f users per server",user->nick,totservers,(totservers > 1 ? "s" : ""),totusers,(totusers > 1 ? "s" : ""),avg_users);
- user->WriteServ("007 %s :End of /MAP",user->nick);
+ user->WriteNumeric(270, "%s :%.0f server%s and %.0f user%s, average %.2f users per server",user->nick,totservers,(totservers > 1 ? "s" : ""),totusers,(totusers > 1 ? "s" : ""),avg_users);
+ user->WriteNumeric(7, "%s :End of /MAP",user->nick);
return;
}