summaryrefslogtreecommitdiff
path: root/src/modules/m_spanningtree/override_map.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/m_spanningtree/override_map.cpp')
-rw-r--r--src/modules/m_spanningtree/override_map.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/modules/m_spanningtree/override_map.cpp b/src/modules/m_spanningtree/override_map.cpp
index d0940936a..1a97cf8f3 100644
--- a/src/modules/m_spanningtree/override_map.cpp
+++ b/src/modules/m_spanningtree/override_map.cpp
@@ -47,7 +47,8 @@ void ModuleSpanningTree::ShowMap(TreeServer* Current, User* user, int depth, cha
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];
@@ -59,12 +60,14 @@ void ModuleSpanningTree::ShowMap(TreeServer* Current, User* user, int depth, cha
{
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->clientlist->size() == 0)
+ {
// If there are no users, WHO THE HELL DID THE /MAP?!?!?!
percent = 0;
}
@@ -72,12 +75,14 @@ void ModuleSpanningTree::ShowMap(TreeServer* Current, User* user, int depth, cha
{
percent = ((float)Current->GetUserCount() / (float)ServerInstance->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()))))
@@ -112,13 +117,17 @@ void ModuleSpanningTree::HandleMap(const char** parameters, int pcnt, User* user
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
@@ -130,17 +139,22 @@ void ModuleSpanningTree::HandleMap(const char** parameters, int pcnt, User* user
// 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] == '`'))
@@ -149,6 +163,7 @@ void ModuleSpanningTree::HandleMap(const char** parameters, int pcnt, User* user
l2--;
}
}
+
// dump the whole lot to the user. This is the easy bit, honest.
for (int t = 0; t < line; t++)
{