inline void update() { bool foundNonBusy{false}; for(auto i(0u); true; ++i) { if(i >= clientHandlers.size()) { if(foundNonBusy) return; HG_LO_VERBOSE("Server") << "Creating new client handlers\n"; for(auto k(0u); k < 10; ++k) ssvu::getEmplaceUPtr<ClientHandler>( clientHandlers, packetHandler); } auto& c(clientHandlers[i]); if(c->isBusy()) continue; foundNonBusy = true; if(!c->tryAccept(listener)) continue; onClientAccepted(*c.get()); c->refreshTimeout(); HG_LO_VERBOSE("Server") << "Accepted client (" << c->getUid() << ")\n"; return; } }
void initializeValidators(HGAssets& mAssets) { HG_LO_VERBOSE("hg::Online::initializeValidators") << "Initializing validators...\n"; for(const auto& p : mAssets.getLevelDatas()) { HG_LO_VERBOSE("hg::Online::initializeValidators") << "Adding (" << p.first << ") validator\n"; const auto& l(p.second); const auto& validator(getValidator(l->packPath, l->id, l->getRootString(), mAssets.getStyleData(l->styleId).getRootPath(), l->luaScriptPath)); validators.addValidator(p.first, validator); HG_LO_VERBOSE("hg::Online::initializeValidators") << "Added (" << p.first << "): " << validator << "\n"; } HG_LO_VERBOSE("hg::Online::initializeValidators") << "Finished initializing validators...\n"; }
template<typename T> void trySendFunc(T mFunc) { if(!canSendPacket()) { lo("hg::Online::trySendFunc") << "Can't send data to server: not connected / not logged in\n"; return; } HG_LO_VERBOSE("hg::Online::trySendFunc") << "Sending data to server...\n"; currentGtm->start([mFunc] { if(!canSendPacket()) { lo("hg::Online::trySendFunc") << "Client not connected - aborting\n"; return; } mFunc(); }); }
inline ClientHandler(PacketHandler<ClientHandler>& mPacketHandler) : packetHandler(mPacketHandler) { onPacketReceived += [this](sf::Packet mPacket){ packetHandler.handle(*this, mPacket); refreshTimeout(); }; timeoutFuture = std::async(std::launch::async, [this] { while(running) { std::this_thread::sleep_for(800ms); if(!isBusy() || --untilTimeout > 0) continue; HG_LO_VERBOSE("ClientHandler") << "Client (" << uid << ") timed out\n"; onDisconnect(); disconnect(); } }); }