1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
/* MemoServ core functions
*
* (C) 2003-2016 Anope Team
* Contact us at team@anope.org
*
* Please read COPYING and README for further details.
*
* Based on the original code of Epona by Lara.
* Based on the original code of Services by Andy Church.
*/
#include "module.h"
class MemoDelCallback : public NumberList
{
CommandSource &source;
ChannelInfo *ci;
MemoInfo *mi;
public:
MemoDelCallback(CommandSource &_source, ChannelInfo *_ci, MemoInfo *_mi, const Anope::string &list) : NumberList(list, true), source(_source), ci(_ci), mi(_mi)
{
}
void HandleNumber(unsigned number) anope_override
{
if (!number || number > mi->memos->size())
return;
FOREACH_MOD(OnMemoDel, (ci ? ci->name : source.nc->display, mi, mi->GetMemo(number - 1)));
mi->Del(number - 1);
source.Reply(_("Memo %d has been deleted."), number);
}
};
class CommandMSDel : public Command
{
public:
CommandMSDel(Module *creator) : Command(creator, "memoserv/del", 0, 2)
{
this->SetDesc(_("Delete a memo or memos"));
this->SetSyntax(_("[\037channel\037] {\037num\037 | \037list\037 | LAST | ALL}"));
}
void Execute(CommandSource &source, const std::vector<Anope::string> ¶ms) anope_override
{
if (Anope::ReadOnly)
{
source.Reply(READ_ONLY_MODE);
return;
}
MemoInfo *mi;
ChannelInfo *ci = NULL;
Anope::string numstr = !params.empty() ? params[0] : "", chan;
if (!numstr.empty() && numstr[0] == '#')
{
chan = numstr;
numstr = params.size() > 1 ? params[1] : "";
ci = ChannelInfo::Find(chan);
if (!ci)
{
source.Reply(CHAN_X_NOT_REGISTERED, chan.c_str());
return;
}
else if (!source.AccessFor(ci).HasPriv("MEMO"))
{
source.Reply(ACCESS_DENIED);
return;
}
mi = &ci->memos;
}
else
mi = &source.nc->memos;
if (numstr.empty() || (!isdigit(numstr[0]) && !numstr.equals_ci("ALL") && !numstr.equals_ci("LAST")))
this->OnSyntaxError(source, numstr);
else if (mi->memos->empty())
{
if (!chan.empty())
source.Reply(MEMO_X_HAS_NO_MEMOS, chan.c_str());
else
source.Reply(MEMO_HAVE_NO_MEMOS);
}
else
{
if (isdigit(numstr[0]))
{
MemoDelCallback list(source, ci, mi, numstr);
list.Process();
}
else if (numstr.equals_ci("LAST"))
{
/* Delete last memo. */
FOREACH_MOD(OnMemoDel, (ci ? ci->name : source.nc->display, 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 = mi->memos->size(); i > 0; --i)
{
FOREACH_MOD(OnMemoDel, (ci ? ci->name : source.nc->display, mi, mi->GetMemo(i)));
mi->Del(i - 1);
}
if (!chan.empty())
source.Reply(_("All memos for channel %s have been deleted."), chan.c_str());
else
source.Reply(_("All of your memos have been deleted."));
}
}
return;
}
bool OnHelp(CommandSource &source, const Anope::string &subcommand) anope_override
{
this->SendSyntax(source);
source.Reply(" ");
source.Reply(_("Deletes the specified memo or memos. You can supply\n"
"multiple memo numbers or ranges of numbers instead of a\n"
"single number, as in the second example below.\n"
" \n"
"If \002LAST\002 is given, the last memo will be deleted.\n"
"If \002ALL\002 is given, deletes all of your memos.\n"
" \n"
"Examples:\n"
" \n"
" \002DEL 1\002\n"
" Deletes your first memo.\n"
" \n"
" \002DEL 2-5,7-9\002\n"
" Deletes memos numbered 2 through 5 and 7 through 9."));
return true;
}
};
class MSDel : public Module
{
CommandMSDel commandmsdel;
public:
MSDel(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR),
commandmsdel(this)
{
}
};
MODULE_INIT(MSDel)
|