23 #include "serverlistcounttracker.h" 25 #include "serverapi/playerslist.h" 26 #include "serverapi/server.h" 31 DClass<ServerListCountTracker>
35 QSet<ServerPtr> countedServers;
38 bool hasRegisterBeenCalled;
40 bool isPassingPluginFilter(
const ServerPtr &server)
const 42 return plugin ==
nullptr || server->plugin() == plugin;
51 d->hasRegisterBeenCalled =
false;
59 void ServerListCountTracker::setPluginFilter(
const EnginePlugin *plugin)
61 assert(!d->hasRegisterBeenCalled &&
"don't change filter after server has already been registered");
65 void ServerListCountTracker::deregisterServer(ServerPtr server)
67 if (d->isPassingPluginFilter(server))
69 d->countedServers.remove(server);
70 server->disconnect(
this);
71 d->count.discountServer(server);
72 if (server->isRefreshing())
74 --d->count.numRefreshing;
78 d->count.discountPlayers(server);
84 void ServerListCountTracker::registerServer(ServerPtr server)
86 d->hasRegisterBeenCalled =
true;
87 if (d->isPassingPluginFilter(server))
89 this->connect(server.data(), SIGNAL(begunRefreshing(ServerPtr)),
90 SLOT(onServerBegunRefreshing(ServerPtr)));
91 this->connect(server.data(), SIGNAL(updated(ServerPtr,
int)),
92 SLOT(onServerUpdated(ServerPtr)));
94 d->count.countServer(server);
95 if (server->isRefreshing())
97 ++d->count.numRefreshing;
101 d->countedServers.insert(server);
102 d->count.countPlayers(server);
108 void ServerListCountTracker::onServerBegunRefreshing(ServerPtr server)
110 d->countedServers.remove(server);
111 d->count.discountPlayers(server);
112 ++d->count.numRefreshing;
116 void ServerListCountTracker::onServerUpdated(ServerPtr server)
118 if (d->countedServers.contains(server))
120 d->countedServers.insert(server);
121 d->count.countPlayers(server);
122 --d->count.numRefreshing;
128 ServerListCount::ServerListCount()
134 numCustomServers = 0;
135 numGenericServers = 0;
141 void ServerListCount::countPlayers(
const ServerPtr &server)
145 numBots += players.numBots();
146 numHumanPlayers += players.numClientsWithoutBots();
150 void ServerListCount::discountPlayers(
const ServerPtr &server)
154 numBots -= players.numBots();
155 numHumanPlayers -= players.numClientsWithoutBots();
159 void ServerListCount::countServer(
const ServerPtr &server)
162 numGenericServers += !server->isSpecial() ? 1 : 0;
163 numLanServers += server->isLan() ? 1 : 0;
164 numCustomServers += server->isCustom() ? 1 : 0;
167 void ServerListCount::discountServer(
const ServerPtr &server)
170 numGenericServers -= !server->isSpecial() ? 1 : 0;
171 numLanServers -= server->isLan() ? 1 : 0;
172 numCustomServers -= server->isCustom() ? 1 : 0;
175 int ServerListCount::refreshedPercent()
const 177 if (numRefreshing == 0 || numServers == 0)
183 float refreshingFactor =
static_cast<float>(numRefreshing) /
184 static_cast<float>(numServers);
185 return static_cast<int>(floor(100.0 - 100.0 * refreshingFactor));
191 numBots += other.numBots;
192 numHumanPlayers += other.numHumanPlayers;
193 numPlayers += other.numPlayers;
195 numCustomServers += other.numCustomServers;
196 numGenericServers += other.numGenericServers;
197 numLanServers += other.numLanServers;
198 numServers += other.numServers;
199 numRefreshing += other.numRefreshing;
int numClients() const
Overall number of people and bots on the server.