summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/modules/os_news.h35
-rw-r--r--modules/commands/os_news.cpp43
-rw-r--r--modules/database/db_old.cpp58
3 files changed, 101 insertions, 35 deletions
diff --git a/include/modules/os_news.h b/include/modules/os_news.h
index b1e717455..458a5a82b 100644
--- a/include/modules/os_news.h
+++ b/include/modules/os_news.h
@@ -23,14 +23,14 @@ struct NewsItem : Serializable
time_t time;
NewsItem() : Serializable("NewsItem") { }
- void Serialize(Serialize::Data &data) const anope_override;
- static Serializable* Unserialize(Serializable *obj, Serialize::Data &data);
};
class NewsService : public Service
{
public:
NewsService(Module *m) : Service(m, "NewsService", "news") { }
+
+ virtual NewsItem *CreateNewsItem() = 0;
virtual void AddNewsItem(NewsItem *n) = 0;
@@ -41,36 +41,5 @@ class NewsService : public Service
static ServiceReference<NewsService> news_service("NewsService", "news");
-void NewsItem::Serialize(Serialize::Data &data) const
-{
- data["type"] << this->type;
- data["text"] << this->text;
- data["who"] << this->who;
- data["time"] << this->time;
-}
-
-Serializable* NewsItem::Unserialize(Serializable *obj, Serialize::Data &data)
-{
- if (!news_service)
- return NULL;
-
- NewsItem *ni;
- if (obj)
- ni = anope_dynamic_static_cast<NewsItem *>(obj);
- else
- ni = new NewsItem();
-
- unsigned int t;
- data["type"] >> t;
- ni->type = static_cast<NewsType>(t);
- data["text"] >> ni->text;
- data["who"] >> ni->who;
- data["time"] >> ni->time;
-
- if (!obj)
- news_service->AddNewsItem(ni);
- return ni;
-}
-
#endif // OS_NEWS
diff --git a/modules/commands/os_news.cpp b/modules/commands/os_news.cpp
index 36a2b9c32..6672e481d 100644
--- a/modules/commands/os_news.cpp
+++ b/modules/commands/os_news.cpp
@@ -59,6 +59,40 @@ struct NewsMessages msgarray[] = {
}
};
+struct MyNewsItem : NewsItem
+{
+ void Serialize(Serialize::Data &data) const anope_override
+ {
+ data["type"] << this->type;
+ data["text"] << this->text;
+ data["who"] << this->who;
+ data["time"] << this->time;
+ }
+
+ static Serializable* Unserialize(Serializable *obj, Serialize::Data &data) anope_override
+ {
+ if (!news_service)
+ return NULL;
+
+ NewsItem *ni;
+ if (obj)
+ ni = anope_dynamic_static_cast<NewsItem *>(obj);
+ else
+ ni = new MyNewsItem();
+
+ unsigned int t;
+ data["type"] >> t;
+ ni->type = static_cast<NewsType>(t);
+ data["text"] >> ni->text;
+ data["who"] >> ni->who;
+ data["time"] >> ni->time;
+
+ if (!obj)
+ news_service->AddNewsItem(ni);
+ return ni;
+ }
+};
+
class MyNewsService : public NewsService
{
std::vector<NewsItem *> newsItems[3];
@@ -72,6 +106,11 @@ class MyNewsService : public NewsService
delete newsItems[i][j];
}
+ NewsItem *CreateNewsItem() anope_override
+ {
+ return new MyNewsItem();
+ }
+
void AddNewsItem(NewsItem *n)
{
this->newsItems[n->type].push_back(n);
@@ -151,7 +190,7 @@ class NewsBase : public Command
if (Anope::ReadOnly)
source.Reply(READ_ONLY_MODE);
- NewsItem *news = new NewsItem();
+ NewsItem *news = new MyNewsItem();
news->type = ntype;
news->text = text;
news->time = Anope::CurTime;
@@ -390,7 +429,7 @@ class OSNews : public Module
public:
OSNews(const Anope::string &modname, const Anope::string &creator) : Module(modname, creator, VENDOR),
- newsservice(this), newsitem_type("NewsItem", NewsItem::Unserialize),
+ newsservice(this), newsitem_type("NewsItem", MyNewsItem::Unserialize),
commandoslogonnews(this), commandosopernews(this), commandosrandomnews(this)
{
}
diff --git a/modules/database/db_old.cpp b/modules/database/db_old.cpp
index 98cf1e055..739fcaebe 100644
--- a/modules/database/db_old.cpp
+++ b/modules/database/db_old.cpp
@@ -13,6 +13,7 @@
#include "modules/bs_kick.h"
#include "modules/cs_mode.h"
#include "modules/bs_badwords.h"
+#include "modules/os_news.h"
#define READ(x) \
if (true) \
@@ -84,6 +85,10 @@ else \
#define OLD_BS_KICK_FLOOD 0x02000000
#define OLD_BS_KICK_REPEAT 0x01000000
+#define OLD_NEWS_LOGON 0
+#define OLD_NEWS_OPER 1
+#define OLD_NEWS_RANDOM 2
+
static struct mlock_info
{
char c;
@@ -1107,6 +1112,58 @@ static void LoadExceptions()
close_db(f);
}
+static void LoadNews()
+{
+ if (!news_service)
+ return;
+
+ dbFILE *f = open_db_read("OperServ", "news.db", 9);
+
+ if (f == NULL)
+ return;
+
+ int16_t n;
+ READ(read_int16(&n, f));
+
+ for (int16_t i = 0; i < n; i++)
+ {
+ int16_t type;
+ NewsItem *ni = news_service->CreateNewsItem();
+
+ READ(read_int16(&type, f));
+
+ switch (type)
+ {
+ case OLD_NEWS_LOGON:
+ ni->type = NEWS_LOGON;
+ break;
+ case OLD_NEWS_OPER:
+ ni->type = NEWS_OPER;
+ break;
+ case OLD_NEWS_RANDOM:
+ ni->type = NEWS_RANDOM;
+ break;
+ }
+
+ int32_t unused;
+ READ(read_int32(&unused, f));
+
+ READ(read_string(ni->text, f));
+
+ char who[32];
+ READ(read_buffer(who, f));
+ ni->who = who;
+
+ int32_t tmp;
+ READ(read_int32(&tmp, f));
+ ni->time = tmp;
+
+ news_service->AddNewsItem(ni);
+ }
+
+ close_db(f);
+}
+
class DBOld : public Module
{
PrimitiveExtensibleItem<uint32_t> mlock_on, mlock_off;
@@ -1131,6 +1188,7 @@ class DBOld : public Module
LoadChannels();
LoadOper();
LoadExceptions();
+ LoadNews();
return EVENT_STOP;
}