summaryrefslogtreecommitdiff
path: root/src/modules
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules')
-rw-r--r--src/modules/m_spanningtree.cpp77
1 files changed, 76 insertions, 1 deletions
diff --git a/src/modules/m_spanningtree.cpp b/src/modules/m_spanningtree.cpp
index 6e0bb76da..c3eb7f8b1 100644
--- a/src/modules/m_spanningtree.cpp
+++ b/src/modules/m_spanningtree.cpp
@@ -88,6 +88,7 @@ class TreeServer
ServerDesc = "";
VersionString = "";
UserCount = OperCount = 0;
+ VersionString = GetVersionString();
}
TreeServer(std::string Name, std::string Desc) : ServerName(Name), ServerDesc(Desc)
@@ -95,6 +96,7 @@ class TreeServer
Parent = NULL;
VersionString = "";
UserCount = OperCount = 0;
+ VersionString = GetVersionString();
}
TreeServer(std::string Name, std::string Desc, TreeServer* Above, TreeSocket* Sock) : Parent(Above), ServerName(Name), ServerDesc(Desc), Socket(Sock)
@@ -161,6 +163,16 @@ class TreeServer
return this->Parent;
}
+ std::string GetVersion()
+ {
+ return VersionString;
+ }
+
+ void SetVersion(std::string Version)
+ {
+ VersionString = Version;
+ }
+
unsigned int ChildCount()
{
return Children.size();
@@ -312,6 +324,23 @@ void RFindServer(TreeServer* Current, std::string ServerName)
return;
}
+void RFindServerMask(TreeServer* Current, std::string ServerName)
+{
+ if (Srv->MatchText(Current->GetName(),ServerName) && (!Found))
+ {
+ Found = Current;
+ return;
+ }
+ if (!Found)
+ {
+ for (unsigned int q = 0; q < Current->ChildCount(); q++)
+ {
+ if (!Found)
+ RFindServerMask(Current->GetChild(q),ServerName);
+ }
+ }
+}
+
TreeServer* FindServer(std::string ServerName)
{
Found = NULL;
@@ -319,6 +348,13 @@ TreeServer* FindServer(std::string ServerName)
return Found;
}
+TreeServer* FindServerMask(std::string ServerName)
+{
+ Found = NULL;
+ RFindServerMask(TreeRoot,ServerName);
+ return Found;
+}
+
bool IsServer(std::string ServerName)
{
return LookForServer(TreeRoot,ServerName);
@@ -400,6 +436,7 @@ class TreeSocket : public InspSocket
// :source.server SERVER server.name hops :Description
snprintf(command,1024,":%s SERVER %s * %d :%s",Current->GetName().c_str(),recursive_server->GetName().c_str(),hops,recursive_server->GetDesc().c_str());
this->WriteLine(command);
+ this->WriteLine(":"+recursive_server->GetName()+" VERSION :"+recursive_server->GetVersion());
// down to next level
this->SendServers(recursive_server, s, hops+1);
}
@@ -758,6 +795,8 @@ class TreeSocket : public InspSocket
{
Srv->SendOpers("*** Bursting to "+s->GetName()+".");
this->WriteLine("BURST");
+ // send our version string
+ this->WriteLine(":"+s->GetName()+" VERSION :"+GetVersionString());
// Send server tree
this->SendServers(TreeRoot,s,1);
// Send users and their channels
@@ -880,6 +919,18 @@ class TreeSocket : public InspSocket
}
return true;
}
+
+ bool ServerVersion(std::string prefix, std::deque<std::string> params)
+ {
+ if (params.size() < 1)
+ return true;
+ TreeServer* ServerSource = FindServer(prefix);
+ if (ServerSource)
+ {
+ ServerSource->SetVersion(params[0]);
+ }
+ return true;
+ }
bool LocalPing(std::string prefix, std::deque<std::string> params)
{
@@ -1193,6 +1244,10 @@ class TreeSocket : public InspSocket
{
return this->LocalPong(prefix,params);
}
+ else if (command == "VERSION")
+ {
+ return this->ServerVersion(prefix,params);
+ }
else if (command == "SQUIT")
{
if (params.size() == 2)
@@ -1643,7 +1698,7 @@ class ModuleSpanningTree : public Module
int HandleSquit(char** parameters, int pcnt, userrec* user)
{
- TreeServer* s = FindServer(parameters[0]);
+ TreeServer* s = FindServerMask(parameters[0]);
if (s)
{
TreeSocket* sock = s->GetSocket();
@@ -1712,6 +1767,21 @@ class ModuleSpanningTree : public Module
}
}
}
+
+ int HandleVersion(char** parameters, int pcnt, userrec* user)
+ {
+ // we've already checked if pcnt > 0, so this is safe
+ TreeServer* found = FindServerMask(parameters[0]);
+ if (found)
+ {
+ std::string Version = found->GetVersion();
+ WriteServ(user->fd,"351 %s :%s",user->nick,Version.c_str());
+ }
+ else
+ {
+ WriteServ(user->fd,"402 %s :No such server",parameters[0]);
+ }
+ }
int HandleConnect(char** parameters, int pcnt, userrec* user)
{
@@ -1763,6 +1833,11 @@ class ModuleSpanningTree : public Module
this->HandleLinks(parameters,pcnt,user);
return 1;
}
+ else if ((command == "VERSION") && (pcnt > 0))
+ {
+ this->HandleVersion(parameters,pcnt,user);
+ return 1;
+ }
else if (Srv->IsValidModuleCommand(command, pcnt, user))
{
// this bit of code cleverly routes all module commands