-
Notifications
You must be signed in to change notification settings - Fork 0
/
ScreepStudioApplication.cpp
217 lines (169 loc) · 8.44 KB
/
ScreepStudioApplication.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
/*
* File: ScreepStudioApplication.cpp
* Created: 2018-12-2
*
* Copyright (c) shecks 2018 <[email protected]>
* All rights reserved.
*
* This file is part of %QT_PROJECT_NAME%.
*
* %QT_PROJECT_NAME% is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* %QT_PROJECT_NAME% is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with %QT_PROJECT_NAME%. If not, see <https://www.gnu.org/licenses/>.
*/
#include "ScreepStudioApplication.h"
#include "./models/server/ServerInfoModel.h"
#include "./models/user/UserInfoModel.h"
#include "./models/console/ConsoleModel.h"
#include "./models/room/RoomModel.h"
#include "./network/rest/RestRoomTerrain.h"
#include "./network/socket/SocketEventRoom.h"
#include "MainWindow.h"
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define CONNECT_LIVE_SERVER 1
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const QString ScreepStudioApplication::COMPANY_NAME = QStringLiteral("Mr Shecks Inc");
const QString ScreepStudioApplication::APPLICATION_NAME = QStringLiteral("Screep Studio");
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ScreepStudioApplication()
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ScreepStudioApplication::ScreepStudioApplication(int& argc, char** argv, int flags /* = ApplicationFlags */)
: _super(argc, argv, flags),
_prefs(COMPANY_NAME, APPLICATION_NAME),
_networkModel(new NetworkModel(this)),
_serverInfoModel(new ServerInfoModel(this)),
_userInfoModel(new UserInfoModel(this)),
_worldModel(new WorldModel(_networkModel, this)),
_consoleModel(new ConsoleModel(this)),
_mainWindow(new MainWindow()) {
setApplicationName(APPLICATION_NAME);
setOrganizationName(COMPANY_NAME);
connect(_networkModel, &NetworkModel::connectionStateChanged, this, &ScreepStudioApplication::_onConnectionStateChanged);
connect(_networkModel, &NetworkModel::serverInfoReceived, _serverInfoModel, &ServerInfoModel::refresh);
connect(_networkModel, &NetworkModel::userInfoReceived, _userInfoModel, &UserInfoModel::refresh);
connect(_networkModel, &NetworkModel::roomTerrainReceived, this, &ScreepStudioApplication::_onRoomTerrainReceived);
connect(_networkModel, &NetworkModel::roomEventReceived, this, &ScreepStudioApplication::_onRoomEventReceived);
#if CONNECT_LIVE_SERVER
QString authKey = _prefs.authKey();
Q_ASSERT_X(!authKey.isEmpty(), "ScreepStudioApplication", "Screeps API Authentication Key not found in \"Screep Studio.conf\"");
qDebug() << "QSslSocket Build Version=" << QSslSocket::sslLibraryBuildVersionString();
qDebug() << "SSL version found=" << QSslSocket::sslLibraryVersionNumber() << ", Library Path=" << QCoreApplication::libraryPaths();
qDebug() << "Screeps API Auth Key=" << authKey;
_networkModel->setAuthentication (authKey);
_networkModel->openConnection("screeps.com", -1, true);
#else
// Note: This is not a real password :)
_networkModel->setAuthentication ("Shecks", "mysecretpassword");
_networkModel->openConnection("192.168.1.11", 21025, false);
#endif // CONNECT_LIVE_SERVER
_consoleModel->setModel(_networkModel);
}
ScreepStudioApplication::~ScreepStudioApplication() {
_networkModel->closeConsole(_userInfoModel->id());
delete _mainWindow;
}
const QString& ScreepStudioApplication::userId() const {
return _userInfoModel->id();
}
RoomModel::TSharedPtr ScreepStudioApplication::createRoomModel(const QString& roomName, const QString& shardName /* = QString() */) {
const QString mapKey = roomMapKey(roomName, shardName);
RoomModel::TSharedPtr roomModel = findRoomModel(mapKey);
if(roomModel == nullptr) {
roomModel = RoomModel::TSharedPtr::create(_networkModel, roomName, shardName);
_roomModels.insert(mapKey, roomModel);
}
#ifdef QT_DEBUG
else {
qDebug() << "Room with mapKey=" << mapKey << " already open!";
}
#endif // QT_DEBUG
return roomModel;
}
void ScreepStudioApplication::destroyRoomModel(const RoomModel::TSharedPtr roomModel) {
Q_ASSERT(roomModel != nullptr);
const QString mapKey = roomMapKey(roomModel->roomName(), roomModel->shardName());
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ScreepStudioApplication::_onRoomTerrainReceived(const RestResponseRoomTerrain& response) {
qDebug() << "Room=" << response.roomName() << ", Shard=" << response.shardName();
RoomModel::TSharedPtr roomModel;
if((roomModel = findRoomModel(response.roomName(), response.shardName())) != nullptr) {
QMetaObject::invokeMethod(roomModel.data(), "_onRoomTerrainReceived", Q_ARG(const RestResponseRoomTerrain&, response));
}
#ifdef QT_DEBUG
else {
qDebug() << "Room=" << response.roomName()
<< ", Shard=" << response.shardName()
<< ", not found in Room Model Map!";
}
#endif // QT_DEBUG
}
void ScreepStudioApplication::_onRoomEventReceived(const SocketEventRoom& event) {
RoomModel::TSharedPtr roomModel;
if((roomModel = findRoomModel(event.roomName(), event.shardName())) != nullptr) {
QMetaObject::invokeMethod(roomModel.data(), "_onRoomEventReceived", Q_ARG(const SocketEventRoom&, event));
}
#ifdef QT_DEBUG
else {
qDebug() << "Room=" << event.roomName()
<< ", Shard=" << event.shardName()
<< ", not found in Room Model Map!";
}
#endif // QT_DEBUG
}
//
// Note: The following _onConnectionStateChanged() handler is temporary and only
// used to open some rooms for debugging until I complete the UI for room seleciton.
//
#include "models/world/WorldModel.h"
void ScreepStudioApplication::_onConnectionStateChanged(NetworkModel::ConnectionState oldState, NetworkModel::ConnectionState newState) {
qDebug() << "oldState=" << oldState << ", newState=" << newState;
if(newState == NetworkModel::StateConnected) {
qDebug() << "Connected!";
_networkModel->openConsole(_userInfoModel->id());
_mainWindow->show();
_worldModel->open("shard3");
#if CONNECT_LIVE_SERVER
_mainWindow->openRoom("W19S47", "shard2");
// _mainWindow->openRoom("W31S32", "shard2");
// _mainWindow->openRoom("E32N24", "shard3");
// _mainWindow->openRoom("W21N18", "shard1");
#else
_mainWindow->openRoom("W8N3");
_mainWindow->openRoom("W7N4"); // Too-Angel Bot
_mainWindow->openRoom("W8N4"); // Too-Angel Bot
_mainWindow->openRoom("W7N3"); // Too-Angel Bot
_mainWindow->openRoom("W9N5"); // Too-Angel Bot
_mainWindow->openRoom("W9N2"); // Too-Angel Bot
_mainWindow->openRoom("W8N7"); // Too-Angel Bot
//_mainWindow->openRoom("W15N12");
// _mainWindow->openRoom("W5N4"); // Has Invaders, Source Extractor and Source Keeper
// _mainWindow->openRoom("W1N9");
// _mainWindow->openRoom("W9N1");
// _mainWindow->openRoom("W9N9");
// _mainWindow->openRoom("W7N1");
#endif // CONNECT_LIVE_SERVER
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
RoomModel::TSharedPtr ScreepStudioApplication::findRoomModel(const QString& roomName, const QString& shardName) const {
return findRoomModel(roomMapKey(roomName, shardName));
}
RoomModel::TSharedPtr ScreepStudioApplication::findRoomModel(const QString& mapKey) const {
TRoomModelMap::const_iterator it = _roomModels.find(mapKey);
return it != _roomModels.constEnd() ? it.value() : nullptr;
}
QString ScreepStudioApplication::roomMapKey(const QString& roomName, const QString& shardName) const {
return QString("{%1:%2}")
.arg(shardName.isEmpty () ? "shard0" : shardName)
.arg(roomName).toLower();
}