mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-09-25 02:43:02 -07:00
* [Application] Add single instance guard and mime types. Took 2 hours 39 minutes Took 18 minutes Took 5 minutes Took 12 seconds Took 11 seconds * Rework Took 30 minutes Took 50 seconds * Only enforce single instance if launched with arguments. Took 5 minutes * Prototype intents Took 53 minutes Took 6 seconds * Connect/disconnect and join game/room intents. Took 3 hours 14 minutes Took 2 seconds Took 15 seconds * Fix include. Took 1 minute Took 23 seconds Took 2 seconds * Mac handling. Took 10 minutes Took 12 seconds Took 3 minutes * Lint. Took 3 minutes * Rebase. Took 3 minutes Took 17 seconds * Implement UrlSchemeEventFilter Took 10 minutes Took 7 seconds * Qt Moc Took 3 minutes * Modern PList. Took 21 minutes Took 1 minute * Debug output. Took 6 minutes Took 19 minutes * Watch file:// prefix. Took 15 minutes Took 7 seconds * Better handler. Took 6 minutes * Don't store reference in member Took 5 minutes * Move impl to cpp, fix lifetime issues. Took 11 minutes Took 2 minutes * Better single-instance handoff, url intent harded copy game link context-menu Polish for installers Took 35 minutes Took 8 seconds --------- Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
74 lines
2.4 KiB
C++
74 lines
2.4 KiB
C++
#include "intent_join_server_room.h"
|
|
|
|
#include "../widgets/tabs/tab_room.h"
|
|
#include "../widgets/tabs/tab_server.h"
|
|
#include "../widgets/tabs/tab_supervisor.h"
|
|
#include "intent_connect_to_server.h"
|
|
|
|
#include <QTimer>
|
|
#include <libcockatrice/protocol/pb/serverinfo_room.pb.h>
|
|
|
|
IntentJoinServerRoom::IntentJoinServerRoom(TabSupervisor *_tabSupervisor,
|
|
RemoteClient *_remoteClient,
|
|
ContextJoinRoom *_context)
|
|
: Intent(), tabSupervisor(_tabSupervisor), remoteClient(_remoteClient), context(_context)
|
|
{
|
|
}
|
|
|
|
bool IntentJoinServerRoom::checkPrecondition() const
|
|
{
|
|
if (remoteClient->getStatus() != ClientStatus::StatusLoggedIn) {
|
|
return false;
|
|
}
|
|
// peerPort() reflects the actual TCP peer, which may differ from the
|
|
// configured server port (e.g. when connecting through a proxy), so only
|
|
// the hostname is compared here.
|
|
if (remoteClient->peerName() != context->serverContext.hostname) {
|
|
return false;
|
|
}
|
|
if (QString::number(remoteClient->peerPort()) != context->serverContext.port) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void IntentJoinServerRoom::onPreconditionSatisfied()
|
|
{
|
|
if (tabSupervisor->getRoomTabs().contains(context->roomId)) {
|
|
tabSupervisor->setCurrentWidget(tabSupervisor->getRoomTabs().value(context->roomId));
|
|
emitFinished();
|
|
return;
|
|
}
|
|
|
|
TabServer *tabServer = tabSupervisor->getTabServer();
|
|
if (!tabServer) {
|
|
tabSupervisor->openTabServer();
|
|
tabServer = tabSupervisor->getTabServer();
|
|
}
|
|
if (!tabServer) {
|
|
emitFailed(tr("No server tab available"));
|
|
return;
|
|
}
|
|
|
|
const int roomId = context->roomId;
|
|
tabServer->joinRoom(roomId, true);
|
|
connect(tabServer, &TabServer::roomJoined, this, [this, roomId](const ServerInfo_Room &info, bool) {
|
|
if (info.room_id() == roomId) {
|
|
emitFinished();
|
|
}
|
|
});
|
|
connect(tabServer, &TabServer::roomJoinFailed, this, [this, roomId](int failedRoomId) {
|
|
if (failedRoomId == roomId) {
|
|
emitFailed(tr("Failed to join the server room %1").arg(roomId));
|
|
}
|
|
});
|
|
|
|
QTimer::singleShot(15000, this,
|
|
[this, roomId]() { emitFailed(tr("Timed out while joining the server room %1").arg(roomId)); });
|
|
}
|
|
|
|
void IntentJoinServerRoom::onPreconditionNotSatisfied()
|
|
{
|
|
runDependency(new IntentConnectToServer(remoteClient, &context->serverContext));
|
|
}
|