summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/memo.h4
-rw-r--r--modules/commands/ms_cancel.cpp2
-rw-r--r--modules/commands/ms_ignore.cpp2
-rw-r--r--modules/commands/ms_rsend.cpp2
-rw-r--r--modules/database/db_sql_live.cpp2
-rw-r--r--modules/pseudoclients/memoserv.cpp22
-rw-r--r--modules/pseudoclients/memoserv.h7
-rw-r--r--src/memos.cpp53
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;
+}
+