void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) override { const Anope::string &target = params[0]; const Anope::string &modes = params[1]; Reference<Channel> c = Channel::Find(target); if (!c) source.Reply(_("Channel \002{0}\002 doesn't exist."), target); else if (c->bouncy_modes) source.Reply(_("Services is unable to change modes. Are your servers' U:lines configured correctly?")); else if (modes.equals_ci("CLEAR")) { bool all = params.size() > 2 && params[2].equals_ci("ALL"); const Channel::ModeList chmodes = c->GetModes(); for (Channel::ModeList::const_iterator it = chmodes.begin(), it_end = chmodes.end(); it != it_end && c; ++it) c->RemoveMode(c->ci->WhoSends(), it->first, it->second, false); if (!c) { source.Reply(_("Modes cleared on %s and the channel destroyed."), target.c_str()); return; } if (all) { for (Channel::ChanUserList::iterator it = c->users.begin(), it_end = c->users.end(); it != it_end; ++it) { ChanUserContainer *uc = it->second; if (uc->user->HasMode("OPER")) continue; for (size_t i = uc->status.Modes().length(); i > 0; --i) c->RemoveMode(c->ci->WhoSends(), ModeManager::FindChannelModeByChar(uc->status.Modes()[i - 1]), uc->user->GetUID(), false); } source.Reply(_("All modes cleared on \002{0}\002."), c->name); } else source.Reply(_("Non-status modes cleared on \002{0}\002."), c->name); } else { spacesepstream sep(modes + (params.size() > 2 ? " " + params[2] : "")); Anope::string mode; int add = 1; Anope::string log_modes, log_params; sep.GetToken(mode); for (unsigned i = 0; i < mode.length() && c; ++i) { char ch = mode[i]; if (ch == '+') { add = 1; log_modes += "+"; continue; } else if (ch == '-') { add = 0; log_modes += "-"; continue; } ChannelMode *cm = ModeManager::FindChannelModeByChar(ch); if (!cm) continue; Anope::string param, param_log; if (cm->type != MODE_REGULAR) { if (cm->type == MODE_PARAM && !add && anope_dynamic_static_cast<ChannelModeParam *>(cm)->minus_no_arg) ; else if (!sep.GetToken(param)) continue; param_log = param; if (cm->type == MODE_STATUS) { User *targ = User::Find(param, true); if (targ == NULL || c->FindUser(targ) == NULL) continue; param = targ->GetUID(); } } log_modes += cm->mchar; if (!param.empty()) log_params += " " + param_log; if (add) c->SetMode(source.service, cm, param, false); else c->RemoveMode(source.service, cm, param, false); } if (!log_modes.replace_all_cs("+", "").replace_all_cs("-", "").empty()) Log(LOG_ADMIN, source, this) << log_modes << log_params << " on " << (c ? c->name : target); } }
void Server::Burst() { 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; ServiceBot *bi = ServiceBot::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; } }
void Whois::Run(MessageSource &source, const std::vector<Anope::string> ¶ms) { User *u = User::Find(params[0]); if (u && u->server == Me) { const ServiceBot *bi = ServiceBot::Find(u->GetUID()); IRCD->SendNumeric(311, source.GetSource(), "%s %s %s * :%s", u->nick.c_str(), u->GetIdent().c_str(), u->host.c_str(), u->realname.c_str()); if (bi) IRCD->SendNumeric(307, source.GetSource(), "%s :is a registered nick", bi->nick.c_str()); IRCD->SendNumeric(312, source.GetSource(), "%s %s :%s", u->nick.c_str(), Me->GetName().c_str(), Config->GetBlock("serverinfo")->Get<Anope::string>("description").c_str()); if (bi) IRCD->SendNumeric(317, source.GetSource(), "%s %ld %ld :seconds idle, signon time", bi->nick.c_str(), static_cast<long>(Anope::CurTime - bi->lastmsg), static_cast<long>(bi->signon)); IRCD->SendNumeric(318, source.GetSource(), "%s :End of /WHOIS list.", u->nick.c_str()); } else IRCD->SendNumeric(401, source.GetSource(), "%s :No such user.", params[0].c_str()); }
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) { syncing = true; juped = jupe; quitting = false; Servers::ByName[sname] = this; if (!ssid.empty()) Servers::ByID[ssid] = this; Log(this, "connect") << "has connected to the network (uplinked to " << (this->uplink ? this->uplink->GetName() : "no uplink") << ")"; /* Add this server to our uplinks leaf list */ if (this->uplink) { this->uplink->AddLink(this); /* 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; } } } FOREACH_MOD(OnNewServer, (this)); }