summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--data/mysql/tables.sql1
-rw-r--r--include/extern.h1
-rw-r--r--include/modules.h6
-rw-r--r--include/services.h5
-rw-r--r--modules/core/db_plain.cpp8
-rw-r--r--modules/core/ms_cancel.cpp4
-rw-r--r--modules/core/ms_del.cpp26
-rw-r--r--modules/core/ms_list.cpp2
-rw-r--r--modules/core/ms_read.cpp4
-rw-r--r--modules/extra/db_mysql.cpp31
-rw-r--r--src/memoserv.cpp68
11 files changed, 67 insertions, 89 deletions
diff --git a/data/mysql/tables.sql b/data/mysql/tables.sql
index c9a781876..a26153a50 100644
--- a/data/mysql/tables.sql
+++ b/data/mysql/tables.sql
@@ -191,7 +191,6 @@ CREATE TABLE IF NOT EXISTS `anope_info` (
CREATE TABLE IF NOT EXISTS `anope_ms_info` (
`receiver` varchar(255) NOT NULL,
- `number` int(11) NOT NULL DEFAULT '0',
`flags` int(11) NOT NULL DEFAULT '0',
`time` int(10) unsigned NOT NULL DEFAULT '0',
`sender` text NOT NULL,
diff --git a/include/extern.h b/include/extern.h
index fe6fe7546..496c1caca 100644
--- a/include/extern.h
+++ b/include/extern.h
@@ -207,7 +207,6 @@ E void rsend_notify(User *u, Memo *m, const Anope::string &chan);
E void check_memos(User *u);
E MemoInfo *getmemoinfo(const Anope::string &name, bool &ischan, bool &isforbid);
E void memo_send(User *u, const Anope::string &name, const Anope::string &text, int z);
-E bool delmemo(MemoInfo *mi, unsigned num);
/**** messages.c ****/
diff --git a/include/modules.h b/include/modules.h
index e47b5612b..7a0d02269 100644
--- a/include/modules.h
+++ b/include/modules.h
@@ -939,16 +939,18 @@ class CoreExport Module : public virtual Base
/** Called when a memo is deleted
* @param nc The nickcore of the memo being deleted
* @param mi The memo info
+ * @param m The memo
* @param number What memo number is being deleted, can be 0 for all memos
*/
- virtual void OnMemoDel(const NickCore *nc, MemoInfo *mi, int number) { }
+ virtual void OnMemoDel(const NickCore *nc, MemoInfo *mi, Memo *m) { }
/** Called when a memo is deleted
* @param ci The channel of the memo being deleted
* @param mi The memo info
+ * @param m The memo
* @param number What memo number is being deleted, can be 0 for all memos
*/
- virtual void OnMemoDel(ChannelInfo *ci, MemoInfo *mi, int number) { }
+ virtual void OnMemoDel(ChannelInfo *ci, MemoInfo *mi, Memo *m) { }
/** Called when a mode is set on a channel
* @param c The channel
diff --git a/include/services.h b/include/services.h
index 50ea809a6..fd4cc80ee 100644
--- a/include/services.h
+++ b/include/services.h
@@ -477,7 +477,6 @@ enum MemoFlag
class Memo : public Flags<MemoFlag>
{
public:
- uint32 number; /* Index number -- not necessarily array position! */
time_t time; /* When it was sent */
Anope::string sender;
Anope::string text;
@@ -487,6 +486,10 @@ struct MemoInfo
{
unsigned memomax;
std::vector<Memo *> memos;
+
+ unsigned GetIndex(Memo *m) const;
+ void Del(unsigned index);
+ void Del(Memo *m);
};
/*************************************************************************/
diff --git a/modules/core/db_plain.cpp b/modules/core/db_plain.cpp
index af342786f..080d4c2ae 100644
--- a/modules/core/db_plain.cpp
+++ b/modules/core/db_plain.cpp
@@ -595,7 +595,7 @@ class DBPlain : public Module
else if (key.equals_ci("MI"))
{
Memo *m = new Memo;
- m->number = params[0].is_pos_number_only() ? convertTo<uint32>(params[0]) : 0;
+ // params[0] is the old number of the memo, no longer used
m->time = params[1].is_pos_number_only() ? convertTo<time_t>(params[1]) : 0;
m->sender = params[2];
for (unsigned j = 3; params[j].equals_ci("UNREAD") || params[j].equals_ci("RECEIPT") || params[j].equals_ci("NOTIFYS"); ++j)
@@ -753,7 +753,7 @@ class DBPlain : public Module
else if (key.equals_ci("MI"))
{
Memo *m = new Memo;
- m->number = params[0].is_pos_number_only() ? convertTo<uint32>(params[0]) : 0;
+ // params[0] is the old number of the memo, no longer used
m->time = params[1].is_pos_number_only() ? convertTo<time_t>(params[1]) : 0;
m->sender = params[2];
for (unsigned j = 3; params[j].equals_ci("UNREAD") || params[j].equals_ci("RECEIPT") || params[j].equals_ci("NOTIFYS"); ++j)
@@ -891,7 +891,7 @@ class DBPlain : public Module
MemoInfo *mi = &nc->memos;
for (unsigned k = 0, end = mi->memos.size(); k < end; ++k)
{
- db << "MD MI " << mi->memos[k]->number << " " << mi->memos[k]->time << " " << mi->memos[k]->sender;
+ db << "MD MI 0 " << mi->memos[k]->time << " " << mi->memos[k]->sender;
if (mi->memos[k]->HasFlag(MF_UNREAD))
db << " UNREAD";
if (mi->memos[k]->HasFlag(MF_RECEIPT))
@@ -1038,7 +1038,7 @@ class DBPlain : public Module
for (unsigned k = 0, end = memos->memos.size(); k < end; ++k)
{
- db << "MD MI " << memos->memos[k]->number << " " << memos->memos[k]->time << " " << memos->memos[k]->sender;
+ db << "MD MI 0 " << memos->memos[k]->time << " " << memos->memos[k]->sender;
if (memos->memos[k]->HasFlag(MF_UNREAD))
db << " UNREAD";
if (memos->memos[k]->HasFlag(MF_RECEIPT))
diff --git a/modules/core/ms_cancel.cpp b/modules/core/ms_cancel.cpp
index a7d824d38..46799a148 100644
--- a/modules/core/ms_cancel.cpp
+++ b/modules/core/ms_cancel.cpp
@@ -42,8 +42,8 @@ class CommandMSCancel : public Command
for (i = mi->memos.size() - 1; i >= 0; --i)
if (mi->memos[i]->HasFlag(MF_UNREAD) && u->Account()->display.equals_ci(mi->memos[i]->sender) && !mi->memos[i]->HasFlag(MF_NOTIFYS))
{
- FOREACH_MOD(I_OnMemoDel, OnMemoDel(findnick(nname)->nc, mi, mi->memos[i]->number));
- delmemo(mi, mi->memos[i]->number);
+ FOREACH_MOD(I_OnMemoDel, OnMemoDel(findnick(nname)->nc, mi, mi->memos[i]));
+ mi->Del(mi->memos[i]);
u->SendMessage(MemoServ, MEMO_CANCELLED, nname.c_str());
return MOD_CONT;
}
diff --git a/modules/core/ms_del.cpp b/modules/core/ms_del.cpp
index 4d9a8ec13..2d69fba5e 100644
--- a/modules/core/ms_del.cpp
+++ b/modules/core/ms_del.cpp
@@ -29,11 +29,12 @@ class MemoDelCallback : public NumberList
return;
if (ci)
- FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, Number - 1));
+ FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->memos[Number - 1]));
else
- FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, Number - 1));
+ FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, mi->memos[Number - 1]));
- delmemo(mi, Number - 1);
+ mi->Del(Number - 1);
+ u->SendMessage(MemoServ, MEMO_DELETED_ONE, Number);
}
};
@@ -50,7 +51,6 @@ class CommandMSDel : public Command
ChannelInfo *ci = NULL;
Anope::string numstr = !params.empty() ? params[0] : "", chan;
unsigned i, end;
- int last;
if (!numstr.empty() && numstr[0] == '#')
{
@@ -95,21 +95,19 @@ class CommandMSDel : public Command
else if (numstr.equals_ci("LAST"))
{
/* Delete last memo. */
- for (i = 0, end = mi->memos.size(); i < end; ++i)
- last = mi->memos[i]->number;
if (ci)
- FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, last));
+ FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, mi->memos[mi->memos.size() - 1]));
else
- FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, last));
- delmemo(mi, last);
- u->SendMessage(MemoServ, MEMO_DELETED_ONE, last);
+ FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, mi->memos[mi->memos.size() - 1]));
+ mi->Del(mi->memos[mi->memos.size() - 1]);
+ u->SendMessage(MemoServ, MEMO_DELETED_ONE, mi->memos.size() + 1);
}
else
{
if (ci)
- FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, 0));
+ FOREACH_MOD(I_OnMemoDel, OnMemoDel(ci, mi, NULL));
else
- FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, 0));
+ FOREACH_MOD(I_OnMemoDel, OnMemoDel(u->Account(), mi, NULL));
/* Delete all memos. */
for (i = 0, end = mi->memos.size(); i < end; ++i)
delete mi->memos[i];
@@ -119,10 +117,6 @@ class CommandMSDel : public Command
else
u->SendMessage(MemoServ, MEMO_DELETED_ALL);
}
-
- /* Reset the order */
- for (i = 0, end = mi->memos.size(); i < end; ++i)
- mi->memos[i]->number = i + 1;
}
return MOD_CONT;
}
diff --git a/modules/core/ms_list.cpp b/modules/core/ms_list.cpp
index b1df87fa9..f71df75fb 100644
--- a/modules/core/ms_list.cpp
+++ b/modules/core/ms_list.cpp
@@ -46,7 +46,7 @@ class MemoListCallback : public NumberList
static void DoList(User *u, ChannelInfo *ci, const MemoInfo *mi, unsigned index)
{
Memo *m = mi->memos[index];
- u->SendMessage(MemoServ, MEMO_LIST_FORMAT, (m->HasFlag(MF_UNREAD)) ? '*' : ' ', m->number, m->sender.c_str(), do_strftime(m->time).c_str());
+ u->SendMessage(MemoServ, MEMO_LIST_FORMAT, (m->HasFlag(MF_UNREAD)) ? '*' : ' ', index + 1, m->sender.c_str(), do_strftime(m->time).c_str());
}
};
diff --git a/modules/core/ms_read.cpp b/modules/core/ms_read.cpp
index 857fd661c..2f743cb30 100644
--- a/modules/core/ms_read.cpp
+++ b/modules/core/ms_read.cpp
@@ -34,9 +34,9 @@ class MemoListCallback : public NumberList
{
Memo *m = mi->memos[index];
if (ci)
- u->SendMessage(MemoServ, MEMO_CHAN_HEADER, m->number, m->sender.c_str(), do_strftime(m->time).c_str(), Config->s_MemoServ.c_str(), ci->name.c_str(), m->number);
+ u->SendMessage(MemoServ, MEMO_CHAN_HEADER, index + 1, m->sender.c_str(), do_strftime(m->time).c_str(), Config->s_MemoServ.c_str(), ci->name.c_str(), index + 1);
else
- u->SendMessage(MemoServ, MEMO_HEADER, m->number, m->sender.c_str(), do_strftime(m->time).c_str(), Config->s_MemoServ.c_str(), m->number);
+ u->SendMessage(MemoServ, MEMO_HEADER, index + 1, m->sender.c_str(), do_strftime(m->time).c_str(), Config->s_MemoServ.c_str(), index + 1);
u->SendMessage(MemoServ, MEMO_TEXT, m->text.c_str());
m->UnsetFlag(MF_UNREAD);
diff --git a/modules/extra/db_mysql.cpp b/modules/extra/db_mysql.cpp
index b9572ac6b..af5c4514a 100644
--- a/modules/extra/db_mysql.cpp
+++ b/modules/extra/db_mysql.cpp
@@ -815,17 +815,6 @@ class DBMySQL : public Module
Memo *m = new Memo();
mi->memos.push_back(m);
m->sender = r.Get(i, "sender");
- if (mi->memos.size() > 1)
- {
- m->number = mi->memos[mi->memos.size() - 1]->number + 1;
- if (m->number < 1)
- {
- for (unsigned j = 0; j < mi->memos.size(); ++j)
- mi->memos[j]->number = j + 1;
- }
- }
- else
- m->number = 1;
m->time = r.Get(i, "time").is_pos_number_only() ? convertTo<time_t>(r.Get(i, "time")) : Anope::CurTime;
m->text = r.Get(i, "text");
@@ -1297,30 +1286,30 @@ class DBMySQL : public Module
void OnMemoSend(User *, NickCore *nc, Memo *m)
{
- this->RunQuery("INSERT INTO `anope_ms_info` (receiver, number, flags, time, sender, text, serv) VALUES('" +
- this->Escape(nc->display) + "', " + stringify(m->number) + ", '" + BuildFlagsList(m) + "', " + stringify(m->time) + ", '" +
+ this->RunQuery("INSERT INTO `anope_ms_info` (receiver, flags, time, sender, text, serv) VALUES('" +
+ this->Escape(nc->display) + "', '" + BuildFlagsList(m) + "', " + stringify(m->time) + ", '" +
this->Escape(m->sender) + "', '" + this->Escape(m->text) + "', 'NICK')");
}
void OnMemoSend(User *, ChannelInfo *ci, Memo *m)
{
- this->RunQuery("INSERT INTO `anope_ms_info` (receiver, number, flags, time, sender, text, serv) VALUES('" +
- this->Escape(ci->name) + "', " + stringify(m->number) + ", '" + BuildFlagsList(m) + "', " + stringify(m->time) + ", '" +
+ this->RunQuery("INSERT INTO `anope_ms_info` (receiver, flags, time, sender, text, serv) VALUES('" +
+ this->Escape(ci->name) + "', '" + BuildFlagsList(m) + "', " + stringify(m->time) + ", '" +
this->Escape(m->sender) + "', '" + this->Escape(m->text) + "', 'CHAN')");
}
- void OnMemoDel(NickCore *nc, MemoInfo *mi, int number)
+ void OnMemoDel(NickCore *nc, MemoInfo *mi, Memo *m)
{
- if (number)
- this->RunQuery("DELETE FROM `anope_ms_info` WHERE `receiver` = '" + this->Escape(nc->display) + "' AND `number` = " + stringify(number));
+ if (m)
+ this->RunQuery("DELETE FROM `anope_ms_info` WHERE `receiver` = '" + this->Escape(nc->display) + "' AND `time` = " + stringify(m->time));
else
this->RunQuery("DELETE FROM `anope_ms_info` WHERE `receiver` = '" + this->Escape(nc->display) + "'");
}
- void OnMemoDel(ChannelInfo *ci, MemoInfo *mi, int number)
+ void OnMemoDel(ChannelInfo *ci, MemoInfo *mi, Memo *m)
{
- if (number)
- this->RunQuery("DELETE FROM `anope_ms_info` WHERE `receiver` = '" + this->Escape(ci->name) + "' AND `number` = " + stringify(number));
+ if (m)
+ this->RunQuery("DELETE FROM `anope_ms_info` WHERE `receiver` = '" + this->Escape(ci->name) + "' AND `time` = " + stringify(m->time));
else
this->RunQuery("DELETE FROM `anope_ms_info` WHERE `receiver` = '" + this->Escape(ci->name) + "'");
}
diff --git a/src/memoserv.cpp b/src/memoserv.cpp
index 3d45dac2e..ac455257f 100644
--- a/src/memoserv.cpp
+++ b/src/memoserv.cpp
@@ -12,7 +12,7 @@
#include "services.h"
#include "modules.h"
-static bool SendMemoMail(NickCore *nc, Memo *m);
+static bool SendMemoMail(NickCore *nc, MemoInfo *mi, Memo *m);
/**
* MemoServ initialization.
@@ -65,7 +65,7 @@ void check_memos(User *u)
if (nc->memos.memos[i]->HasFlag(MF_UNREAD))
break;
}
- u->SendMessage(MemoServ, MEMO_TYPE_READ_NUM, Config->s_MemoServ.c_str(), nc->memos.memos[i]->number);
+ u->SendMessage(MemoServ, MEMO_TYPE_READ_NUM, Config->s_MemoServ.c_str(), i);
}
else
u->SendMessage(MemoServ, MEMO_TYPE_LIST_NEW, Config->s_MemoServ.c_str());
@@ -215,17 +215,6 @@ void memo_send(User *u, const Anope::string &name, const Anope::string &text, in
Memo *m = new Memo();
mi->memos.push_back(m);
m->sender = source;
- if (mi->memos.size() > 1)
- {
- m->number = mi->memos[mi->memos.size() - 2]->number + 1;
- if (m->number < 1)
- {
- for (unsigned i = 0, end = mi->memos.size(); i < end; ++i)
- mi->memos[i]->number = i + 1;
- }
- }
- else
- m->number = 1;
m->time = Anope::CurTime;
m->text = text;
m->SetFlag(MF_UNREAD);
@@ -252,19 +241,19 @@ void memo_send(User *u, const Anope::string &name, const Anope::string &text, in
NickAlias *na = *it;
User *user = finduser(na->nick);
if (user && user->IsIdentified())
- user->SendMessage(MemoServ, MEMO_NEW_MEMO_ARRIVED, source.c_str(), Config->s_MemoServ.c_str(), m->number);
+ user->SendMessage(MemoServ, MEMO_NEW_MEMO_ARRIVED, source.c_str(), Config->s_MemoServ.c_str(), mi->memos.size());
}
}
else
{
if ((u = finduser(name)) && u->IsIdentified() && nc->HasFlag(NI_MEMO_RECEIVE))
- u->SendMessage(MemoServ, MEMO_NEW_MEMO_ARRIVED, source.c_str(), Config->s_MemoServ.c_str(), m->number);
+ u->SendMessage(MemoServ, MEMO_NEW_MEMO_ARRIVED, source.c_str(), Config->s_MemoServ.c_str(), mi->memos.size());
} /* if (flags & MEMO_RECEIVE) */
}
/* if (MSNotifyAll) */
/* let's get out the mail if set in the nickcore - certus */
if (nc->HasFlag(NI_MEMO_MAIL))
- SendMemoMail(nc, m);
+ SendMemoMail(nc, mi, m);
}
else
{
@@ -281,7 +270,7 @@ void memo_send(User *u, const Anope::string &name, const Anope::string &text, in
if (check_access(cu->user, c->ci, CA_MEMO))
{
if (cu->user->Account() && cu->user->Account()->HasFlag(NI_MEMO_RECEIVE) && !get_ignore(cu->user->nick))
- cu->user->SendMessage(MemoServ, MEMO_NEW_X_MEMO_ARRIVED, c->ci->name.c_str(), Config->s_MemoServ.c_str(), c->ci->name.c_str(), m->number);
+ cu->user->SendMessage(MemoServ, MEMO_NEW_X_MEMO_ARRIVED, c->ci->name.c_str(), Config->s_MemoServ.c_str(), c->ci->name.c_str(), mi->memos.size());
}
}
} /* MSNotifyAll */
@@ -290,38 +279,41 @@ void memo_send(User *u, const Anope::string &name, const Anope::string &text, in
}
/*************************************************************************/
-/**
- * Delete a memo by number.
- * @param mi Memoinfo struct
- * @param num Memo number to delete
- * @return int 1 if the memo was found, else 0.
- */
-bool delmemo(MemoInfo *mi, unsigned num)
+
+unsigned MemoInfo::GetIndex(Memo *m) const
{
- if (mi->memos.empty())
- return false;
+ for (unsigned i = 0; i < this->memos.size(); ++i)
+ if (this->memos[i] == m)
+ return i;
+ return -1;
+}
- unsigned i = 0, end = mi->memos.size();
- for (; i < end; ++i)
- if (mi->memos[i]->number == num)
- break;
- if (i < end)
+void MemoInfo::Del(unsigned index)
+{
+ if (index >= this->memos.size())
+ return;
+ delete this->memos[index];
+ this->memos.erase(this->memos.begin() + index);
+}
+
+void MemoInfo::Del(Memo *memo)
+{
+ std::vector<Memo *>::iterator it = std::find(this->memos.begin(), this->memos.end(), memo);
+
+ if (it != this->memos.end())
{
- delete mi->memos[i]; /* Deallocate the memo itself */
- mi->memos.erase(mi->memos.begin() + i); /* Remove the memo pointer from the vector */
- return true;
+ delete memo;
+ this->memos.erase(it);
}
- else
- return false;
}
/*************************************************************************/
-static bool SendMemoMail(NickCore *nc, Memo *m)
+static bool SendMemoMail(NickCore *nc, MemoInfo *mi, Memo *m)
{
char message[BUFSIZE];
- snprintf(message, sizeof(message), GetString(nc, NICK_MAIL_TEXT).c_str(), nc->display.c_str(), m->sender.c_str(), m->number, m->text.c_str());
+ snprintf(message, sizeof(message), GetString(nc, NICK_MAIL_TEXT).c_str(), nc->display.c_str(), m->sender.c_str(), mi->GetIndex(m), m->text.c_str());
return Mail(nc, GetString(nc, MEMO_MAIL_SUBJECT), message);
}