diff options
-rw-r--r-- | include/modules/os_news.h | 35 | ||||
-rw-r--r-- | modules/commands/os_news.cpp | 43 | ||||
-rw-r--r-- | modules/database/db_old.cpp | 58 |
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; } |