Skip to content

Instantly share code, notes, and snippets.

@Koncord
Created July 30, 2018 10:29
Show Gist options
  • Select an option

  • Save Koncord/25295d3ebdfbfb4e61f9d33f1bd5b5e7 to your computer and use it in GitHub Desktop.

Select an option

Save Koncord/25295d3ebdfbfb4e61f9d33f1bd5b5e7 to your computer and use it in GitHub Desktop.
SocketWorker
void SocketWorker::process()
{
if(!webSocket)
{
webSocket = new QWebSocket;
connect(webSocket, &QWebSocket::disconnected, this, &SocketWorker::finished);
}
disconnect(webSocket, &QWebSocket::textFrameReceived, nullptr, nullptr);
disconnect(webSocket, &QWebSocket::textMessageReceived, nullptr, nullptr);
if (!serverId.isEmpty())
{
connect(webSocket, &QWebSocket::textMessageReceived, [this](const QString &message) {
rapidjson::Document d;
d.Parse(message.toUtf8());
if (d.HasParseError())
return;
if (d.HasMember("status"))
{
QMessageBox::critical(nullptr, d["status"].GetString(), d["message"].GetString());
return;
}
ServerExtra extra;
extra.address = d["address"].GetString();
extra.dlServer = d["dlServer"].GetString();
extra.dlServer = d["dlServer"].GetString();
for (const auto &player : d["players"].GetArray())
extra.players.emplace_back(player.GetString());
for (const auto &plugin : d["plugins"].GetArray())
extra.plugins.emplace_back(plugin.GetString());
for (const auto &info : d["extraInfo"].GetObject())
{
const char *key = info.name.GetString();
if (info.value.IsString())
extra.extraInfo[key] = info.value.GetString();
else
extra.extraInfo[key] = info.value.GetDouble();
}
emit serverExtra(std::move(extra));
});
}
else
{
connect(webSocket, &QWebSocket::textFrameReceived, [this](const QString &frame, bool last) {
rapidjson::Document d;
d.Parse(frame.toUtf8());
if (d.HasParseError())
return;
if (d.HasMember("status"))
{
QMessageBox::critical(nullptr, d["status"].GetString(), d["message"].GetString());
return;
}
Server server;
server.hostname = d["hostname"].GetString();
server.modname = d["modname"].GetString();
server.version = d["version"].GetString();
server.password = d["passw"].GetBool();
server.players = d["players"].GetInt();
server.maxPlayers = d["max_players"].GetInt();
emit parsedServer(std::move(server));
});
}
connect(webSocket, &QWebSocket::connected, [this]() {
qint64 b = 0;
if (serverId.isEmpty())
b = webSocket->sendTextMessage("GET SERVERS");
else
b = webSocket->sendTextMessage("GET EXTRA " + serverId);
qDebug() << "Bytes sent:" << b;
});
qint64 bytesSent;
if (serverId.isEmpty())
bytesSent = webSocket->sendTextMessage("GET SERVERS");
else
bytesSent = webSocket->sendTextMessage("GET EXTRA " + serverId);
if (bytesSent == 0) // we are not connected
webSocket->open(addr);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment