summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2010-11-07 20:51:41 -0500
committerAdam <Adam@anope.org>2010-12-12 19:31:00 -0500
commitac41137ce2741df8faf539e0655a10cd4a8f7e32 (patch)
treeee4fc88bba9eeb24bd6802533d42df05e9ee9e75 /modules
parent28aba58e250fd6d58b0dff3bbc9ee8bbe172df24 (diff)
Added /ms ignore
Diffstat (limited to 'modules')
-rw-r--r--modules/core/db_plain.cpp55
-rw-r--r--modules/core/ms_ignore.cpp117
-rw-r--r--modules/extra/db_mysql.cpp50
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> &params)
+ {
+ 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)