diff options
author | Adam <Adam@anope.org> | 2010-11-07 20:51:41 -0500 |
---|---|---|
committer | Adam <Adam@anope.org> | 2010-12-12 19:31:00 -0500 |
commit | ac41137ce2741df8faf539e0655a10cd4a8f7e32 (patch) | |
tree | ee4fc88bba9eeb24bd6802533d42df05e9ee9e75 /modules | |
parent | 28aba58e250fd6d58b0dff3bbc9ee8bbe172df24 (diff) |
Added /ms ignore
Diffstat (limited to 'modules')
-rw-r--r-- | modules/core/db_plain.cpp | 55 | ||||
-rw-r--r-- | modules/core/ms_ignore.cpp | 117 | ||||
-rw-r--r-- | modules/extra/db_mysql.cpp | 50 |
3 files changed, 195 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) diff --git a/modules/extra/db_mysql.cpp b/modules/extra/db_mysql.cpp index f6e0f8f12..fc9f47df9 100644 --- a/modules/extra/db_mysql.cpp +++ b/modules/extra/db_mysql.cpp @@ -905,6 +905,26 @@ class DBMySQL : public Module FOREACH_RESULT(I_OnDatabaseRead, OnDatabaseRead(params)); } + r = SQL->RunQuery("SELECT * FROM `anope_ns_core_metadata`"); + for (int i = 0; i < r.Rows(); ++i) + { + NickCore *nc = findcore(r.Get(i, "nick")); + if (!nc) + continue; + if (r.Get(i, "name") == "MEMO_IGNORE") + nc->memos.ignores.push_back(r.Get(i, "value").ci_str()); + } + + r = SQL->RunQuery("SELECT * FROM `anope_cs_info_metadata`"); + for (int i = 0; i < r.Rows(); ++i) + { + ChannelInfo *ci = cs_findchan(r.Get(i, "channel")); + if (!ci) + continue; + if (r.Get(i, "name") == "MEMO_IGNORE") + ci->memos.ignores.push_back(r.Get(i, "value").ci_str()); + } + return EVENT_STOP; } @@ -1073,6 +1093,36 @@ class DBMySQL : public Module } } } + else if (service == MemoServ) + { + if (command.equals_ci("IGNORE") && params.size() > 0) + { + Anope::string target = params[0]; + NickCore *nc = NULL; + ChannelInfo *ci = NULL; + if (target[0] != '#') + { + target = u->nick; + nc = u->Account(); + if (!nc) + return; + } + else + { + ci = cs_findchan(target); + if (!ci || !check_access(u, ci, CA_MEMO)) + return; + } + + MemoInfo *mi = ci ? &ci->memos : &nc->memos; + Anope::string table = ci ? "anope_cs_info_metadata" : "anope_ns_core_metadata"; + Anope::string ename = ci ? "channel" : "nick"; + + this->RunQuery("DELETE FROM `" + table + "` WHERE `" + ename + "` = '" + this->Escape(target) + "' AND `name` = 'MEMO_IGNORE'"); + for (unsigned j = 0; j < mi->ignores.size(); ++j) + this->RunQuery("INSERT INTO `" + table + "` VALUES(" + ename + ", name, value) ('" + this->Escape(target) + "', 'MEMO_IGNORE', '" + this->Escape(mi->ignores[j]) + "')"); + } + } } void OnNickAddAccess(NickCore *nc, const Anope::string &entry) |