diff options
Diffstat (limited to 'modules/core')
| -rw-r--r-- | modules/core/db_plain.cpp | 55 | ||||
| -rw-r--r-- | modules/core/ms_ignore.cpp | 117 |
2 files changed, 145 insertions, 27 deletions
diff --git a/modules/core/db_plain.cpp b/modules/core/db_plain.cpp index 041ea752e..1c8de7fee 100644 --- a/modules/core/db_plain.cpp +++ b/modules/core/db_plain.cpp @@ -609,6 +609,8 @@ class DBPlain : public Module m->text = params[params.size() - 1]; nc->memos.memos.push_back(m); } + else if (key.equals_ci("MIG")) + nc->memos.ignores.push_back(params[0].ci_str()); return EVENT_CONTINUE; } @@ -766,6 +768,8 @@ class DBPlain : public Module m->text = params[params.size() - 1]; ci->memos.memos.push_back(m); } + else if (key.equals_ci("MIG")) + ci->memos.ignores.push_back(params[0].ci_str()); else if (key.equals_ci("ENTRYMSG")) ci->entry_message = params[0]; else if (key.equals_ci("BI")) @@ -884,21 +888,20 @@ class DBPlain : public Module db << " " << NickCoreFlags[j].Name; db << endl; } - if (!nc->memos.memos.empty()) + MemoInfo *mi = &nc->memos; + for (unsigned k = 0, end = mi->memos.size(); k < end; ++k) { - MemoInfo *mi = &nc->memos; - for (unsigned k = 0, end = mi->memos.size(); k < end; ++k) - { - db << "MD MI " << mi->memos[k]->time << " " << mi->memos[k]->sender; - if (mi->memos[k]->HasFlag(MF_UNREAD)) - db << " UNREAD"; - if (mi->memos[k]->HasFlag(MF_RECEIPT)) - db << " RECEIPT"; - if (mi->memos[k]->HasFlag(MF_NOTIFYS)) - db << " NOTIFYS"; - db << " :" << mi->memos[k]->text << endl; - } + db << "MD MI " << mi->memos[k]->time << " " << mi->memos[k]->sender; + if (mi->memos[k]->HasFlag(MF_UNREAD)) + db << " UNREAD"; + if (mi->memos[k]->HasFlag(MF_RECEIPT)) + db << " RECEIPT"; + if (mi->memos[k]->HasFlag(MF_NOTIFYS)) + db << " NOTIFYS"; + db << " :" << mi->memos[k]->text << endl; } + for (unsigned k = 0, end = mi->ignores.size(); k < end; ++k) + db << "MD MIG " << Anope::string(mi->ignores[k]) << endl; FOREACH_MOD(I_OnDatabaseWriteMetadata, OnDatabaseWriteMetadata(WriteMetadata, nc)); } @@ -1030,22 +1033,20 @@ class DBPlain : public Module db << "MD MLP " << cm->NameAsString << " " << Param << endl; } } - if (!ci->memos.memos.empty()) + MemoInfo *memos = &ci->memos; + for (unsigned k = 0, end = memos->memos.size(); k < end; ++k) { - MemoInfo *memos = &ci->memos; - - for (unsigned k = 0, end = memos->memos.size(); k < end; ++k) - { - db << "MD MI " << memos->memos[k]->time << " " << memos->memos[k]->sender; - if (memos->memos[k]->HasFlag(MF_UNREAD)) - db << " UNREAD"; - if (memos->memos[k]->HasFlag(MF_RECEIPT)) - db << " RECEIPT"; - if (memos->memos[k]->HasFlag(MF_NOTIFYS)) - db << " NOTIFYS"; - db << " :" << memos->memos[k]->text << endl; - } + db << "MD MI " << memos->memos[k]->time << " " << memos->memos[k]->sender; + if (memos->memos[k]->HasFlag(MF_UNREAD)) + db << " UNREAD"; + if (memos->memos[k]->HasFlag(MF_RECEIPT)) + db << " RECEIPT"; + if (memos->memos[k]->HasFlag(MF_NOTIFYS)) + db << " NOTIFYS"; + db << " :" << memos->memos[k]->text << endl; } + for (unsigned k = 0, end = memos->ignores.size(); k < end; ++k) + db << "MD MIG " << Anope::string(memos->ignores[k]) << endl; if (!ci->entry_message.empty()) db << "MD ENTRYMSG :" << ci->entry_message << endl; if (ci->bi) diff --git a/modules/core/ms_ignore.cpp b/modules/core/ms_ignore.cpp new file mode 100644 index 000000000..347657437 --- /dev/null +++ b/modules/core/ms_ignore.cpp @@ -0,0 +1,117 @@ +/* MemoServ core functions + * + * (C) 2003-2010 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 CommandMSIgnore : public Command +{ + public: + CommandMSIgnore() : Command("IGNORE", 1, 3) + { + } + + CommandReturn Execute(User *u, const std::vector<Anope::string> ¶ms) + { + Anope::string channel = params[0]; + Anope::string command = (params.size() > 1 ? params[1] : ""); + Anope::string param = (params.size() > 2 ? params[2] : ""); + + if (channel[0] != '#') + { + param = command; + command = channel; + channel = u->nick; + } + + bool ischan, isforbid; + MemoInfo *mi = getmemoinfo(channel, ischan, isforbid); + if (!mi) + { + if (isforbid) + u->SendMessage(MemoServ, ischan ? CHAN_X_FORBIDDEN : NICK_X_FORBIDDEN, channel.c_str()); + else + u->SendMessage(MemoServ, ischan ? CHAN_X_NOT_REGISTERED : NICK_X_NOT_REGISTERED, channel.c_str()); + } + else if (ischan && !check_access(u, cs_findchan(channel), CA_MEMO)) + u->SendMessage(MemoServ, ACCESS_DENIED); + else if (command.equals_ci("ADD") && !param.empty()) + { + if (std::find(mi->ignores.begin(), mi->ignores.end(), param.ci_str()) == mi->ignores.end()) + { + mi->ignores.push_back(param.ci_str()); + u->SendMessage(MemoServ, MEMO_IGNORE_ADD, param.c_str()); + } + else + u->SendMessage(MemoServ, MEMO_IGNORE_ALREADY_IGNORED, param.c_str()); + } + else if (command.equals_ci("DEL") && !param.empty()) + { + std::vector<ci::string>::iterator it = std::find(mi->ignores.begin(), mi->ignores.end(), param.ci_str()); + + if (it != mi->ignores.end()) + { + mi->ignores.erase(it); + u->SendMessage(MemoServ, MEMO_IGNORE_DEL, param.c_str()); + } + else + u->SendMessage(MemoServ, MEMO_IGNORE_NOT_IGNORED, param.c_str()); + } + else if (command.equals_ci("LIST")) + { + if (mi->ignores.empty()) + u->SendMessage(MemoServ, MEMO_IGNORE_LIST_EMPTY); + else + { + u->SendMessage(MemoServ, MEMO_IGNORE_LIST_HEADER); + for (unsigned i = 0; i < mi->ignores.size(); ++i) + u->SendMessage(Config->s_MemoServ, " %s", mi->ignores[i].c_str()); + } + } + else + this->OnSyntaxError(u, ""); + + return MOD_CONT; + } + + bool OnHelp(User *u, const Anope::string &subcommand) + { + u->SendMessage(MemoServ, MEMO_HELP_IGNORE); + return true; + } + + void OnSyntaxError(User *u, const Anope::string &subcommand) + { + SyntaxError(MemoServ, u, "IGNORE", MEMO_IGNORE_SYNTAX); + } + + void OnServHelp(User *u) + { + u->SendMessage(MemoServ, MEMO_HELP_CMD_IGNORE); + } +}; + +class MSIgnore : public Module +{ + CommandMSIgnore commandmsignore; + + public: + MSIgnore(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator) + { + this->SetAuthor("Anope"); + this->SetType(CORE); + + this->AddCommand(MemoServ, &commandmsignore); + } +}; + +MODULE_INIT(MSIgnore) |
