diff options
-rw-r--r-- | data/mysql/tables.sql | 1 | ||||
-rw-r--r-- | include/extern.h | 1 | ||||
-rw-r--r-- | include/modules.h | 6 | ||||
-rw-r--r-- | include/services.h | 5 | ||||
-rw-r--r-- | modules/core/db_plain.cpp | 8 | ||||
-rw-r--r-- | modules/core/ms_cancel.cpp | 4 | ||||
-rw-r--r-- | modules/core/ms_del.cpp | 26 | ||||
-rw-r--r-- | modules/core/ms_list.cpp | 2 | ||||
-rw-r--r-- | modules/core/ms_read.cpp | 4 | ||||
-rw-r--r-- | modules/extra/db_mysql.cpp | 31 | ||||
-rw-r--r-- | src/memoserv.cpp | 68 |
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); } |