mirror of
https://github.com/simple64/simple64.git
synced 2026-07-11 01:24:00 +02:00
220 lines
6.8 KiB
C++
220 lines
6.8 KiB
C++
#include "waitroom.h"
|
|
#include "../mainwindow.h"
|
|
#include "../interface/core_commands.h"
|
|
#include <QGridLayout>
|
|
#include <QMessageBox>
|
|
#include <QJsonArray>
|
|
|
|
WaitRoom::WaitRoom(QString filename, QJsonObject response, QWebSocket *socket, QWidget *parent)
|
|
: QDialog(parent)
|
|
{
|
|
this->resize(640, 480);
|
|
|
|
QString cheats_string = response.value("room").toObject().value("features").toObject().value("cheats").toString();
|
|
QJsonDocument cheats_doc = QJsonDocument::fromJson(cheats_string.toUtf8());
|
|
cheats = cheats_doc.object();
|
|
|
|
player_name = response.value("player_name").toString();
|
|
room_port = response.value("room").toObject().value("port").toInt();
|
|
room_name = response.value("room").toObject().value("room_name").toString();
|
|
file_name = filename;
|
|
started = 0;
|
|
|
|
w->getSettings()->setValue("netplay_name", player_name);
|
|
|
|
webSocket = socket;
|
|
connect(webSocket, &QWebSocket::textMessageReceived,
|
|
this, &WaitRoom::processTextMessage);
|
|
|
|
connect(webSocket, &QWebSocket::pong, this, &WaitRoom::updatePing);
|
|
|
|
QGridLayout *layout = new QGridLayout(this);
|
|
QLabel *nameLabel = new QLabel("Room Name:", this);
|
|
layout->addWidget(nameLabel, 0, 0);
|
|
QLabel *roomName = new QLabel(room_name, this);
|
|
layout->addWidget(roomName, 0, 1);
|
|
|
|
QLabel *gameLabel = new QLabel("Game Name:", this);
|
|
layout->addWidget(gameLabel, 1, 0);
|
|
QLabel *gameName = new QLabel(response.value("room").toObject().value("game_name").toString(), this);
|
|
layout->addWidget(gameName, 1, 1);
|
|
|
|
QLabel *pingLabel = new QLabel("Your ping:", this);
|
|
layout->addWidget(pingLabel, 2, 0);
|
|
pingValue = new QLabel(this);
|
|
layout->addWidget(pingValue, 2, 1);
|
|
|
|
QLabel *p1Label = new QLabel("Player 1:", this);
|
|
layout->addWidget(p1Label, 3, 0);
|
|
|
|
QLabel *p2Label = new QLabel("Player 2:", this);
|
|
layout->addWidget(p2Label, 4, 0);
|
|
|
|
QLabel *p3Label = new QLabel("Player 3:", this);
|
|
layout->addWidget(p3Label, 5, 0);
|
|
|
|
QLabel *p4Label = new QLabel("Player 4:", this);
|
|
layout->addWidget(p4Label, 6, 0);
|
|
|
|
for (int i = 0; i < 4; ++i)
|
|
{
|
|
pName[i] = new QLabel(this);
|
|
layout->addWidget(pName[i], i + 3, 1);
|
|
}
|
|
|
|
chatWindow = new QPlainTextEdit(this);
|
|
chatWindow->setReadOnly(1);
|
|
layout->addWidget(chatWindow, 7, 0, 3, 2);
|
|
|
|
chatEdit = new QLineEdit(this);
|
|
chatEdit->setPlaceholderText("Enter chat message here");
|
|
connect(chatEdit, &QLineEdit::returnPressed, this, &WaitRoom::sendChat);
|
|
layout->addWidget(chatEdit, 10, 0, 1, 2);
|
|
|
|
startGameButton = new QPushButton(this);
|
|
startGameButton->setText("Start Game");
|
|
startGameButton->setAutoDefault(0);
|
|
connect(startGameButton, &QPushButton::released, this, &WaitRoom::startGame);
|
|
layout->addWidget(startGameButton, 11, 0, 1, 2);
|
|
|
|
motd = new QLabel(this);
|
|
motd->setTextFormat(Qt::RichText);
|
|
motd->setTextInteractionFlags(Qt::TextBrowserInteraction);
|
|
motd->setOpenExternalLinks(true);
|
|
motd->setAlignment(Qt::AlignCenter);
|
|
layout->addWidget(motd, 12, 0, 1, 2);
|
|
|
|
setLayout(layout);
|
|
|
|
connect(this, &WaitRoom::finished, this, &WaitRoom::onFinished);
|
|
|
|
QJsonObject json;
|
|
QJsonObject room;
|
|
json.insert("type", "request_players");
|
|
room.insert("port", room_port);
|
|
json.insert("room", room);
|
|
QJsonDocument json_doc(json);
|
|
webSocket->sendTextMessage(json_doc.toJson());
|
|
|
|
timer = new QTimer(this);
|
|
connect(timer, &QTimer::timeout, this, &WaitRoom::sendPing);
|
|
timer->start(5000);
|
|
|
|
struct DiscordActivity activity;
|
|
struct DiscordActivityAssets assets;
|
|
memset(&activity, 0, sizeof(activity));
|
|
memset(&assets, 0, sizeof(assets));
|
|
strcpy(assets.large_image, "6205049");
|
|
strcpy(assets.large_text, "https://simple64.github.io");
|
|
activity.assets = assets;
|
|
strncpy(activity.details, response.value("room").toObject().value("game_name").toString().toUtf8().constData(), 128);
|
|
strcpy(activity.state, "Netplay waiting room");
|
|
w->updateDiscordActivity(activity);
|
|
}
|
|
|
|
void WaitRoom::sendPing()
|
|
{
|
|
if (motd->text().isEmpty())
|
|
{
|
|
QJsonObject json;
|
|
json.insert("type", "request_motd");
|
|
QJsonDocument json_doc(json);
|
|
webSocket->sendTextMessage(json_doc.toJson());
|
|
}
|
|
webSocket->ping();
|
|
}
|
|
|
|
void WaitRoom::updatePing(quint64 elapsedTime, const QByteArray &)
|
|
{
|
|
pingValue->setText(QString::number(elapsedTime) + " ms");
|
|
}
|
|
|
|
void WaitRoom::startGame()
|
|
{
|
|
if (player_name == pName[0]->text())
|
|
{
|
|
startGameButton->setEnabled(false);
|
|
QJsonObject json;
|
|
QJsonObject room;
|
|
json.insert("type", "request_begin_game");
|
|
room.insert("port", room_port);
|
|
json.insert("room", room);
|
|
QJsonDocument json_doc(json);
|
|
webSocket->sendTextMessage(json_doc.toJson());
|
|
}
|
|
else
|
|
{
|
|
QMessageBox msgBox;
|
|
msgBox.setText("Only player 1 can start the game");
|
|
msgBox.exec();
|
|
}
|
|
}
|
|
|
|
void WaitRoom::sendChat()
|
|
{
|
|
if (!chatEdit->text().isEmpty())
|
|
{
|
|
QJsonObject json;
|
|
QJsonObject room;
|
|
json.insert("type", "request_chat_message");
|
|
json.insert("player_name", player_name);
|
|
room.insert("port", room_port);
|
|
json.insert("room", room);
|
|
json.insert("message", chatEdit->text());
|
|
QJsonDocument json_doc(json);
|
|
webSocket->sendTextMessage(json_doc.toJson());
|
|
chatEdit->clear();
|
|
}
|
|
}
|
|
|
|
void WaitRoom::onFinished(int)
|
|
{
|
|
if (!started)
|
|
w->clearDiscordActivity();
|
|
timer->stop();
|
|
webSocket->close();
|
|
webSocket->deleteLater();
|
|
}
|
|
|
|
void WaitRoom::processTextMessage(QString message)
|
|
{
|
|
QJsonDocument json_doc = QJsonDocument::fromJson(message.toUtf8());
|
|
QJsonObject json = json_doc.object();
|
|
if (json.value("type").toString() == "reply_players")
|
|
{
|
|
if (json.contains("player_names"))
|
|
{
|
|
for (int i = 0; i < 4; ++i)
|
|
{
|
|
pName[i]->setText(json.value("player_names").toArray().at(i).toString());
|
|
if (pName[i]->text() == player_name)
|
|
player_number = i + 1;
|
|
}
|
|
}
|
|
}
|
|
else if (json.value("type").toString() == "reply_chat_message")
|
|
{
|
|
chatWindow->appendPlainText(json.value("message").toString());
|
|
}
|
|
else if (json.value("type").toString() == "reply_begin_game")
|
|
{
|
|
if (json.value("accept").toInt() == 0)
|
|
{
|
|
started = 1;
|
|
w->openROM(file_name, webSocket->peerAddress().toString(), room_port, player_number, cheats);
|
|
accept();
|
|
}
|
|
else
|
|
{
|
|
QMessageBox msgBox;
|
|
msgBox.setText(json.value("message").toString());
|
|
msgBox.exec();
|
|
}
|
|
}
|
|
else if (json.value("type").toString() == "reply_motd")
|
|
{
|
|
QString message = json.value("message").toString();
|
|
motd->setText(message);
|
|
}
|
|
}
|