mirror of
https://github.com/anope/anope.git
synced 2026-07-03 00:23:12 +02:00
Moved the core pseudo clients out into their own modules
This commit is contained in:
+11
-263
@@ -13,6 +13,7 @@
|
||||
|
||||
#include "services.h"
|
||||
#include "modules.h"
|
||||
#include "chanserv.h"
|
||||
|
||||
registered_channel_map RegisteredChannelList;
|
||||
|
||||
@@ -140,70 +141,6 @@ Anope::string get_mlock_modes(ChannelInfo *ci, int complete)
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/* Return information on memory use. Assumes pointers are valid. */
|
||||
|
||||
void get_chanserv_stats(long *nrec, long *memuse)
|
||||
{
|
||||
long count = 0, mem = 0;
|
||||
ModeLock *ml;
|
||||
|
||||
for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it)
|
||||
{
|
||||
ChannelInfo *ci = it->second;
|
||||
|
||||
++count;
|
||||
mem += sizeof(*ci);
|
||||
if (!ci->desc.empty())
|
||||
mem += ci->desc.length() + 1;
|
||||
mem += ci->GetAccessCount() * sizeof(ChanAccess);
|
||||
mem += ci->GetAkickCount() * sizeof(AutoKick);
|
||||
|
||||
ml = ci->GetMLock(CMODE_KEY);
|
||||
if (ml && !ml->param.empty())
|
||||
mem += ml->param.length() + 1;
|
||||
|
||||
ml = ci->GetMLock(CMODE_FLOOD);
|
||||
if (ml && !ml->param.empty())
|
||||
mem += ml->param.length() + 1;
|
||||
|
||||
ml = ci->GetMLock(CMODE_REDIRECT);
|
||||
if (ml && !ml->param.empty())
|
||||
mem += ml->param.length() + 1;
|
||||
|
||||
if (!ci->last_topic.empty())
|
||||
mem += ci->last_topic.length() + 1;
|
||||
if (!ci->forbidby.empty())
|
||||
mem += ci->forbidby.length() + 1;
|
||||
if (!ci->forbidreason.empty())
|
||||
mem += ci->forbidreason.length() + 1;
|
||||
if (ci->levels)
|
||||
mem += sizeof(*ci->levels) * CA_SIZE;
|
||||
unsigned memos = ci->memos.memos.size();
|
||||
mem += memos * sizeof(Memo);
|
||||
for (unsigned j = 0; j < memos; ++j)
|
||||
if (!ci->memos.memos[j]->text.empty())
|
||||
mem += ci->memos.memos[j]->text.length() + 1;
|
||||
if (ci->ttb)
|
||||
mem += sizeof(*ci->ttb) * TTB_SIZE;
|
||||
mem += ci->GetBadWordCount() * sizeof(BadWord);
|
||||
}
|
||||
*nrec = count;
|
||||
*memuse = mem;
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
/*************************************************************************/
|
||||
|
||||
/* ChanServ initialization. */
|
||||
|
||||
void cs_init()
|
||||
{
|
||||
if (!Config->s_ChanServ.empty())
|
||||
ModuleManager::LoadModuleList(Config->ChanServCoreModules);
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/* Check the current modes on a channel; if they conflict with a mode lock,
|
||||
* fix them.
|
||||
*/
|
||||
@@ -288,194 +225,6 @@ void check_modes(Channel *c)
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
int check_valid_admin(User *user, Channel *chan, int servermode)
|
||||
{
|
||||
ChannelMode *cm;
|
||||
|
||||
if (!chan || !chan->ci)
|
||||
return 1;
|
||||
|
||||
if (!(cm = ModeManager::FindChannelModeByName(CMODE_PROTECT)))
|
||||
return 0;
|
||||
|
||||
/* They will be kicked; no need to deop, no need to update our internal struct too */
|
||||
if (chan->ci->HasFlag(CI_FORBIDDEN))
|
||||
return 0;
|
||||
|
||||
if (servermode && !check_access(user, chan->ci, CA_AUTOPROTECT))
|
||||
{
|
||||
user->SendMessage(ChanServ, _("This channel has been registered with %s."), Config->s_ChanServ.c_str());
|
||||
chan->RemoveMode(NULL, CMODE_PROTECT, user->nick);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/* Check whether a user is allowed to be opped on a channel; if they
|
||||
* aren't, deop them. If serverop is 1, the +o was done by a server.
|
||||
* Return 1 if the user is allowed to be opped, 0 otherwise. */
|
||||
|
||||
int check_valid_op(User *user, Channel *chan, int servermode)
|
||||
{
|
||||
ChannelMode *owner, *protect, *halfop;
|
||||
if (!chan || !chan->ci)
|
||||
return 1;
|
||||
|
||||
/* They will be kicked; no need to deop, no need to update our internal struct too */
|
||||
if (chan->ci->HasFlag(CI_FORBIDDEN))
|
||||
return 0;
|
||||
|
||||
owner = ModeManager::FindChannelModeByName(CMODE_OWNER);
|
||||
protect = ModeManager::FindChannelModeByName(CMODE_PROTECT);
|
||||
halfop = ModeManager::FindChannelModeByName(CMODE_HALFOP);
|
||||
|
||||
if (servermode && !check_access(user, chan->ci, CA_AUTOOP))
|
||||
{
|
||||
user->SendMessage(ChanServ, _("This channel has been registered with %s."), Config->s_ChanServ.c_str());
|
||||
|
||||
if (owner)
|
||||
chan->RemoveMode(NULL, CMODE_OWNER, user->nick);
|
||||
if (protect)
|
||||
chan->RemoveMode(NULL, CMODE_PROTECT, user->nick);
|
||||
chan->RemoveMode(NULL, CMODE_OP, user->nick);
|
||||
if (halfop && !check_access(user, chan->ci, CA_AUTOHALFOP))
|
||||
chan->RemoveMode(NULL, CMODE_HALFOP, user->nick);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
/* Remove all channels which have expired. */
|
||||
|
||||
void expire_chans()
|
||||
{
|
||||
if (!Config->CSExpire)
|
||||
return;
|
||||
|
||||
for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; )
|
||||
{
|
||||
ChannelInfo *ci = it->second;
|
||||
++it;
|
||||
|
||||
bool expire = false;
|
||||
if (ci->HasFlag(CI_SUSPENDED))
|
||||
{
|
||||
if (Config->CSSuspendExpire && Anope::CurTime - ci->last_used >= Config->CSSuspendExpire)
|
||||
expire = true;
|
||||
}
|
||||
else if (ci->HasFlag(CI_FORBIDDEN))
|
||||
{
|
||||
if (Config->CSForbidExpire && Anope::CurTime - ci->last_used >= Config->CSForbidExpire)
|
||||
expire = true;
|
||||
}
|
||||
else if (!ci->c && Anope::CurTime - ci->last_used >= Config->CSExpire)
|
||||
expire = true;
|
||||
|
||||
if (ci->HasFlag(CI_NO_EXPIRE))
|
||||
expire = false;
|
||||
|
||||
if (expire)
|
||||
{
|
||||
EventReturn MOD_RESULT;
|
||||
FOREACH_RESULT(I_OnPreChanExpire, OnPreChanExpire(ci));
|
||||
if (MOD_RESULT == EVENT_STOP)
|
||||
continue;
|
||||
|
||||
Anope::string extra;
|
||||
if (ci->HasFlag(CI_FORBIDDEN))
|
||||
extra = "forbidden ";
|
||||
else if (ci->HasFlag(CI_SUSPENDED))
|
||||
extra = "suspended ";
|
||||
|
||||
Log(LOG_NORMAL, "chanserv/expire") << "Expiring " << extra << "channel " << ci->name << " (founder: " << (ci->founder ? ci->founder->display : "(none)") << ")";
|
||||
FOREACH_MOD(I_OnChanExpire, OnChanExpire(ci));
|
||||
delete ci;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
// XXX this is slightly inefficient
|
||||
void cs_remove_nick(NickCore *nc)
|
||||
{
|
||||
for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end;)
|
||||
{
|
||||
ChannelInfo *ci = it->second;
|
||||
++it;
|
||||
|
||||
for (unsigned j = ci->GetAkickCount(); j > 0; --j)
|
||||
{
|
||||
AutoKick *akick = ci->GetAkick(j - 1);
|
||||
if (akick->HasFlag(AK_ISNICK) && akick->nc == nc)
|
||||
ci->EraseAkick(j - 1);
|
||||
}
|
||||
|
||||
if (ci->founder == nc)
|
||||
{
|
||||
NickCore *newowner = NULL;
|
||||
if (ci->successor && (ci->successor->IsServicesOper() || !Config->CSMaxReg || ci->successor->channelcount < Config->CSMaxReg))
|
||||
newowner = ci->successor;
|
||||
else
|
||||
{
|
||||
ChanAccess *highest = NULL;
|
||||
for (unsigned j = 0; j < ci->GetAccessCount(); ++j)
|
||||
{
|
||||
ChanAccess *ca = ci->GetAccess(j);
|
||||
|
||||
if (!ca->nc || (!ca->nc->IsServicesOper() && Config->CSMaxReg && ca->nc->channelcount >= Config->CSMaxReg) || (ca->nc == nc))
|
||||
continue;
|
||||
if (!highest || ca->level > highest->level)
|
||||
highest = ca;
|
||||
}
|
||||
if (highest)
|
||||
newowner = highest->nc;
|
||||
}
|
||||
|
||||
if (newowner)
|
||||
{
|
||||
Log(LOG_NORMAL, "chanserv/expire") << "Transferring foundership of " << ci->name << " from deleted nick " << nc->display << " to " << newowner->display;
|
||||
ci->founder = newowner;
|
||||
ci->successor = NULL;
|
||||
++newowner->channelcount;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log(LOG_NORMAL, "chanserv/expire") << "Deleting channel " << ci->name << " owned by deleted nick " << nc->display;
|
||||
|
||||
if (ModeManager::FindChannelModeByName(CMODE_REGISTERED))
|
||||
{
|
||||
/* Maybe move this to delchan() ? */
|
||||
if (ci->c && ci->c->HasMode(CMODE_REGISTERED))
|
||||
ci->c->RemoveMode(NULL, CMODE_REGISTERED, true);
|
||||
}
|
||||
|
||||
delete ci;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (ci->successor == nc)
|
||||
ci->successor = NULL;
|
||||
|
||||
/* Note that it is important we lookup the access for the channel after the new founder
|
||||
* has been determined incase this user was the founder and also was on the access list!
|
||||
*/
|
||||
ChanAccess *access = ci->GetAccess(nc);
|
||||
if (access)
|
||||
ci->EraseAccess(access);
|
||||
}
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
|
||||
ChannelInfo *cs_findchan(const Anope::string &chan)
|
||||
{
|
||||
FOREACH_MOD(I_OnFindChan, OnFindChan(chan));
|
||||
@@ -534,10 +283,6 @@ int check_access(User *user, ChannelInfo *ci, int what)
|
||||
return level >= ci->levels[what];
|
||||
}
|
||||
|
||||
/*************************************************************************/
|
||||
/*********************** ChanServ private routines ***********************/
|
||||
/*************************************************************************/
|
||||
|
||||
/* Reset channel access level values to their default state. */
|
||||
|
||||
void reset_levels(ChannelInfo *ci)
|
||||
@@ -657,26 +402,29 @@ Anope::string get_xop_level(int level)
|
||||
|
||||
ChanServTimer::ChanServTimer(Channel *chan) : Timer(Config->CSInhabit), c(chan)
|
||||
{
|
||||
if (!ChanServ)
|
||||
if (!chanserv)
|
||||
return;
|
||||
if (c->ci)
|
||||
c->ci->SetFlag(CI_INHABIT);
|
||||
if (!c->ci || !c->ci->bi)
|
||||
ChanServ->Join(*c);
|
||||
chanserv->Bot()->Join(c);
|
||||
else if (!c->FindUser(c->ci->bi))
|
||||
c->ci->bi->Join(*c);
|
||||
c->ci->bi->Join(c);
|
||||
}
|
||||
|
||||
void ChanServTimer::Tick(time_t)
|
||||
{
|
||||
if (!c || !c->ci || !ChanServ)
|
||||
if (!c || !c->ci)
|
||||
return;
|
||||
|
||||
c->ci->UnsetFlag(CI_INHABIT);
|
||||
|
||||
if (!c->ci->bi && ChanServ)
|
||||
ChanServ->Part(*c);
|
||||
if (!c->ci->bi)
|
||||
{
|
||||
if (chanserv)
|
||||
chanserv->Bot()->Part(c);
|
||||
}
|
||||
else if (c->users.size() == 1 || c->users.size() < Config->BSMinUsers)
|
||||
c->ci->bi->Part(*c);
|
||||
c->ci->bi->Part(c);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user