diff options
-rw-r--r-- | include/memo.h | 4 | ||||
-rw-r--r-- | modules/commands/ms_cancel.cpp | 2 | ||||
-rw-r--r-- | modules/commands/ms_ignore.cpp | 2 | ||||
-rw-r--r-- | modules/commands/ms_rsend.cpp | 2 | ||||
-rw-r--r-- | modules/database/db_sql_live.cpp | 2 | ||||
-rw-r--r-- | modules/pseudoclients/memoserv.cpp | 22 | ||||
-rw-r--r-- | modules/pseudoclients/memoserv.h | 7 | ||||
-rw-r--r-- | src/memos.cpp | 53 |
8 files changed, 43 insertions, 51 deletions
diff --git a/include/memo.h b/include/memo.h index c8bf11f74..30215a340 100644 --- a/include/memo.h +++ b/include/memo.h @@ -22,6 +22,7 @@ class CoreExport Memo : public Serializable bool unread; bool receipt; Memo(); + ~Memo(); void Serialize(Serialize::Data &data) const anope_override; static Serializable* Unserialize(Serializable *obj, Serialize::Data &); @@ -46,8 +47,9 @@ struct CoreExport MemoInfo Memo *GetMemo(unsigned index) const; unsigned GetIndex(Memo *m) const; void Del(unsigned index); - void Del(Memo *m); bool HasIgnore(User *u); + + static MemoInfo *GetMemoInfo(const Anope::string &targ, bool &is_chan); }; #endif // MEMO_H diff --git a/modules/commands/ms_cancel.cpp b/modules/commands/ms_cancel.cpp index 908c4ef96..e03883d91 100644 --- a/modules/commands/ms_cancel.cpp +++ b/modules/commands/ms_cancel.cpp @@ -34,7 +34,7 @@ class CommandMSCancel : public Command const Anope::string &nname = params[0]; bool ischan; - MemoInfo *mi = MemoServService->GetMemoInfo(nname, ischan); + MemoInfo *mi = MemoInfo::GetMemoInfo(nname, ischan); if (mi == NULL) source.Reply(ischan ? CHAN_X_NOT_REGISTERED : _(NICK_X_NOT_REGISTERED), nname.c_str()); diff --git a/modules/commands/ms_ignore.cpp b/modules/commands/ms_ignore.cpp index ec56624b8..7caa30f88 100644 --- a/modules/commands/ms_ignore.cpp +++ b/modules/commands/ms_ignore.cpp @@ -44,7 +44,7 @@ class CommandMSIgnore : public Command } bool ischan; - MemoInfo *mi = MemoServService->GetMemoInfo(channel, ischan); + MemoInfo *mi = MemoInfo::GetMemoInfo(channel, ischan); ChannelInfo *ci = ChannelInfo::Find(channel); if (!mi) source.Reply(ischan ? CHAN_X_NOT_REGISTERED : _(NICK_X_NOT_REGISTERED), channel.c_str()); diff --git a/modules/commands/ms_rsend.cpp b/modules/commands/ms_rsend.cpp index 19bd80437..fafcf5eff 100644 --- a/modules/commands/ms_rsend.cpp +++ b/modules/commands/ms_rsend.cpp @@ -63,7 +63,7 @@ class CommandMSRSend : public Command source.Reply(_("Memo sent to \002%s\002."), name.c_str()); bool ischan; - MemoInfo *mi = MemoServService->GetMemoInfo(nick, ischan); + MemoInfo *mi = MemoInfo::GetMemoInfo(nick, ischan); if (mi == NULL) throw CoreException("NULL mi in ms_rsend"); Memo *m = (mi->memos->size() ? mi->GetMemo(mi->memos->size() - 1) : NULL); diff --git a/modules/database/db_sql_live.cpp b/modules/database/db_sql_live.cpp index 156e6e120..aec84c8ef 100644 --- a/modules/database/db_sql_live.cpp +++ b/modules/database/db_sql_live.cpp @@ -109,7 +109,7 @@ class DBMySQL : public Module, public Pipe this->RunQueryResult(create[i]); Result res = this->RunQueryResult(this->SQL->BuildInsert(this->prefix + s_type->GetName(), obj->id, *data)); - if (obj->id != res.GetID()) + if (res.GetID() && obj->id != res.GetID()) { /* In this case obj is new, so place it into the object map */ obj->id = res.GetID(); diff --git a/modules/pseudoclients/memoserv.cpp b/modules/pseudoclients/memoserv.cpp index 17aaaa308..ca54f3378 100644 --- a/modules/pseudoclients/memoserv.cpp +++ b/modules/pseudoclients/memoserv.cpp @@ -39,30 +39,10 @@ class MyMemoServService : public MemoServService public: MyMemoServService(Module *m) : MemoServService(m) { } - MemoInfo *GetMemoInfo(const Anope::string &target, bool &ischan) anope_override - { - if (!target.empty() && target[0] == '#') - { - ischan = true; - ChannelInfo *ci = ChannelInfo::Find(target); - if (ci != NULL) - return &ci->memos; - } - else - { - ischan = false; - NickAlias *na = NickAlias::Find(target); - if (na != NULL) - return &na->nc->memos; - } - - return NULL; - } - MemoResult Send(const Anope::string &source, const Anope::string &target, const Anope::string &message, bool force) anope_override { bool ischan; - MemoInfo *mi = this->GetMemoInfo(target, ischan); + MemoInfo *mi = MemoInfo::GetMemoInfo(target, ischan); if (mi == NULL) return MEMO_INVALID_TARGET; diff --git a/modules/pseudoclients/memoserv.h b/modules/pseudoclients/memoserv.h index e314c7208..71ca064de 100644 --- a/modules/pseudoclients/memoserv.h +++ b/modules/pseudoclients/memoserv.h @@ -14,13 +14,6 @@ class MemoServService : public Service MemoServService(Module *m) : Service(m, "MemoServService", "MemoServ") { } - /** Retrieve the memo info for a nick or channel - * @param target Target - * @param ischan Set to true if target is a channel - * @return A memoinfo structure or NULL - */ - virtual MemoInfo *GetMemoInfo(const Anope::string &target, bool &ischan) = 0; - /** Sends a memo. * @param source The source of the memo, can be anythin. * @param target The target of the memo, nick or channel. diff --git a/src/memos.cpp b/src/memos.cpp index eb4d22107..1f8b00fff 100644 --- a/src/memos.cpp +++ b/src/memos.cpp @@ -24,6 +24,19 @@ Memo::Memo() : Serializable("Memo") unread = receipt = false; } +Memo::~Memo() +{ + bool ischan; + MemoInfo *mi = MemoInfo::GetMemoInfo(this->owner, ischan); + if (mi) + { + std::vector<Memo *>::iterator it = std::find(mi->memos->begin(), mi->memos->end(), this); + + if (it != mi->memos->end()) + mi->memos->erase(it); + } +} + void Memo::Serialize(Serialize::Data &data) const { data["owner"] << this->owner; @@ -36,16 +49,12 @@ void Memo::Serialize(Serialize::Data &data) const Serializable* Memo::Unserialize(Serializable *obj, Serialize::Data &data) { - ServiceReference<MemoServService> MemoServService("MemoServService", "MemoServ"); - if (!MemoServService) - return NULL; - Anope::string owner; data["owner"] >> owner; bool ischan; - MemoInfo *mi = MemoServService->GetMemoInfo(owner, ischan); + MemoInfo *mi = MemoInfo::GetMemoInfo(owner, ischan); if (!mi) return NULL; @@ -55,7 +64,7 @@ Serializable* Memo::Unserialize(Serializable *obj, Serialize::Data &data) else m = new Memo(); - data["owner"] >> m->owner; + m->owner = owner; data["time"] >> m->time; data["sender"] >> m->sender; data["text"] >> m->text; @@ -93,18 +102,6 @@ void MemoInfo::Del(unsigned index) if (index >= this->memos->size()) return; this->GetMemo(index)->Destroy(); - 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()) - { - memo->Destroy(); - this->memos->erase(it); - } } bool MemoInfo::HasIgnore(User *u) @@ -115,3 +112,23 @@ bool MemoInfo::HasIgnore(User *u) return false; } +MemoInfo *MemoInfo::GetMemoInfo(const Anope::string &target, bool &ischan) +{ + if (!target.empty() && target[0] == '#') + { + ischan = true; + ChannelInfo *ci = ChannelInfo::Find(target); + if (ci != NULL) + return &ci->memos; + } + else + { + ischan = false; + NickAlias *na = NickAlias::Find(target); + if (na != NULL) + return &na->nc->memos; + } + + return NULL; +} + |