summaryrefslogtreecommitdiff
path: root/src/servers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/servers.cpp')
-rw-r--r--src/servers.cpp207
1 files changed, 95 insertions, 112 deletions
diff --git a/src/servers.cpp b/src/servers.cpp
index b78cd19f7..d1fa2bf26 100644
--- a/src/servers.cpp
+++ b/src/servers.cpp
@@ -1,12 +1,20 @@
-/* Routines to maintain a list of connected servers
+/*
+ * Anope IRC Services
*
- * (C) 2003-2016 Anope Team
- * Contact us at team@anope.org
+ * Copyright (C) 2004-2016 Anope Team <team@anope.org>
*
- * Please read COPYING and README for further details.
+ * This file is part of Anope. Anope is free software; you can
+ * redistribute it and/or modify it under the terms of the GNU
+ * General Public License as published by the Free Software
+ * Foundation, version 2.
*
- * Based on the original code of Epona by Lara.
- * Based on the original code of Services by Andy Church.
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see see <http://www.gnu.org/licenses/>.
*/
#include "services.h"
@@ -14,10 +22,11 @@
#include "xline.h"
#include "servers.h"
#include "bots.h"
-#include "regchannel.h"
#include "protocol.h"
#include "config.h"
#include "channels.h"
+#include "event.h"
+#include "modules/chanserv.h"
/* Anope */
Server *Me = NULL;
@@ -27,7 +36,7 @@ Anope::map<Server *> Servers::ByID;
std::set<Anope::string> Servers::Capab;
-Server::Server(Server *up, const Anope::string &sname, unsigned shops, const Anope::string &desc, const Anope::string &ssid, bool jupe) : name(sname), hops(shops), description(desc), sid(ssid), uplink(up), users(0)
+Server::Server(Server *up, const Anope::string &sname, unsigned int shops, const Anope::string &desc, const Anope::string &ssid, bool jupe) : name(sname), hops(shops), description(desc), sid(ssid), uplink(up), users(0)
{
syncing = true;
juped = jupe;
@@ -37,7 +46,7 @@ Server::Server(Server *up, const Anope::string &sname, unsigned shops, const Ano
if (!ssid.empty())
Servers::ByID[ssid] = this;
- Log(this, "connect") << "has connected to the network (uplinked to " << (this->uplink ? this->uplink->GetName() : "no uplink") << ")";
+ this->logger.Category("connect").Log(_("{0} has connected to the network (uplinked to {1})"), this->GetName(), this->uplink ? this->uplink->GetName() : "no uplink");
/* Add this server to our uplinks leaf list */
if (this->uplink)
@@ -46,98 +55,15 @@ Server::Server(Server *up, const Anope::string &sname, unsigned shops, const Ano
/* Check to be sure this isn't a juped server */
if (Me == this->uplink && !juped)
- {
- /* Now do mode related stuff as we know what modes exist .. */
- for (botinfo_map::iterator it = BotListByNick->begin(), it_end = BotListByNick->end(); it != it_end; ++it)
- {
- BotInfo *bi = it->second;
- Anope::string modes = !bi->botmodes.empty() ? ("+" + bi->botmodes) : IRCD->DefaultPseudoclientModes;
-
- bi->SetModesInternal(bi, modes.c_str());
- for (unsigned i = 0; i < bi->botchannels.size(); ++i)
- {
- size_t h = bi->botchannels[i].find('#');
- if (h == Anope::string::npos)
- continue;
- Anope::string chname = bi->botchannels[i].substr(h);
- Channel *c = Channel::Find(chname);
- if (c && c->FindUser(bi))
- {
- Anope::string want_modes = bi->botchannels[i].substr(0, h);
- for (unsigned j = 0; j < want_modes.length(); ++j)
- {
- ChannelMode *cm = ModeManager::FindChannelModeByChar(want_modes[j]);
- if (cm == NULL)
- cm = ModeManager::FindChannelModeByChar(ModeManager::GetStatusChar(want_modes[j]));
- if (cm && cm->type == MODE_STATUS)
- {
- MessageSource ms = bi;
- c->SetModeInternal(ms, cm, bi->nick);
- }
- }
- }
- }
- }
-
- IRCD->SendBOB();
-
- for (unsigned i = 0; i < Me->GetLinks().size(); ++i)
- {
- Server *s = Me->GetLinks()[i];
-
- if (s->juped)
- IRCD->SendServer(s);
- }
-
- /* We make the bots go online */
- for (user_map::const_iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
- {
- User *u = it->second;
-
- BotInfo *bi = BotInfo::Find(u->GetUID());
- if (bi)
- {
- XLine x(bi->nick, "Reserved for services");
- IRCD->SendSQLine(NULL, &x);
- }
-
- IRCD->SendClientIntroduction(u);
- if (bi)
- bi->introduced = true;
- }
-
- for (channel_map::const_iterator it = ChannelList.begin(), it_end = ChannelList.end(); it != it_end; ++it)
- {
- Channel *c = it->second;
-
- if (c->users.empty())
- IRCD->SendChannel(c);
- else
- for (Channel::ChanUserList::const_iterator cit = c->users.begin(), cit_end = c->users.end(); cit != cit_end; ++cit)
- IRCD->SendJoin(cit->second->user, c, &cit->second->status);
-
- for (Channel::ModeList::const_iterator it2 = c->GetModes().begin(); it2 != c->GetModes().end(); ++it2)
- {
- ChannelMode *cm = ModeManager::FindChannelModeByName(it2->first);
- if (!cm || cm->type != MODE_LIST)
- continue;
- ModeManager::StackerAdd(c->ci->WhoSends(), c, cm, true, it2->second);
- }
-
- if (!c->topic.empty() && !c->topic_setter.empty())
- IRCD->SendTopic(c->ci->WhoSends(), c);
-
- c->syncing = true;
- }
- }
+ Burst();
}
- FOREACH_MOD(OnNewServer, (this));
+ EventManager::Get()->Dispatch(&Event::NewServer::OnNewServer, this);
}
Server::~Server()
{
- Log(this, "quit") << "quit from " << (this->uplink ? this->uplink->GetName() : "no uplink") << " for " << this->quit_reason;
+ this->logger.Category("quit").Log(_("{0} quit from {1} for {2}"), this->GetName(), this->uplink ? this->uplink->GetName() : "no uplink", this->quit_reason);
for (user_map::const_iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
{
@@ -150,14 +76,14 @@ Server::~Server()
}
}
- Log(LOG_DEBUG) << "Finished removing all users for " << this->GetName();
+ this->logger.Debug("Finished removing all users for {0}", this->GetName());
if (this->uplink)
this->uplink->DelLink(this);
- for (unsigned i = this->links.size(); i > 0; --i)
+ for (unsigned int i = this->links.size(); i > 0; --i)
this->links[i - 1]->Delete(this->quit_reason);
-
+
Servers::ByName.erase(this->name);
if (!this->sid.empty())
Servers::ByID.erase(this->sid);
@@ -167,10 +93,67 @@ void Server::Delete(const Anope::string &reason)
{
this->quit_reason = reason;
this->quitting = true;
- FOREACH_MOD(OnServerQuit, (this));
+ EventManager::Get()->Dispatch(&Event::ServerQuit::OnServerQuit, this);
delete this;
}
+void Server::Burst()
+{
+ IRCD->SendBOB();
+
+ for (unsigned int i = 0; i < Me->GetLinks().size(); ++i)
+ {
+ Server *s = Me->GetLinks()[i];
+
+ if (s->juped)
+ IRCD->Send<messages::MessageServer>(s);
+ }
+
+ /* We make the bots go online */
+ for (user_map::const_iterator it = UserListByNick.begin(); it != UserListByNick.end(); ++it)
+ {
+ User *u = it->second;
+
+ ServiceBot *bi = ServiceBot::Find(u->GetUID());
+ if (bi)
+ {
+#warning "xline on stack"
+ //XLine x(bi->nick, "Reserved for services");
+ //IRCD->SendSQLine(NULL, &x);
+ }
+
+ IRCD->Send<messages::NickIntroduction>(u);
+ if (bi)
+ bi->introduced = true;
+ }
+
+ ServiceBot *chanserv = Config->GetClient("ChanServ");
+
+ for (channel_map::const_iterator it = ChannelList.begin(), it_end = ChannelList.end(); it != it_end; ++it)
+ {
+ Channel *c = it->second;
+
+ if (c->users.empty())
+ IRCD->Send<messages::MessageChannel>(c);
+ else
+ for (Channel::ChanUserList::const_iterator cit = c->users.begin(), cit_end = c->users.end(); cit != cit_end; ++cit)
+ IRCD->Send<messages::Join>(cit->second->user, c, &cit->second->status);
+
+ for (Channel::ModeList::const_iterator it2 = c->GetModes().begin(); it2 != c->GetModes().end(); ++it2)
+ {
+ ChannelMode *cm = ModeManager::FindChannelModeByName(it2->first);
+ if (!cm || cm->type != MODE_LIST)
+ continue;
+ ModeManager::StackerAdd(nullptr, c, cm, true, it2->second);
+ }
+
+ if (!c->topic.empty() && !c->topic_setter.empty())
+ IRCD->Send<messages::Topic>(c->ci ? c->ci->WhoSends() : chanserv, c, c->topic, c->topic_ts, c->topic_setter);
+
+ c->syncing = true;
+ }
+}
+
const Anope::string &Server::GetName() const
{
return this->name;
@@ -226,7 +209,7 @@ void Server::AddLink(Server *s)
{
this->links.push_back(s);
- Log(this, "connect") << "introduced " << s->GetName();
+ this->logger.Category("connect").Log(_("{0} introduced {1}"), this->GetName(), s->GetName());
}
void Server::DelLink(Server *s)
@@ -243,7 +226,7 @@ void Server::DelLink(Server *s)
}
}
- Log(this, "quit") << "quit " << s->GetName();
+ this->logger.Category("quit").Log(_("{0} quit {1}"), this->GetName(), s->GetName());
}
void Server::Sync(bool sync_links)
@@ -253,9 +236,9 @@ void Server::Sync(bool sync_links)
syncing = false;
- Log(this, "sync") << "is done syncing";
+ this->logger.Category("sync").Log(_("{0} is done syncing"), this->GetName());
- FOREACH_MOD(OnServerSync, (this));
+ EventManager::Get()->Dispatch(&Event::ServerSync::OnServerSync, this);
if (sync_links && !this->links.empty())
{
@@ -267,7 +250,7 @@ void Server::Sync(bool sync_links)
if (me)
{
- FOREACH_MOD(OnPreUplinkSync, (this));
+ EventManager::Get()->Dispatch(&Event::PreUplinkSync::OnPreUplinkSync, this);
}
for (channel_map::const_iterator it = ChannelList.begin(), it_end = ChannelList.end(); it != it_end;)
@@ -284,11 +267,11 @@ void Server::Sync(bool sync_links)
IRCD->SendEOB();
Me->Sync(false);
- FOREACH_MOD(OnUplinkSync, (this));
+ EventManager::Get()->Dispatch(&Event::UplinkSync::OnUplinkSync, this);
if (!Anope::NoFork)
{
- Log(LOG_TERMINAL) << "Successfully linked, launching into background...";
+ Anope::Logger.Terminal(_("Successfully linked, launching into background..."));
Anope::Fork();
}
}
@@ -325,29 +308,29 @@ bool Server::IsQuitting() const
return quitting;
}
-void Server::Notice(BotInfo *source, const Anope::string &message)
+void Server::Notice(ServiceBot *source, const Anope::string &message)
{
if (Config->UsePrivmsg && Config->DefPrivmsg)
- IRCD->SendGlobalPrivmsg(source, this, message);
+ IRCD->Send<messages::GlobalPrivmsg>(source, this, message);
else
- IRCD->SendGlobalNotice(source, this, message);
+ IRCD->Send<messages::GlobalNotice>(source, this, message);
}
Server *Server::Find(const Anope::string &name, bool name_only)
{
Anope::map<Server *>::iterator it;
-
+
if (!name_only)
{
it = Servers::ByID.find(name);
if (it != Servers::ByID.end())
return it->second;
}
-
+
it = Servers::ByName.find(name);
if (it != Servers::ByName.end())
return it->second;
-
+
return NULL;
}