mirror of
https://github.com/anope/anope.git
synced 2026-07-07 15:23:13 +02:00
Reworked live SQL support yet again
This commit is contained in:
@@ -81,7 +81,7 @@ class CommandBSBadwords : public Command
|
||||
if (!Number || Number > ci->GetBadWordCount())
|
||||
return;
|
||||
|
||||
BadWord *bw = ci->GetBadWord(Number - 1);
|
||||
const BadWord *bw = ci->GetBadWord(Number - 1);
|
||||
ListFormatter::ListEntry entry;
|
||||
entry["Number"] = stringify(Number);
|
||||
entry["Word"] = bw->word;
|
||||
@@ -96,7 +96,7 @@ class CommandBSBadwords : public Command
|
||||
{
|
||||
for (unsigned i = 0, end = ci->GetBadWordCount(); i < end; ++i)
|
||||
{
|
||||
BadWord *bw = ci->GetBadWord(i);
|
||||
const BadWord *bw = ci->GetBadWord(i);
|
||||
|
||||
if (!word.empty() && !Anope::Match(bw->word, word))
|
||||
continue;
|
||||
@@ -154,7 +154,7 @@ class CommandBSBadwords : public Command
|
||||
|
||||
for (unsigned i = 0, end = ci->GetBadWordCount(); i < end; ++i)
|
||||
{
|
||||
BadWord *bw = ci->GetBadWord(i);
|
||||
const BadWord *bw = ci->GetBadWord(i);
|
||||
|
||||
if (!bw->word.empty() && ((Config->BSCaseSensitive && realword.equals_cs(bw->word)) || (!Config->BSCaseSensitive && realword.equals_ci(bw->word))))
|
||||
{
|
||||
@@ -183,7 +183,7 @@ class CommandBSBadwords : public Command
|
||||
else
|
||||
{
|
||||
unsigned i, end;
|
||||
BadWord *badword;
|
||||
const BadWord *badword;
|
||||
|
||||
for (i = 0, end = ci->GetBadWordCount(); i < end; ++i)
|
||||
{
|
||||
|
||||
@@ -22,7 +22,6 @@ class CommandBSBot : public Command
|
||||
const Anope::string &user = params[2];
|
||||
const Anope::string &host = params[3];
|
||||
const Anope::string &real = params[4];
|
||||
BotInfo *bi;
|
||||
|
||||
if (findbot(nick))
|
||||
{
|
||||
@@ -93,7 +92,7 @@ class CommandBSBot : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
bi = new BotInfo(nick, user, host, real);
|
||||
BotInfo *bi = new BotInfo(nick, user, host, real);
|
||||
|
||||
Log(LOG_ADMIN, source.u, this) << "ADD " << bi->GetMask() << " " << bi->realname;
|
||||
|
||||
@@ -110,7 +109,6 @@ class CommandBSBot : public Command
|
||||
const Anope::string &user = params.size() > 3 ? params[3] : "";
|
||||
const Anope::string &host = params.size() > 4 ? params[4] : "";
|
||||
const Anope::string &real = params.size() > 5 ? params[5] : "";
|
||||
BotInfo *bi;
|
||||
|
||||
if (oldnick.empty() || nick.empty())
|
||||
{
|
||||
@@ -118,7 +116,8 @@ class CommandBSBot : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(bi = findbot(oldnick)))
|
||||
BotInfo *bi = findbot(oldnick);
|
||||
if (!bi)
|
||||
{
|
||||
source.Reply(BOT_DOES_NOT_EXIST, oldnick.c_str());
|
||||
return;
|
||||
@@ -263,7 +262,6 @@ class CommandBSBot : public Command
|
||||
void DoDel(CommandSource &source, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
const Anope::string &nick = params[1];
|
||||
BotInfo *bi;
|
||||
|
||||
if (nick.empty())
|
||||
{
|
||||
@@ -271,7 +269,8 @@ class CommandBSBot : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(bi = findbot(nick)))
|
||||
BotInfo *bi = findbot(nick);
|
||||
if (!bi)
|
||||
{
|
||||
source.Reply(BOT_DOES_NOT_EXIST, nick.c_str());
|
||||
return;
|
||||
@@ -288,7 +287,7 @@ class CommandBSBot : public Command
|
||||
Log(LOG_ADMIN, source.u, this) << "DEL " << bi->nick;
|
||||
|
||||
source.Reply(_("Bot \002%s\002 has been deleted."), nick.c_str());
|
||||
delete bi;
|
||||
bi->destroy();
|
||||
return;
|
||||
}
|
||||
public:
|
||||
|
||||
@@ -30,7 +30,7 @@ class CommandBSBotList : public Command
|
||||
|
||||
list.addColumn("Nick").addColumn("Mask");
|
||||
|
||||
for (Anope::insensitive_map<BotInfo *>::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it)
|
||||
for (Anope::insensitive_map<BotInfo *>::const_iterator it = BotListByNick->begin(), it_end = BotListByNick->end(); it != it_end; ++it)
|
||||
{
|
||||
BotInfo *bi = it->second;
|
||||
|
||||
|
||||
@@ -17,12 +17,12 @@
|
||||
class CommandBSInfo : public Command
|
||||
{
|
||||
private:
|
||||
void send_bot_channels(std::vector<Anope::string> &buffers, BotInfo *bi)
|
||||
void send_bot_channels(std::vector<Anope::string> &buffers, const BotInfo *bi)
|
||||
{
|
||||
Anope::string buf;
|
||||
for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it)
|
||||
for (registered_channel_map::const_iterator it = RegisteredChannelList->begin(), it_end = RegisteredChannelList->end(); it != it_end; ++it)
|
||||
{
|
||||
ChannelInfo *ci = it->second;
|
||||
const ChannelInfo *ci = it->second;
|
||||
|
||||
if (ci->bi == bi)
|
||||
{
|
||||
@@ -38,7 +38,7 @@ class CommandBSInfo : public Command
|
||||
buffers.push_back(buf);
|
||||
}
|
||||
|
||||
void CheckOptStr(Anope::string &buf, BotServFlag flag, const char *option, Flags<BotServFlag> &flags, NickCore *nc)
|
||||
void CheckOptStr(Anope::string &buf, BotServFlag flag, const char *option, Flags<BotServFlag> &flags, const NickCore *nc)
|
||||
{
|
||||
if (flags.HasFlag(flag))
|
||||
{
|
||||
@@ -60,7 +60,7 @@ class CommandBSInfo : public Command
|
||||
const Anope::string &query = params[0];
|
||||
|
||||
User *u = source.u;
|
||||
BotInfo *bi = findbot(query);
|
||||
const BotInfo *bi = findbot(query);
|
||||
ChannelInfo *ci;
|
||||
InfoFormatter info(u);
|
||||
|
||||
|
||||
@@ -900,7 +900,7 @@ class BSKick : public Module
|
||||
|
||||
for (unsigned i = 0, end = ci->GetBadWordCount(); i < end; ++i)
|
||||
{
|
||||
BadWord *bw = ci->GetBadWord(i);
|
||||
const BadWord *bw = ci->GetBadWord(i);
|
||||
|
||||
if (bw->type == BW_ANY && ((Config->BSCaseSensitive && nbuf.find(bw->word) != Anope::string::npos) || (!Config->BSCaseSensitive && nbuf.find_ci(bw->word) != Anope::string::npos)))
|
||||
mustkick = true;
|
||||
@@ -1012,7 +1012,7 @@ class BSKick : public Module
|
||||
Channel *chan = (*it)->chan;
|
||||
++it;
|
||||
|
||||
if (chan->ci != NULL && chan->ci->botflags.HasFlag(BS_KICK_AMSGS) && !chan->ci->AccessFor(u).HasPriv("NOKICK"))
|
||||
if (chan->ci && chan->ci->botflags.HasFlag(BS_KICK_AMSGS) && !chan->ci->AccessFor(u).HasPriv("NOKICK"))
|
||||
{
|
||||
check_ban(chan->ci, u, TTB_AMSGS);
|
||||
bot_kick(chan->ci, u, _("Don't use AMSGs!"));
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
static std::map<Anope::string, int16_t, ci::less> defaultLevels;
|
||||
|
||||
static void reset_levels(ChannelInfo *ci)
|
||||
static inline void reset_levels(ChannelInfo *ci)
|
||||
{
|
||||
ci->ClearLevels();
|
||||
for (std::map<Anope::string, int16_t, ci::less>::iterator it = defaultLevels.begin(), it_end = defaultLevels.end(); it != it_end; ++it)
|
||||
@@ -36,7 +36,7 @@ class AccessChanAccess : public ChanAccess
|
||||
return this->ci->GetLevel(name) != ACCESS_INVALID && this->level >= this->ci->GetLevel(name);
|
||||
}
|
||||
|
||||
Anope::string Serialize()
|
||||
Anope::string Serialize() const
|
||||
{
|
||||
return stringify(this->level);
|
||||
}
|
||||
@@ -46,11 +46,11 @@ class AccessChanAccess : public ChanAccess
|
||||
this->level = convertTo<int>(data);
|
||||
}
|
||||
|
||||
static int DetermineLevel(ChanAccess *access)
|
||||
static int DetermineLevel(const ChanAccess *access)
|
||||
{
|
||||
if (access->provider->name == "access/access")
|
||||
{
|
||||
AccessChanAccess *aaccess = debug_cast<AccessChanAccess *>(access);
|
||||
const AccessChanAccess *aaccess = debug_cast<const AccessChanAccess *>(access);
|
||||
return aaccess->level;
|
||||
}
|
||||
else
|
||||
@@ -108,7 +108,7 @@ class CommandCSAccess : public Command
|
||||
}
|
||||
|
||||
AccessGroup u_access = ci->AccessFor(u);
|
||||
ChanAccess *highest = u_access.Highest();
|
||||
const ChanAccess *highest = u_access.Highest();
|
||||
int u_level = (highest ? AccessChanAccess::DetermineLevel(highest) : 0);
|
||||
if (level >= u_level && !u_access.Founder && !u->HasPriv("chanserv/access/modify"))
|
||||
{
|
||||
@@ -123,7 +123,7 @@ class CommandCSAccess : public Command
|
||||
|
||||
bool override = !ci->AccessFor(u).HasPriv("ACCESS_CHANGE") || (level >= u_level && !u_access.Founder);
|
||||
|
||||
if (mask.find_first_of("!*@") == Anope::string::npos && findnick(mask) == NULL)
|
||||
if (mask.find_first_of("!*@") == Anope::string::npos && !findnick(mask))
|
||||
{
|
||||
User *targ = finduser(mask);
|
||||
if (targ != NULL)
|
||||
@@ -137,7 +137,7 @@ class CommandCSAccess : public Command
|
||||
|
||||
for (unsigned i = ci->GetAccessCount(); i > 0; --i)
|
||||
{
|
||||
ChanAccess *access = ci->GetAccess(i - 1);
|
||||
const ChanAccess *access = ci->GetAccess(i - 1);
|
||||
if (mask.equals_ci(access->mask))
|
||||
{
|
||||
/* Don't allow lowering from a level >= u_level */
|
||||
@@ -230,7 +230,7 @@ class CommandCSAccess : public Command
|
||||
ChanAccess *access = ci->GetAccess(Number - 1);
|
||||
|
||||
AccessGroup u_access = ci->AccessFor(user);
|
||||
ChanAccess *u_highest = u_access.Highest();
|
||||
const ChanAccess *u_highest = u_access.Highest();
|
||||
|
||||
if ((u_highest ? AccessChanAccess::DetermineLevel(u_highest) : 0) <= AccessChanAccess::DetermineLevel(access) && !u_access.Founder && !this->override && !access->mask.equals_ci(user->Account()->display))
|
||||
{
|
||||
@@ -255,7 +255,7 @@ class CommandCSAccess : public Command
|
||||
else
|
||||
{
|
||||
AccessGroup u_access = ci->AccessFor(u);
|
||||
ChanAccess *highest = u_access.Highest();
|
||||
const ChanAccess *highest = u_access.Highest();
|
||||
int u_level = (highest ? AccessChanAccess::DetermineLevel(highest) : 0);
|
||||
|
||||
for (unsigned i = ci->GetAccessCount(); i > 0; --i)
|
||||
@@ -308,7 +308,7 @@ class CommandCSAccess : public Command
|
||||
if (!number || number > ci->GetAccessCount())
|
||||
return;
|
||||
|
||||
ChanAccess *access = ci->GetAccess(number - 1);
|
||||
const ChanAccess *access = ci->GetAccess(number - 1);
|
||||
|
||||
Anope::string timebuf;
|
||||
if (ci->c)
|
||||
@@ -339,7 +339,7 @@ class CommandCSAccess : public Command
|
||||
{
|
||||
for (unsigned i = 0, end = ci->GetAccessCount(); i < end; ++i)
|
||||
{
|
||||
ChanAccess *access = ci->GetAccess(i);
|
||||
const ChanAccess *access = ci->GetAccess(i);
|
||||
|
||||
if (!nick.empty() && !Anope::Match(access->mask, nick))
|
||||
continue;
|
||||
@@ -470,7 +470,7 @@ class CommandCSAccess : public Command
|
||||
has_access = true;
|
||||
else if (is_del)
|
||||
{
|
||||
NickAlias *na = findnick(nick);
|
||||
const NickAlias *na = findnick(nick);
|
||||
if (na && na->nc == u->Account())
|
||||
has_access = true;
|
||||
}
|
||||
|
||||
@@ -54,9 +54,9 @@ class CommandCSAKick : public Command
|
||||
|
||||
Anope::string mask = params[2];
|
||||
Anope::string reason = params.size() > 3 ? params[3] : "";
|
||||
NickAlias *na = findnick(mask);
|
||||
const NickAlias *na = findnick(mask);
|
||||
NickCore *nc = NULL;
|
||||
AutoKick *akick;
|
||||
const AutoKick *akick;
|
||||
|
||||
if (!na)
|
||||
{
|
||||
@@ -113,7 +113,7 @@ class CommandCSAKick : public Command
|
||||
|
||||
/* Match against the lastusermask of all nickalias's with equal
|
||||
* or higher access. - Viper */
|
||||
for (nickalias_map::const_iterator it = NickAliasList.begin(), it_end = NickAliasList.end(); it != it_end; ++it)
|
||||
for (nickalias_map::const_iterator it = NickAliasList->begin(), it_end = NickAliasList->end(); it != it_end; ++it)
|
||||
{
|
||||
na = it->second;
|
||||
|
||||
@@ -166,7 +166,6 @@ class CommandCSAKick : public Command
|
||||
User *u = source.u;
|
||||
|
||||
const Anope::string &mask = params[2];
|
||||
AutoKick *akick;
|
||||
unsigned i, end;
|
||||
|
||||
if (!ci->GetAkickCount())
|
||||
@@ -218,12 +217,12 @@ class CommandCSAKick : public Command
|
||||
}
|
||||
else
|
||||
{
|
||||
NickAlias *na = findnick(mask);
|
||||
NickCore *nc = na ? na->nc : NULL;
|
||||
const NickAlias *na = findnick(mask);
|
||||
const NickCore *nc = na ? *na->nc : NULL;
|
||||
|
||||
for (i = 0, end = ci->GetAkickCount(); i < end; ++i)
|
||||
{
|
||||
akick = ci->GetAkick(i);
|
||||
const AutoKick *akick = ci->GetAkick(i);
|
||||
|
||||
if ((akick->HasFlag(AK_ISNICK) && akick->nc == nc) || (!akick->HasFlag(AK_ISNICK) && mask.equals_ci(akick->mask)))
|
||||
break;
|
||||
@@ -267,7 +266,7 @@ class CommandCSAKick : public Command
|
||||
if (!number || number > ci->GetAkickCount())
|
||||
return;
|
||||
|
||||
AutoKick *akick = ci->GetAkick(number - 1);
|
||||
const AutoKick *akick = ci->GetAkick(number - 1);
|
||||
|
||||
Anope::string timebuf, lastused;
|
||||
if (akick->addtime)
|
||||
@@ -296,7 +295,7 @@ class CommandCSAKick : public Command
|
||||
{
|
||||
for (unsigned i = 0, end = ci->GetAkickCount(); i < end; ++i)
|
||||
{
|
||||
AutoKick *akick = ci->GetAkick(i);
|
||||
const AutoKick *akick = ci->GetAkick(i);
|
||||
|
||||
if (!mask.empty())
|
||||
{
|
||||
|
||||
@@ -41,6 +41,7 @@ public:
|
||||
source.Reply(ACCESS_DENIED);
|
||||
return;
|
||||
}
|
||||
|
||||
ChannelInfo *target_ci = cs_findchan(target);
|
||||
if (!target_ci)
|
||||
{
|
||||
@@ -58,10 +59,10 @@ public:
|
||||
|
||||
if (what.empty())
|
||||
{
|
||||
delete target_ci;
|
||||
target_ci->destroy();
|
||||
target_ci = new ChannelInfo(*ci);
|
||||
target_ci->name = target;
|
||||
RegisteredChannelList[target_ci->name] = target_ci;
|
||||
(*RegisteredChannelList)[target_ci->name] = target_ci;
|
||||
target_ci->c = findchan(target_ci->name);
|
||||
if (target_ci->c)
|
||||
{
|
||||
@@ -107,7 +108,7 @@ public:
|
||||
{
|
||||
for (unsigned i = 0; i < ci->GetAccessCount(); ++i)
|
||||
{
|
||||
ChanAccess *taccess = ci->GetAccess(i);
|
||||
const ChanAccess *taccess = ci->GetAccess(i);
|
||||
AccessProvider *provider = taccess->provider;
|
||||
|
||||
ChanAccess *newaccess = provider->Create();
|
||||
@@ -128,7 +129,7 @@ public:
|
||||
target_ci->ClearAkick();
|
||||
for (unsigned i = 0; i < ci->GetAkickCount(); ++i)
|
||||
{
|
||||
AutoKick *akick = ci->GetAkick(i);
|
||||
const AutoKick *akick = ci->GetAkick(i);
|
||||
if (akick->HasFlag(AK_ISNICK))
|
||||
target_ci->AddAkick(akick->creator, akick->nc, akick->reason, akick->addtime, akick->last_used);
|
||||
else
|
||||
@@ -142,7 +143,7 @@ public:
|
||||
target_ci->ClearBadWords();
|
||||
for (unsigned i = 0; i < ci->GetBadWordCount(); ++i)
|
||||
{
|
||||
BadWord *bw = ci->GetBadWord(i);
|
||||
const BadWord *bw = ci->GetBadWord(i);
|
||||
target_ci->AddBadWord(bw->word, bw->type);
|
||||
}
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ class CommandCSDrop : public Command
|
||||
FOREACH_MOD(I_OnChanDrop, OnChanDrop(ci));
|
||||
|
||||
Channel *c = ci->c;
|
||||
delete ci;
|
||||
ci->destroy();
|
||||
|
||||
source.Reply(_("Channel \002%s\002 has been dropped."), chan.c_str());
|
||||
|
||||
|
||||
@@ -20,9 +20,9 @@ class CommandCSEnforce : public Command
|
||||
private:
|
||||
void DoSet(Channel *c)
|
||||
{
|
||||
ChannelInfo *ci;
|
||||
const ChannelInfo *ci = c->ci;
|
||||
|
||||
if (!(ci = c->ci))
|
||||
if (!ci)
|
||||
return;
|
||||
|
||||
if (ci->HasFlag(CI_SECUREOPS))
|
||||
@@ -39,10 +39,9 @@ class CommandCSEnforce : public Command
|
||||
|
||||
void DoSecureOps(Channel *c)
|
||||
{
|
||||
ChannelInfo *ci;
|
||||
bool hadsecureops = false;
|
||||
ChannelInfo *ci = c->ci;
|
||||
|
||||
if (!(ci = c->ci))
|
||||
if (!ci)
|
||||
return;
|
||||
|
||||
/* Dirty hack to allow chan_set_correct_modes to work ok.
|
||||
@@ -50,6 +49,7 @@ class CommandCSEnforce : public Command
|
||||
* part of the code. This way we can enforce SECUREOPS even
|
||||
* if it's off.
|
||||
*/
|
||||
bool hadsecureops = false;
|
||||
if (!ci->HasFlag(CI_SECUREOPS))
|
||||
{
|
||||
ci->SetFlag(CI_SECUREOPS);
|
||||
@@ -91,10 +91,10 @@ class CommandCSEnforce : public Command
|
||||
|
||||
void DoCModeR(Channel *c)
|
||||
{
|
||||
ChannelInfo *ci;
|
||||
ChannelInfo *ci = c->ci;
|
||||
Anope::string mask;
|
||||
|
||||
if (!(ci = c->ci))
|
||||
if (!ci)
|
||||
return;
|
||||
|
||||
for (CUserList::iterator it = c->users.begin(), it_end = c->users.end(); it != it_end; )
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
|
||||
struct EntryMsg : Serializable
|
||||
{
|
||||
ChannelInfo *ci;
|
||||
serialize_obj<ChannelInfo> ci;
|
||||
Anope::string creator;
|
||||
Anope::string message;
|
||||
time_t when;
|
||||
@@ -29,14 +29,14 @@ struct EntryMsg : Serializable
|
||||
this->when = ct;
|
||||
}
|
||||
|
||||
Anope::string serialize_name() const anope_override
|
||||
const Anope::string serialize_name() const anope_override
|
||||
{
|
||||
return "EntryMsg";
|
||||
}
|
||||
|
||||
serialized_data serialize() anope_override
|
||||
Serialize::Data serialize() const anope_override
|
||||
{
|
||||
serialized_data data;
|
||||
Serialize::Data data;
|
||||
|
||||
data["ci"] << this->ci->name;
|
||||
data["creator"] << this->creator;
|
||||
@@ -46,7 +46,7 @@ struct EntryMsg : Serializable
|
||||
return data;
|
||||
}
|
||||
|
||||
static void unserialize(serialized_data &data);
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &data);
|
||||
};
|
||||
|
||||
static unsigned MaxEntries = 0;
|
||||
@@ -55,11 +55,21 @@ struct EntryMessageList : std::vector<EntryMsg>, ExtensibleItem
|
||||
{
|
||||
};
|
||||
|
||||
void EntryMsg::unserialize(serialized_data &data)
|
||||
Serializable* EntryMsg::unserialize(Serializable *obj, Serialize::Data &data)
|
||||
{
|
||||
ChannelInfo *ci = cs_findchan(data["ci"].astr());
|
||||
if (!ci)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
if (obj)
|
||||
{
|
||||
EntryMsg *msg = debug_cast<EntryMsg *>(obj);
|
||||
msg->ci = ci;
|
||||
data["creator"] >> msg->creator;
|
||||
data["message"] >> msg->message;
|
||||
data["when"] >> msg->when;
|
||||
return msg;
|
||||
}
|
||||
|
||||
EntryMessageList *messages = ci->GetExt<EntryMessageList *>("cs_entrymsg");
|
||||
if (messages == NULL)
|
||||
@@ -69,6 +79,7 @@ void EntryMsg::unserialize(serialized_data &data)
|
||||
}
|
||||
|
||||
messages->push_back(EntryMsg(ci, data["creator"].astr(), data["message"].astr()));
|
||||
return &messages->back();
|
||||
}
|
||||
|
||||
class CommandEntryMessage : public Command
|
||||
|
||||
@@ -106,7 +106,7 @@ class CSStats : public Module
|
||||
Anope::string display;
|
||||
if (params.empty())
|
||||
display = source.u->Account()->display;
|
||||
else if (NickAlias *na = findnick(params[0]))
|
||||
else if (const NickAlias *na = findnick(params[0]))
|
||||
display = na->nc->display;
|
||||
else
|
||||
{
|
||||
@@ -165,4 +165,5 @@ void CommandCSGStats::Execute(CommandSource &source, const std::vector<Anope::st
|
||||
me->DoStats(source, true, params);
|
||||
}
|
||||
|
||||
MODULE_INIT(CSStats)
|
||||
MODULE_INIT(CSStats)
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ class FlagsChanAccess : public ChanAccess
|
||||
return false;
|
||||
}
|
||||
|
||||
Anope::string Serialize()
|
||||
Anope::string Serialize() const
|
||||
{
|
||||
return Anope::string(this->flags.begin(), this->flags.end());
|
||||
}
|
||||
@@ -43,7 +43,7 @@ class FlagsChanAccess : public ChanAccess
|
||||
this->flags.insert(data[i - 1]);
|
||||
}
|
||||
|
||||
static Anope::string DetermineFlags(ChanAccess *access)
|
||||
static Anope::string DetermineFlags(const ChanAccess *access)
|
||||
{
|
||||
if (access->provider->name == "access/flags")
|
||||
return access->Serialize();
|
||||
@@ -88,7 +88,7 @@ class CommandCSFlags : public Command
|
||||
|
||||
AccessGroup u_access = ci->AccessFor(u);
|
||||
|
||||
if (mask.find_first_of("!*@") == Anope::string::npos && findnick(mask) == NULL)
|
||||
if (mask.find_first_of("!*@") == Anope::string::npos && !findnick(mask))
|
||||
{
|
||||
User *targ = finduser(mask);
|
||||
if (targ != NULL)
|
||||
@@ -234,7 +234,7 @@ class CommandCSFlags : public Command
|
||||
unsigned count = 0;
|
||||
for (unsigned i = 0, end = ci->GetAccessCount(); i < end; ++i)
|
||||
{
|
||||
ChanAccess *access = ci->GetAccess(i);
|
||||
const ChanAccess *access = ci->GetAccess(i);
|
||||
const Anope::string &flags = FlagsChanAccess::DetermineFlags(access);
|
||||
|
||||
if (!arg.empty())
|
||||
|
||||
@@ -13,9 +13,11 @@
|
||||
|
||||
#include "module.h"
|
||||
|
||||
struct ExtensibleString : Anope::string, ExtensibleItem { };
|
||||
|
||||
class CommandCSInfo : public Command
|
||||
{
|
||||
void CheckOptStr(Anope::string &buf, ChannelInfoFlag opt, const char *str, ChannelInfo *ci, NickCore *nc)
|
||||
void CheckOptStr(Anope::string &buf, ChannelInfoFlag opt, const char *str, const ChannelInfo *ci, const NickCore *nc)
|
||||
{
|
||||
if (ci->HasFlag(opt))
|
||||
{
|
||||
@@ -68,7 +70,7 @@ class CommandCSInfo : public Command
|
||||
info["Registered"] = do_strftime(ci->time_registered);
|
||||
info["Last used"] = do_strftime(ci->last_used);
|
||||
|
||||
ModeLock *secret = ci->GetMLock(CMODE_SECRET);
|
||||
const ModeLock *secret = ci->GetMLock(CMODE_SECRET);
|
||||
if (!ci->last_topic.empty() && (show_all || ((!secret || secret->set == false) && (!ci->c || !ci->c->HasMode(CMODE_SECRET)))))
|
||||
{
|
||||
info["Last topic"] = ci->last_topic;
|
||||
|
||||
@@ -76,9 +76,9 @@ class CommandCSList : public Command
|
||||
ListFormatter list;
|
||||
list.addColumn("Name").addColumn("Description");
|
||||
|
||||
for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it)
|
||||
for (registered_channel_map::const_iterator it = RegisteredChannelList->begin(), it_end = RegisteredChannelList->end(); it != it_end; ++it)
|
||||
{
|
||||
ChannelInfo *ci = it->second;
|
||||
const ChannelInfo *ci = it->second;
|
||||
|
||||
if (!is_servadmin && (ci->HasFlag(CI_PRIVATE) || ci->HasFlag(CI_SUSPENDED)))
|
||||
continue;
|
||||
|
||||
+33
-32
@@ -36,23 +36,23 @@ public:
|
||||
source.Reply(ACCESS_DENIED);
|
||||
else if (params.size() == 1)
|
||||
{
|
||||
if (ci->log_settings.empty())
|
||||
if (ci->log_settings->empty())
|
||||
source.Reply(_("There currently are no logging configurations for %s."), ci->name.c_str());
|
||||
else
|
||||
{
|
||||
ListFormatter list;
|
||||
list.addColumn("Number").addColumn("Service").addColumn("Command").addColumn("Method").addColumn("");
|
||||
|
||||
for (unsigned i = 0; i < ci->log_settings.size(); ++i)
|
||||
for (unsigned i = 0; i < ci->log_settings->size(); ++i)
|
||||
{
|
||||
LogSetting &log = ci->log_settings[i];
|
||||
const LogSetting *log = ci->log_settings->at(i);
|
||||
|
||||
ListFormatter::ListEntry entry;
|
||||
entry["Number"] = stringify(i + 1);
|
||||
entry["Service"] = log.command_service;
|
||||
entry["Command"] = log.command_name;
|
||||
entry["Method"] = log.method;
|
||||
entry[""] = log.extra;
|
||||
entry["Service"] = log->command_service;
|
||||
entry["Command"] = log->command_name;
|
||||
entry["Method"] = log->method;
|
||||
entry[""] = log->extra;
|
||||
list.addEntry(entry);
|
||||
}
|
||||
|
||||
@@ -110,21 +110,22 @@ public:
|
||||
|
||||
bool override = !ci->AccessFor(u).HasPriv("SET");
|
||||
|
||||
for (unsigned i = ci->log_settings.size(); i > 0; --i)
|
||||
for (unsigned i = ci->log_settings->size(); i > 0; --i)
|
||||
{
|
||||
LogSetting &log = ci->log_settings[i - 1];
|
||||
LogSetting *log = ci->log_settings->at(i - 1);
|
||||
|
||||
if (log.service_name == bi->commands[command_name].name && log.method.equals_ci(method))
|
||||
if (log->service_name == bi->commands[command_name].name && log->method.equals_ci(method))
|
||||
{
|
||||
if (log.extra == extra)
|
||||
if (log->extra == extra)
|
||||
{
|
||||
ci->log_settings.erase(ci->log_settings.begin() + i - 1);
|
||||
log->destroy();
|
||||
ci->log_settings->erase(ci->log_settings->begin() + i - 1);
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "to remove logging for " << command << " with method " << method << (extra == "" ? "" : " ") << extra;
|
||||
source.Reply(_("Logging for command %s on %s with log method %s%s%s has been removed."), command_name.c_str(), bi->nick.c_str(), method.c_str(), extra.empty() ? "" : " ", extra.empty() ? "" : extra.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
log.extra = extra;
|
||||
log->extra = extra;
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "to change logging for " << command << " to method " << method << (extra == "" ? "" : " ") << extra;
|
||||
source.Reply(_("Logging changed for command %s on %s, now using log method %s%s%s."), command_name.c_str(), bi->nick.c_str(), method.c_str(), extra.empty() ? "" : " ", extra.empty() ? "" : extra.c_str());
|
||||
}
|
||||
@@ -132,17 +133,17 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
LogSetting log;
|
||||
log.ci = ci;
|
||||
log.service_name = bi->commands[command_name].name;
|
||||
log.command_service = bi->nick;
|
||||
log.command_name = command_name;
|
||||
log.method = method;
|
||||
log.extra = extra;
|
||||
log.created = Anope::CurTime;
|
||||
log.creator = u->nick;
|
||||
LogSetting *log = new LogSetting();
|
||||
log->ci = ci;
|
||||
log->service_name = bi->commands[command_name].name;
|
||||
log->command_service = bi->nick;
|
||||
log->command_name = command_name;
|
||||
log->method = method;
|
||||
log->extra = extra;
|
||||
log->created = Anope::CurTime;
|
||||
log->creator = u->nick;
|
||||
|
||||
ci->log_settings.push_back(log);
|
||||
ci->log_settings->push_back(log);
|
||||
Log(override ? LOG_OVERRIDE : LOG_COMMAND, u, this, ci) << "to log " << command << " with method " << method << (extra == "" ? "" : " ") << extra;
|
||||
|
||||
source.Reply(_("Logging is now active for command %s on %s, using log method %s%s%s."), command_name.c_str(), bi->nick.c_str(), method.c_str(), extra.empty() ? "" : " ", extra.empty() ? "" : extra.c_str());
|
||||
@@ -197,19 +198,19 @@ class CSLog : public Module
|
||||
if (l->Type != LOG_COMMAND || l->u == NULL || l->c == NULL || l->ci == NULL || !Me || !Me->IsSynced())
|
||||
return;
|
||||
|
||||
for (unsigned i = l->ci->log_settings.size(); i > 0; --i)
|
||||
for (unsigned i = l->ci->log_settings->size(); i > 0; --i)
|
||||
{
|
||||
LogSetting &log = l->ci->log_settings[i - 1];
|
||||
const LogSetting *log = l->ci->log_settings->at(i - 1);
|
||||
|
||||
if (log.service_name == l->c->name)
|
||||
if (log->service_name == l->c->name)
|
||||
{
|
||||
Anope::string buffer = l->u->nick + " used " + log.command_name + " " + l->buf.str();
|
||||
Anope::string buffer = l->u->nick + " used " + log->command_name + " " + l->buf.str();
|
||||
|
||||
if (log.method.equals_ci("MESSAGE") && l->ci->c && l->ci->bi && l->ci->c->FindUser(l->ci->bi) != NULL)
|
||||
ircdproto->SendPrivmsg(l->ci->bi, log.extra + l->ci->c->name, "%s", buffer.c_str());
|
||||
else if (log.method.equals_ci("NOTICE") && l->ci->c && l->ci->bi && l->ci->c->FindUser(l->ci->bi) != NULL)
|
||||
ircdproto->SendNotice(l->ci->bi, log.extra + l->ci->c->name, "%s", buffer.c_str());
|
||||
else if (log.method.equals_ci("MEMO") && memoserv && l->ci->WhoSends() != NULL)
|
||||
if (log->method.equals_ci("MESSAGE") && l->ci->c && l->ci->bi && l->ci->c->FindUser(l->ci->bi) != NULL)
|
||||
ircdproto->SendPrivmsg(l->ci->bi, log->extra + l->ci->c->name, "%s", buffer.c_str());
|
||||
else if (log->method.equals_ci("NOTICE") && l->ci->c && l->ci->bi && l->ci->c->FindUser(l->ci->bi) != NULL)
|
||||
ircdproto->SendNotice(l->ci->bi, log->extra + l->ci->c->name, "%s", buffer.c_str());
|
||||
else if (log->method.equals_ci("MEMO") && memoserv && l->ci->WhoSends() != NULL)
|
||||
memoserv->Send(l->ci->WhoSends()->nick, l->ci->name, buffer, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -151,7 +151,7 @@ class CommandCSMode : public Command
|
||||
}
|
||||
else if (subcommand.equals_ci("LIST"))
|
||||
{
|
||||
const std::multimap<ChannelModeName, ModeLock> &mlocks = ci->GetMLock();
|
||||
const ChannelInfo::ModeList &mlocks = ci->GetMLock();
|
||||
if (mlocks.empty())
|
||||
{
|
||||
source.Reply(_("Channel %s has no mode locks."), ci->name.c_str());
|
||||
@@ -161,18 +161,18 @@ class CommandCSMode : public Command
|
||||
ListFormatter list;
|
||||
list.addColumn("Mode").addColumn("Param").addColumn("Creator").addColumn("Created");
|
||||
|
||||
for (std::multimap<ChannelModeName, ModeLock>::const_iterator it = mlocks.begin(), it_end = mlocks.end(); it != it_end; ++it)
|
||||
for (ChannelInfo::ModeList::const_iterator it = mlocks.begin(), it_end = mlocks.end(); it != it_end; ++it)
|
||||
{
|
||||
const ModeLock &ml = it->second;
|
||||
ChannelMode *cm = ModeManager::FindChannelModeByName(ml.name);
|
||||
const ModeLock *ml = it->second;
|
||||
ChannelMode *cm = ModeManager::FindChannelModeByName(ml->name);
|
||||
if (!cm)
|
||||
continue;
|
||||
|
||||
ListFormatter::ListEntry entry;
|
||||
entry["Mode"] = Anope::printf("%c%c", ml.set ? '+' : '-', cm->ModeChar);
|
||||
entry["Param"] = ml.param;
|
||||
entry["Creator"] = ml.setter;
|
||||
entry["Created"] = do_strftime(ml.created, source.u->Account(), false);
|
||||
entry["Mode"] = Anope::printf("%c%c", ml->set ? '+' : '-', cm->ModeChar);
|
||||
entry["Param"] = ml->param;
|
||||
entry["Creator"] = ml->setter;
|
||||
entry["Created"] = do_strftime(ml->created, source.u->Account(), false);
|
||||
list.addEntry(entry);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,19 +20,31 @@ class CommandModeBase : public Command
|
||||
User *u = source.u;
|
||||
User *u2 = finduser(nick);
|
||||
Channel *c = findchan(chan);
|
||||
ChannelInfo *ci = c ? c->ci : NULL;
|
||||
|
||||
bool is_same = u == u2;
|
||||
|
||||
AccessGroup u_access = ci ? ci->AccessFor(u) : AccessGroup(), u2_access = ci && u2 ? ci->AccessFor(u2) : AccessGroup();
|
||||
|
||||
if (!c)
|
||||
{
|
||||
source.Reply(CHAN_X_NOT_IN_USE, chan.c_str());
|
||||
else if (!ci)
|
||||
source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
|
||||
else if (!u2)
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
if (!u2)
|
||||
{
|
||||
source.Reply(NICK_X_NOT_IN_USE, nick.c_str());
|
||||
else if (is_same ? !ci->AccessFor(u).HasPriv(levelself) : !ci->AccessFor(u).HasPriv(level))
|
||||
return;
|
||||
}
|
||||
|
||||
ChannelInfo *ci = c->ci;
|
||||
if (!ci)
|
||||
{
|
||||
source.Reply(CHAN_X_NOT_REGISTERED, c->name.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
bool is_same = u == u2;
|
||||
AccessGroup u_access = ci->AccessFor(u), u2_access = ci->AccessFor(u2);
|
||||
|
||||
if (is_same ? !ci->AccessFor(u).HasPriv(levelself) : !ci->AccessFor(u).HasPriv(level))
|
||||
source.Reply(ACCESS_DENIED);
|
||||
else if (!set && !is_same && ci->HasFlag(CI_PEACE) && u2_access >= u_access)
|
||||
source.Reply(ACCESS_DENIED);
|
||||
|
||||
@@ -46,7 +46,7 @@ class CommandCSRegister : public Command
|
||||
else if (c && !c->HasUserStatus(u, CMODE_OP))
|
||||
source.Reply(_("You must be a channel operator to register the channel."));
|
||||
else if (Config->CSMaxReg && u->Account()->channelcount >= Config->CSMaxReg && !u->HasPriv("chanserv/no-register-limit"))
|
||||
source.Reply(u->Account()->channelcount > Config->CSMaxReg ? CHAN_EXCEEDED_CHANNEL_LIMIT : _(CHAN_REACHED_CHANNEL_LIMIT), Config->CSMaxReg);
|
||||
source.Reply(u->Account()->channelcount > Config->CSMaxReg ? CHAN_EXCEEDED_CHANNEL_LIMIT : CHAN_REACHED_CHANNEL_LIMIT, Config->CSMaxReg);
|
||||
else
|
||||
{
|
||||
ci = new ChannelInfo(chan);
|
||||
@@ -54,11 +54,12 @@ class CommandCSRegister : public Command
|
||||
if (!chdesc.empty())
|
||||
ci->desc = chdesc;
|
||||
|
||||
ci->mode_locks = def_mode_locks;
|
||||
for (ChannelInfo::ModeList::iterator it = ci->mode_locks.begin(), it_end = ci->mode_locks.end(); it != it_end; ++it)
|
||||
for (ChannelInfo::ModeList::iterator it = def_mode_locks.begin(), it_end = def_mode_locks.end(); it != it_end; ++it)
|
||||
{
|
||||
it->second.setter = u->nick;
|
||||
it->second.ci = ci;
|
||||
ModeLock *ml = new ModeLock(*it->second);
|
||||
ml->setter = u->nick;
|
||||
ml->ci = ci;
|
||||
ci->mode_locks->insert(std::make_pair(it->first, ml));
|
||||
}
|
||||
|
||||
if (c && !c->topic.empty())
|
||||
|
||||
@@ -37,10 +37,10 @@ class CommandCSSASet : public Command
|
||||
" \n"
|
||||
"Available options:"));
|
||||
Anope::string this_name = source.command;
|
||||
for (BotInfo::command_map::iterator it = source.owner->commands.begin(), it_end = source.owner->commands.end(); it != it_end; ++it)
|
||||
for (BotInfo::command_map::const_iterator it = source.owner->commands.begin(), it_end = source.owner->commands.end(); it != it_end; ++it)
|
||||
{
|
||||
const Anope::string &c_name = it->first;
|
||||
CommandInfo &info = it->second;
|
||||
const CommandInfo &info = it->second;
|
||||
if (c_name.find_ci(this_name + " ") == 0)
|
||||
{
|
||||
service_reference<Command> command("Command", info.name);
|
||||
|
||||
@@ -37,14 +37,14 @@ struct SeenInfo : Serializable
|
||||
{
|
||||
}
|
||||
|
||||
Anope::string serialize_name() const anope_override
|
||||
const Anope::string serialize_name() const anope_override
|
||||
{
|
||||
return "SeenInfo";
|
||||
}
|
||||
|
||||
serialized_data serialize() anope_override
|
||||
Serialize::Data serialize() const anope_override
|
||||
{
|
||||
serialized_data data;
|
||||
Serialize::Data data;
|
||||
|
||||
data["nick"] << nick;
|
||||
data["vhost"] << vhost;
|
||||
@@ -57,9 +57,13 @@ struct SeenInfo : Serializable
|
||||
return data;
|
||||
}
|
||||
|
||||
static void unserialize(serialized_data &data)
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &data)
|
||||
{
|
||||
SeenInfo *s = new SeenInfo();
|
||||
SeenInfo *s;
|
||||
if (obj)
|
||||
s = debug_cast<SeenInfo *>(obj);
|
||||
else
|
||||
s = new SeenInfo();
|
||||
|
||||
data["nick"] >> s->nick;
|
||||
data["vhost"] >> s->vhost;
|
||||
@@ -71,7 +75,9 @@ struct SeenInfo : Serializable
|
||||
data["message"] >> s->message;
|
||||
data["last"] >> s->last;
|
||||
|
||||
database[s->nick] = s;
|
||||
if (!s)
|
||||
database[s->nick] = s;
|
||||
return s;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -89,7 +95,7 @@ static SeenInfo *FindInfo(const Anope::string &nick)
|
||||
static bool ShouldHide(const Anope::string &channel, User *u)
|
||||
{
|
||||
Channel *targetchan = findchan(channel);
|
||||
ChannelInfo *targetchan_ci = targetchan ? targetchan->ci : cs_findchan(channel);
|
||||
const ChannelInfo *targetchan_ci = targetchan ? *targetchan->ci : cs_findchan(channel);
|
||||
|
||||
if (targetchan && targetchan->HasMode(CMODE_SECRET))
|
||||
return true;
|
||||
@@ -303,7 +309,7 @@ class DataBasePurger : public CallBack
|
||||
if ((Anope::CurTime - cur->second->last) > purgetime)
|
||||
{
|
||||
Log(LOG_DEBUG) << cur->first << " was last seen " << do_strftime(cur->second->last) << ", purging entry";
|
||||
delete cur->second;
|
||||
cur->second->destroy();
|
||||
database.erase(cur);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,10 +37,10 @@ class CommandCSSet : public Command
|
||||
" \n"
|
||||
"Available options:"));
|
||||
Anope::string this_name = source.command;
|
||||
for (BotInfo::command_map::iterator it = source.owner->commands.begin(), it_end = source.owner->commands.end(); it != it_end; ++it)
|
||||
for (BotInfo::command_map::const_iterator it = source.owner->commands.begin(), it_end = source.owner->commands.end(); it != it_end; ++it)
|
||||
{
|
||||
const Anope::string &c_name = it->first;
|
||||
CommandInfo &info = it->second;
|
||||
const CommandInfo &info = it->second;
|
||||
if (c_name.find_ci(this_name + " ") == 0)
|
||||
{
|
||||
service_reference<Command> command("Command", info.name);
|
||||
|
||||
@@ -22,7 +22,7 @@ class CommandCSSetFounder : public Command
|
||||
this->SetSyntax(_("\037channel\037 \037nick\037"));
|
||||
}
|
||||
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms)anope_override
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
User *u = source.u;
|
||||
ChannelInfo *ci = cs_findchan(params[0]);
|
||||
@@ -44,8 +44,7 @@ class CommandCSSetFounder : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
NickAlias *na = findnick(params[1]);
|
||||
|
||||
const NickAlias *na = findnick(params[1]);
|
||||
if (!na)
|
||||
{
|
||||
source.Reply(NICK_X_NOT_REGISTERED, params[1].c_str());
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
|
||||
#include "module.h"
|
||||
|
||||
struct CSMiscData : Anope::string, ExtensibleItem, Serializable
|
||||
struct CSMiscData : ExtensibleItem, Serializable
|
||||
{
|
||||
ChannelInfo *ci;
|
||||
serialize_obj<ChannelInfo> ci;
|
||||
Anope::string name;
|
||||
Anope::string data;
|
||||
|
||||
@@ -22,14 +22,14 @@ struct CSMiscData : Anope::string, ExtensibleItem, Serializable
|
||||
{
|
||||
}
|
||||
|
||||
Anope::string serialize_name() const anope_override
|
||||
const Anope::string serialize_name() const anope_override
|
||||
{
|
||||
return "CSMiscData";
|
||||
}
|
||||
|
||||
serialized_data serialize() anope_override
|
||||
Serialize::Data serialize() const anope_override
|
||||
{
|
||||
serialized_data sdata;
|
||||
Serialize::Data sdata;
|
||||
|
||||
sdata["ci"] << this->ci->name;
|
||||
sdata["name"] << this->name;
|
||||
@@ -38,13 +38,27 @@ struct CSMiscData : Anope::string, ExtensibleItem, Serializable
|
||||
return sdata;
|
||||
}
|
||||
|
||||
static void unserialize(serialized_data &data)
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &data)
|
||||
{
|
||||
ChannelInfo *ci = cs_findchan(data["ci"].astr());
|
||||
if (ci == NULL)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
ci->Extend(data["name"].astr(), new CSMiscData(ci, data["name"].astr(), data["data"].astr()));
|
||||
CSMiscData *d;
|
||||
if (obj)
|
||||
{
|
||||
d = debug_cast<CSMiscData *>(obj);
|
||||
d->ci = ci;
|
||||
data["name"] >> d->name;
|
||||
data["data"] >> d->data;
|
||||
}
|
||||
else
|
||||
{
|
||||
d = new CSMiscData(ci, data["name"].astr(), data["data"].astr());
|
||||
ci->Extend(data["name"].astr(), d);
|
||||
}
|
||||
|
||||
return d;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ class CommandCSSetSuccessor : public Command
|
||||
|
||||
if (params.size() > 1)
|
||||
{
|
||||
NickAlias *na = findnick(params[1]);
|
||||
const NickAlias *na = findnick(params[1]);
|
||||
|
||||
if (!na)
|
||||
{
|
||||
|
||||
@@ -13,6 +13,11 @@
|
||||
|
||||
#include "module.h"
|
||||
|
||||
struct ExtensibleString : Anope::string, ExtensibleItem
|
||||
{
|
||||
ExtensibleString(const Anope::string &s) : Anope::string(s) { }
|
||||
};
|
||||
|
||||
struct ChanSuspend : ExtensibleItem, Serializable
|
||||
{
|
||||
Anope::string chan;
|
||||
@@ -22,14 +27,14 @@ struct ChanSuspend : ExtensibleItem, Serializable
|
||||
{
|
||||
}
|
||||
|
||||
Anope::string serialize_name() const
|
||||
const Anope::string serialize_name() const
|
||||
{
|
||||
return "ChanSuspend";
|
||||
}
|
||||
|
||||
serialized_data serialize() anope_override
|
||||
Serialize::Data serialize() const anope_override
|
||||
{
|
||||
serialized_data sd;
|
||||
Serialize::Data sd;
|
||||
|
||||
sd["chan"] << this->chan;
|
||||
sd["when"] << this->when;
|
||||
@@ -37,18 +42,24 @@ struct ChanSuspend : ExtensibleItem, Serializable
|
||||
return sd;
|
||||
}
|
||||
|
||||
static void unserialize(serialized_data &sd)
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &sd)
|
||||
{
|
||||
ChannelInfo *ci = cs_findchan(sd["chan"].astr());
|
||||
if (ci == NULL)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
ChanSuspend *cs = new ChanSuspend();
|
||||
ChanSuspend *cs;
|
||||
if (obj)
|
||||
cs = debug_cast<ChanSuspend *>(obj);
|
||||
else
|
||||
cs = new ChanSuspend();
|
||||
|
||||
sd["chan"] >> cs->chan;
|
||||
sd["when"] >> cs->when;
|
||||
|
||||
ci->Extend("ci_suspend_expire", cs);
|
||||
if (!obj)
|
||||
ci->Extend("ci_suspend_expire", cs);
|
||||
return cs;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -220,11 +231,12 @@ class CSSuspend : public Module
|
||||
|
||||
~CSSuspend()
|
||||
{
|
||||
for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it)
|
||||
for (registered_channel_map::const_iterator it = RegisteredChannelList->begin(), it_end = RegisteredChannelList->end(); it != it_end; ++it)
|
||||
{
|
||||
it->second->Shrink("cs_suspend_expire");
|
||||
it->second->Shrink("suspend_by");
|
||||
it->second->Shrink("suspend_reason");
|
||||
ChannelInfo *ci = it->second;
|
||||
ci->Shrink("cs_suspend_expire");
|
||||
ci->Shrink("suspend_by");
|
||||
ci->Shrink("suspend_reason");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ class CommandCSUp : public Command
|
||||
|
||||
if (c == NULL)
|
||||
source.Reply(CHAN_X_NOT_IN_USE, channel.c_str());
|
||||
else if (c->ci == NULL)
|
||||
else if (!c->ci)
|
||||
source.Reply(CHAN_X_NOT_REGISTERED, channel.c_str());
|
||||
else
|
||||
chan_set_correct_modes(u, c, 1);
|
||||
@@ -94,7 +94,7 @@ class CommandCSDown : public Command
|
||||
|
||||
if (c == NULL)
|
||||
source.Reply(CHAN_X_NOT_IN_USE, channel.c_str());
|
||||
else if (c->ci == NULL)
|
||||
else if (!c->ci)
|
||||
source.Reply(CHAN_X_NOT_REGISTERED, channel.c_str());
|
||||
else
|
||||
RemoveAll(u, c);
|
||||
|
||||
+10
-10
@@ -116,7 +116,7 @@ class XOPChanAccess : public ChanAccess
|
||||
return false;
|
||||
}
|
||||
|
||||
Anope::string Serialize()
|
||||
Anope::string Serialize() const
|
||||
{
|
||||
for (int i = 0; xopAccess[i].type != XOP_UNKNOWN; ++i)
|
||||
{
|
||||
@@ -145,11 +145,11 @@ class XOPChanAccess : public ChanAccess
|
||||
this->type = XOP_UNKNOWN;
|
||||
}
|
||||
|
||||
static XOPType DetermineLevel(ChanAccess *access)
|
||||
static XOPType DetermineLevel(const ChanAccess *access)
|
||||
{
|
||||
if (access->provider->name == "access/xop")
|
||||
{
|
||||
XOPChanAccess *xaccess = debug_cast<XOPChanAccess *>(access);
|
||||
const XOPChanAccess *xaccess = debug_cast<const XOPChanAccess *>(access);
|
||||
return xaccess->type;
|
||||
}
|
||||
else
|
||||
@@ -216,7 +216,7 @@ class XOPBase : public Command
|
||||
}
|
||||
|
||||
AccessGroup access = ci->AccessFor(u);
|
||||
ChanAccess *highest = access.Highest();
|
||||
const ChanAccess *highest = access.Highest();
|
||||
int u_level = (highest ? XOPChanAccess::DetermineLevel(highest) : 0);
|
||||
|
||||
if ((!access.Founder && !access.HasPriv("ACCESS_CHANGE") && !u->HasPriv("chanserv/access/modify")) || (level <= u_level && !access.Founder))
|
||||
@@ -225,7 +225,7 @@ class XOPBase : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
if (mask.find_first_of("!*@") == Anope::string::npos && findnick(mask) == NULL)
|
||||
if (mask.find_first_of("!*@") == Anope::string::npos && !findnick(mask))
|
||||
{
|
||||
User *targ = finduser(mask);
|
||||
if (targ != NULL)
|
||||
@@ -239,7 +239,7 @@ class XOPBase : public Command
|
||||
|
||||
for (unsigned i = 0; i < ci->GetAccessCount(); ++i)
|
||||
{
|
||||
ChanAccess *a = ci->GetAccess(i);
|
||||
const ChanAccess *a = ci->GetAccess(i);
|
||||
|
||||
if (a->mask.equals_ci(mask))
|
||||
{
|
||||
@@ -304,7 +304,7 @@ class XOPBase : public Command
|
||||
}
|
||||
|
||||
AccessGroup access = ci->AccessFor(u);
|
||||
ChanAccess *highest = access.Highest();
|
||||
const ChanAccess *highest = access.Highest();
|
||||
bool override = false;
|
||||
if ((!mask.equals_ci(u->Account()->display) && !access.HasPriv("ACCESS_CHANGE") && !access.Founder) || ((!highest || level <= XOPChanAccess::DetermineLevel(highest)) && !access.Founder))
|
||||
{
|
||||
@@ -436,7 +436,7 @@ class XOPBase : public Command
|
||||
if (!Number || Number > ci->GetAccessCount())
|
||||
return;
|
||||
|
||||
ChanAccess *a = ci->GetAccess(Number - 1);
|
||||
const ChanAccess *a = ci->GetAccess(Number - 1);
|
||||
|
||||
if (this->type != XOPChanAccess::DetermineLevel(a))
|
||||
return;
|
||||
@@ -453,7 +453,7 @@ class XOPBase : public Command
|
||||
{
|
||||
for (unsigned i = 0, end = ci->GetAccessCount(); i < end; ++i)
|
||||
{
|
||||
ChanAccess *a = ci->GetAccess(i);
|
||||
const ChanAccess *a = ci->GetAccess(i);
|
||||
|
||||
if (XOPChanAccess::DetermineLevel(a) != level)
|
||||
continue;
|
||||
@@ -507,7 +507,7 @@ class XOPBase : public Command
|
||||
|
||||
for (unsigned i = ci->GetAccessCount(); i > 0; --i)
|
||||
{
|
||||
ChanAccess *access = ci->GetAccess(i - 1);
|
||||
const ChanAccess *access = ci->GetAccess(i - 1);
|
||||
if (XOPChanAccess::DetermineLevel(access) == level)
|
||||
ci->EraseAccess(i - 1);
|
||||
}
|
||||
|
||||
@@ -31,14 +31,14 @@ class CommandHelp : public Command
|
||||
return;
|
||||
|
||||
User *u = source.u;
|
||||
BotInfo *bi = source.owner;
|
||||
const BotInfo *bi = source.owner;
|
||||
|
||||
if (params.empty())
|
||||
{
|
||||
for (BotInfo::command_map::iterator it = bi->commands.begin(), it_end = bi->commands.end(); it != it_end; ++it)
|
||||
for (BotInfo::command_map::const_iterator it = bi->commands.begin(), it_end = bi->commands.end(); it != it_end; ++it)
|
||||
{
|
||||
const Anope::string &c_name = it->first;
|
||||
CommandInfo &info = it->second;
|
||||
const CommandInfo &info = it->second;
|
||||
|
||||
// Smaller command exists
|
||||
Anope::string cmd = myStrGetToken(c_name, ' ', 0);
|
||||
@@ -65,11 +65,11 @@ class CommandHelp : public Command
|
||||
full_command += " " + params[i];
|
||||
full_command.erase(full_command.begin());
|
||||
|
||||
BotInfo::command_map::iterator it = bi->commands.find(full_command);
|
||||
BotInfo::command_map::const_iterator it = bi->commands.find(full_command);
|
||||
if (it == bi->commands.end())
|
||||
continue;
|
||||
|
||||
CommandInfo &info = it->second;
|
||||
const CommandInfo &info = it->second;
|
||||
|
||||
service_reference<Command> c("Command", info.name);
|
||||
if (!c)
|
||||
|
||||
@@ -65,8 +65,8 @@ class CommandHSDelAll : public Command
|
||||
if (na)
|
||||
{
|
||||
FOREACH_MOD(I_OnDeleteVhost, OnDeleteVhost(na));
|
||||
NickCore *nc = na->nc;
|
||||
for (std::list<NickAlias *>::iterator it = nc->aliases.begin(), it_end = nc->aliases.end(); it != it_end; ++it)
|
||||
const NickCore *nc = na->nc;
|
||||
for (std::list<serialize_obj<NickAlias> >::const_iterator it = nc->aliases.begin(), it_end = nc->aliases.end(); it != it_end; ++it)
|
||||
{
|
||||
na = *it;
|
||||
na->RemoveVhost();
|
||||
|
||||
@@ -15,15 +15,16 @@
|
||||
|
||||
class CommandHSGroup : public Command
|
||||
{
|
||||
void Sync(NickAlias *na)
|
||||
void Sync(const NickAlias *na)
|
||||
{
|
||||
if (!na || !na->HasVhost())
|
||||
return;
|
||||
|
||||
for (std::list<NickAlias *>::iterator it = na->nc->aliases.begin(), it_end = na->nc->aliases.end(); it != it_end; ++it)
|
||||
for (std::list<serialize_obj<NickAlias> >::const_iterator it = na->nc->aliases.begin(), it_end = na->nc->aliases.end(); it != it_end;)
|
||||
{
|
||||
NickAlias *nick = *it;
|
||||
nick->SetVhost(na->GetVhostIdent(), na->GetVhostHost(), na->GetVhostCreator());
|
||||
NickAlias *nick = *it++;
|
||||
if (nick)
|
||||
nick->SetVhost(na->GetVhostIdent(), na->GetVhostHost(), na->GetVhostCreator());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -59,9 +59,9 @@ class CommandHSList : public Command
|
||||
ListFormatter list;
|
||||
list.addColumn("Number").addColumn("Nick").addColumn("Vhost").addColumn("Creator").addColumn("Created");
|
||||
|
||||
for (nickalias_map::const_iterator it = NickAliasList.begin(), it_end = NickAliasList.end(); it != it_end; ++it)
|
||||
for (nickalias_map::const_iterator it = NickAliasList->begin(), it_end = NickAliasList->end(); it != it_end; ++it)
|
||||
{
|
||||
NickAlias *na = it->second;
|
||||
const NickAlias *na = it->second;
|
||||
|
||||
if (!na->HasVhost())
|
||||
continue;
|
||||
|
||||
@@ -25,7 +25,7 @@ class CommandHSOff : public Command
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
User *u = source.u;
|
||||
NickAlias *na = findnick(u->nick);
|
||||
const NickAlias *na = findnick(u->nick);
|
||||
|
||||
if (!na || !na->HasVhost())
|
||||
source.Reply(HOST_NOT_ASSIGNED);
|
||||
|
||||
@@ -25,7 +25,7 @@ class CommandHSOn : public Command
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
User *u = source.u;
|
||||
NickAlias *na = findnick(u->nick);
|
||||
const NickAlias *na = findnick(u->nick);
|
||||
if (na && u->Account() == na->nc && na->HasVhost())
|
||||
{
|
||||
if (!na->GetVhostIdent().empty())
|
||||
|
||||
@@ -30,14 +30,14 @@ struct HostRequest : ExtensibleItem, Serializable
|
||||
Anope::string host;
|
||||
time_t time;
|
||||
|
||||
Anope::string serialize_name() const anope_override
|
||||
const Anope::string serialize_name() const anope_override
|
||||
{
|
||||
return "HostRequest";
|
||||
}
|
||||
|
||||
serialized_data serialize() anope_override
|
||||
Serialize::Data serialize() const anope_override
|
||||
{
|
||||
serialized_data data;
|
||||
Serialize::Data data;
|
||||
|
||||
data["nick"] << this->nick;
|
||||
data["ident"] << this->ident;
|
||||
@@ -47,19 +47,25 @@ struct HostRequest : ExtensibleItem, Serializable
|
||||
return data;
|
||||
}
|
||||
|
||||
static void unserialize(serialized_data &data)
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &data)
|
||||
{
|
||||
NickAlias *na = findnick(data["nick"].astr());
|
||||
if (na == NULL)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
HostRequest *req = new HostRequest;
|
||||
HostRequest *req;
|
||||
if (obj)
|
||||
req = debug_cast<HostRequest *>(obj);
|
||||
else
|
||||
req = new HostRequest;
|
||||
req->nick = na->nick;
|
||||
data["ident"] >> req->ident;
|
||||
data["host"] >> req->host;
|
||||
data["time"] >> req->time;
|
||||
|
||||
na->Extend("hs_request", req);
|
||||
if (!obj)
|
||||
na->Extend("hs_request", req);
|
||||
return req;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -282,9 +288,9 @@ class CommandHSWaiting : public Command
|
||||
|
||||
list.addColumn("Number").addColumn("Nick").addColumn("Vhost").addColumn("Created");
|
||||
|
||||
for (nickalias_map::const_iterator it = NickAliasList.begin(), it_end = NickAliasList.end(); it != it_end; ++it)
|
||||
for (nickalias_map::const_iterator it = NickAliasList->begin(), it_end = NickAliasList->end(); it != it_end; ++it)
|
||||
{
|
||||
NickAlias *na = it->second;
|
||||
const NickAlias *na = it->second;
|
||||
HostRequest *hr = na->GetExt<HostRequest *>("hs_request");
|
||||
if (!hr)
|
||||
continue;
|
||||
@@ -358,8 +364,11 @@ class HSRequest : public Module
|
||||
|
||||
~HSRequest()
|
||||
{
|
||||
for (nickalias_map::const_iterator it = NickAliasList.begin(), it_end = NickAliasList.end(); it != it_end; ++it)
|
||||
it->second->Shrink("hs_request");
|
||||
for (nickalias_map::const_iterator it = NickAliasList->begin(), it_end = NickAliasList->end(); it != it_end; ++it)
|
||||
{
|
||||
NickAlias *na = it->second;
|
||||
na->Shrink("hs_request");
|
||||
}
|
||||
}
|
||||
|
||||
void OnReload() anope_override
|
||||
@@ -387,7 +396,7 @@ void req_send_memos(CommandSource &source, const Anope::string &vIdent, const An
|
||||
{
|
||||
Oper *o = Config->Opers[i];
|
||||
|
||||
NickAlias *na = findnick(o->name);
|
||||
const NickAlias *na = findnick(o->name);
|
||||
if (!na)
|
||||
continue;
|
||||
|
||||
|
||||
@@ -104,15 +104,16 @@ class CommandHSSet : public Command
|
||||
|
||||
class CommandHSSetAll : public Command
|
||||
{
|
||||
void Sync(NickAlias *na)
|
||||
void Sync(const NickAlias *na)
|
||||
{
|
||||
if (!na || !na->HasVhost())
|
||||
return;
|
||||
|
||||
for (std::list<NickAlias *>::iterator it = na->nc->aliases.begin(), it_end = na->nc->aliases.end(); it != it_end; ++it)
|
||||
for (std::list<serialize_obj<NickAlias> >::const_iterator it = na->nc->aliases.begin(), it_end = na->nc->aliases.end(); it != it_end;)
|
||||
{
|
||||
NickAlias *nick = *it;
|
||||
nick->SetVhost(na->GetVhostIdent(), na->GetVhostHost(), na->GetVhostCreator());
|
||||
NickAlias *nick = *it++;
|
||||
if (nick)
|
||||
nick->SetVhost(na->GetVhostIdent(), na->GetVhostHost(), na->GetVhostCreator());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -39,11 +39,20 @@ class CommandMSCancel : public Command
|
||||
source.Reply(ischan ? CHAN_X_NOT_REGISTERED : _(NICK_X_NOT_REGISTERED), nname.c_str());
|
||||
else
|
||||
{
|
||||
for (int i = mi->memos.size() - 1; i >= 0; --i)
|
||||
if (mi->memos[i]->HasFlag(MF_UNREAD) && u->Account()->display.equals_ci(mi->memos[i]->sender))
|
||||
ChannelInfo *ci;
|
||||
NickAlias *na;
|
||||
if (ischan)
|
||||
ci = cs_findchan(nname);
|
||||
else
|
||||
na = findnick(nname);
|
||||
for (int i = mi->memos->size() - 1; i >= 0; --i)
|
||||
if (mi->GetMemo(i)->HasFlag(MF_UNREAD) && u->Account()->display.equals_ci(mi->GetMemo(i)->sender))
|
||||
{
|
||||
FOREACH_MOD(I_OnMemoDel, OnMemoDel(findnick(nname)->nc, mi, mi->memos[i]));
|
||||
mi->Del(mi->memos[i]);
|
||||
if (ischan)
|
||||
FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->GetMemo(i)));
|
||||
else
|
||||
FOREACH_MOD(I_OnMemoDel, OnMemoDel(na->nc, mi, mi->GetMemo(i)));
|
||||
mi->Del(i);
|
||||
source.Reply(_("Last memo to \002%s\002 has been cancelled."), nname.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -30,28 +30,28 @@ class CommandMSCheck : public Command
|
||||
|
||||
bool found = false;
|
||||
|
||||
NickAlias *na = findnick(recipient);
|
||||
const NickAlias *na = findnick(recipient);
|
||||
if (!na)
|
||||
{
|
||||
source.Reply(NICK_X_NOT_REGISTERED, recipient.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
MemoInfo *mi = &na->nc->memos;
|
||||
MemoInfo *mi = const_cast<MemoInfo *>(&na->nc->memos);
|
||||
|
||||
/* Okay, I know this looks strange but we wanna get the LAST memo, so we
|
||||
have to loop backwards */
|
||||
|
||||
for (int i = mi->memos.size() - 1; i >= 0; --i)
|
||||
for (int i = mi->memos->size() - 1; i >= 0; --i)
|
||||
{
|
||||
if (u->Account()->display.equals_ci(mi->memos[i]->sender))
|
||||
if (u->Account()->display.equals_ci(mi->GetMemo(i)->sender))
|
||||
{
|
||||
found = true; /* Yes, we've found the memo */
|
||||
|
||||
if (mi->memos[i]->HasFlag(MF_UNREAD))
|
||||
source.Reply(_("The last memo you sent to %s (sent on %s) has not yet been read."), na->nick.c_str(), do_strftime(mi->memos[i]->time).c_str());
|
||||
if (mi->GetMemo(i)->HasFlag(MF_UNREAD))
|
||||
source.Reply(_("The last memo you sent to %s (sent on %s) has not yet been read."), na->nick.c_str(), do_strftime(mi->GetMemo(i)->time).c_str());
|
||||
else
|
||||
source.Reply(_("The last memo you sent to %s (sent on %s) has been read."), na->nick.c_str(), do_strftime(mi->memos[i]->time).c_str());
|
||||
source.Reply(_("The last memo you sent to %s (sent on %s) has been read."), na->nick.c_str(), do_strftime(mi->GetMemo(i)->time).c_str());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
+17
-16
@@ -25,13 +25,13 @@ class MemoDelCallback : public NumberList
|
||||
|
||||
void HandleNumber(unsigned Number) anope_override
|
||||
{
|
||||
if (!Number || Number > mi->memos.size())
|
||||
if (!Number || Number > mi->memos->size())
|
||||
return;
|
||||
|
||||
if (ci)
|
||||
FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->memos[Number - 1]));
|
||||
FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->GetMemo(Number - 1)));
|
||||
else
|
||||
FOREACH_MOD(I_OnMemoDel, OnMemoDel(source.u->Account(), mi, mi->memos[Number - 1]));
|
||||
FOREACH_MOD(I_OnMemoDel, OnMemoDel(source.u->Account(), mi, mi->GetMemo(Number - 1)));
|
||||
|
||||
mi->Del(Number - 1);
|
||||
source.Reply(_("Memo %d has been deleted."), Number);
|
||||
@@ -52,7 +52,7 @@ class CommandMSDel : public Command
|
||||
User *u = source.u;
|
||||
|
||||
MemoInfo *mi;
|
||||
ChannelInfo *ci = NULL;
|
||||
ChannelInfo *ci;
|
||||
Anope::string numstr = !params.empty() ? params[0] : "", chan;
|
||||
|
||||
if (!numstr.empty() && numstr[0] == '#')
|
||||
@@ -60,7 +60,8 @@ class CommandMSDel : public Command
|
||||
chan = numstr;
|
||||
numstr = params.size() > 1 ? params[1] : "";
|
||||
|
||||
if (!(ci = cs_findchan(chan)))
|
||||
ci = cs_findchan(chan);
|
||||
if (!ci)
|
||||
{
|
||||
source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
|
||||
return;
|
||||
@@ -78,10 +79,10 @@ class CommandMSDel : public Command
|
||||
mi = &ci->memos;
|
||||
}
|
||||
else
|
||||
mi = &u->Account()->memos;
|
||||
mi = const_cast<MemoInfo *>(&u->Account()->memos);
|
||||
if (numstr.empty() || (!isdigit(numstr[0]) && !numstr.equals_ci("ALL") && !numstr.equals_ci("LAST")))
|
||||
this->OnSyntaxError(source, numstr);
|
||||
else if (mi->memos.empty())
|
||||
else if (mi->memos->empty())
|
||||
{
|
||||
if (!chan.empty())
|
||||
source.Reply(MEMO_X_HAS_NO_MEMOS, chan.c_str());
|
||||
@@ -99,24 +100,24 @@ class CommandMSDel : public Command
|
||||
{
|
||||
/* Delete last memo. */
|
||||
if (ci)
|
||||
FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->memos[mi->memos.size() - 1]));
|
||||
FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->GetMemo(mi->memos->size() - 1)));
|
||||
else
|
||||
FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, mi->memos[mi->memos.size() - 1]));
|
||||
mi->Del(mi->memos[mi->memos.size() - 1]);
|
||||
source.Reply(_("Memo %d has been deleted."), mi->memos.size() + 1);
|
||||
FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, mi->GetMemo(mi->memos->size() - 1)));
|
||||
mi->Del(mi->memos->size() - 1);
|
||||
source.Reply(_("Memo %d has been deleted."), mi->memos->size() + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Delete all memos. */
|
||||
for (unsigned i = 0, end = mi->memos.size(); i < end; ++i)
|
||||
for (unsigned i = 0, end = mi->memos->size(); i < end; ++i)
|
||||
{
|
||||
if (ci)
|
||||
FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->memos[i]));
|
||||
FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->GetMemo(i)));
|
||||
else
|
||||
FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, mi->memos[i]));
|
||||
delete mi->memos[i];
|
||||
FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, mi->GetMemo(i)));
|
||||
mi->GetMemo(i)->destroy();
|
||||
}
|
||||
mi->memos.clear();
|
||||
mi->memos->clear();
|
||||
if (!chan.empty())
|
||||
source.Reply(_("All memos for channel %s have been deleted."), chan.c_str());
|
||||
else
|
||||
|
||||
@@ -27,8 +27,8 @@ class CommandMSInfo : public Command
|
||||
User *u = source.u;
|
||||
|
||||
const MemoInfo *mi;
|
||||
NickAlias *na = NULL;
|
||||
ChannelInfo *ci = NULL;
|
||||
const NickAlias *na = NULL;
|
||||
ChannelInfo *ci;
|
||||
const Anope::string &nname = !params.empty() ? params[0] : "";
|
||||
int hardmax = 0;
|
||||
|
||||
@@ -45,7 +45,8 @@ class CommandMSInfo : public Command
|
||||
}
|
||||
else if (!nname.empty() && nname[0] == '#')
|
||||
{
|
||||
if (!(ci = cs_findchan(nname)))
|
||||
ci = cs_findchan(nname);
|
||||
if (!ci)
|
||||
{
|
||||
source.Reply(CHAN_X_NOT_REGISTERED, nname.c_str());
|
||||
return;
|
||||
@@ -71,11 +72,11 @@ class CommandMSInfo : public Command
|
||||
|
||||
if (!nname.empty() && (ci || na->nc != u->Account()))
|
||||
{
|
||||
if (mi->memos.empty())
|
||||
if (mi->memos->empty())
|
||||
source.Reply(_("%s currently has no memos."), nname.c_str());
|
||||
else if (mi->memos.size() == 1)
|
||||
else if (mi->memos->size() == 1)
|
||||
{
|
||||
if (mi->memos[0]->HasFlag(MF_UNREAD))
|
||||
if (mi->GetMemo(0)->HasFlag(MF_UNREAD))
|
||||
source.Reply(_("%s currently has \0021\002 memo, and it has not yet been read."), nname.c_str());
|
||||
else
|
||||
source.Reply(_("%s currently has \0021\002 memo."), nname.c_str());
|
||||
@@ -83,17 +84,17 @@ class CommandMSInfo : public Command
|
||||
else
|
||||
{
|
||||
unsigned count = 0, i, end;
|
||||
for (i = 0, end = mi->memos.size(); i < end; ++i)
|
||||
if (mi->memos[i]->HasFlag(MF_UNREAD))
|
||||
for (i = 0, end = mi->memos->size(); i < end; ++i)
|
||||
if (mi->GetMemo(i)->HasFlag(MF_UNREAD))
|
||||
++count;
|
||||
if (count == mi->memos.size())
|
||||
if (count == mi->memos->size())
|
||||
source.Reply(_("%s currently has \002%d\002 memos; all of them are unread."), nname.c_str(), count);
|
||||
else if (!count)
|
||||
source.Reply(_("%s currently has \002%d\002 memos."), nname.c_str(), mi->memos.size());
|
||||
source.Reply(_("%s currently has \002%d\002 memos."), nname.c_str(), mi->memos->size());
|
||||
else if (count == 1)
|
||||
source.Reply(_("%s currently has \002%d\002 memos, of which \0021\002 is unread."), nname.c_str(), mi->memos.size());
|
||||
source.Reply(_("%s currently has \002%d\002 memos, of which \0021\002 is unread."), nname.c_str(), mi->memos->size());
|
||||
else
|
||||
source.Reply(_("%s currently has \002%d\002 memos, of which \002%d\002 are unread."), nname.c_str(), mi->memos.size(), count);
|
||||
source.Reply(_("%s currently has \002%d\002 memos, of which \002%d\002 are unread."), nname.c_str(), mi->memos->size(), count);
|
||||
}
|
||||
if (!mi->memomax)
|
||||
{
|
||||
@@ -128,11 +129,11 @@ class CommandMSInfo : public Command
|
||||
}
|
||||
else /* !nname || (!ci || na->nc == u->Account()) */
|
||||
{
|
||||
if (mi->memos.empty())
|
||||
if (mi->memos->empty())
|
||||
source.Reply(_("You currently have no memos."));
|
||||
else if (mi->memos.size() == 1)
|
||||
else if (mi->memos->size() == 1)
|
||||
{
|
||||
if (mi->memos[0]->HasFlag(MF_UNREAD))
|
||||
if (mi->GetMemo(0)->HasFlag(MF_UNREAD))
|
||||
source.Reply(_("You currently have \0021\002 memo, and it has not yet been read."));
|
||||
else
|
||||
source.Reply(_("You currently have \0021\002 memo."));
|
||||
@@ -140,17 +141,17 @@ class CommandMSInfo : public Command
|
||||
else
|
||||
{
|
||||
unsigned count = 0, i, end;
|
||||
for (i = 0, end = mi->memos.size(); i < end; ++i)
|
||||
if (mi->memos[i]->HasFlag(MF_UNREAD))
|
||||
for (i = 0, end = mi->memos->size(); i < end; ++i)
|
||||
if (mi->GetMemo(i)->HasFlag(MF_UNREAD))
|
||||
++count;
|
||||
if (count == mi->memos.size())
|
||||
if (count == mi->memos->size())
|
||||
source.Reply(_("You currently have \002%d\002 memos; all of them are unread."), count);
|
||||
else if (!count)
|
||||
source.Reply(_("You currently have \002%d\002 memos."), mi->memos.size());
|
||||
source.Reply(_("You currently have \002%d\002 memos."), mi->memos->size());
|
||||
else if (count == 1)
|
||||
source.Reply(_("You currently have \002%d\002 memos, of which \0021\002 is unread."), mi->memos.size());
|
||||
source.Reply(_("You currently have \002%d\002 memos, of which \0021\002 is unread."), mi->memos->size());
|
||||
else
|
||||
source.Reply(_("You currently have \002%d\002 memos, of which \002%d\002 are unread."), mi->memos.size(), count);
|
||||
source.Reply(_("You currently have \002%d\002 memos, of which \002%d\002 are unread."), mi->memos->size(), count);
|
||||
}
|
||||
|
||||
if (!mi->memomax)
|
||||
|
||||
@@ -27,7 +27,7 @@ class CommandMSList : public Command
|
||||
User *u = source.u;
|
||||
|
||||
Anope::string param = !params.empty() ? params[0] : "", chan;
|
||||
ChannelInfo *ci = NULL;
|
||||
ChannelInfo *ci;
|
||||
const MemoInfo *mi;
|
||||
|
||||
if (!param.empty() && param[0] == '#')
|
||||
@@ -35,7 +35,8 @@ class CommandMSList : public Command
|
||||
chan = param;
|
||||
param = params.size() > 1 ? params[1] : "";
|
||||
|
||||
if (!(ci = cs_findchan(chan)))
|
||||
ci = cs_findchan(chan);
|
||||
if (!ci)
|
||||
{
|
||||
source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
|
||||
return;
|
||||
@@ -52,7 +53,7 @@ class CommandMSList : public Command
|
||||
|
||||
if (!param.empty() && !isdigit(param[0]) && !param.equals_ci("NEW"))
|
||||
this->OnSyntaxError(source, param);
|
||||
else if (!mi->memos.size())
|
||||
else if (!mi->memos->size())
|
||||
{
|
||||
if (!chan.empty())
|
||||
source.Reply(MEMO_X_HAS_NO_MEMOS, chan.c_str());
|
||||
@@ -79,10 +80,10 @@ class CommandMSList : public Command
|
||||
|
||||
void HandleNumber(unsigned Number) anope_override
|
||||
{
|
||||
if (!Number || Number > mi->memos.size())
|
||||
if (!Number || Number > mi->memos->size())
|
||||
return;
|
||||
|
||||
Memo *m = mi->memos[Number];
|
||||
const Memo *m = mi->GetMemo(Number);
|
||||
|
||||
ListFormatter::ListEntry entry;
|
||||
entry["Number"] = (m->HasFlag(MF_UNREAD) ? "* " : " ") + stringify(Number + 1);
|
||||
@@ -99,8 +100,8 @@ class CommandMSList : public Command
|
||||
if (!param.empty())
|
||||
{
|
||||
unsigned i, end;
|
||||
for (i = 0, end = mi->memos.size(); i < end; ++i)
|
||||
if (mi->memos[i]->HasFlag(MF_UNREAD))
|
||||
for (i = 0, end = mi->memos->size(); i < end; ++i)
|
||||
if (mi->GetMemo(i)->HasFlag(MF_UNREAD))
|
||||
break;
|
||||
if (i == end)
|
||||
{
|
||||
@@ -112,12 +113,12 @@ class CommandMSList : public Command
|
||||
}
|
||||
}
|
||||
|
||||
for (unsigned i = 0, end = mi->memos.size(); i < end; ++i)
|
||||
for (unsigned i = 0, end = mi->memos->size(); i < end; ++i)
|
||||
{
|
||||
if (!param.empty() && !mi->memos[i]->HasFlag(MF_UNREAD))
|
||||
if (!param.empty() && !mi->GetMemo(i)->HasFlag(MF_UNREAD))
|
||||
continue;
|
||||
|
||||
Memo *m = mi->memos[i];
|
||||
const Memo *m = mi->GetMemo(i);
|
||||
|
||||
ListFormatter::ListEntry entry;
|
||||
entry["Number"] = (m->HasFlag(MF_UNREAD) ? "* " : " ") + stringify(i + 1);
|
||||
|
||||
@@ -14,19 +14,19 @@
|
||||
#include "module.h"
|
||||
#include "memoserv.h"
|
||||
|
||||
void rsend_notify(CommandSource &source, MemoInfo *mi, Memo *m, const Anope::string &targ)
|
||||
static void rsend_notify(CommandSource &source, MemoInfo *mi, Memo *m, const Anope::string &targ)
|
||||
{
|
||||
/* Only send receipt if memos are allowed */
|
||||
if (memoserv && !readonly)
|
||||
{
|
||||
/* Get nick alias for sender */
|
||||
NickAlias *na = findnick(m->sender);
|
||||
const NickAlias *na = findnick(m->sender);
|
||||
|
||||
if (!na)
|
||||
return;
|
||||
|
||||
/* Get nick core for sender */
|
||||
NickCore *nc = na->nc;
|
||||
const NickCore *nc = na->nc;
|
||||
|
||||
if (!nc)
|
||||
return;
|
||||
@@ -52,23 +52,23 @@ class MemoListCallback : public NumberList
|
||||
{
|
||||
CommandSource &source;
|
||||
MemoInfo *mi;
|
||||
ChannelInfo *ci;
|
||||
const ChannelInfo *ci;
|
||||
public:
|
||||
MemoListCallback(CommandSource &_source, MemoInfo *_mi, ChannelInfo *_ci, const Anope::string &numlist) : NumberList(numlist, false), source(_source), mi(_mi), ci(_ci)
|
||||
MemoListCallback(CommandSource &_source, MemoInfo *_mi, const ChannelInfo *_ci, const Anope::string &numlist) : NumberList(numlist, false), source(_source), mi(_mi), ci(_ci)
|
||||
{
|
||||
}
|
||||
|
||||
void HandleNumber(unsigned Number) anope_override
|
||||
{
|
||||
if (!Number || Number > mi->memos.size())
|
||||
if (!Number || Number > mi->memos->size())
|
||||
return;
|
||||
|
||||
MemoListCallback::DoRead(source, mi, ci, Number - 1);
|
||||
}
|
||||
|
||||
static void DoRead(CommandSource &source, MemoInfo *mi, ChannelInfo *ci, unsigned index)
|
||||
static void DoRead(CommandSource &source, MemoInfo *mi, const ChannelInfo *ci, unsigned index)
|
||||
{
|
||||
Memo *m = mi->memos[index];
|
||||
Memo *m = mi->GetMemo(index);
|
||||
if (ci)
|
||||
source.Reply(_("Memo %d from %s (%s). To delete, type: \002%s%s DEL %s %d\002"), index + 1, m->sender.c_str(), do_strftime(m->time).c_str(), Config->UseStrictPrivMsgString.c_str(), Config->MemoServ.c_str(), ci->name.c_str(), index + 1);
|
||||
else
|
||||
@@ -96,7 +96,7 @@ class CommandMSRead : public Command
|
||||
User *u = source.u;
|
||||
|
||||
MemoInfo *mi;
|
||||
ChannelInfo *ci = NULL;
|
||||
ChannelInfo *ci;
|
||||
Anope::string numstr = params[0], chan;
|
||||
|
||||
if (!numstr.empty() && numstr[0] == '#')
|
||||
@@ -104,7 +104,8 @@ class CommandMSRead : public Command
|
||||
chan = numstr;
|
||||
numstr = params.size() > 1 ? params[1] : "";
|
||||
|
||||
if (!(ci = cs_findchan(chan)))
|
||||
ci = cs_findchan(chan);
|
||||
if (!ci)
|
||||
{
|
||||
source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
|
||||
return;
|
||||
@@ -117,11 +118,11 @@ class CommandMSRead : public Command
|
||||
mi = &ci->memos;
|
||||
}
|
||||
else
|
||||
mi = &u->Account()->memos;
|
||||
mi = const_cast<MemoInfo *>(&u->Account()->memos);
|
||||
|
||||
if (numstr.empty() || (!numstr.equals_ci("LAST") && !numstr.equals_ci("NEW") && !numstr.is_number_only()))
|
||||
this->OnSyntaxError(source, numstr);
|
||||
else if (mi->memos.empty())
|
||||
else if (mi->memos->empty())
|
||||
{
|
||||
if (!chan.empty())
|
||||
source.Reply(MEMO_X_HAS_NO_MEMOS, chan.c_str());
|
||||
@@ -135,8 +136,8 @@ class CommandMSRead : public Command
|
||||
if (numstr.equals_ci("NEW"))
|
||||
{
|
||||
int readcount = 0;
|
||||
for (i = 0, end = mi->memos.size(); i < end; ++i)
|
||||
if (mi->memos[i]->HasFlag(MF_UNREAD))
|
||||
for (i = 0, end = mi->memos->size(); i < end; ++i)
|
||||
if (mi->GetMemo(i)->HasFlag(MF_UNREAD))
|
||||
{
|
||||
MemoListCallback::DoRead(source, mi, ci, i);
|
||||
++readcount;
|
||||
@@ -151,7 +152,7 @@ class CommandMSRead : public Command
|
||||
}
|
||||
else if (numstr.equals_ci("LAST"))
|
||||
{
|
||||
for (i = 0, end = mi->memos.size() - 1; i < end; ++i);
|
||||
for (i = 0, end = mi->memos->size() - 1; i < end; ++i);
|
||||
MemoListCallback::DoRead(source, mi, ci, i);
|
||||
}
|
||||
else /* number[s] */
|
||||
|
||||
@@ -32,7 +32,7 @@ class CommandMSRSend : public Command
|
||||
|
||||
const Anope::string &nick = params[0];
|
||||
const Anope::string &text = params[1];
|
||||
NickAlias *na = NULL;
|
||||
const NickAlias *na = NULL;
|
||||
|
||||
/* prevent user from rsend to themselves */
|
||||
if ((na = findnick(nick)) && na->nc == u->Account())
|
||||
@@ -65,7 +65,7 @@ class CommandMSRSend : public Command
|
||||
MemoInfo *mi = memoserv->GetMemoInfo(nick, ischan);
|
||||
if (mi == NULL)
|
||||
throw CoreException("NULL mi in ms_rsend");
|
||||
Memo *m = (mi->memos.size() ? mi->memos[mi->memos.size() - 1] : NULL);
|
||||
Memo *m = (mi->memos->size() ? mi->GetMemo(mi->memos->size() - 1) : NULL);
|
||||
if (m != NULL)
|
||||
m->SetFlag(MF_RECEIPT);
|
||||
}
|
||||
|
||||
@@ -37,11 +37,11 @@ class CommandMSSendAll : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
NickAlias *na = findnick(u->nick);
|
||||
const NickAlias *na = findnick(u->nick);
|
||||
|
||||
for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it)
|
||||
for (nickcore_map::const_iterator it = NickCoreList->begin(), it_end = NickCoreList->end(); it != it_end; ++it)
|
||||
{
|
||||
NickCore *nc = it->second;
|
||||
const NickCore *nc = it->second;
|
||||
|
||||
if ((na && na->nc == nc) || !nc->display.equals_ci(u->nick))
|
||||
memoserv->Send(u->nick, nc->display, text);
|
||||
|
||||
+19
-16
@@ -20,30 +20,31 @@ class CommandMSSet : public Command
|
||||
{
|
||||
User *u = source.u;
|
||||
const Anope::string ¶m = params[1];
|
||||
NickCore *nc = u->Account();
|
||||
|
||||
if (param.equals_ci("ON"))
|
||||
{
|
||||
u->Account()->SetFlag(NI_MEMO_SIGNON);
|
||||
u->Account()->SetFlag(NI_MEMO_RECEIVE);
|
||||
nc->SetFlag(NI_MEMO_SIGNON);
|
||||
nc->SetFlag(NI_MEMO_RECEIVE);
|
||||
source.Reply(_("%s will now notify you of memos when you log on and when they are sent to you."), Config->MemoServ.c_str());
|
||||
}
|
||||
else if (param.equals_ci("LOGON"))
|
||||
{
|
||||
u->Account()->SetFlag(NI_MEMO_SIGNON);
|
||||
u->Account()->UnsetFlag(NI_MEMO_RECEIVE);
|
||||
nc->SetFlag(NI_MEMO_SIGNON);
|
||||
nc->UnsetFlag(NI_MEMO_RECEIVE);
|
||||
source.Reply(_("%s will now notify you of memos when you log on or unset /AWAY."), Config->MemoServ.c_str());
|
||||
}
|
||||
else if (param.equals_ci("NEW"))
|
||||
{
|
||||
u->Account()->UnsetFlag(NI_MEMO_SIGNON);
|
||||
u->Account()->SetFlag(NI_MEMO_RECEIVE);
|
||||
nc->UnsetFlag(NI_MEMO_SIGNON);
|
||||
nc->SetFlag(NI_MEMO_RECEIVE);
|
||||
source.Reply(_("%s will now notify you of memos when they are sent to you."), Config->MemoServ.c_str());
|
||||
}
|
||||
else if (param.equals_ci("MAIL"))
|
||||
{
|
||||
if (!u->Account()->email.empty())
|
||||
if (!nc->email.empty())
|
||||
{
|
||||
u->Account()->SetFlag(NI_MEMO_MAIL);
|
||||
nc->SetFlag(NI_MEMO_MAIL);
|
||||
source.Reply(_("You will now be informed about new memos via email."));
|
||||
}
|
||||
else
|
||||
@@ -51,14 +52,14 @@ class CommandMSSet : public Command
|
||||
}
|
||||
else if (param.equals_ci("NOMAIL"))
|
||||
{
|
||||
u->Account()->UnsetFlag(NI_MEMO_MAIL);
|
||||
nc->UnsetFlag(NI_MEMO_MAIL);
|
||||
source.Reply(_("You will no longer be informed via email."));
|
||||
}
|
||||
else if (param.equals_ci("OFF"))
|
||||
{
|
||||
u->Account()->UnsetFlag(NI_MEMO_SIGNON);
|
||||
u->Account()->UnsetFlag(NI_MEMO_RECEIVE);
|
||||
u->Account()->UnsetFlag(NI_MEMO_MAIL);
|
||||
nc->UnsetFlag(NI_MEMO_SIGNON);
|
||||
nc->UnsetFlag(NI_MEMO_RECEIVE);
|
||||
nc->UnsetFlag(NI_MEMO_MAIL);
|
||||
source.Reply(_("%s will not send you any notification of memos."), Config->MemoServ.c_str());
|
||||
}
|
||||
else
|
||||
@@ -86,7 +87,9 @@ class CommandMSSet : public Command
|
||||
p1 = p2;
|
||||
p2 = p3;
|
||||
p3 = params.size() > 4 ? params[4] : "";
|
||||
if (!(ci = cs_findchan(chan)))
|
||||
|
||||
ci = cs_findchan(chan);
|
||||
if (!ci)
|
||||
{
|
||||
source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
|
||||
return;
|
||||
@@ -102,14 +105,14 @@ class CommandMSSet : public Command
|
||||
{
|
||||
if (!p2.empty() && !p2.equals_ci("HARD") && chan.empty())
|
||||
{
|
||||
NickAlias *na;
|
||||
const NickAlias *na;
|
||||
if (!(na = findnick(p1)))
|
||||
{
|
||||
source.Reply(NICK_X_NOT_REGISTERED, p1.c_str());
|
||||
return;
|
||||
}
|
||||
user = p1;
|
||||
mi = &na->nc->memos;
|
||||
mi = const_cast<MemoInfo *>(&na->nc->memos);
|
||||
nc = na->nc;
|
||||
p1 = p2;
|
||||
p2 = p3;
|
||||
@@ -209,7 +212,7 @@ class CommandMSSet : public Command
|
||||
{
|
||||
User *u = source.u;
|
||||
const Anope::string &cmd = params[0];
|
||||
MemoInfo *mi = &u->Account()->memos;
|
||||
MemoInfo *mi = const_cast<MemoInfo *>(&u->Account()->memos);
|
||||
|
||||
if (readonly)
|
||||
source.Reply(_("Sorry, memo option setting is temporarily disabled."));
|
||||
|
||||
@@ -36,9 +36,9 @@ class CommandMSStaff : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it)
|
||||
for (nickcore_map::const_iterator it = NickCoreList->begin(), it_end = NickCoreList->end(); it != it_end; ++it)
|
||||
{
|
||||
NickCore *nc = it->second;
|
||||
const NickCore *nc = it->second;
|
||||
|
||||
if (nc->IsServicesOper())
|
||||
memoserv->Send(source.u->nick, nc->display, text, true);
|
||||
|
||||
@@ -18,7 +18,6 @@ class CommandNSAccess : public Command
|
||||
private:
|
||||
void DoAdd(CommandSource &source, NickCore *nc, const Anope::string &mask)
|
||||
{
|
||||
|
||||
if (mask.empty())
|
||||
{
|
||||
this->OnSyntaxError(source, "ADD");
|
||||
@@ -110,7 +109,7 @@ class CommandNSAccess : public Command
|
||||
NickCore *nc;
|
||||
if (!nick.empty())
|
||||
{
|
||||
NickAlias *na = findnick(nick);
|
||||
const NickAlias *na = findnick(nick);
|
||||
if (na == NULL)
|
||||
{
|
||||
source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
|
||||
|
||||
@@ -15,18 +15,18 @@
|
||||
|
||||
struct AJoinList : std::vector<std::pair<Anope::string, Anope::string> >, ExtensibleItem, Serializable
|
||||
{
|
||||
NickCore *nc;
|
||||
serialize_obj<NickCore> nc;
|
||||
|
||||
AJoinList(NickCore *n) : nc(n) { }
|
||||
|
||||
Anope::string serialize_name() const anope_override
|
||||
const Anope::string serialize_name() const anope_override
|
||||
{
|
||||
return "AJoinList";
|
||||
}
|
||||
|
||||
serialized_data serialize() anope_override
|
||||
Serialize::Data serialize() const anope_override
|
||||
{
|
||||
serialized_data sd;
|
||||
Serialize::Data sd;
|
||||
|
||||
sd["nc"] << this->nc->display;
|
||||
Anope::string channels;
|
||||
@@ -43,14 +43,20 @@ struct AJoinList : std::vector<std::pair<Anope::string, Anope::string> >, Extens
|
||||
return sd;
|
||||
}
|
||||
|
||||
static void unserialize(serialized_data &sd)
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &sd)
|
||||
{
|
||||
NickCore *nc = findcore(sd["nc"].astr());
|
||||
if (nc == NULL)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
AJoinList *aj = new AJoinList(nc);
|
||||
nc->Extend("ns_ajoin_channels", aj);
|
||||
AJoinList *aj;
|
||||
if (obj)
|
||||
aj = debug_cast<AJoinList *>(obj);
|
||||
else
|
||||
{
|
||||
aj = new AJoinList(nc);
|
||||
nc->Extend("ns_ajoin_channels", aj);
|
||||
}
|
||||
|
||||
Anope::string token;
|
||||
spacesepstream ssep(sd["channels"].astr());
|
||||
@@ -68,6 +74,8 @@ struct AJoinList : std::vector<std::pair<Anope::string, Anope::string> >, Extens
|
||||
|
||||
aj->push_back(std::make_pair(chan, key));
|
||||
}
|
||||
|
||||
return aj;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -200,7 +208,7 @@ class NSAJoin : public Module
|
||||
void OnNickIdentify(User *u) anope_override
|
||||
{
|
||||
AJoinList *channels = u->Account()->GetExt<AJoinList *>("ns_ajoin_channels");
|
||||
BotInfo *bi = findbot(Config->NickServ);
|
||||
const BotInfo *bi = findbot(Config->NickServ);
|
||||
|
||||
if (channels == NULL || bi == NULL)
|
||||
return;
|
||||
@@ -208,9 +216,12 @@ class NSAJoin : public Module
|
||||
for (unsigned i = 0; i < channels->size(); ++i)
|
||||
{
|
||||
Channel *c = findchan(channels->at(i).first);
|
||||
ChannelInfo *ci = c != NULL ? c->ci : cs_findchan(channels->at(i).first);
|
||||
if (c == NULL && ci != NULL)
|
||||
c = ci->c;
|
||||
ChannelInfo *ci;
|
||||
|
||||
if (c)
|
||||
ci = c->ci;
|
||||
else
|
||||
ci = cs_findchan(channels->at(i).first);
|
||||
|
||||
bool need_invite = false;
|
||||
Anope::string key = channels->at(i).second;
|
||||
|
||||
@@ -30,7 +30,7 @@ class CommandNSAList : public Command
|
||||
if (params.size() && u->IsServicesOper())
|
||||
nick = params[0];
|
||||
|
||||
NickAlias *na = findnick(nick);
|
||||
const NickAlias *na = findnick(nick);
|
||||
|
||||
if (!na)
|
||||
{
|
||||
@@ -45,7 +45,7 @@ class CommandNSAList : public Command
|
||||
|
||||
source.Reply(_("Channels that \002%s\002 has access on:"), na->nick.c_str());
|
||||
|
||||
for (registered_channel_map::const_iterator it = RegisteredChannelList.begin(), it_end = RegisteredChannelList.end(); it != it_end; ++it)
|
||||
for (registered_channel_map::const_iterator it = RegisteredChannelList->begin(), it_end = RegisteredChannelList->end(); it != it_end; ++it)
|
||||
{
|
||||
ChannelInfo *ci = it->second;
|
||||
ListFormatter::ListEntry entry;
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
class CommandNSCert : public Command
|
||||
{
|
||||
private:
|
||||
void DoServAdminList(CommandSource &source, NickCore *nc)
|
||||
void DoServAdminList(CommandSource &source, const NickCore *nc)
|
||||
{
|
||||
if (nc->cert.empty())
|
||||
{
|
||||
@@ -112,7 +112,7 @@ class CommandNSCert : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
void DoList(CommandSource &source, NickCore *nc)
|
||||
void DoList(CommandSource &source, const NickCore *nc)
|
||||
{
|
||||
User *u = source.u;
|
||||
|
||||
@@ -154,18 +154,20 @@ class CommandNSCert : public Command
|
||||
const Anope::string &cmd = params[0];
|
||||
const Anope::string &mask = params.size() > 1 ? params[1] : "";
|
||||
|
||||
NickAlias *na;
|
||||
const NickAlias *na;
|
||||
if (cmd.equals_ci("LIST") && u->IsServicesOper() && !mask.empty() && (na = findnick(mask)))
|
||||
return this->DoServAdminList(source, na->nc);
|
||||
|
||||
NickCore *nc = u->Account();
|
||||
|
||||
if (u->Account()->HasFlag(NI_SUSPENDED))
|
||||
source.Reply(NICK_X_SUSPENDED, u->Account()->display.c_str());
|
||||
else if (cmd.equals_ci("ADD"))
|
||||
return this->DoAdd(source, u->Account(), mask);
|
||||
return this->DoAdd(source, nc, mask);
|
||||
else if (cmd.equals_ci("DEL"))
|
||||
return this->DoDel(source, u->Account(), mask);
|
||||
return this->DoDel(source, nc, mask);
|
||||
else if (cmd.equals_ci("LIST"))
|
||||
return this->DoList(source, u->Account());
|
||||
return this->DoList(source, nc);
|
||||
else
|
||||
this->OnSyntaxError(source, cmd);
|
||||
|
||||
@@ -203,7 +205,7 @@ class NSCert : public Module
|
||||
|
||||
void DoAutoIdentify(User *u)
|
||||
{
|
||||
BotInfo *bi = findbot(Config->NickServ);
|
||||
const BotInfo *bi = findbot(Config->NickServ);
|
||||
NickAlias *na = findnick(u->nick);
|
||||
if (!bi || !na)
|
||||
return;
|
||||
|
||||
@@ -63,7 +63,7 @@ class CommandNSDrop : public Command
|
||||
FOREACH_MOD(I_OnNickDrop, OnNickDrop(u, na));
|
||||
|
||||
Log(!is_mine ? LOG_OVERRIDE : LOG_COMMAND, u, this) << "to drop nickname " << na->nick << " (group: " << na->nc->display << ") (email: " << (!na->nc->email.empty() ? na->nc->email : "none") << ")";
|
||||
delete na;
|
||||
na->destroy();
|
||||
|
||||
if (!is_mine)
|
||||
{
|
||||
|
||||
@@ -34,9 +34,9 @@ class CommandNSGetEMail : public Command
|
||||
|
||||
Log(LOG_ADMIN, u, this) << "on " << email;
|
||||
|
||||
for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it)
|
||||
for (nickcore_map::const_iterator it = NickCoreList->begin(), it_end = NickCoreList->end(); it != it_end; ++it)
|
||||
{
|
||||
NickCore *nc = it->second;
|
||||
const NickCore *nc = it->second;
|
||||
|
||||
if (!nc->email.empty() && nc->email.equals_ci(email))
|
||||
{
|
||||
|
||||
@@ -27,7 +27,7 @@ class CommandNSGetPass : public Command
|
||||
User *u = source.u;
|
||||
const Anope::string &nick = params[0];
|
||||
Anope::string tmp_pass;
|
||||
NickAlias *na;
|
||||
const NickAlias *na;
|
||||
|
||||
if (!(na = findnick(nick)))
|
||||
source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
|
||||
|
||||
@@ -30,7 +30,7 @@ class CommandNSGhost : public Command
|
||||
|
||||
User *u = source.u;
|
||||
User *user = finduser(nick);
|
||||
NickAlias *na = findnick(nick);
|
||||
const NickAlias *na = findnick(nick);
|
||||
|
||||
if (!user)
|
||||
source.Reply(NICK_X_NOT_IN_USE, nick.c_str());
|
||||
|
||||
@@ -58,7 +58,7 @@ class CommandNSGroup : public Command
|
||||
Log(LOG_COMMAND, u, this) << "tried to use GROUP for SUSPENDED nick " << target->nick;
|
||||
source.Reply(NICK_X_SUSPENDED, target->nick.c_str());
|
||||
}
|
||||
else if (na && target->nc == na->nc)
|
||||
else if (na && *target->nc == *na->nc)
|
||||
source.Reply(_("You are already a member of the group of \002%s\002."), target->nick.c_str());
|
||||
else if (na && na->nc != u->Account())
|
||||
source.Reply(NICK_IDENTIFY_REQUIRED, Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str());
|
||||
@@ -88,7 +88,7 @@ class CommandNSGroup : public Command
|
||||
* If not, check that it is valid.
|
||||
*/
|
||||
if (na)
|
||||
delete na;
|
||||
na->destroy();
|
||||
else
|
||||
{
|
||||
size_t prefixlen = Config->NSGuestNickPrefix.length();
|
||||
@@ -108,7 +108,7 @@ class CommandNSGroup : public Command
|
||||
na->last_realname = u->realname;
|
||||
na->time_registered = na->last_seen = Anope::CurTime;
|
||||
|
||||
u->Login(na->nc);
|
||||
u->Login(target->nc);
|
||||
ircdproto->SendLogin(u);
|
||||
if (!Config->NoNicknameOwnership && na->nc == u->Account() && na->nc->HasFlag(NI_UNCONFIRMED) == false)
|
||||
u->SetMode(findbot(Config->NickServ), UMODE_REGISTERED);
|
||||
@@ -188,22 +188,23 @@ class CommandNSUngroup : public Command
|
||||
{
|
||||
NickCore *oldcore = na->nc;
|
||||
|
||||
std::list<NickAlias *>::iterator it = std::find(oldcore->aliases.begin(), oldcore->aliases.end(), na);
|
||||
std::list<serialize_obj<NickAlias> >::iterator it = std::find(oldcore->aliases.begin(), oldcore->aliases.end(), na);
|
||||
if (it != oldcore->aliases.end())
|
||||
oldcore->aliases.erase(it);
|
||||
|
||||
if (na->nick.equals_ci(oldcore->display))
|
||||
change_core_display(oldcore);
|
||||
|
||||
na->nc = new NickCore(na->nick);
|
||||
na->nc->aliases.push_back(na);
|
||||
NickCore *nc = new NickCore(na->nick);
|
||||
na->nc = nc;
|
||||
nc->aliases.push_back(na);
|
||||
|
||||
na->nc->pass = oldcore->pass;
|
||||
nc->pass = oldcore->pass;
|
||||
if (!oldcore->email.empty())
|
||||
na->nc->email = oldcore->email;
|
||||
nc->email = oldcore->email;
|
||||
if (!oldcore->greet.empty())
|
||||
na->nc->greet = oldcore->greet;
|
||||
na->nc->language = oldcore->language;
|
||||
nc->greet = oldcore->greet;
|
||||
nc->language = oldcore->language;
|
||||
|
||||
source.Reply(_("Nick %s has been ungrouped from %s."), na->nick.c_str(), oldcore->display.c_str());
|
||||
|
||||
@@ -240,37 +241,50 @@ class CommandNSGList : public Command
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
User *u = source.u;
|
||||
Anope::string nick = !params.empty() ? params[0] : "";
|
||||
const Anope::string &nick = !params.empty() ? params[0] : "";
|
||||
const NickCore *nc;
|
||||
|
||||
const NickCore *nc = u->Account();
|
||||
|
||||
if (!nick.empty() && (!nick.equals_ci(u->nick) && !u->IsServicesOper()))
|
||||
source.Reply(ACCESS_DENIED, Config->NickServ.c_str());
|
||||
else if (!nick.empty() && (!findnick(nick) || !(nc = findnick(nick)->nc)))
|
||||
source.Reply(nick.empty() ? NICK_NOT_REGISTERED : _(NICK_X_NOT_REGISTERED), nick.c_str());
|
||||
else
|
||||
if (!nick.empty())
|
||||
{
|
||||
ListFormatter list;
|
||||
list.addColumn("Nick").addColumn("Expires");
|
||||
for (std::list<NickAlias *>::const_iterator it = nc->aliases.begin(), it_end = nc->aliases.end(); it != it_end; ++it)
|
||||
const NickAlias *na = findnick(nick);
|
||||
if (!na)
|
||||
{
|
||||
NickAlias *na2 = *it;
|
||||
|
||||
ListFormatter::ListEntry entry;
|
||||
entry["Nick"] = na2->nick;
|
||||
entry["Expires"] = (na2->HasFlag(NS_NO_EXPIRE) || !Config->NSExpire) ? "Does not expire" : ("expires in " + do_strftime(na2->last_seen + Config->NSExpire));
|
||||
list.addEntry(entry);
|
||||
source.Reply(NICK_X_NOT_REGISTERED, nick.c_str());
|
||||
return;
|
||||
}
|
||||
else if (!u->IsServicesOper())
|
||||
{
|
||||
source.Reply(ACCESS_DENIED, Config->NickServ.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
source.Reply(!nick.empty() ? _("List of nicknames in the group of \002%s\002:") : _("List of nicknames in your group:"), nc->display.c_str());
|
||||
std::vector<Anope::string> replies;
|
||||
list.Process(replies);
|
||||
|
||||
for (unsigned i = 0; i < replies.size(); ++i)
|
||||
source.Reply(replies[i]);
|
||||
|
||||
source.Reply(_("%d nicknames in the group."), nc->aliases.size());
|
||||
nc = na->nc;
|
||||
}
|
||||
else
|
||||
nc = u->Account();
|
||||
|
||||
ListFormatter list;
|
||||
list.addColumn("Nick").addColumn("Expires");
|
||||
for (std::list<serialize_obj<NickAlias> >::const_iterator it = nc->aliases.begin(), it_end = nc->aliases.end(); it != it_end;)
|
||||
{
|
||||
const NickAlias *na2 = *it++;
|
||||
if (!na2)
|
||||
continue;
|
||||
|
||||
ListFormatter::ListEntry entry;
|
||||
entry["Nick"] = na2->nick;
|
||||
entry["Expires"] = (na2->HasFlag(NS_NO_EXPIRE) || !Config->NSExpire) ? "Does not expire" : ("expires in " + do_strftime(na2->last_seen + Config->NSExpire));
|
||||
list.addEntry(entry);
|
||||
}
|
||||
|
||||
source.Reply(!nick.empty() ? _("List of nicknames in the group of \002%s\002:") : _("List of nicknames in your group:"), nc->display.c_str());
|
||||
std::vector<Anope::string> replies;
|
||||
list.Process(replies);
|
||||
|
||||
for (unsigned i = 0; i < replies.size(); ++i)
|
||||
source.Reply(replies[i]);
|
||||
|
||||
source.Reply(_("%d nicknames in the group."), nc->aliases.size());
|
||||
}
|
||||
|
||||
bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
class CommandNSInfo : public Command
|
||||
{
|
||||
private:
|
||||
template<typename T, unsigned END> void CheckOptStr(User *u, Anope::string &buf, T opt, const char *str, Flags<T, END> *nc, bool reverse_logic = false)
|
||||
template<typename T, unsigned END> void CheckOptStr(User *u, Anope::string &buf, T opt, const char *str, const Flags<T, END> *nc, bool reverse_logic = false)
|
||||
{
|
||||
if (reverse_logic ? !nc->HasFlag(opt) : nc->HasFlag(opt))
|
||||
{
|
||||
|
||||
@@ -75,9 +75,9 @@ class CommandNSList : public Command
|
||||
|
||||
list.addColumn("Nick").addColumn("Last usermask");
|
||||
|
||||
for (nickalias_map::const_iterator it = NickAliasList.begin(), it_end = NickAliasList.end(); it != it_end; ++it)
|
||||
for (nickalias_map::const_iterator it = NickAliasList->begin(), it_end = NickAliasList->end(); it != it_end; ++it)
|
||||
{
|
||||
NickAlias *na = it->second;
|
||||
const NickAlias *na = it->second;
|
||||
|
||||
/* Don't show private nicks to non-services admins. */
|
||||
if (na->nc->HasFlag(NI_PRIVATE) && !is_servadmin && na->nc != mync)
|
||||
|
||||
@@ -13,7 +13,12 @@
|
||||
|
||||
#include "module.h"
|
||||
|
||||
static bool SendRegmail(User *u, NickAlias *na, BotInfo *bi);
|
||||
static bool SendRegmail(User *u, const NickAlias *na, const BotInfo *bi);
|
||||
|
||||
struct ExtensibleString : Anope::string, ExtensibleItem
|
||||
{
|
||||
ExtensibleString(const Anope::string &s) : Anope::string(s) { }
|
||||
};
|
||||
|
||||
class CommandNSConfirm : public Command
|
||||
{
|
||||
@@ -49,13 +54,14 @@ class CommandNSConfirm : public Command
|
||||
Anope::string *code = u->Account()->GetExt<ExtensibleString *>("ns_register_passcode");
|
||||
if (code != NULL && *code == passcode)
|
||||
{
|
||||
u->Account()->Shrink("ns_register_passcode");
|
||||
NickCore *nc = u->Account();
|
||||
nc->Shrink("ns_register_passcode");
|
||||
Log(LOG_COMMAND, u, this) << "to confirm their email";
|
||||
source.Reply(_("Your email address of \002%s\002 has been confirmed."), u->Account()->email.c_str());
|
||||
u->Account()->UnsetFlag(NI_UNCONFIRMED);
|
||||
nc->UnsetFlag(NI_UNCONFIRMED);
|
||||
|
||||
ircdproto->SendLogin(u);
|
||||
NickAlias *na = findnick(u->nick);
|
||||
const NickAlias *na = findnick(u->nick);
|
||||
if (!Config->NoNicknameOwnership && na != NULL && na->nc == u->Account() && na->nc->HasFlag(NI_UNCONFIRMED) == false)
|
||||
u->SetMode(findbot(Config->NickServ), UMODE_REGISTERED);
|
||||
}
|
||||
@@ -170,18 +176,19 @@ class CommandNSRegister : public Command
|
||||
source.Reply(MAIL_X_INVALID, email.c_str());
|
||||
else
|
||||
{
|
||||
na = new NickAlias(u->nick, new NickCore(u->nick));
|
||||
enc_encrypt(pass, na->nc->pass);
|
||||
NickCore *nc = new NickCore(u->nick);
|
||||
na = new NickAlias(u->nick, nc);
|
||||
enc_encrypt(pass, nc->pass);
|
||||
if (!email.empty())
|
||||
na->nc->email = email;
|
||||
nc->email = email;
|
||||
|
||||
Anope::string last_usermask = u->GetIdent() + "@" + u->GetDisplayedHost();
|
||||
na->last_usermask = last_usermask;
|
||||
na->last_realname = u->realname;
|
||||
if (Config->NSAddAccessOnReg)
|
||||
na->nc->AddAccess(create_mask(u));
|
||||
nc->AddAccess(create_mask(u));
|
||||
|
||||
u->Login(na->nc);
|
||||
u->Login(nc);
|
||||
|
||||
Log(LOG_COMMAND, u, this) << "to register " << na->nick << " (email: " << (!na->nc->email.empty() ? na->nc->email : "none") << ")";
|
||||
|
||||
@@ -198,12 +205,12 @@ class CommandNSRegister : public Command
|
||||
|
||||
if (Config->NSRegistration.equals_ci("admin"))
|
||||
{
|
||||
na->nc->SetFlag(NI_UNCONFIRMED);
|
||||
nc->SetFlag(NI_UNCONFIRMED);
|
||||
source.Reply(_("All new accounts must be validated by an administrator. Please wait for your registration to be confirmed."));
|
||||
}
|
||||
else if (Config->NSRegistration.equals_ci("mail"))
|
||||
{
|
||||
na->nc->SetFlag(NI_UNCONFIRMED);
|
||||
nc->SetFlag(NI_UNCONFIRMED);
|
||||
if (SendRegmail(u, na, source.owner))
|
||||
{
|
||||
source.Reply(_("A passcode has been sent to %s, please type %s%s confirm <passcode> to confirm your email address."), email.c_str(), Config->UseStrictPrivMsgString.c_str(), Config->NickServ.c_str());
|
||||
@@ -276,7 +283,7 @@ class CommandNSResend : public Command
|
||||
return;
|
||||
|
||||
User *u = source.u;
|
||||
NickAlias *na = findnick(u->nick);
|
||||
const NickAlias *na = findnick(u->nick);
|
||||
|
||||
if (na == NULL)
|
||||
source.Reply(NICK_NOT_REGISTERED);
|
||||
@@ -335,8 +342,10 @@ class NSRegister : public Module
|
||||
}
|
||||
};
|
||||
|
||||
static bool SendRegmail(User *u, NickAlias *na, BotInfo *bi)
|
||||
static bool SendRegmail(User *u, const NickAlias *na, const BotInfo *bi)
|
||||
{
|
||||
NickCore *nc = na->nc;
|
||||
|
||||
Anope::string *code = na->nc->GetExt<ExtensibleString *>("ns_register_passcode");
|
||||
Anope::string codebuf;
|
||||
if (code == NULL)
|
||||
@@ -351,7 +360,7 @@ static bool SendRegmail(User *u, NickAlias *na, BotInfo *bi)
|
||||
int idx, min = 1, max = 62;
|
||||
for (idx = 0; idx < 9; ++idx)
|
||||
codebuf += chars[1 + static_cast<int>((static_cast<float>(max - min)) * static_cast<uint16_t>(rand()) / 65536.0) + min];
|
||||
na->nc->Extend("ns_register_passcode", new ExtensibleString(codebuf));
|
||||
nc->Extend("ns_register_passcode", new ExtensibleString(codebuf));
|
||||
}
|
||||
else
|
||||
codebuf = *code;
|
||||
@@ -367,7 +376,7 @@ static bool SendRegmail(User *u, NickAlias *na, BotInfo *bi)
|
||||
message = message.replace_all_cs("%N", Config->NetworkName);
|
||||
message = message.replace_all_cs("%c", codebuf);
|
||||
|
||||
return Mail(u, na->nc, bi, subject, message);
|
||||
return Mail(u, nc, bi, subject, message);
|
||||
}
|
||||
|
||||
MODULE_INIT(NSRegister)
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
#include "module.h"
|
||||
|
||||
static bool SendResetEmail(User *u, NickAlias *na, BotInfo *bi);
|
||||
static bool SendResetEmail(User *u, const NickAlias *na, const BotInfo *bi);
|
||||
|
||||
class CommandNSResetPass : public Command
|
||||
{
|
||||
@@ -28,7 +28,7 @@ class CommandNSResetPass : public Command
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
User *u = source.u;
|
||||
NickAlias *na;
|
||||
const NickAlias *na;
|
||||
|
||||
if (Config->RestrictMail && (!u->Account() || !u->HasCommand("nickserv/resetpass")))
|
||||
source.Reply(ACCESS_DENIED);
|
||||
@@ -89,19 +89,20 @@ class NSResetPass : public Module
|
||||
ResetInfo *ri = na ? na->nc->GetExt<ResetInfo *>("ns_resetpass") : NULL;
|
||||
if (na && ri)
|
||||
{
|
||||
NickCore *nc = na->nc;
|
||||
const Anope::string &passcode = params[1];
|
||||
if (ri->time < Anope::CurTime - 3600)
|
||||
{
|
||||
na->nc->Shrink("ns_resetpass");
|
||||
nc->Shrink("ns_resetpass");
|
||||
source.Reply(_("Your password reset request has expired."));
|
||||
}
|
||||
else if (passcode.equals_cs(ri->code))
|
||||
{
|
||||
na->nc->Shrink("ns_resetpass");
|
||||
nc->Shrink("ns_resetpass");
|
||||
|
||||
Log(LOG_COMMAND, u, &commandnsresetpass) << "confirmed RESETPASS to forcefully identify to " << na->nick;
|
||||
|
||||
na->nc->UnsetFlag(NI_UNCONFIRMED);
|
||||
nc->UnsetFlag(NI_UNCONFIRMED);
|
||||
u->Identify(na);
|
||||
|
||||
source.Reply(_("You are now identified for your nick. Change your password now."));
|
||||
@@ -118,7 +119,7 @@ class NSResetPass : public Module
|
||||
}
|
||||
};
|
||||
|
||||
static bool SendResetEmail(User *u, NickAlias *na, BotInfo *bi)
|
||||
static bool SendResetEmail(User *u, const NickAlias *na, const BotInfo *bi)
|
||||
{
|
||||
int min = 1, max = 62;
|
||||
int chars[] = {
|
||||
@@ -148,9 +149,10 @@ static bool SendResetEmail(User *u, NickAlias *na, BotInfo *bi)
|
||||
ResetInfo *ri = new ResetInfo;
|
||||
ri->code = passcode;
|
||||
ri->time = Anope::CurTime;
|
||||
na->nc->Extend("ns_resetpass", ri);
|
||||
NickCore *nc = na->nc;
|
||||
nc->Extend("ns_resetpass", ri);
|
||||
|
||||
return Mail(u, na->nc, bi, subject, message);
|
||||
return Mail(u, nc, bi, subject, message);
|
||||
}
|
||||
|
||||
MODULE_INIT(NSResetPass)
|
||||
|
||||
@@ -33,10 +33,10 @@ class CommandNSSASet : public Command
|
||||
this->SendSyntax(source);
|
||||
source.Reply(_("Sets various nickname options. \037option\037 can be one of:"));
|
||||
Anope::string this_name = source.command;
|
||||
for (BotInfo::command_map::iterator it = source.owner->commands.begin(), it_end = source.owner->commands.end(); it != it_end; ++it)
|
||||
for (BotInfo::command_map::const_iterator it = source.owner->commands.begin(), it_end = source.owner->commands.end(); it != it_end; ++it)
|
||||
{
|
||||
const Anope::string &c_name = it->first;
|
||||
CommandInfo &info = it->second;
|
||||
const CommandInfo &info = it->second;
|
||||
|
||||
if (c_name.find_ci(this_name + " ") == 0)
|
||||
{
|
||||
@@ -67,7 +67,7 @@ class CommandNSSASetPassword : public Command
|
||||
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
User *u = source.u;
|
||||
NickAlias *setter_na = findnick(params[0]);
|
||||
const NickAlias *setter_na = findnick(params[0]);
|
||||
if (setter_na == NULL)
|
||||
{
|
||||
source.Reply(NICK_X_NOT_REGISTERED, params[0].c_str());
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
#include "module.h"
|
||||
|
||||
static bool SendPassMail(User *u, NickAlias *na, BotInfo *bi, const Anope::string &pass);
|
||||
static bool SendPassMail(User *u, const NickAlias *na, const BotInfo *bi, const Anope::string &pass);
|
||||
|
||||
class CommandNSSendPass : public Command
|
||||
{
|
||||
@@ -29,7 +29,7 @@ class CommandNSSendPass : public Command
|
||||
{
|
||||
User *u = source.u;
|
||||
const Anope::string &nick = params[0];
|
||||
NickAlias *na;
|
||||
const NickAlias *na;
|
||||
|
||||
if (Config->RestrictMail && (!u->Account() || !u->HasCommand("nickserv/sendpass")))
|
||||
source.Reply(ACCESS_DENIED);
|
||||
@@ -86,7 +86,7 @@ class NSSendPass : public Module
|
||||
}
|
||||
};
|
||||
|
||||
static bool SendPassMail(User *u, NickAlias *na, BotInfo *bi, const Anope::string &pass)
|
||||
static bool SendPassMail(User *u, const NickAlias *na, const BotInfo *bi, const Anope::string &pass)
|
||||
{
|
||||
Anope::string subject = translate(na->nc, Config->MailSendpassSubject.c_str());
|
||||
Anope::string message = translate(na->nc, Config->MailSendpassMessage.c_str());
|
||||
|
||||
@@ -34,10 +34,10 @@ class CommandNSSet : public Command
|
||||
source.Reply(" ");
|
||||
source.Reply(_("Sets various nickname options. \037option\037 can be one of:"));
|
||||
Anope::string this_name = source.command;
|
||||
for (BotInfo::command_map::iterator it = source.owner->commands.begin(), it_end = source.owner->commands.end(); it != it_end; ++it)
|
||||
for (BotInfo::command_map::const_iterator it = source.owner->commands.begin(), it_end = source.owner->commands.end(); it != it_end; ++it)
|
||||
{
|
||||
const Anope::string &c_name = it->first;
|
||||
CommandInfo &info = it->second;
|
||||
const CommandInfo &info = it->second;
|
||||
|
||||
if (c_name.find_ci(this_name + " ") == 0)
|
||||
{
|
||||
|
||||
@@ -24,7 +24,7 @@ class CommandNSSetAutoOp : public Command
|
||||
|
||||
void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m)
|
||||
{
|
||||
NickAlias *na = findnick(user);
|
||||
const NickAlias *na = findnick(user);
|
||||
if (na == NULL)
|
||||
{
|
||||
source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
|
||||
|
||||
@@ -24,14 +24,14 @@ class CommandNSSetDisplay : public Command
|
||||
|
||||
void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m)
|
||||
{
|
||||
NickAlias *user_na = findnick(user), *na = findnick(param);
|
||||
const NickAlias *user_na = findnick(user), *na = findnick(param);
|
||||
|
||||
if (user_na == NULL)
|
||||
{
|
||||
source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
|
||||
return;
|
||||
}
|
||||
else if (!na || na->nc != user_na->nc)
|
||||
else if (!na || *na->nc != *user_na->nc)
|
||||
{
|
||||
source.Reply(_("The new display MUST be a nickname of the nickname group %s"), user_na->nc->display.c_str());
|
||||
return;
|
||||
|
||||
@@ -13,7 +13,12 @@
|
||||
|
||||
#include "module.h"
|
||||
|
||||
static bool SendConfirmMail(User *u, BotInfo *bi)
|
||||
struct ExtensibleString : Anope::string, ExtensibleItem
|
||||
{
|
||||
ExtensibleString(const Anope::string &s) : Anope::string(s) { }
|
||||
};
|
||||
|
||||
static bool SendConfirmMail(User *u, const BotInfo *bi)
|
||||
{
|
||||
int chars[] = {
|
||||
' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
|
||||
@@ -26,6 +31,7 @@ static bool SendConfirmMail(User *u, BotInfo *bi)
|
||||
Anope::string code;
|
||||
for (idx = 0; idx < 9; ++idx)
|
||||
code += chars[1 + static_cast<int>((static_cast<float>(max - min)) * static_cast<uint16_t>(rand()) / 65536.0) + min];
|
||||
|
||||
u->Account()->Extend("ns_set_email_passcode", new ExtensibleString(code));
|
||||
|
||||
Anope::string subject = Config->MailEmailchangeSubject;
|
||||
@@ -54,7 +60,7 @@ class CommandNSSetEmail : public Command
|
||||
void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m)
|
||||
{
|
||||
User *u = source.u;
|
||||
NickAlias *na = findnick(user);
|
||||
const NickAlias *na = findnick(user);
|
||||
if (!na)
|
||||
{
|
||||
source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
|
||||
@@ -168,11 +174,12 @@ class NSSetEmail : public Module
|
||||
{
|
||||
if (params[0] == *passcode)
|
||||
{
|
||||
u->Account()->email = *new_email;
|
||||
NickCore *uac = u->Account();
|
||||
uac->email = *new_email;
|
||||
Log(LOG_COMMAND, u, command) << "to confirm their email address change to " << u->Account()->email;
|
||||
source.Reply(_("Your email address has been changed to \002%s\002."), u->Account()->email.c_str());
|
||||
u->Account()->Shrink("ns_set_email");
|
||||
u->Account()->Shrink("ns_set_email_passcode");
|
||||
uac->Shrink("ns_set_email");
|
||||
uac->Shrink("ns_set_email_passcode");
|
||||
return EVENT_STOP;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ class CommandNSSetGreet : public Command
|
||||
|
||||
void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m)
|
||||
{
|
||||
NickAlias *na = findnick(user);
|
||||
const NickAlias *na = findnick(user);
|
||||
if (!na)
|
||||
{
|
||||
source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
|
||||
|
||||
@@ -24,7 +24,7 @@ class CommandNSSetHide : public Command
|
||||
|
||||
void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m, const Anope::string &arg)
|
||||
{
|
||||
NickAlias *na = findnick(user);
|
||||
const NickAlias *na = findnick(user);
|
||||
if (!na)
|
||||
{
|
||||
source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
|
||||
|
||||
@@ -24,7 +24,7 @@ class CommandNSSetKill : public Command
|
||||
|
||||
void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m)
|
||||
{
|
||||
NickAlias *na = findnick(user);
|
||||
const NickAlias *na = findnick(user);
|
||||
if (!na)
|
||||
{
|
||||
source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
|
||||
|
||||
@@ -24,7 +24,7 @@ class CommandNSSetLanguage : public Command
|
||||
|
||||
void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m)
|
||||
{
|
||||
NickAlias *na = findnick(user);
|
||||
const NickAlias *na = findnick(user);
|
||||
if (!na)
|
||||
{
|
||||
source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
|
||||
|
||||
@@ -24,7 +24,7 @@ class CommandNSSetMessage : public Command
|
||||
|
||||
void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m)
|
||||
{
|
||||
NickAlias *na = findnick(user);
|
||||
const NickAlias *na = findnick(user);
|
||||
if (!na)
|
||||
{
|
||||
source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
|
||||
#include "module.h"
|
||||
|
||||
struct NSMiscData : Anope::string, ExtensibleItem, Serializable
|
||||
struct NSMiscData : ExtensibleItem, Serializable
|
||||
{
|
||||
NickCore *nc;
|
||||
serialize_obj<NickCore> nc;
|
||||
Anope::string name;
|
||||
Anope::string data;
|
||||
|
||||
@@ -23,14 +23,14 @@ struct NSMiscData : Anope::string, ExtensibleItem, Serializable
|
||||
{
|
||||
}
|
||||
|
||||
Anope::string serialize_name() const anope_override
|
||||
const Anope::string serialize_name() const anope_override
|
||||
{
|
||||
return "NSMiscData";
|
||||
}
|
||||
|
||||
serialized_data serialize() anope_override
|
||||
Serialize::Data serialize() const anope_override
|
||||
{
|
||||
serialized_data sdata;
|
||||
Serialize::Data sdata;
|
||||
|
||||
sdata["nc"] << this->nc->display;
|
||||
sdata["name"] << this->name;
|
||||
@@ -39,13 +39,27 @@ struct NSMiscData : Anope::string, ExtensibleItem, Serializable
|
||||
return sdata;
|
||||
}
|
||||
|
||||
static void unserialize(serialized_data &data)
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &data)
|
||||
{
|
||||
NickCore *nc = findcore(data["nc"].astr());
|
||||
if (nc == NULL)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
nc->Extend(data["name"].astr(), new NSMiscData(nc, data["name"].astr(), data["data"].astr()));
|
||||
NSMiscData *d;
|
||||
if (obj)
|
||||
{
|
||||
d = debug_cast<NSMiscData *>(obj);
|
||||
d->nc = nc;
|
||||
data["name"] >> d->name;
|
||||
data["data"] >> d->data;
|
||||
}
|
||||
else
|
||||
{
|
||||
d = new NSMiscData(nc, data["name"].astr(), data["data"].astr());
|
||||
nc->Extend(data["name"].astr(), d);
|
||||
}
|
||||
|
||||
return d;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -67,7 +81,7 @@ class CommandNSSetMisc : public Command
|
||||
|
||||
void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m)
|
||||
{
|
||||
NickAlias *na = findnick(user);
|
||||
const NickAlias *na = findnick(user);
|
||||
if (!na)
|
||||
{
|
||||
source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
|
||||
|
||||
@@ -24,7 +24,7 @@ class CommandNSSetPrivate : public Command
|
||||
|
||||
void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m)
|
||||
{
|
||||
NickAlias *na = findnick(user);
|
||||
const NickAlias *na = findnick(user);
|
||||
if (!na)
|
||||
{
|
||||
source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
|
||||
|
||||
@@ -24,7 +24,7 @@ class CommandNSSetSecure : public Command
|
||||
|
||||
void Run(CommandSource &source, const Anope::string &user, const Anope::string ¶m)
|
||||
{
|
||||
NickAlias *na = findnick(user);
|
||||
const NickAlias *na = findnick(user);
|
||||
if (!na)
|
||||
{
|
||||
source.Reply(NICK_X_NOT_REGISTERED, user.c_str());
|
||||
|
||||
@@ -27,7 +27,7 @@ class CommandNSStatus : public Command
|
||||
{
|
||||
User *u = source.u;
|
||||
const Anope::string &nick = !params.empty() ? params[0] : u->nick;
|
||||
NickAlias *na = findnick(nick);
|
||||
const NickAlias *na = findnick(nick);
|
||||
spacesepstream sep(nick);
|
||||
Anope::string nickbuf;
|
||||
|
||||
|
||||
@@ -22,14 +22,14 @@ struct NickSuspend : ExtensibleItem, Serializable
|
||||
{
|
||||
}
|
||||
|
||||
Anope::string serialize_name() const
|
||||
const Anope::string serialize_name() const
|
||||
{
|
||||
return "NickSuspend";
|
||||
}
|
||||
|
||||
serialized_data serialize() anope_override
|
||||
Serialize::Data serialize() const anope_override
|
||||
{
|
||||
serialized_data sd;
|
||||
Serialize::Data sd;
|
||||
|
||||
sd["nick"] << this->nick;
|
||||
sd["when"] << this->when;
|
||||
@@ -37,18 +37,25 @@ struct NickSuspend : ExtensibleItem, Serializable
|
||||
return sd;
|
||||
}
|
||||
|
||||
static void unserialize(serialized_data &sd)
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &sd)
|
||||
{
|
||||
NickAlias *na = findnick(sd["nick"].astr());
|
||||
const NickAlias *na = findnick(sd["nick"].astr());
|
||||
if (na == NULL)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
NickSuspend *ns = new NickSuspend();
|
||||
NickSuspend *ns;
|
||||
if (obj)
|
||||
ns = debug_cast<NickSuspend *>(obj);
|
||||
else
|
||||
ns = new NickSuspend();
|
||||
|
||||
sd["nick"] >> ns->nick;
|
||||
sd["when"] >> ns->when;
|
||||
|
||||
na->nc->Extend("ns_suspend_expire", ns);
|
||||
if (!obj)
|
||||
na->nc->Extend("ns_suspend_expire", ns);
|
||||
|
||||
return ns;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -98,17 +105,19 @@ class CommandNSSuspend : public Command
|
||||
return;
|
||||
}
|
||||
|
||||
na->nc->SetFlag(NI_SUSPENDED);
|
||||
na->nc->SetFlag(NI_SECURE);
|
||||
na->nc->UnsetFlag(NI_KILLPROTECT);
|
||||
na->nc->UnsetFlag(NI_KILL_QUICK);
|
||||
na->nc->UnsetFlag(NI_KILL_IMMED);
|
||||
NickCore *nc = na->nc;
|
||||
|
||||
for (std::list<NickAlias *>::iterator it = na->nc->aliases.begin(), it_end = na->nc->aliases.end(); it != it_end; ++it)
|
||||
nc->SetFlag(NI_SUSPENDED);
|
||||
nc->SetFlag(NI_SECURE);
|
||||
nc->UnsetFlag(NI_KILLPROTECT);
|
||||
nc->UnsetFlag(NI_KILL_QUICK);
|
||||
nc->UnsetFlag(NI_KILL_IMMED);
|
||||
|
||||
for (std::list<serialize_obj<NickAlias> >::iterator it = nc->aliases.begin(), it_end = nc->aliases.end(); it != it_end;)
|
||||
{
|
||||
NickAlias *na2 = *it;
|
||||
NickAlias *na2 = *it++;
|
||||
|
||||
if (na2->nc == na->nc)
|
||||
if (na2 && *na2->nc == *na->nc)
|
||||
{
|
||||
na2->last_quit = reason;
|
||||
|
||||
@@ -127,7 +136,7 @@ class CommandNSSuspend : public Command
|
||||
ns->nick = na->nick;
|
||||
ns->when = Anope::CurTime + expiry_secs;
|
||||
|
||||
na->nc->Extend("ns_suspend_expire", ns);
|
||||
nc->Extend("ns_suspend_expire", ns);
|
||||
}
|
||||
|
||||
Log(LOG_ADMIN, u, this) << "for " << nick << " (" << (!reason.empty() ? reason : "No reason") << "), expires in " << (expiry_secs ? do_strftime(Anope::CurTime + expiry_secs) : "never");
|
||||
@@ -221,7 +230,7 @@ class NSSuspend : public Module
|
||||
|
||||
~NSSuspend()
|
||||
{
|
||||
for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it)
|
||||
for (nickcore_map::const_iterator it = NickCoreList->begin(), it_end = NickCoreList->end(); it != it_end; ++it)
|
||||
it->second->Shrink("ns_suspend_expire");
|
||||
}
|
||||
|
||||
|
||||
@@ -173,7 +173,7 @@ class CommandOSAKill : public Command
|
||||
{
|
||||
source.Reply(USERHOST_MASK_TOO_WIDE, mask.c_str());
|
||||
Log(LOG_ADMIN, u, this) << "tried to akill " << percent << "% of the network (" << affected << " users)";
|
||||
delete x;
|
||||
x->destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -181,7 +181,7 @@ class CommandOSAKill : public Command
|
||||
FOREACH_RESULT(I_OnAddXLine, OnAddXLine(u, x, akills));
|
||||
if (MOD_RESULT == EVENT_STOP)
|
||||
{
|
||||
delete x;
|
||||
x->destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -264,7 +264,7 @@ class CommandOSAKill : public Command
|
||||
if (!number)
|
||||
return;
|
||||
|
||||
XLine *x = akills->GetEntry(number - 1);
|
||||
const XLine *x = akills->GetEntry(number - 1);
|
||||
|
||||
if (!x)
|
||||
return;
|
||||
@@ -286,7 +286,7 @@ class CommandOSAKill : public Command
|
||||
{
|
||||
for (unsigned i = 0, end = akills->GetCount(); i < end; ++i)
|
||||
{
|
||||
XLine *x = akills->GetEntry(i);
|
||||
const XLine *x = akills->GetEntry(i);
|
||||
|
||||
if (mask.empty() || mask.equals_ci(x->Mask) || mask == x->UID || Anope::Match(x->Mask, mask, false, true))
|
||||
{
|
||||
|
||||
@@ -31,7 +31,7 @@ class MyForbidService : public ForbidService
|
||||
std::vector<ForbidData *>::iterator it = std::find(this->forbidData.begin(), this->forbidData.end(), d);
|
||||
if (it != this->forbidData.end())
|
||||
this->forbidData.erase(it);
|
||||
delete d;
|
||||
d->destroy();
|
||||
}
|
||||
|
||||
ForbidData *FindForbid(const Anope::string &mask, ForbidType ftype) anope_override
|
||||
@@ -42,7 +42,7 @@ class MyForbidService : public ForbidService
|
||||
ForbidData *d = this->forbidData[i - 1];
|
||||
|
||||
if ((ftype == FT_NONE || ftype == d->type) && Anope::Match(mask, d->mask, false, true))
|
||||
return d;
|
||||
d->destroy();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@@ -65,7 +65,7 @@ class MyForbidService : public ForbidService
|
||||
|
||||
Log(LOG_NORMAL, "expire/forbid") << "Expiring forbid for " << d->mask << " type " << ftype;
|
||||
this->forbidData.erase(this->forbidData.begin() + i - 1);
|
||||
delete d;
|
||||
d->destroy();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -257,7 +257,7 @@ class OSForbid : public Module
|
||||
ForbidData *d = this->forbidService.FindForbid(u->nick, FT_NICK);
|
||||
if (d != NULL)
|
||||
{
|
||||
BotInfo *bi = findbot(Config->OperServ);
|
||||
const BotInfo *bi = findbot(Config->OperServ);
|
||||
if (bi)
|
||||
{
|
||||
if (d->reason.empty())
|
||||
|
||||
@@ -18,9 +18,9 @@ struct ForbidData : Serializable
|
||||
time_t expires;
|
||||
ForbidType type;
|
||||
|
||||
Anope::string serialize_name() const anope_override { return "ForbidData"; }
|
||||
serialized_data serialize() anope_override;
|
||||
static void unserialize(serialized_data &data);
|
||||
const Anope::string serialize_name() const anope_override { return "ForbidData"; }
|
||||
Serialize::Data serialize() const anope_override;
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &data);
|
||||
};
|
||||
|
||||
class ForbidService : public Service
|
||||
@@ -39,9 +39,9 @@ class ForbidService : public Service
|
||||
|
||||
static service_reference<ForbidService> forbid_service("ForbidService", "forbid");
|
||||
|
||||
Serializable::serialized_data ForbidData::serialize()
|
||||
Serialize::Data ForbidData::serialize() const
|
||||
{
|
||||
serialized_data data;
|
||||
Serialize::Data data;
|
||||
|
||||
data["mask"] << this->mask;
|
||||
data["creator"] << this->creator;
|
||||
@@ -53,12 +53,16 @@ Serializable::serialized_data ForbidData::serialize()
|
||||
return data;
|
||||
}
|
||||
|
||||
void ForbidData::unserialize(serialized_data &data)
|
||||
Serializable* ForbidData::unserialize(Serializable *obj, Serialize::Data &data)
|
||||
{
|
||||
if (!forbid_service)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
ForbidData *fb = new ForbidData;
|
||||
ForbidData *fb;
|
||||
if (obj)
|
||||
fb = debug_cast<ForbidData *>(obj);
|
||||
else
|
||||
fb = new ForbidData;
|
||||
|
||||
data["mask"] >> fb->mask;
|
||||
data["creator"] >> fb->creator;
|
||||
@@ -69,7 +73,9 @@ void ForbidData::unserialize(serialized_data &data)
|
||||
data["type"] >> t;
|
||||
fb->type = static_cast<ForbidType>(t);
|
||||
|
||||
forbid_service->AddForbid(fb);
|
||||
if (!obj)
|
||||
forbid_service->AddForbid(fb);
|
||||
return fb;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -19,7 +19,7 @@ class OSIgnoreService : public IgnoreService
|
||||
public:
|
||||
OSIgnoreService(Module *o) : IgnoreService(o) { }
|
||||
|
||||
void AddIgnore(const Anope::string &mask, const Anope::string &creator, const Anope::string &reason, time_t delta = Anope::CurTime) anope_override
|
||||
IgnoreData* AddIgnore(const Anope::string &mask, const Anope::string &creator, const Anope::string &reason, time_t delta = Anope::CurTime) anope_override
|
||||
{
|
||||
/* If it s an existing user, we ignore the hostmask. */
|
||||
Anope::string realmask = mask;
|
||||
@@ -36,7 +36,7 @@ class OSIgnoreService : public IgnoreService
|
||||
{
|
||||
/* this should never happen */
|
||||
if (user > host)
|
||||
return;
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
/* We have user@host. Add nick wildcard. */
|
||||
@@ -54,6 +54,7 @@ class OSIgnoreService : public IgnoreService
|
||||
ign->time = 0;
|
||||
else
|
||||
ign->time = Anope::CurTime + delta;
|
||||
return ign;
|
||||
}
|
||||
/* Create new entry.. */
|
||||
else
|
||||
@@ -64,6 +65,7 @@ class OSIgnoreService : public IgnoreService
|
||||
newign.reason = reason;
|
||||
newign.time = delta ? Anope::CurTime + delta : 0;
|
||||
this->ignores.push_back(newign);
|
||||
return &this->ignores.back();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -17,9 +17,9 @@ struct IgnoreData : Serializable
|
||||
Anope::string reason;
|
||||
time_t time; /* When do we stop ignoring them? */
|
||||
|
||||
Anope::string serialize_name() const anope_override { return "IgnoreData"; }
|
||||
serialized_data serialize() anope_override;
|
||||
static void unserialize(serialized_data &data);
|
||||
const Anope::string serialize_name() const anope_override { return "IgnoreData"; }
|
||||
Serialize::Data serialize() const anope_override;
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &data);
|
||||
};
|
||||
|
||||
class IgnoreService : public Service
|
||||
@@ -30,7 +30,7 @@ class IgnoreService : public Service
|
||||
IgnoreService(Module *c) : Service(c, "IgnoreService", "ignore") { }
|
||||
|
||||
public:
|
||||
virtual void AddIgnore(const Anope::string &mask, const Anope::string &creator, const Anope::string &reason, time_t delta = Anope::CurTime) = 0;
|
||||
virtual IgnoreData* AddIgnore(const Anope::string &mask, const Anope::string &creator, const Anope::string &reason, time_t delta = Anope::CurTime) = 0;
|
||||
|
||||
virtual bool DelIgnore(const Anope::string &mask) = 0;
|
||||
|
||||
@@ -43,9 +43,9 @@ class IgnoreService : public Service
|
||||
|
||||
static service_reference<IgnoreService> ignore_service("IgnoreService", "ignore");
|
||||
|
||||
Serializable::serialized_data IgnoreData::serialize()
|
||||
Serialize::Data IgnoreData::serialize() const
|
||||
{
|
||||
serialized_data data;
|
||||
Serialize::Data data;
|
||||
|
||||
data["mask"] << this->mask;
|
||||
data["creator"] << this->creator;
|
||||
@@ -55,14 +55,24 @@ Serializable::serialized_data IgnoreData::serialize()
|
||||
return data;
|
||||
}
|
||||
|
||||
void IgnoreData::unserialize(serialized_data &data)
|
||||
Serializable* IgnoreData::unserialize(Serializable *obj, Serialize::Data &data)
|
||||
{
|
||||
if (!ignore_service)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
if (obj)
|
||||
{
|
||||
IgnoreData *ign = debug_cast<IgnoreData *>(obj);
|
||||
data["mask"] >> ign->mask;
|
||||
data["creator"] >> ign->creator;
|
||||
data["reason"] >> ign->reason;
|
||||
data["time"] >> ign->time;
|
||||
return ign;
|
||||
}
|
||||
|
||||
time_t t;
|
||||
data["time"] >> t;
|
||||
|
||||
ignore_service->AddIgnore(data["mask"].astr(), data["creator"].astr(), data["reason"].astr(), t);
|
||||
return ignore_service->AddIgnore(data["mask"].astr(), data["creator"].astr(), data["reason"].astr(), t);
|
||||
}
|
||||
|
||||
|
||||
@@ -40,9 +40,9 @@ class CommandOSModInfo : public Command
|
||||
|
||||
source.Reply(_(" Providing service: \002%s\002"), c->name.c_str());
|
||||
|
||||
for (botinfo_map::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it)
|
||||
for (botinfo_map::const_iterator it = BotListByNick->begin(), it_end = BotListByNick->end(); it != it_end; ++it)
|
||||
{
|
||||
BotInfo *bi = it->second;
|
||||
const BotInfo *bi = it->second;
|
||||
|
||||
for (BotInfo::command_map::const_iterator cit = bi->commands.begin(), cit_end = bi->commands.end(); cit != cit_end; ++cit)
|
||||
{
|
||||
|
||||
@@ -72,7 +72,7 @@ class MyNewsService : public NewsService
|
||||
{
|
||||
for (unsigned i = 0; i < 3; ++i)
|
||||
for (unsigned j = 0; j < newsItems[i].size(); ++j)
|
||||
delete newsItems[i][j];
|
||||
newsItems[i][j]->destroy();
|
||||
}
|
||||
|
||||
void AddNewsItem(NewsItem *n)
|
||||
@@ -86,7 +86,7 @@ class MyNewsService : public NewsService
|
||||
std::vector<NewsItem *>::iterator it = std::find(list.begin(), list.end(), n);
|
||||
if (it != list.end())
|
||||
list.erase(it);
|
||||
delete n;
|
||||
n->destroy();
|
||||
}
|
||||
|
||||
std::vector<NewsItem *> &GetNewsList(NewsType t)
|
||||
@@ -364,10 +364,10 @@ class OSNews : public Module
|
||||
if (Type == NEWS_RANDOM && i != cur_rand_news)
|
||||
continue;
|
||||
|
||||
BotInfo *gl = findbot(Config->Global);
|
||||
if (!gl && !BotListByNick.empty())
|
||||
gl = BotListByNick.begin()->second;
|
||||
BotInfo *os = findbot(Config->OperServ);
|
||||
const BotInfo *gl = findbot(Config->Global);
|
||||
if (!gl && !BotListByNick->empty())
|
||||
gl = BotListByNick->begin()->second;
|
||||
const BotInfo *os = findbot(Config->OperServ);
|
||||
if (!os)
|
||||
os = gl;
|
||||
if (gl)
|
||||
|
||||
@@ -22,9 +22,9 @@ struct NewsItem : Serializable
|
||||
Anope::string who;
|
||||
time_t time;
|
||||
|
||||
Anope::string serialize_name() const anope_override { return "NewsItem"; }
|
||||
serialized_data serialize() anope_override;
|
||||
static void unserialize(serialized_data &data);
|
||||
const Anope::string serialize_name() const anope_override { return "NewsItem"; }
|
||||
Serialize::Data serialize() const anope_override;
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &data);
|
||||
};
|
||||
|
||||
class NewsService : public Service
|
||||
@@ -41,9 +41,9 @@ class NewsService : public Service
|
||||
|
||||
static service_reference<NewsService> news_service("NewsService", "news");
|
||||
|
||||
Serializable::serialized_data NewsItem::serialize()
|
||||
Serialize::Data NewsItem::serialize() const
|
||||
{
|
||||
serialized_data data;
|
||||
Serialize::Data data;
|
||||
|
||||
data["type"] << this->type;
|
||||
data["text"] << this->text;
|
||||
@@ -53,12 +53,16 @@ Serializable::serialized_data NewsItem::serialize()
|
||||
return data;
|
||||
}
|
||||
|
||||
void NewsItem::unserialize(serialized_data &data)
|
||||
Serializable* NewsItem::unserialize(Serializable *obj, Serialize::Data &data)
|
||||
{
|
||||
if (!news_service)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
NewsItem *ni = new NewsItem();
|
||||
NewsItem *ni;
|
||||
if (obj)
|
||||
ni = debug_cast<NewsItem *>(obj);
|
||||
else
|
||||
ni = new NewsItem();
|
||||
|
||||
unsigned int t;
|
||||
data["type"] >> t;
|
||||
@@ -67,7 +71,9 @@ void NewsItem::unserialize(serialized_data &data)
|
||||
data["who"] >> ni->who;
|
||||
data["time"] >> ni->time;
|
||||
|
||||
news_service->AddNewsItem(ni);
|
||||
if (!obj)
|
||||
news_service->AddNewsItem(ni);
|
||||
return ni;
|
||||
}
|
||||
|
||||
#endif // OS_NEWS
|
||||
|
||||
@@ -17,14 +17,14 @@ struct MyOper : Oper, Serializable
|
||||
{
|
||||
MyOper(const Anope::string &n, OperType *o) : Oper(n, o) { }
|
||||
|
||||
Anope::string serialize_name() const anope_override
|
||||
const Anope::string serialize_name() const anope_override
|
||||
{
|
||||
return "Oper";
|
||||
}
|
||||
|
||||
serialized_data serialize() anope_override
|
||||
Serialize::Data serialize() const anope_override
|
||||
{
|
||||
serialized_data data;
|
||||
Serialize::Data data;
|
||||
|
||||
data["name"] << this->name;
|
||||
data["type"] << this->ot->GetName();
|
||||
@@ -32,17 +32,23 @@ struct MyOper : Oper, Serializable
|
||||
return data;
|
||||
}
|
||||
|
||||
static void unserialize(serialized_data &data)
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &data)
|
||||
{
|
||||
OperType *ot = OperType::Find(data["type"].astr());
|
||||
if (ot == NULL)
|
||||
return;
|
||||
return NULL;
|
||||
NickCore *nc = findcore(data["name"].astr());
|
||||
if (nc == NULL)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
nc->o = new MyOper(nc->display, ot);
|
||||
MyOper *myo;
|
||||
if (obj)
|
||||
myo = debug_cast<MyOper *>(obj);
|
||||
else
|
||||
myo = new MyOper(nc->display, ot);
|
||||
nc->o = myo;
|
||||
Log(LOG_NORMAL, "operserv/oper") << "Tied oper " << nc->display << " to type " << ot->GetName();
|
||||
return myo;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -67,7 +73,7 @@ class CommandOSOper : public Command
|
||||
const Anope::string &oper = params[1];
|
||||
const Anope::string &otype = params[2];
|
||||
|
||||
NickAlias *na = findnick(oper);
|
||||
const NickAlias *na = findnick(oper);
|
||||
if (na == NULL)
|
||||
source.Reply(NICK_X_NOT_REGISTERED, oper.c_str());
|
||||
else if (na->nc->o)
|
||||
@@ -90,7 +96,7 @@ class CommandOSOper : public Command
|
||||
{
|
||||
const Anope::string &oper = params[1];
|
||||
|
||||
NickAlias *na = findnick(oper);
|
||||
const NickAlias *na = findnick(oper);
|
||||
if (na == NULL)
|
||||
source.Reply(NICK_X_NOT_REGISTERED, oper.c_str());
|
||||
else if (!na->nc || !na->nc->o)
|
||||
@@ -107,9 +113,9 @@ class CommandOSOper : public Command
|
||||
else if (subcommand.equals_ci("LIST"))
|
||||
{
|
||||
source.Reply(_("Name Type"));
|
||||
for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it)
|
||||
for (nickcore_map::const_iterator it = NickCoreList->begin(), it_end = NickCoreList->end(); it != it_end; ++it)
|
||||
{
|
||||
NickCore *nc = it->second;
|
||||
const NickCore *nc = it->second;
|
||||
|
||||
if (!nc->o)
|
||||
continue;
|
||||
@@ -117,7 +123,7 @@ class CommandOSOper : public Command
|
||||
source.Reply(_("%-8s %s"), nc->o->name.c_str(), nc->o->ot->GetName().c_str());
|
||||
if (nc->o->config)
|
||||
source.Reply(_(" This oper is configured in the configuration file."));
|
||||
for (std::list<User *>::iterator uit = nc->Users.begin(); uit != nc->Users.end(); ++uit)
|
||||
for (std::list<User *>::const_iterator uit = nc->Users.begin(); uit != nc->Users.end(); ++uit)
|
||||
{
|
||||
User *u = *uit;
|
||||
source.Reply(_(" %s is online using this oper block."), u->nick.c_str());
|
||||
@@ -213,9 +219,9 @@ class OSOper : public Module
|
||||
|
||||
~OSOper()
|
||||
{
|
||||
for (nickcore_map::const_iterator it = NickCoreList.begin(), it_end = NickCoreList.end(); it != it_end; ++it)
|
||||
for (nickcore_map::const_iterator it = NickCoreList->begin(), it_end = NickCoreList->end(); it != it_end; ++it)
|
||||
{
|
||||
NickCore *nc = it->second;
|
||||
const NickCore *nc = it->second;
|
||||
|
||||
if (nc->o && !nc->o->config)
|
||||
delete nc->o;
|
||||
|
||||
@@ -102,7 +102,7 @@ class ExpireTimer : public Timer
|
||||
continue;
|
||||
Log(findbot(Config->OperServ), "expire/exception") << "Session exception for " << e->mask << "has expired.";
|
||||
session_service->DelException(e);
|
||||
delete e;
|
||||
e->destroy();
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -143,7 +143,7 @@ class ExceptionDelCallback : public NumberList
|
||||
FOREACH_MOD(I_OnExceptionDel, OnExceptionDel(source.u, e));
|
||||
|
||||
session_service->DelException(e);
|
||||
delete e;
|
||||
e->destroy();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -346,7 +346,7 @@ class CommandOSException : public Command
|
||||
EventReturn MOD_RESULT;
|
||||
FOREACH_RESULT(I_OnExceptionAdd, OnExceptionAdd(exception));
|
||||
if (MOD_RESULT == EVENT_STOP)
|
||||
delete exception;
|
||||
exception->destroy();
|
||||
else
|
||||
{
|
||||
session_service->AddException(exception);
|
||||
@@ -635,7 +635,7 @@ class OSSession : public Module
|
||||
|
||||
if (kill && !exempt)
|
||||
{
|
||||
BotInfo *bi = findbot(Config->OperServ);
|
||||
const BotInfo *bi = findbot(Config->OperServ);
|
||||
if (bi)
|
||||
{
|
||||
if (!Config->SessionLimitExceeded.empty())
|
||||
|
||||
@@ -17,9 +17,9 @@ struct Exception : Serializable
|
||||
time_t time; /* When this exception was added */
|
||||
time_t expires; /* Time when it expires. 0 == no expiry */
|
||||
|
||||
Anope::string serialize_name() const anope_override { return "Exception"; }
|
||||
serialized_data serialize() anope_override;
|
||||
static void unserialize(serialized_data &data);
|
||||
const Anope::string serialize_name() const anope_override { return "Exception"; }
|
||||
Serialize::Data serialize() const anope_override;
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &data);
|
||||
};
|
||||
|
||||
class SessionService : public Service
|
||||
@@ -51,9 +51,9 @@ class SessionService : public Service
|
||||
|
||||
static service_reference<SessionService> session_service("SessionService", "session");
|
||||
|
||||
Serializable::serialized_data Exception::serialize()
|
||||
Serialize::Data Exception::serialize() const
|
||||
{
|
||||
serialized_data data;
|
||||
Serialize::Data data;
|
||||
|
||||
data["mask"] << this->mask;
|
||||
data["limit"] << this->limit;
|
||||
@@ -65,12 +65,16 @@ Serializable::serialized_data Exception::serialize()
|
||||
return data;
|
||||
}
|
||||
|
||||
void Exception::unserialize(Serializable::serialized_data &data)
|
||||
Serializable* Exception::unserialize(Serializable *obj, Serialize::Data &data)
|
||||
{
|
||||
if (!session_service)
|
||||
return;
|
||||
return NULL;
|
||||
|
||||
Exception *ex = new Exception;
|
||||
Exception *ex;
|
||||
if (obj)
|
||||
ex = debug_cast<Exception *>(obj);
|
||||
else
|
||||
ex = new Exception;
|
||||
data["mask"] >> ex->mask;
|
||||
data["limit"] >> ex->limit;
|
||||
data["who"] >> ex->who;
|
||||
@@ -78,7 +82,9 @@ void Exception::unserialize(Serializable::serialized_data &data)
|
||||
data["time"] >> ex->time;
|
||||
data["expires"] >> ex->expires;
|
||||
|
||||
session_service->AddException(ex);
|
||||
if (!obj)
|
||||
session_service->AddException(ex);
|
||||
return ex;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -15,14 +15,14 @@
|
||||
|
||||
struct Stats : Serializable
|
||||
{
|
||||
Anope::string serialize_name() const
|
||||
const Anope::string serialize_name() const
|
||||
{
|
||||
return "Stats";
|
||||
}
|
||||
|
||||
serialized_data serialize() anope_override
|
||||
Serialize::Data serialize() const anope_override
|
||||
{
|
||||
serialized_data data;
|
||||
Serialize::Data data;
|
||||
|
||||
data["maxusercnt"] << maxusercnt;
|
||||
data["maxusertime"] << maxusertime;
|
||||
@@ -30,10 +30,11 @@ struct Stats : Serializable
|
||||
return data;
|
||||
}
|
||||
|
||||
static void unserialize(serialized_data &data)
|
||||
static Serializable* unserialize(Serializable *obj, Serialize::Data &data)
|
||||
{
|
||||
data["maxusercnt"] >> maxusercnt;
|
||||
data["maxusertime"] >> maxusertime;
|
||||
return NULL;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@ class CommandOSSXLineBase : public Command
|
||||
if (!Number)
|
||||
return;
|
||||
|
||||
XLine *x = this->xlm->GetEntry(Number - 1);
|
||||
const XLine *x = this->xlm->GetEntry(Number - 1);
|
||||
|
||||
if (!x)
|
||||
return;
|
||||
@@ -154,7 +154,7 @@ class CommandOSSXLineBase : public Command
|
||||
{
|
||||
for (unsigned i = 0, end = this->xlm()->GetCount(); i < end; ++i)
|
||||
{
|
||||
XLine *x = this->xlm()->GetEntry(i);
|
||||
const XLine *x = this->xlm()->GetEntry(i);
|
||||
|
||||
if (mask.empty() || mask.equals_ci(x->Mask) || mask == x->UID || Anope::Match(x->Mask, mask, false, true))
|
||||
{
|
||||
@@ -369,7 +369,7 @@ class CommandOSSNLine : public CommandOSSXLineBase
|
||||
{
|
||||
source.Reply(USERHOST_MASK_TOO_WIDE, mask.c_str());
|
||||
Log(LOG_ADMIN, u, this) << "tried to " << source.command << " " << percent << "% of the network (" << affected << " users)";
|
||||
delete x;
|
||||
x->destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -377,7 +377,7 @@ class CommandOSSNLine : public CommandOSSXLineBase
|
||||
FOREACH_RESULT(I_OnAddXLine, OnAddXLine(u, x, this->xlm()));
|
||||
if (MOD_RESULT == EVENT_STOP)
|
||||
{
|
||||
delete x;
|
||||
x->destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -576,7 +576,7 @@ class CommandOSSQLine : public CommandOSSXLineBase
|
||||
{
|
||||
source.Reply(USERHOST_MASK_TOO_WIDE, mask.c_str());
|
||||
Log(LOG_ADMIN, u, this) << "tried to SQLine " << percent << "% of the network (" << affected << " users)";
|
||||
delete x;
|
||||
x->destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -584,7 +584,7 @@ class CommandOSSQLine : public CommandOSSXLineBase
|
||||
FOREACH_RESULT(I_OnAddXLine, OnAddXLine(u, x, this->xlm()));
|
||||
if (MOD_RESULT == EVENT_STOP)
|
||||
{
|
||||
delete x;
|
||||
x->destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -91,8 +91,8 @@ class DBFlatFile : public Module
|
||||
}
|
||||
|
||||
SerializeType *st = NULL;
|
||||
Serializable::serialized_data data;
|
||||
std::multimap<SerializeType *, Serializable::serialized_data> objects;
|
||||
Serialize::Data data;
|
||||
std::multimap<SerializeType *, Serialize::Data> objects;
|
||||
for (Anope::string buf, token; std::getline(db, buf.str());)
|
||||
{
|
||||
spacesepstream sep(buf);
|
||||
@@ -121,11 +121,11 @@ class DBFlatFile : public Module
|
||||
{
|
||||
SerializeType *stype = SerializeType::Find(type_order[i]);
|
||||
|
||||
std::multimap<SerializeType *, Serializable::serialized_data>::iterator it = objects.find(stype), it_end = objects.upper_bound(stype);
|
||||
std::multimap<SerializeType *, Serialize::Data>::iterator it = objects.find(stype), it_end = objects.upper_bound(stype);
|
||||
if (it == objects.end())
|
||||
continue;
|
||||
for (; it != it_end; ++it)
|
||||
it->first->Create(it->second);
|
||||
it->first->Unserialize(NULL, it->second);
|
||||
}
|
||||
|
||||
db.close();
|
||||
@@ -155,10 +155,10 @@ class DBFlatFile : public Module
|
||||
for (std::list<Serializable *>::const_iterator it = items.begin(), it_end = items.end(); it != it_end; ++it)
|
||||
{
|
||||
Serializable *base = *it;
|
||||
Serializable::serialized_data data = base->serialize();
|
||||
Serialize::Data data = base->serialize();
|
||||
|
||||
db << "OBJECT " << base->serialize_name() << "\n";
|
||||
for (Serializable::serialized_data::iterator dit = data.begin(), dit_end = data.end(); dit != dit_end; ++dit)
|
||||
for (Serialize::Data::iterator dit = data.begin(), dit_end = data.end(); dit != dit_end; ++dit)
|
||||
db << "DATA " << dit->first << " " << dit->second.astr() << "\n";
|
||||
db << "END\n";
|
||||
}
|
||||
|
||||
@@ -516,7 +516,7 @@ static void LoadNicks()
|
||||
m->sender = sbuf;
|
||||
READ(read_string(m->text, f));
|
||||
m->owner = nc->display;
|
||||
nc->memos.memos.push_back(m);
|
||||
nc->memos.memos->push_back(m);
|
||||
}
|
||||
READ(read_uint16(&u16, f));
|
||||
READ(read_int16(&i16, f));
|
||||
@@ -798,7 +798,7 @@ static void LoadChannels()
|
||||
m->sender = sbuf;
|
||||
READ(read_string(m->text, f));
|
||||
m->owner = ci->name;
|
||||
ci->memos.memos.push_back(m);
|
||||
ci->memos.memos->push_back(m);
|
||||
}
|
||||
|
||||
READ(read_string(buffer, f));
|
||||
|
||||
@@ -17,6 +17,11 @@
|
||||
Anope::string DatabaseFile;
|
||||
std::stringstream db_buffer;
|
||||
|
||||
struct ExtensibleString : Anope::string, ExtensibleItem
|
||||
{
|
||||
ExtensibleString(const Anope::string &s) : Anope::string(s) { }
|
||||
};
|
||||
|
||||
class DatabaseException : public CoreException
|
||||
{
|
||||
public:
|
||||
@@ -60,7 +65,7 @@ EventReturn OnDatabaseRead(const std::vector<Anope::string> ¶ms)
|
||||
LoadOperInfo(otherparams);
|
||||
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
}
|
||||
|
||||
EventReturn OnDatabaseReadMetadata(NickCore *nc, const Anope::string &key, const std::vector<Anope::string> ¶ms)
|
||||
{
|
||||
@@ -93,7 +98,7 @@ EventReturn OnDatabaseReadMetadata(NickCore *nc, const Anope::string &key, const
|
||||
m->SetFlag(MF_RECEIPT);
|
||||
}
|
||||
m->text = params[params.size() - 1];
|
||||
nc->memos.memos.push_back(m);
|
||||
nc->memos.memos->push_back(m);
|
||||
}
|
||||
else if (key.equals_ci("MIG"))
|
||||
nc->memos.ignores.push_back(params[0].ci_str());
|
||||
@@ -173,7 +178,7 @@ EventReturn OnDatabaseReadMetadata(ChannelInfo *ci, const Anope::string &key, co
|
||||
if (!provider)
|
||||
throw DatabaseException("Old access entry for nonexistant provider");
|
||||
|
||||
ChanAccess *access = provider->Create();
|
||||
ChanAccess *access = const_cast<ChanAccess *>(provider->Create());
|
||||
access->ci = ci;
|
||||
access->mask = params[0];
|
||||
access->Unserialize(params[1]);
|
||||
@@ -189,7 +194,7 @@ EventReturn OnDatabaseReadMetadata(ChannelInfo *ci, const Anope::string &key, co
|
||||
if (!provider)
|
||||
throw DatabaseException("Access entry for nonexistant provider " + params[0]);
|
||||
|
||||
ChanAccess *access = provider->Create();
|
||||
ChanAccess *access = const_cast<ChanAccess *>(provider->Create());
|
||||
access->ci = ci;
|
||||
access->mask = params[1];
|
||||
access->Unserialize(params[2]);
|
||||
@@ -222,18 +227,18 @@ EventReturn OnDatabaseReadMetadata(ChannelInfo *ci, const Anope::string &key, co
|
||||
}
|
||||
else if (key.equals_ci("LOG"))
|
||||
{
|
||||
LogSetting l;
|
||||
LogSetting *l = new LogSetting();
|
||||
|
||||
l.ci = ci;
|
||||
l.service_name = params[0];
|
||||
l.command_service = params[1];
|
||||
l.command_name = params[2];
|
||||
l.method = params[3];
|
||||
l.creator = params[4];
|
||||
l.created = params[5].is_pos_number_only() ? convertTo<time_t>(params[5]) : Anope::CurTime;
|
||||
l.extra = params.size() > 6 ? params[6] : "";
|
||||
l->ci = ci;
|
||||
l->service_name = params[0];
|
||||
l->command_service = params[1];
|
||||
l->command_name = params[2];
|
||||
l->method = params[3];
|
||||
l->creator = params[4];
|
||||
l->created = params[5].is_pos_number_only() ? convertTo<time_t>(params[5]) : Anope::CurTime;
|
||||
l->extra = params.size() > 6 ? params[6] : "";
|
||||
|
||||
ci->log_settings.push_back(l);
|
||||
ci->log_settings->push_back(l);
|
||||
}
|
||||
else if (key.equals_ci("MLOCK"))
|
||||
{
|
||||
@@ -241,12 +246,12 @@ EventReturn OnDatabaseReadMetadata(ChannelInfo *ci, const Anope::string &key, co
|
||||
Anope::string mode_name = params[1];
|
||||
Anope::string setter = params[2];
|
||||
time_t mcreated = params[3].is_pos_number_only() ? convertTo<time_t>(params[3]) : Anope::CurTime;
|
||||
Anope::string param = params.size() > 4 ? params[4] : "";
|
||||
for (size_t i = CMODE_BEGIN + 1; i < CMODE_END; ++i)
|
||||
Anope::string param = params.size() > 4 ? params[4] : "";
|
||||
for (size_t i = CMODE_BEGIN + 1; i < CMODE_END; ++i)
|
||||
if (ChannelModeNameStrings[i] == mode_name)
|
||||
{
|
||||
ChannelModeName n = static_cast<ChannelModeName>(i);
|
||||
ci->mode_locks.insert(std::make_pair(n, ModeLock(ci, set, n, param, setter, mcreated)));
|
||||
ci->mode_locks->insert(std::make_pair(n, new ModeLock(ci, set, n, param, setter, mcreated)));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -263,7 +268,7 @@ EventReturn OnDatabaseReadMetadata(ChannelInfo *ci, const Anope::string &key, co
|
||||
m->SetFlag(MF_RECEIPT);
|
||||
}
|
||||
m->text = params[params.size() - 1];
|
||||
ci->memos.memos.push_back(m);
|
||||
ci->memos.memos->push_back(m);
|
||||
}
|
||||
else if (key.equals_ci("MIG"))
|
||||
ci->memos.ignores.push_back(params[0].ci_str());
|
||||
@@ -666,9 +671,9 @@ class DBPlain : public Module
|
||||
|
||||
db_buffer << "VER 2" << endl;
|
||||
|
||||
for (nickcore_map::const_iterator nit = NickCoreList.begin(), nit_end = NickCoreList.end(); nit != nit_end; ++nit)
|
||||
for (nickcore_map::const_iterator nit = NickCoreList->begin(), nit_end = NickCoreList->end(); nit != nit_end; ++nit)
|
||||
{
|
||||
NickCore *nc = nit->second;
|
||||
const NickCore *nc = nit->second;
|
||||
|
||||
db_buffer << "NC " << nc->display << " " << nc->pass << endl;
|
||||
|
||||
@@ -683,34 +688,35 @@ class DBPlain : public Module
|
||||
|
||||
if (!nc->access.empty())
|
||||
{
|
||||
for (std::vector<Anope::string>::iterator it = nc->access.begin(), it_end = nc->access.end(); it != it_end; ++it)
|
||||
for (std::vector<Anope::string>::const_iterator it = nc->access.begin(), it_end = nc->access.end(); it != it_end; ++it)
|
||||
db_buffer << "MD ACCESS " << *it << endl;
|
||||
}
|
||||
if (!nc->cert.empty())
|
||||
{
|
||||
for (std::vector<Anope::string>::iterator it = nc->cert.begin(), it_end = nc->cert.end(); it != it_end; ++it)
|
||||
for (std::vector<Anope::string>::const_iterator it = nc->cert.begin(), it_end = nc->cert.end(); it != it_end; ++it)
|
||||
db_buffer << "MD CERT " << *it << endl;
|
||||
}
|
||||
if (nc->FlagCount())
|
||||
db_buffer << "MD FLAGS " << nc->ToString() << endl;
|
||||
MemoInfo *mi = &nc->memos;
|
||||
for (unsigned k = 0, end = mi->memos.size(); k < end; ++k)
|
||||
const MemoInfo *mi = &nc->memos;
|
||||
for (unsigned k = 0, end = mi->memos->size(); k < end; ++k)
|
||||
{
|
||||
db_buffer << "MD MI " << mi->memos[k]->time << " " << mi->memos[k]->sender;
|
||||
if (mi->memos[k]->HasFlag(MF_UNREAD))
|
||||
const Memo *m = mi->GetMemo(k);
|
||||
db_buffer << "MD MI " << m->time << " " << m->sender;
|
||||
if (m->HasFlag(MF_UNREAD))
|
||||
db_buffer << " UNREAD";
|
||||
if (mi->memos[k]->HasFlag(MF_RECEIPT))
|
||||
if (m->HasFlag(MF_RECEIPT))
|
||||
db_buffer << " RECEIPT";
|
||||
db_buffer << " :" << mi->memos[k]->text << endl;
|
||||
db_buffer << " :" << m->text << endl;
|
||||
}
|
||||
for (unsigned k = 0, end = mi->ignores.size(); k < end; ++k)
|
||||
db_buffer << "MD MIG " << Anope::string(mi->ignores[k]) << endl;
|
||||
//FOREACH_MOD(I_OnDatabaseWriteMetadata, OnDatabaseWriteMetadata(WriteMetadata, nc));
|
||||
}
|
||||
|
||||
for (nickalias_map::const_iterator it = NickAliasList.begin(), it_end = NickAliasList.end(); it != it_end; ++it)
|
||||
for (nickalias_map::const_iterator it = NickAliasList->begin(), it_end = NickAliasList->end(); it != it_end; ++it)
|
||||
{
|
||||
NickAlias *na = it->second;
|
||||
const NickAlias *na = it->second;
|
||||
|
||||
db_buffer << "NA " << na->nc->display << " " << na->nick << " " << na->time_registered << " " << na->last_seen << endl;
|
||||
if (!na->last_usermask.empty())
|
||||
@@ -729,7 +735,7 @@ class DBPlain : public Module
|
||||
//FOREACH_MOD(I_OnDatabaseWriteMetadata, OnDatabaseWriteMetadata(WriteMetadata, na));
|
||||
}
|
||||
|
||||
for (Anope::insensitive_map<BotInfo *>::const_iterator it = BotListByNick.begin(), it_end = BotListByNick.end(); it != it_end; ++it)
|
||||
for (Anope::insensitive_map<BotInfo *>::const_iterator it = BotListByNick->begin(), it_end = BotListByNick->end(); it != it_end; ++it)
|
||||
{
|
||||
BotInfo *bi = it->second;
|
||||
|
||||
@@ -741,9 +747,9 @@ class DBPlain : public Module
|
||||
db_buffer << "MD FLAGS " << bi->ToString() << endl;
|
||||
}
|
||||
|
||||
for (registered_channel_map::const_iterator cit = RegisteredChannelList.begin(), cit_end = RegisteredChannelList.end(); cit != cit_end; ++cit)
|
||||
for (registered_channel_map::const_iterator cit = RegisteredChannelList->begin(), cit_end = RegisteredChannelList->end(); cit != cit_end; ++cit)
|
||||
{
|
||||
ChannelInfo *ci = cit->second;
|
||||
const ChannelInfo *ci = cit->second;
|
||||
|
||||
db_buffer << "CH " << ci->name << " " << ci->time_registered << " " << ci->last_used << endl;
|
||||
db_buffer << "MD BANTYPE " << ci->bantype << endl;
|
||||
@@ -774,7 +780,7 @@ class DBPlain : public Module
|
||||
}
|
||||
for (unsigned k = 0, end = ci->GetAccessCount(); k < end; ++k)
|
||||
{
|
||||
ChanAccess *access = ci->GetAccess(k);
|
||||
const ChanAccess *access = ci->GetAccess(k);
|
||||
db_buffer << "MD ACCESS2 " << access->provider->name << " " << access->mask << " " << access->Serialize() << " " << access->last_seen << " " << access->creator << " " << access->created << endl;
|
||||
}
|
||||
for (unsigned k = 0, end = ci->GetAkickCount(); k < end; ++k)
|
||||
@@ -785,28 +791,29 @@ class DBPlain : public Module
|
||||
db_buffer << ci->GetAkick(k)->reason;
|
||||
db_buffer << endl;
|
||||
}
|
||||
for (unsigned k = 0, end = ci->log_settings.size(); k < end; ++k)
|
||||
for (unsigned k = 0, end = ci->log_settings->size(); k < end; ++k)
|
||||
{
|
||||
LogSetting &l = ci->log_settings[k];
|
||||
const LogSetting &l = *ci->log_settings->at(k);
|
||||
|
||||
db_buffer << "MD LOG " << l.service_name << " " << l.command_service << " " << l.command_name << " " << l.method << " " << l.creator << " " << l.created << " " << l.extra << endl;
|
||||
}
|
||||
for (std::multimap<ChannelModeName, ModeLock>::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it)
|
||||
for (ChannelInfo::ModeList::const_iterator it = ci->GetMLock().begin(), it_end = ci->GetMLock().end(); it != it_end; ++it)
|
||||
{
|
||||
const ModeLock &ml = it->second;
|
||||
const ModeLock &ml = *it->second;
|
||||
ChannelMode *cm = ModeManager::FindChannelModeByName(ml.name);
|
||||
if (cm != NULL)
|
||||
db_buffer << "MD MLOCK " << (ml.set ? 1 : 0) << " " << cm->NameAsString() << " " << ml.setter << " " << ml.created << " " << ml.param << endl;
|
||||
}
|
||||
MemoInfo *memos = &ci->memos;
|
||||
for (unsigned k = 0, end = memos->memos.size(); k < end; ++k)
|
||||
const MemoInfo *memos = &ci->memos;
|
||||
for (unsigned k = 0, end = memos->memos->size(); k < end; ++k)
|
||||
{
|
||||
db_buffer << "MD MI " << memos->memos[k]->time << " " << memos->memos[k]->sender;
|
||||
if (memos->memos[k]->HasFlag(MF_UNREAD))
|
||||
const Memo *m = memos->GetMemo(k);
|
||||
db_buffer << "MD MI " << m->time << " " << m->sender;
|
||||
if (m->HasFlag(MF_UNREAD))
|
||||
db_buffer << " UNREAD";
|
||||
if (memos->memos[k]->HasFlag(MF_RECEIPT))
|
||||
if (m->HasFlag(MF_RECEIPT))
|
||||
db_buffer << " RECEIPT";
|
||||
db_buffer << " :" << memos->memos[k]->text << endl;
|
||||
db_buffer << " :" << m->text << endl;
|
||||
}
|
||||
for (unsigned k = 0, end = memos->ignores.size(); k < end; ++k)
|
||||
db_buffer << "MD MIG " << Anope::string(memos->ignores[k]) << endl;
|
||||
@@ -839,7 +846,7 @@ class DBPlain : public Module
|
||||
XLineManager *xl = *it;
|
||||
for (unsigned i = 0, end = xl->GetCount(); i < end; ++i)
|
||||
{
|
||||
XLine *x = xl->GetEntry(i);
|
||||
const XLine *x = xl->GetEntry(i);
|
||||
db_buffer << "OS SXLINE " << xl->Type() << " " << x->GetUser() << " " << x->GetHost() << " " << x->By << " " << x->Created << " " << x->Expires << " :" << x->Reason << endl;
|
||||
}
|
||||
}
|
||||
|
||||
+11
-39
@@ -60,41 +60,20 @@ class DBSQL : public Module
|
||||
}
|
||||
}
|
||||
|
||||
void AlterTable(const Anope::string &table, std::set<Anope::string> &data, const Serializable::serialized_data &newd)
|
||||
{
|
||||
for (Serializable::serialized_data::const_iterator it = newd.begin(), it_end = newd.end(); it != it_end; ++it)
|
||||
{
|
||||
if (data.count(it->first) > 0)
|
||||
continue;
|
||||
|
||||
data.insert(it->first);
|
||||
|
||||
Anope::string query_text = "ALTER TABLE `" + table + "` ADD `" + it->first + "` ";
|
||||
if (it->second.getType() == Serialize::DT_INT)
|
||||
query_text += "int(11)";
|
||||
else if (it->second.getMax() > 0)
|
||||
query_text += "varchar(" + stringify(it->second.getMax()) + ")";
|
||||
else
|
||||
query_text += "text";
|
||||
|
||||
this->RunBackground(SQLQuery(query_text));
|
||||
}
|
||||
}
|
||||
|
||||
void Insert(const Anope::string &table, const Serializable::serialized_data &data)
|
||||
void Insert(const Anope::string &table, const Serialize::Data &data)
|
||||
{
|
||||
Anope::string query_text = "INSERT INTO `" + table + "` (";
|
||||
for (Serializable::serialized_data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
for (Serialize::Data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
query_text += "`" + it->first + "`,";
|
||||
query_text.erase(query_text.end() - 1);
|
||||
query_text += ") VALUES (";
|
||||
for (Serializable::serialized_data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
for (Serialize::Data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
query_text += "@" + it->first + "@,";
|
||||
query_text.erase(query_text.end() - 1);
|
||||
query_text += ")";
|
||||
|
||||
SQLQuery query(query_text);
|
||||
for (Serializable::serialized_data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
for (Serialize::Data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
query.setValue(it->first, it->second.astr());
|
||||
|
||||
this->RunBackground(query);
|
||||
@@ -132,28 +111,21 @@ class DBSQL : public Module
|
||||
|
||||
this->DropAll();
|
||||
|
||||
std::map<Anope::string, std::set<Anope::string> > table_layout;
|
||||
for (std::list<Serializable *>::const_iterator it = items.begin(), it_end = items.end(); it != it_end; ++it)
|
||||
{
|
||||
Serializable *base = *it;
|
||||
Serializable::serialized_data data = base->serialize();
|
||||
Serialize::Data data = base->serialize();
|
||||
|
||||
if (data.empty())
|
||||
continue;
|
||||
|
||||
std::set<Anope::string> &layout = table_layout[base->serialize_name()];
|
||||
if (layout.empty())
|
||||
{
|
||||
this->RunBackground(this->sql->CreateTable(base->serialize_name(), data));
|
||||
|
||||
for (Serializable::serialized_data::iterator it2 = data.begin(), it2_end = data.end(); it2 != it2_end; ++it2)
|
||||
layout.insert(it2->first);
|
||||
}
|
||||
else
|
||||
this->AlterTable(base->serialize_name(), layout, data);
|
||||
std::vector<SQLQuery> create_queries = this->sql->CreateTable(base->serialize_name(), data);
|
||||
for (unsigned i = 0; i < create_queries.size(); ++i)
|
||||
this->RunBackground(create_queries[i]);
|
||||
|
||||
this->Insert(base->serialize_name(), data);
|
||||
}
|
||||
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
|
||||
@@ -174,12 +146,12 @@ class DBSQL : public Module
|
||||
SQLResult res = this->sql->RunQuery(query);
|
||||
for (int j = 0; j < res.Rows(); ++j)
|
||||
{
|
||||
Serializable::serialized_data data;
|
||||
Serialize::Data data;
|
||||
const std::map<Anope::string, Anope::string> &row = res.Row(j);
|
||||
for (std::map<Anope::string, Anope::string>::const_iterator rit = row.begin(), rit_end = row.end(); rit != rit_end; ++rit)
|
||||
data[rit->first] << rit->second;
|
||||
|
||||
sb->Create(data);
|
||||
sb->Unserialize(NULL, data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,311 @@
|
||||
#include "module.h"
|
||||
#include "../extra/sql.h"
|
||||
#include "../commands/os_session.h"
|
||||
|
||||
class MySQLInterface : public SQLInterface
|
||||
{
|
||||
public:
|
||||
MySQLInterface(Module *o) : SQLInterface(o) { }
|
||||
|
||||
void OnResult(const SQLResult &r) anope_override
|
||||
{
|
||||
Log(LOG_DEBUG) << "SQLive successfully executed query: " << r.finished_query;
|
||||
}
|
||||
|
||||
void OnError(const SQLResult &r) anope_override
|
||||
{
|
||||
if (!r.GetQuery().query.empty())
|
||||
Log(LOG_DEBUG) << "Error executing query " << r.finished_query << ": " << r.GetError();
|
||||
else
|
||||
Log(LOG_DEBUG) << "Error executing query: " << r.GetError();
|
||||
}
|
||||
};
|
||||
|
||||
class DBMySQL : public Module, public Pipe
|
||||
{
|
||||
private:
|
||||
MySQLInterface sqlinterface;
|
||||
Anope::string engine;
|
||||
service_reference<SQLProvider> SQL;
|
||||
time_t lastwarn;
|
||||
bool ro;
|
||||
bool init;
|
||||
std::set<dynamic_reference<Serializable> > updated_items;
|
||||
|
||||
bool CheckSQL()
|
||||
{
|
||||
if (SQL)
|
||||
{
|
||||
if (readonly && this->ro)
|
||||
{
|
||||
readonly = this->ro = false;
|
||||
const BotInfo *bi = findbot(Config->OperServ);
|
||||
if (bi)
|
||||
ircdproto->SendGlobops(bi, "Found SQL again, going out of readonly mode...");
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Anope::CurTime - Config->UpdateTimeout > lastwarn)
|
||||
{
|
||||
const BotInfo *bi = findbot(Config->OperServ);
|
||||
if (bi)
|
||||
ircdproto->SendGlobops(bi, "Unable to locate SQL reference, going to readonly...");
|
||||
readonly = this->ro = true;
|
||||
this->lastwarn = Anope::CurTime;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool CheckInit()
|
||||
{
|
||||
return init && SQL;
|
||||
}
|
||||
|
||||
void RunQuery(const SQLQuery &query)
|
||||
{
|
||||
/* Can this be threaded? */
|
||||
this->RunQueryResult(query);
|
||||
}
|
||||
|
||||
SQLResult RunQueryResult(const SQLQuery &query)
|
||||
{
|
||||
if (this->CheckSQL())
|
||||
{
|
||||
SQLResult res = SQL->RunQuery(query);
|
||||
if (!res.GetError().empty())
|
||||
Log(LOG_DEBUG) << "SQlive got error " << res.GetError() << " for " + res.finished_query;
|
||||
else
|
||||
Log(LOG_DEBUG) << "SQLive got " << res.Rows() << " rows for " << res.finished_query;
|
||||
return res;
|
||||
}
|
||||
throw SQLException("No SQL!");
|
||||
}
|
||||
|
||||
SQLQuery BuildInsert(const Anope::string &table, unsigned int id, const Serialize::Data &data)
|
||||
{
|
||||
if (this->SQL)
|
||||
{
|
||||
std::vector<SQLQuery> create_queries = this->SQL->CreateTable(table, data);
|
||||
for (unsigned i = 0; i < create_queries.size(); ++i)
|
||||
this->RunQuery(create_queries[i]);
|
||||
}
|
||||
|
||||
Anope::string query_text = "INSERT INTO `" + table + "` (`id`";
|
||||
for (Serialize::Data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
query_text += ",`" + it->first + "`";
|
||||
query_text += ") VALUES (" + stringify(id);
|
||||
for (Serialize::Data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
query_text += ",@" + it->first + "@";
|
||||
query_text += ") ON DUPLICATE KEY UPDATE ";
|
||||
for (Serialize::Data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
query_text += "`" + it->first + "`=VALUES(`" + it->first + "`),";
|
||||
query_text.erase(query_text.end() - 1);
|
||||
|
||||
SQLQuery query(query_text);
|
||||
for (Serialize::Data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
query.setValue(it->first, it->second.astr());
|
||||
|
||||
return query;
|
||||
}
|
||||
|
||||
public:
|
||||
DBMySQL(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, DATABASE), sqlinterface(this), SQL("", "")
|
||||
{
|
||||
this->lastwarn = 0;
|
||||
this->ro = false;
|
||||
this->init = false;
|
||||
|
||||
Implementation i[] = { I_OnReload, I_OnShutdown, I_OnLoadDatabase, I_OnSerializableConstruct, I_OnSerializableDestruct, I_OnSerializePtrAssign, I_OnSerializeCheck, I_OnSerializableUpdate };
|
||||
ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
|
||||
|
||||
OnReload();
|
||||
}
|
||||
|
||||
void OnNotify() anope_override
|
||||
{
|
||||
if (!this->CheckInit())
|
||||
return;
|
||||
|
||||
for (std::set<dynamic_reference<Serializable> >::iterator it = this->updated_items.begin(), it_end = this->updated_items.end(); it != it_end; ++it)
|
||||
{
|
||||
dynamic_reference<Serializable> obj = *it;
|
||||
|
||||
if (obj)
|
||||
{
|
||||
if (obj->IsCached())
|
||||
continue;
|
||||
obj->UpdateCache();
|
||||
|
||||
static std::set<Serializable *> working_objects; // XXX
|
||||
if (working_objects.count(obj))
|
||||
continue;
|
||||
working_objects.insert(obj);
|
||||
|
||||
SQLResult res = this->RunQueryResult(BuildInsert(obj->serialize_name(), obj->id, obj->serialize()));
|
||||
if (res.GetID() > 0)
|
||||
obj->id = res.GetID();
|
||||
SerializeType *type = SerializeType::Find(obj->serialize_name());
|
||||
if (type)
|
||||
type->objects.erase(obj->id);
|
||||
|
||||
working_objects.erase(obj);
|
||||
}
|
||||
}
|
||||
|
||||
this->updated_items.clear();
|
||||
}
|
||||
|
||||
EventReturn OnLoadDatabase() anope_override
|
||||
{
|
||||
init = true;
|
||||
return EVENT_STOP;
|
||||
}
|
||||
|
||||
void OnShutdown() anope_override
|
||||
{
|
||||
init = false;
|
||||
}
|
||||
|
||||
void OnReload() anope_override
|
||||
{
|
||||
ConfigReader config;
|
||||
this->engine = config.ReadValue("db_sql", "engine", "", 0);
|
||||
this->SQL = service_reference<SQLProvider>("SQLProvider", this->engine);
|
||||
}
|
||||
|
||||
void OnSerializableConstruct(Serializable *obj) anope_override
|
||||
{
|
||||
if (!this->CheckInit())
|
||||
return;
|
||||
this->updated_items.insert(obj);
|
||||
this->Notify();
|
||||
}
|
||||
|
||||
void OnSerializableDestruct(Serializable *obj) anope_override
|
||||
{
|
||||
if (!this->CheckInit())
|
||||
return;
|
||||
this->RunQuery("DELETE FROM `" + obj->serialize_name() + "` WHERE `id` = " + stringify(obj->id));
|
||||
SerializeType *type = SerializeType::Find(obj->serialize_name());
|
||||
if (type)
|
||||
type->objects.erase(obj->id);
|
||||
}
|
||||
|
||||
void OnSerializePtrAssign(Serializable *obj) anope_override
|
||||
{
|
||||
SerializeType *stype = SerializeType::Find(obj->serialize_name());
|
||||
if (stype == NULL || !this->CheckInit() || stype->GetTimestamp() == Anope::CurTime)
|
||||
return;
|
||||
|
||||
if (obj->IsCached())
|
||||
return;
|
||||
obj->UpdateCache();
|
||||
|
||||
SQLResult res = this->RunQueryResult("SELECT * FROM `" + obj->serialize_name() + "` WHERE `id` = " + stringify(obj->id));
|
||||
|
||||
if (res.Rows() == 0)
|
||||
obj->destroy();
|
||||
else
|
||||
{
|
||||
const std::map<Anope::string, Anope::string> &row = res.Row(0);
|
||||
|
||||
if (res.Get(0, "timestamp").empty())
|
||||
{
|
||||
obj->destroy();
|
||||
stype->objects.erase(obj->id);
|
||||
}
|
||||
else
|
||||
{
|
||||
Serialize::Data data;
|
||||
|
||||
for (std::map<Anope::string, Anope::string>::const_iterator it = row.begin(), it_end = row.end(); it != it_end; ++it)
|
||||
data[it->first] << it->second;
|
||||
|
||||
if (stype->Unserialize(obj, data) == NULL)
|
||||
obj->destroy();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OnSerializeCheck(SerializeType *obj)
|
||||
{
|
||||
if (!this->CheckInit() || obj->GetTimestamp() == Anope::CurTime)
|
||||
return;
|
||||
|
||||
SQLQuery query("SELECT * FROM `" + obj->GetName() + "` WHERE (`timestamp` > FROM_UNIXTIME(@ts@) OR `timestamp` IS NULL)");
|
||||
query.setValue("ts", obj->GetTimestamp());
|
||||
|
||||
obj->UpdateTimestamp();
|
||||
|
||||
SQLResult res = this->RunQueryResult(query);
|
||||
|
||||
bool clear_null = false;
|
||||
for (int i = 0; i < res.Rows(); ++i)
|
||||
{
|
||||
const std::map<Anope::string, Anope::string> &row = res.Row(i);
|
||||
|
||||
unsigned int id;
|
||||
try
|
||||
{
|
||||
id = convertTo<unsigned int>(res.Get(i, "id"));
|
||||
}
|
||||
catch (const ConvertException &)
|
||||
{
|
||||
Log(LOG_DEBUG) << "Unable to convert id from " << obj->GetName();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (res.Get(i, "timestamp").empty())
|
||||
{
|
||||
clear_null = true;
|
||||
std::map<unsigned int, Serializable *>::iterator it = obj->objects.find(id);
|
||||
if (it != obj->objects.end())
|
||||
{
|
||||
it->second->destroy();
|
||||
obj->objects.erase(it);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Serialize::Data data;
|
||||
|
||||
for (std::map<Anope::string, Anope::string>::const_iterator it = row.begin(), it_end = row.end(); it != it_end; ++it)
|
||||
data[it->first] << it->second;
|
||||
|
||||
Serializable *s = NULL;
|
||||
std::map<unsigned int, Serializable *>::iterator it = obj->objects.find(id);
|
||||
if (it != obj->objects.end())
|
||||
s = it->second;
|
||||
|
||||
Serializable *new_s = obj->Unserialize(s, data);
|
||||
if (new_s)
|
||||
{
|
||||
new_s->id = id;
|
||||
obj->objects[id] = new_s;
|
||||
}
|
||||
else
|
||||
s->destroy();
|
||||
}
|
||||
}
|
||||
|
||||
if (clear_null)
|
||||
{
|
||||
query = "DELETE FROM `" + obj->GetName() + "` WHERE `timestamp` IS NULL";
|
||||
this->RunQuery(query);
|
||||
}
|
||||
}
|
||||
|
||||
void OnSerializableUpdate(Serializable *obj)
|
||||
{
|
||||
this->updated_items.insert(obj);
|
||||
this->Notify();
|
||||
}
|
||||
};
|
||||
|
||||
MODULE_INIT(DBMySQL)
|
||||
|
||||
@@ -1,179 +0,0 @@
|
||||
#include "module.h"
|
||||
#include "../extra/sql.h"
|
||||
|
||||
class SQLCache : public Timer
|
||||
{
|
||||
typedef std::map<Anope::string, time_t, ci::less> cache_map;
|
||||
cache_map cache;
|
||||
public:
|
||||
|
||||
SQLCache() : Timer(300, Anope::CurTime, true) { }
|
||||
|
||||
bool Check(const Anope::string &item)
|
||||
{
|
||||
cache_map::iterator it = this->cache.find(item);
|
||||
if (it != this->cache.end() && Anope::CurTime - it->second < 5)
|
||||
return true;
|
||||
|
||||
this->cache[item] = Anope::CurTime;
|
||||
return false;
|
||||
}
|
||||
|
||||
void Tick(time_t) anope_override
|
||||
{
|
||||
for (cache_map::iterator it = this->cache.begin(), next_it; it != this->cache.end(); it = next_it)
|
||||
{
|
||||
next_it = it;
|
||||
++next_it;
|
||||
|
||||
if (Anope::CurTime - it->second > 5)
|
||||
this->cache.erase(it);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class MySQLLiveModule : public Module
|
||||
{
|
||||
service_reference<SQLProvider> SQL;
|
||||
|
||||
SQLCache chan_cache, nick_cache, core_cache;
|
||||
|
||||
SQLResult RunQuery(const SQLQuery &query)
|
||||
{
|
||||
if (!this->SQL)
|
||||
throw SQLException("Unable to locate SQL reference, is db_sql loaded and configured correctly?");
|
||||
|
||||
SQLResult res = SQL->RunQuery(query);
|
||||
if (!res.GetError().empty())
|
||||
throw SQLException(res.GetError());
|
||||
return res;
|
||||
}
|
||||
|
||||
public:
|
||||
MySQLLiveModule(const Anope::string &modname, const Anope::string &creator) :
|
||||
Module(modname, creator, DATABASE), SQL("", "")
|
||||
{
|
||||
this->OnReload();
|
||||
|
||||
Implementation i[] = { I_OnReload, I_OnFindChan, I_OnFindNick, I_OnFindCore, I_OnShutdown };
|
||||
ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
|
||||
}
|
||||
|
||||
void OnReload() anope_override
|
||||
{
|
||||
ConfigReader config;
|
||||
Anope::string engine = config.ReadValue("db_sql", "engine", "", 0);
|
||||
this->SQL = service_reference<SQLProvider>("SQLProvider", engine);
|
||||
}
|
||||
|
||||
void OnShutdown() anope_override
|
||||
{
|
||||
Implementation i[] = { I_OnFindChan, I_OnFindNick, I_OnFindCore };
|
||||
for (size_t j = 0; j < 3; ++j)
|
||||
ModuleManager::Detach(i[j], this);
|
||||
}
|
||||
|
||||
void OnFindChan(const Anope::string &chname) anope_override
|
||||
{
|
||||
if (chan_cache.Check(chname))
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
SQLQuery query("SELECT * FROM `ChannelInfo` WHERE `name` = @name@");
|
||||
query.setValue("name", chname);
|
||||
SQLResult res = this->RunQuery(query);
|
||||
|
||||
if (res.Rows() == 0)
|
||||
{
|
||||
delete cs_findchan(chname);
|
||||
return;
|
||||
}
|
||||
|
||||
SerializeType *sb = SerializeType::Find("ChannelInfo");
|
||||
if (sb == NULL)
|
||||
return;
|
||||
|
||||
Serializable::serialized_data data;
|
||||
const std::map<Anope::string, Anope::string> &row = res.Row(0);
|
||||
for (std::map<Anope::string, Anope::string>::const_iterator rit = row.begin(), rit_end = row.end(); rit != rit_end; ++rit)
|
||||
data[rit->first] << rit->second;
|
||||
|
||||
sb->Create(data);
|
||||
}
|
||||
catch (const SQLException &ex)
|
||||
{
|
||||
Log(LOG_DEBUG) << "OnFindChan: " << ex.GetReason();
|
||||
}
|
||||
}
|
||||
|
||||
void OnFindNick(const Anope::string &nick) anope_override
|
||||
{
|
||||
if (nick_cache.Check(nick))
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
SQLQuery query("SELECT * FROM `NickAlias` WHERE `nick` = @nick@");
|
||||
query.setValue("nick", nick);
|
||||
SQLResult res = this->RunQuery(query);
|
||||
|
||||
if (res.Rows() == 0)
|
||||
{
|
||||
delete findnick(nick);
|
||||
return;
|
||||
}
|
||||
|
||||
SerializeType *sb = SerializeType::Find("NickAlias");
|
||||
if (sb == NULL)
|
||||
return;
|
||||
|
||||
Serializable::serialized_data data;
|
||||
const std::map<Anope::string, Anope::string> &row = res.Row(0);
|
||||
for (std::map<Anope::string, Anope::string>::const_iterator rit = row.begin(), rit_end = row.end(); rit != rit_end; ++rit)
|
||||
data[rit->first] << rit->second;
|
||||
|
||||
sb->Create(data);
|
||||
}
|
||||
catch (const SQLException &ex)
|
||||
{
|
||||
Log(LOG_DEBUG) << "OnFindNick: " << ex.GetReason();
|
||||
}
|
||||
}
|
||||
|
||||
void OnFindCore(const Anope::string &nick) anope_override
|
||||
{
|
||||
if (core_cache.Check(nick))
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
SQLQuery query("SELECT * FROM `NickCore` WHERE `display` = @display@");
|
||||
query.setValue("display", nick);
|
||||
SQLResult res = this->RunQuery(query);
|
||||
|
||||
if (res.Rows() == 0)
|
||||
{
|
||||
delete findcore(nick);
|
||||
return;
|
||||
}
|
||||
|
||||
SerializeType *sb = SerializeType::Find("NickCore");
|
||||
if (sb == NULL)
|
||||
return;
|
||||
|
||||
Serializable::serialized_data data;
|
||||
const std::map<Anope::string, Anope::string> &row = res.Row(0);
|
||||
for (std::map<Anope::string, Anope::string>::const_iterator rit = row.begin(), rit_end = row.end(); rit != rit_end; ++rit)
|
||||
data[rit->first] << rit->second;
|
||||
|
||||
sb->Create(data);
|
||||
}
|
||||
catch (const SQLException &ex)
|
||||
{
|
||||
Log(LOG_DEBUG) << "OnFindCore: " << ex.GetReason();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
MODULE_INIT(MySQLLiveModule)
|
||||
@@ -1,440 +0,0 @@
|
||||
#include "module.h"
|
||||
#include "../extra/sql.h"
|
||||
#include "../commands/os_session.h"
|
||||
|
||||
class MySQLInterface : public SQLInterface
|
||||
{
|
||||
public:
|
||||
MySQLInterface(Module *o) : SQLInterface(o) { }
|
||||
|
||||
void OnResult(const SQLResult &r) anope_override
|
||||
{
|
||||
Log(LOG_DEBUG) << "SQL successfully executed query: " << r.finished_query;
|
||||
}
|
||||
|
||||
void OnError(const SQLResult &r) anope_override
|
||||
{
|
||||
if (!r.GetQuery().query.empty())
|
||||
Log(LOG_DEBUG) << "Error executing query " << r.finished_query << ": " << r.GetError();
|
||||
else
|
||||
Log(LOG_DEBUG) << "Error executing query: " << r.GetError();
|
||||
}
|
||||
};
|
||||
|
||||
class DBMySQL : public Module
|
||||
{
|
||||
private:
|
||||
MySQLInterface sqlinterface;
|
||||
service_reference<SQLProvider> SQL;
|
||||
std::set<Anope::string> tables;
|
||||
|
||||
void RunQuery(const SQLQuery &query)
|
||||
{
|
||||
if (SQL)
|
||||
{
|
||||
if (readonly && this->ro)
|
||||
{
|
||||
readonly = this->ro = false;
|
||||
BotInfo *bi = findbot(Config->OperServ);
|
||||
if (bi)
|
||||
ircdproto->SendGlobops(bi, "Found SQL again, going out of readonly mode...");
|
||||
}
|
||||
|
||||
SQL->Run(&sqlinterface, query);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Anope::CurTime - Config->UpdateTimeout > lastwarn)
|
||||
{
|
||||
BotInfo *bi = findbot(Config->OperServ);
|
||||
if (bi)
|
||||
ircdproto->SendGlobops(bi, "Unable to locate SQL reference, going to readonly...");
|
||||
readonly = this->ro = true;
|
||||
this->lastwarn = Anope::CurTime;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Insert(const Anope::string &table, const Serializable::serialized_data &data)
|
||||
{
|
||||
if (tables.count(table) == 0 && SQL)
|
||||
{
|
||||
this->RunQuery(this->SQL->CreateTable(table, data));
|
||||
tables.insert(table);
|
||||
}
|
||||
|
||||
Anope::string query_text = "INSERT INTO `" + table + "` (";
|
||||
for (Serializable::serialized_data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
query_text += "`" + it->first + "`,";
|
||||
query_text.erase(query_text.end() - 1);
|
||||
query_text += ") VALUES (";
|
||||
for (Serializable::serialized_data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
query_text += "@" + it->first + "@,";
|
||||
query_text.erase(query_text.end() - 1);
|
||||
query_text += ") ON DUPLICATE KEY UPDATE ";
|
||||
for (Serializable::serialized_data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
query_text += "`" + it->first + "`=VALUES(`" + it->first + "`),";
|
||||
query_text.erase(query_text.end() - 1);
|
||||
|
||||
SQLQuery query(query_text);
|
||||
for (Serializable::serialized_data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
query.setValue(it->first, it->second.astr());
|
||||
|
||||
this->RunQuery(query);
|
||||
}
|
||||
|
||||
void Delete(const Anope::string &table, const Serializable::serialized_data &data)
|
||||
{
|
||||
Anope::string query_text = "DELETE FROM `" + table + "` WHERE ", arg_text;
|
||||
for (Serializable::serialized_data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
{
|
||||
if (!arg_text.empty())
|
||||
arg_text += " AND ";
|
||||
arg_text += "`" + it->first + "` = @" + it->first + "@";
|
||||
}
|
||||
|
||||
query_text += arg_text;
|
||||
|
||||
SQLQuery query(query_text);
|
||||
for (Serializable::serialized_data::const_iterator it = data.begin(), it_end = data.end(); it != it_end; ++it)
|
||||
query.setValue(it->first, it->second.astr());
|
||||
|
||||
this->RunQuery(query);
|
||||
}
|
||||
|
||||
public:
|
||||
time_t lastwarn;
|
||||
bool ro;
|
||||
|
||||
DBMySQL(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, DATABASE), sqlinterface(this), SQL("", "")
|
||||
{
|
||||
this->lastwarn = 0;
|
||||
this->ro = false;
|
||||
|
||||
Implementation i[] = { I_OnReload, I_OnServerConnect };
|
||||
ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
|
||||
|
||||
OnReload();
|
||||
|
||||
if (CurrentUplink)
|
||||
OnServerConnect();
|
||||
}
|
||||
|
||||
void OnReload() anope_override
|
||||
{
|
||||
ConfigReader config;
|
||||
Anope::string engine = config.ReadValue("db_sql", "engine", "", 0);
|
||||
this->SQL = service_reference<SQLProvider>("SQLProvider", engine);
|
||||
}
|
||||
|
||||
void OnServerConnect() anope_override
|
||||
{
|
||||
Implementation i[] = {
|
||||
/* Misc */
|
||||
I_OnPostCommand,
|
||||
/* NickServ */
|
||||
I_OnNickAddAccess, I_OnNickEraseAccess, I_OnNickClearAccess,
|
||||
I_OnDelCore, I_OnNickForbidden, I_OnNickGroup,
|
||||
I_OnNickRegister, I_OnChangeCoreDisplay,
|
||||
I_OnNickSuspended, I_OnDelNick,
|
||||
/* ChanServ */
|
||||
I_OnAccessAdd, I_OnAccessDel, I_OnAccessClear, I_OnLevelChange,
|
||||
I_OnDelChan, I_OnChanRegistered, I_OnChanSuspend,
|
||||
I_OnAkickAdd, I_OnAkickDel, I_OnMLock, I_OnUnMLock,
|
||||
/* BotServ */
|
||||
I_OnBotCreate, I_OnBotChange, I_OnBotDelete,
|
||||
I_OnBotAssign, I_OnBotUnAssign,
|
||||
I_OnBadWordAdd, I_OnBadWordDel,
|
||||
/* MemoServ */
|
||||
I_OnMemoSend, I_OnMemoDel,
|
||||
/* OperServ */
|
||||
I_OnExceptionAdd, I_OnExceptionDel,
|
||||
I_OnAddXLine, I_OnDelXLine,
|
||||
/* HostServ */
|
||||
I_OnSetVhost, I_OnDeleteVhost
|
||||
};
|
||||
ModuleManager::Attach(i, this, sizeof(i) / sizeof(Implementation));
|
||||
}
|
||||
|
||||
void OnPostCommand(CommandSource &source, Command *command, const std::vector<Anope::string> ¶ms) anope_override
|
||||
{
|
||||
User *u = source.u;
|
||||
|
||||
if (command->name.find("nickserv/set/") == 0)
|
||||
{
|
||||
NickAlias *na = findnick(source.u->nick);
|
||||
if (na)
|
||||
this->Insert(na->nc->serialize_name(), na->nc->serialize());
|
||||
|
||||
}
|
||||
else if (command->name.find("nickserv/saset/") == 0)
|
||||
{
|
||||
NickAlias *na = findnick(params[0]);
|
||||
if (na)
|
||||
this->Insert(na->nc->serialize_name(), na->nc->serialize());
|
||||
}
|
||||
else if (command->name.find("chanserv/set") == 0 || command->name.find("chanserv/saset") == 0)
|
||||
{
|
||||
ChannelInfo *ci = params.size() > 0 ? cs_findchan(params[0]) : NULL;
|
||||
if (ci)
|
||||
this->Insert(ci->serialize_name(), ci->serialize());
|
||||
}
|
||||
else if (command->name == "botserv/kick" && params.size() > 2)
|
||||
{
|
||||
ChannelInfo *ci = cs_findchan(params[0]);
|
||||
if (!ci)
|
||||
return;
|
||||
if (!ci->AccessFor(u).HasPriv("SET") && !u->HasPriv("botserv/administration"))
|
||||
return;
|
||||
this->Insert(ci->serialize_name(), ci->serialize());
|
||||
}
|
||||
else if (command->name == "botserv/set" && params.size() > 1)
|
||||
{
|
||||
ChannelInfo *ci = cs_findchan(params[0]);
|
||||
BotInfo *bi = NULL;
|
||||
if (!ci)
|
||||
bi = findbot(params[0]);
|
||||
if (bi && params[1].equals_ci("PRIVATE") && u->HasPriv("botserv/set/private"))
|
||||
this->Insert(bi->serialize_name(), bi->serialize());
|
||||
else if (ci && !ci->AccessFor(u).HasPriv("SET") && !u->HasPriv("botserv/administration"))
|
||||
this->Insert(ci->serialize_name(), ci->serialize());
|
||||
}
|
||||
else if (command->name == "memoserv/ignore" && params.size() > 0)
|
||||
{
|
||||
Anope::string target = params[0];
|
||||
if (target[0] != '#')
|
||||
{
|
||||
NickCore *nc = u->Account();
|
||||
if (nc)
|
||||
this->Insert(nc->serialize_name(), nc->serialize());
|
||||
}
|
||||
else
|
||||
{
|
||||
ChannelInfo *ci = cs_findchan(target);
|
||||
if (ci && ci->AccessFor(u).HasPriv("MEMO"))
|
||||
this->Insert(ci->serialize_name(), ci->serialize());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void OnNickAddAccess(NickCore *nc, const Anope::string &entry) anope_override
|
||||
{
|
||||
this->Insert(nc->serialize_name(), nc->serialize());
|
||||
}
|
||||
|
||||
void OnNickEraseAccess(NickCore *nc, const Anope::string &entry) anope_override
|
||||
{
|
||||
this->Insert(nc->serialize_name(), nc->serialize());
|
||||
}
|
||||
|
||||
void OnNickClearAccess(NickCore *nc) anope_override
|
||||
{
|
||||
this->Insert(nc->serialize_name(), nc->serialize());
|
||||
}
|
||||
|
||||
void OnDelCore(NickCore *nc) anope_override
|
||||
{
|
||||
this->Delete(nc->serialize_name(), nc->serialize());
|
||||
}
|
||||
|
||||
void OnNickForbidden(NickAlias *na) anope_override
|
||||
{
|
||||
this->Insert(na->serialize_name(), na->serialize());
|
||||
}
|
||||
|
||||
void OnNickGroup(User *u, NickAlias *) anope_override
|
||||
{
|
||||
OnNickRegister(findnick(u->nick));
|
||||
}
|
||||
|
||||
void InsertAlias(NickAlias *na)
|
||||
{
|
||||
this->Insert(na->serialize_name(), na->serialize());
|
||||
}
|
||||
|
||||
void InsertCore(NickCore *nc)
|
||||
{
|
||||
this->Insert(nc->serialize_name(), nc->serialize());
|
||||
}
|
||||
|
||||
void OnNickRegister(NickAlias *na) anope_override
|
||||
{
|
||||
this->InsertCore(na->nc);
|
||||
this->InsertAlias(na);
|
||||
}
|
||||
|
||||
void OnChangeCoreDisplay(NickCore *nc, const Anope::string &newdisplay) anope_override
|
||||
{
|
||||
Serializable::serialized_data data = nc->serialize();
|
||||
this->Delete(nc->serialize_name(), data);
|
||||
data.erase("display");
|
||||
data["display"] << newdisplay;
|
||||
this->Insert(nc->serialize_name(), data);
|
||||
|
||||
for (std::list<NickAlias *>::iterator it = nc->aliases.begin(), it_end = nc->aliases.end(); it != it_end; ++it)
|
||||
{
|
||||
NickAlias *na = *it;
|
||||
data = na->serialize();
|
||||
|
||||
this->Delete(na->serialize_name(), data);
|
||||
data.erase("nc");
|
||||
data["nc"] << newdisplay;
|
||||
this->Insert(na->serialize_name(), data);
|
||||
}
|
||||
}
|
||||
|
||||
void OnNickSuspend(NickAlias *na) anope_override
|
||||
{
|
||||
this->Insert(na->serialize_name(), na->serialize());
|
||||
}
|
||||
|
||||
void OnDelNick(NickAlias *na) anope_override
|
||||
{
|
||||
this->Delete(na->serialize_name(), na->serialize());
|
||||
}
|
||||
|
||||
void OnAccessAdd(ChannelInfo *ci, User *, ChanAccess *access) anope_override
|
||||
{
|
||||
this->Insert(access->serialize_name(), access->serialize());
|
||||
}
|
||||
|
||||
void OnAccessDel(ChannelInfo *ci, User *u, ChanAccess *access) anope_override
|
||||
{
|
||||
this->Delete(access->serialize_name(), access->serialize());
|
||||
}
|
||||
|
||||
void OnAccessClear(ChannelInfo *ci, User *u) anope_override
|
||||
{
|
||||
for (unsigned i = 0; i < ci->GetAccessCount(); ++i)
|
||||
this->OnAccessDel(ci, NULL, ci->GetAccess(i));
|
||||
}
|
||||
|
||||
void OnLevelChange(User *u, ChannelInfo *ci, const Anope::string &priv, int16_t what) anope_override
|
||||
{
|
||||
this->Insert(ci->serialize_name(), ci->serialize());
|
||||
}
|
||||
|
||||
void OnDelChan(ChannelInfo *ci) anope_override
|
||||
{
|
||||
this->Delete(ci->serialize_name(), ci->serialize());
|
||||
}
|
||||
|
||||
void OnChanRegistered(ChannelInfo *ci) anope_override
|
||||
{
|
||||
this->Insert(ci->serialize_name(), ci->serialize());
|
||||
}
|
||||
|
||||
void OnChanSuspend(ChannelInfo *ci) anope_override
|
||||
{
|
||||
this->Insert(ci->serialize_name(), ci->serialize());
|
||||
}
|
||||
|
||||
void OnAkickAdd(User *u, ChannelInfo *ci, AutoKick *ak) anope_override
|
||||
{
|
||||
this->Insert(ak->serialize_name(), ak->serialize());
|
||||
}
|
||||
|
||||
void OnAkickDel(User *u, ChannelInfo *ci, AutoKick *ak) anope_override
|
||||
{
|
||||
this->Delete(ak->serialize_name(), ak->serialize());
|
||||
}
|
||||
|
||||
EventReturn OnMLock(ChannelInfo *ci, ModeLock *lock) anope_override
|
||||
{
|
||||
this->Insert(lock->serialize_name(), lock->serialize());
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
|
||||
EventReturn OnUnMLock(ChannelInfo *ci, ModeLock *lock) anope_override
|
||||
{
|
||||
this->Delete(lock->serialize_name(), lock->serialize());
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
|
||||
void OnBotCreate(BotInfo *bi) anope_override
|
||||
{
|
||||
this->Insert(bi->serialize_name(), bi->serialize());
|
||||
}
|
||||
|
||||
void OnBotChange(BotInfo *bi) anope_override
|
||||
{
|
||||
OnBotCreate(bi);
|
||||
}
|
||||
|
||||
void OnBotDelete(BotInfo *bi) anope_override
|
||||
{
|
||||
this->Delete(bi->serialize_name(), bi->serialize());
|
||||
}
|
||||
|
||||
EventReturn OnBotAssign(User *sender, ChannelInfo *ci, BotInfo *bi) anope_override
|
||||
{
|
||||
this->Insert(ci->serialize_name(), ci->serialize());
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
|
||||
EventReturn OnBotUnAssign(User *sender, ChannelInfo *ci) anope_override
|
||||
{
|
||||
this->Insert(ci->serialize_name(), ci->serialize());
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
|
||||
void OnBadWordAdd(ChannelInfo *ci, BadWord *bw) anope_override
|
||||
{
|
||||
this->Insert(bw->serialize_name(), bw->serialize());
|
||||
}
|
||||
|
||||
void OnBadWordDel(ChannelInfo *ci, BadWord *bw) anope_override
|
||||
{
|
||||
this->Delete(bw->serialize_name(), bw->serialize());
|
||||
}
|
||||
|
||||
void OnMemoSend(const Anope::string &source, const Anope::string &target, MemoInfo *mi, Memo *m) anope_override
|
||||
{
|
||||
this->Insert(m->serialize_name(), m->serialize());
|
||||
}
|
||||
|
||||
void OnMemoDel(const NickCore *nc, MemoInfo *mi, Memo *m) anope_override
|
||||
{
|
||||
this->Delete(m->serialize_name(), m->serialize());
|
||||
}
|
||||
|
||||
void OnMemoDel(ChannelInfo *ci, MemoInfo *mi, Memo *m) anope_override
|
||||
{
|
||||
this->Delete(m->serialize_name(), m->serialize());
|
||||
}
|
||||
|
||||
EventReturn OnExceptionAdd(Exception *ex) anope_override
|
||||
{
|
||||
this->Insert(ex->serialize_name(), ex->serialize());
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
|
||||
void OnExceptionDel(User *, Exception *ex) anope_override
|
||||
{
|
||||
this->Delete(ex->serialize_name(), ex->serialize());
|
||||
}
|
||||
|
||||
EventReturn OnAddXLine(User *u, XLine *x, XLineManager *xlm) anope_override
|
||||
{
|
||||
this->Insert(x->serialize_name(), x->serialize());
|
||||
return EVENT_CONTINUE;
|
||||
}
|
||||
|
||||
void OnDelXLine(User *, XLine *x, XLineManager *xlm) anope_override
|
||||
{
|
||||
this->Delete(x->serialize_name(), x->serialize());
|
||||
}
|
||||
|
||||
void OnDeleteVhost(NickAlias *na) anope_override
|
||||
{
|
||||
this->Insert(na->serialize_name(), na->serialize());
|
||||
}
|
||||
|
||||
void OnSetVhost(NickAlias *na) anope_override
|
||||
{
|
||||
this->Insert(na->serialize_name(), na->serialize());
|
||||
}
|
||||
};
|
||||
|
||||
MODULE_INIT(DBMySQL)
|
||||
|
||||
@@ -341,10 +341,10 @@ class EMD5 : public Module
|
||||
|
||||
EventReturn OnCheckAuthentication(Command *c, CommandSource *source, const std::vector<Anope::string> ¶ms, const Anope::string &account, const Anope::string &password) anope_override
|
||||
{
|
||||
NickAlias *na = findnick(account);
|
||||
NickCore *nc = na ? na->nc : NULL;
|
||||
const NickAlias *na = findnick(account);
|
||||
if (na == NULL)
|
||||
return EVENT_CONTINUE;
|
||||
NickCore *nc = na->nc;
|
||||
|
||||
size_t pos = nc->pass.find(':');
|
||||
if (pos == Anope::string::npos)
|
||||
|
||||
@@ -43,10 +43,10 @@ class ENone : public Module
|
||||
|
||||
EventReturn OnCheckAuthentication(Command *c, CommandSource *source, const std::vector<Anope::string> ¶ms, const Anope::string &account, const Anope::string &password) anope_override
|
||||
{
|
||||
NickAlias *na = findnick(account);
|
||||
NickCore *nc = na ? na->nc : NULL;
|
||||
const NickAlias *na = findnick(account);
|
||||
if (na == NULL)
|
||||
return EVENT_CONTINUE;
|
||||
NickCore *nc = na->nc;
|
||||
|
||||
size_t pos = nc->pass.find(':');
|
||||
if (pos == Anope::string::npos)
|
||||
|
||||
@@ -351,10 +351,10 @@ class EOld : public Module
|
||||
|
||||
EventReturn OnCheckAuthentication(Command *c, CommandSource *source, const std::vector<Anope::string> ¶ms, const Anope::string &account, const Anope::string &password) anope_override
|
||||
{
|
||||
NickAlias *na = findnick(account);
|
||||
NickCore *nc = na ? na->nc : NULL;
|
||||
const NickAlias *na = findnick(account);
|
||||
if (na == NULL)
|
||||
return EVENT_CONTINUE;
|
||||
NickCore *nc = na->nc;
|
||||
|
||||
size_t pos = nc->pass.find(':');
|
||||
if (pos == Anope::string::npos)
|
||||
|
||||
@@ -194,10 +194,10 @@ class ESHA1 : public Module
|
||||
|
||||
EventReturn OnCheckAuthentication(Command *c, CommandSource *source, const std::vector<Anope::string> ¶ms, const Anope::string &account, const Anope::string &password) anope_override
|
||||
{
|
||||
NickAlias *na = findnick(account);
|
||||
NickCore *nc = na ? na->nc : NULL;
|
||||
const NickAlias *na = findnick(account);
|
||||
if (na == NULL)
|
||||
return EVENT_CONTINUE;
|
||||
NickCore *nc = na->nc;
|
||||
|
||||
size_t pos = nc->pass.find(':');
|
||||
if (pos == Anope::string::npos)
|
||||
|
||||
@@ -280,10 +280,10 @@ class ESHA256 : public Module
|
||||
|
||||
EventReturn OnCheckAuthentication(Command *c, CommandSource *source, const std::vector<Anope::string> ¶ms, const Anope::string &account, const Anope::string &password) anope_override
|
||||
{
|
||||
NickAlias *na = findnick(account);
|
||||
NickCore *nc = na ? na->nc : NULL;
|
||||
const NickAlias *na = findnick(account);
|
||||
if (na == NULL)
|
||||
return EVENT_CONTINUE;
|
||||
NickCore *nc = na->nc;
|
||||
|
||||
size_t pos = nc->pass.find(':');
|
||||
if (pos == Anope::string::npos)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user