From fe1b55bb39e3b1ba888c6e5fc110fa5ad25e387f Mon Sep 17 00:00:00 2001 From: blue Date: Sun, 12 Aug 2018 01:11:33 +0300 Subject: [PATCH] a handler to add players in Corax --- corax/corax.cpp | 73 +++++++++++++++++++++++++++++++++++++++++++++---- corax/corax.h | 4 +++ 2 files changed, 72 insertions(+), 5 deletions(-) diff --git a/corax/corax.cpp b/corax/corax.cpp index 92c4145..3bcc4df 100644 --- a/corax/corax.cpp +++ b/corax/corax.cpp @@ -9,6 +9,7 @@ Corax* Corax::corax = 0; Corax::Corax(QObject *parent): QObject(parent), + started(false) server(new W::Server(W::String(u"Corax"), this)), logger(new W::Logger()), parentReporter(new W::ParentReporter()), @@ -17,7 +18,8 @@ Corax::Corax(QObject *parent): connector(0), dispatcher(new W::Dispatcher()), caches(), - parsers() + parsers(), + players() { if (corax != 0) { @@ -42,6 +44,7 @@ Corax::Corax(QObject *parent): attributes->addAttribute(W::String(u"connectionsCount"), new M::String(W::String(u"0"), W::Address({u"attributes", u"connectionCount"}))); attributes->addAttribute(W::String(u"name"), new M::String(W::String(u"Corax"), W::Address({u"attributes", u"name"}))); attributes->addAttribute(W::String(u"version"), new M::String(W::String(u"0.0.2"), W::Address({u"attributes", u"version"}))); + attributes->addAttribute(W::String(u"players"), new M::String(W::String(u"0"), W::Address({u"attributes", u"players"}))); createCaches(); createHandlers(); @@ -49,20 +52,27 @@ Corax::Corax(QObject *parent): Corax::~Corax() { - std::map::iterator pbeg = parsers.begin(); - std::map::iterator pend = parsers.end(); + std::map::const_iterator pbeg = parsers.begin(); + std::map::const_iterator pend = parsers.end(); for (; pbeg != pend; ++pbeg) { delete pbeg->second; } - std::map::iterator beg = caches.begin(); - std::map::iterator end = caches.end(); + std::map::const_iterator beg = caches.begin(); + std::map::const_iterator end = caches.end(); for (; beg != end; ++beg) { delete beg->second; } + std::map::const_iterator plit = players.begin(); + std::map::const_iterator plend = players.end(); + + for (; plit != plend; ++plit) { + delete plit->second; + } + delete connector; dispatcher->unregisterDefaultHandler(logger); @@ -83,6 +93,9 @@ void Corax::onConnectionCountChanged(uint64_t count) void Corax::start() { + if (started) { + throw 3; + } std::map::iterator beg = caches.begin(); std::map::iterator end = caches.end(); @@ -97,6 +110,13 @@ void Corax::start() beg->second->getRegistered(connector); } + std::map::const_iterator plit = players.begin(); + std::map::const_iterator plend = players.end(); + + for (; plit != plend; ++plit) { + plit->second->getRegistered(connector);; + } + cout << "Opening caches..." << endl; beg = caches.begin(); @@ -106,11 +126,16 @@ void Corax::start() commands->enableCommand(W::String(u"clearCache"), true); + started = true; cout << "Corax is ready" << endl; } void Corax::stop() { + if (!started) { + throw 3; + } + std::map::iterator beg = caches.begin(); std::map::iterator end = caches.end(); @@ -122,7 +147,17 @@ void Corax::stop() beg->second->getUnregistered(); } + std::map::const_iterator plit = players.begin(); + std::map::const_iterator plend = players.end(); + + for (; plit != plend; ++plit) { + plit->second->getUnregistered(); + } + server->stop(); + + started = false; + cout << "Corax is stopped" << endl; } void Corax::onModelServiceMessage(const QString& msg) @@ -202,6 +237,9 @@ void Corax::createHandlers() W::Vocabulary parseArgs; parseArgs.insert(u"path", W::Uint64(W::Object::string)); commands->addCommand(W::String(u"parseDirectory"), parseDirectory, parseArgs); + + W::Handler* givePlayer = W::Handler::create(W::Address({u"management", u"givePlayer"}), this, &Corax::_h_givePlayer); + commands->addCommand(W::String(u"givePlayer"), givePlayer, W::Vocabulary()); } void Corax::onParserDone(const W::String& path) @@ -234,3 +272,28 @@ void Corax::onNodeDisconnected(const W::String& name) commands->enableCommand(W::String(u"parseDirectory"), false); } } + +void Corax::h_givePlayer(const W::Event& ev) +{ + W::String num(std::to_string(players.size())); + W::Address addr{u"players", num}; + M::Player* pl = new M::Player(addr); + connect(pl, SIGNAL(serviceMessage(const QString&)), SLOT(onModelServiceMessage(const QString&))); + players.insert(std::make_pair(addr, pl)); + + attributes->setAttribute(W::String(u"players"), W::String(std::to_string(players.size()))); + pl->getRegistered(connector); //it's a handler, so I assume corax is started here; + + W::Vocabulary* vc = new W::Vocabulary(); + vc->insert(u"address", addr); + + const W::Vocabulary& svc = static_cast(ev.getData()); + const W::Address& source = static_cast(svc.at(u"source")); + uint64_t id = ev.getSenderId(); + vc->insert(u"source", W::Address{u"management"}); //TODO think about it, may be Corax should be a model? + + W::Event res(source + W::Address{u"getPlayer"}, vc); + res.setSenderId(id); + connector->getConnection(id)->send(ev); +} + diff --git a/corax/corax.h b/corax/corax.h index 179df14..aa5cf9c 100644 --- a/corax/corax.h +++ b/corax/corax.h @@ -30,6 +30,7 @@ #include #include "tools/parser.h" +#include "models/player.h" class Corax: public QObject { @@ -42,6 +43,7 @@ public: static Corax* corax; private: + bool started; W::Server *server; W::Logger *logger; W::ParentReporter* parentReporter; @@ -53,9 +55,11 @@ private: std::map caches; std::map parsers; + std::map players; handler(clearCache); handler(parseDirectory); + handler(givePlayer); public slots: void start();