1 #include "tab_logs.h"
2
3 #include "abstractclient.h"
4 #include "customlineedit.h"
5 #include "dlg_manage_sets.h"
6 #include "pb/moderator_commands.pb.h"
7 #include "pb/response_viewlog_history.pb.h"
8 #include "pending_command.h"
9
10 #include <QCheckBox>
11 #include <QDialogButtonBox>
12 #include <QGroupBox>
13 #include <QHBoxLayout>
14 #include <QLabel>
15 #include <QMessageBox>
16 #include <QPushButton>
17 #include <QRadioButton>
18 #include <QSpinBox>
19 #include <QTabWidget>
20 #include <QtGui>
21 #include <QtWidgets>
22
TabLog(TabSupervisor * _tabSupervisor,AbstractClient * _client,QWidget * parent)23 TabLog::TabLog(TabSupervisor *_tabSupervisor, AbstractClient *_client, QWidget *parent)
24 : Tab(_tabSupervisor, parent), client(_client)
25 {
26 roomTable = new QTableWidget();
27 roomTable->setColumnCount(6);
28 roomTable->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
29 roomTable->setHorizontalHeaderLabels(
30 QString(tr("Time;SenderName;SenderIP;Message;TargetID;TargetName")).split(";"));
31
32 gameTable = new QTableWidget();
33 gameTable->setColumnCount(6);
34 gameTable->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
35 gameTable->setHorizontalHeaderLabels(
36 QString(tr("Time;SenderName;SenderIP;Message;TargetID;TargetName")).split(";"));
37
38 chatTable = new QTableWidget();
39 chatTable->setColumnCount(6);
40 chatTable->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
41 chatTable->setHorizontalHeaderLabels(
42 QString(tr("Time;SenderName;SenderIP;Message;TargetID;TargetName")).split(";"));
43
44 QTabWidget *tabManager = new QTabWidget();
45 tabManager->addTab(roomTable, tr("Room Logs"));
46 tabManager->addTab(gameTable, tr("Game Logs"));
47 tabManager->addTab(chatTable, tr("Chat Logs"));
48 setCentralWidget(tabManager);
49
50 createDock();
51 restartLayout();
52 clearClicked();
53 retranslateUi();
54 }
55
~TabLog()56 TabLog::~TabLog()
57 {
58 }
59
retranslateUi()60 void TabLog::retranslateUi()
61 {
62 }
63
getClicked()64 void TabLog::getClicked()
65 {
66 if (findUsername->text().isEmpty() && findIPAddress->text().isEmpty() && findGameName->text().isEmpty() &&
67 findGameID->text().isEmpty() && findMessage->text().isEmpty()) {
68 QMessageBox::critical(this, tr("Error"), tr("You must select at least one filter."));
69 return;
70 }
71
72 if (!lastHour->isChecked() && !today->isChecked() && !pastDays->isChecked()) {
73 pastDays->setChecked(true);
74 pastXDays->setValue(20);
75 }
76
77 if (pastDays->isChecked() && pastXDays->value() == 0) {
78 QMessageBox::critical(this, tr("Error"), tr("You have to select a valid number of days to locate."));
79 return;
80 }
81
82 if (!mainRoom->isChecked() && !gameRoom->isChecked() && !privateChat->isChecked()) {
83 mainRoom->setChecked(true);
84 gameRoom->setChecked(true);
85 privateChat->setChecked(true);
86 }
87
88 if (maximumResults->value() == 0)
89 maximumResults->setValue(1000);
90
91 int dateRange;
92 if (lastHour->isChecked())
93 dateRange = 1;
94
95 if (today->isChecked())
96 dateRange = 24;
97
98 if (pastDays->isChecked())
99 dateRange = pastXDays->value() * 24;
100
101 Command_ViewLogHistory cmd;
102 cmd.set_user_name(findUsername->text().toStdString());
103 cmd.set_ip_address(findIPAddress->text().toStdString());
104 cmd.set_game_name(findGameName->text().toStdString());
105 cmd.set_game_id(findGameID->text().toStdString());
106 cmd.set_message(findMessage->text().toStdString());
107 if (mainRoom->isChecked()) {
108 cmd.add_log_location("room");
109 };
110 if (gameRoom->isChecked()) {
111 cmd.add_log_location("game");
112 };
113 if (privateChat->isChecked()) {
114 cmd.add_log_location("chat");
115 };
116 cmd.set_date_range(dateRange);
117 cmd.set_maximum_results(maximumResults->value());
118 PendingCommand *pend = client->prepareModeratorCommand(cmd);
119 connect(pend, SIGNAL(finished(Response, CommandContainer, QVariant)), this,
120 SLOT(viewLogHistory_processResponse(Response)));
121 client->sendCommand(pend);
122 }
123
clearClicked()124 void TabLog::clearClicked()
125 {
126 findUsername->clear();
127 findIPAddress->clear();
128 findGameName->clear();
129 findGameID->clear();
130 findMessage->clear();
131 pastXDays->clear();
132 maximumResults->clear();
133 mainRoom->setChecked(false);
134 gameRoom->setChecked(false);
135 privateChat->setChecked(false);
136 pastDays->setAutoExclusive(false);
137 pastDays->setChecked(false);
138 today->setAutoExclusive(false);
139 today->setChecked(false);
140 lastHour->setAutoExclusive(false);
141 lastHour->setChecked(false);
142 pastDays->setAutoExclusive(true);
143 today->setAutoExclusive(true);
144 lastHour->setAutoExclusive(true);
145 }
146
createDock()147 void TabLog::createDock()
148 {
149
150 labelFindUserName = new QLabel(tr("Username: "));
151 findUsername = new LineEditUnfocusable("");
152 findUsername->setAlignment(Qt::AlignCenter);
153 labelFindIPAddress = new QLabel(tr("IP Address: "));
154 findIPAddress = new LineEditUnfocusable("");
155 findIPAddress->setAlignment(Qt::AlignCenter);
156 labelFindGameName = new QLabel(tr("Game Name: "));
157 findGameName = new LineEditUnfocusable("");
158 findGameName->setAlignment(Qt::AlignCenter);
159 labelFindGameID = new QLabel(tr("GameID: "));
160 findGameID = new LineEditUnfocusable("");
161 findGameID->setAlignment(Qt::AlignCenter);
162 labelMessage = new QLabel(tr("Message: "));
163 findMessage = new LineEditUnfocusable("");
164 findMessage->setAlignment(Qt::AlignCenter);
165
166 mainRoom = new QCheckBox(tr("Main Room"));
167 gameRoom = new QCheckBox(tr("Game Room"));
168 privateChat = new QCheckBox(tr("Private Chat"));
169
170 pastDays = new QRadioButton(tr("Past X Days: "));
171 today = new QRadioButton(tr("Today"));
172 lastHour = new QRadioButton(tr("Last Hour"));
173 pastXDays = new QSpinBox;
174 pastXDays->setMaximum(20);
175
176 labelMaximum = new QLabel(tr("Maximum Results: "));
177 maximumResults = new QSpinBox;
178 maximumResults->setMaximum(1000);
179
180 labelDescription = new QLabel(tr(
181 "At least one filter is required.\nThe more information you put in, the more specific your results will be."));
182
183 getButton = new QPushButton(tr("Get User Logs"));
184 getButton->setAutoDefault(true);
185 connect(getButton, SIGNAL(clicked()), this, SLOT(getClicked()));
186
187 clearButton = new QPushButton(tr("Clear Filters"));
188 clearButton->setAutoDefault(true);
189 connect(clearButton, SIGNAL(clicked()), this, SLOT(clearClicked()));
190
191 criteriaGrid = new QGridLayout;
192 criteriaGrid->addWidget(labelFindUserName, 0, 0);
193 criteriaGrid->addWidget(findUsername, 0, 1);
194 criteriaGrid->addWidget(labelFindIPAddress, 1, 0);
195 criteriaGrid->addWidget(findIPAddress, 1, 1);
196 criteriaGrid->addWidget(labelFindGameName, 2, 0);
197 criteriaGrid->addWidget(findGameName, 2, 1);
198 criteriaGrid->addWidget(labelFindGameID, 3, 0);
199 criteriaGrid->addWidget(findGameID, 3, 1);
200 criteriaGrid->addWidget(labelMessage, 4, 0);
201 criteriaGrid->addWidget(findMessage, 4, 1);
202
203 criteriaGroupBox = new QGroupBox(tr("Filters"));
204 criteriaGroupBox->setLayout(criteriaGrid);
205 criteriaGroupBox->setFixedSize(500, 300);
206
207 locationGrid = new QGridLayout;
208 locationGrid->addWidget(mainRoom, 0, 0);
209 locationGrid->addWidget(gameRoom, 0, 1);
210 locationGrid->addWidget(privateChat, 0, 2);
211
212 locationGroupBox = new QGroupBox(tr("Log Locations"));
213 locationGroupBox->setLayout(locationGrid);
214
215 rangeGrid = new QGridLayout;
216 rangeGrid->addWidget(pastDays, 0, 0);
217 rangeGrid->addWidget(pastXDays, 0, 1);
218 rangeGrid->addWidget(today, 0, 2);
219 rangeGrid->addWidget(lastHour, 0, 3);
220
221 rangeGroupBox = new QGroupBox(tr("Date Range"));
222 rangeGroupBox->setLayout(rangeGrid);
223
224 maxResultsGrid = new QGridLayout;
225 maxResultsGrid->addWidget(labelMaximum, 0, 0);
226 maxResultsGrid->addWidget(maximumResults, 0, 1);
227
228 maxResultsGroupBox = new QGroupBox(tr("Maximum Results"));
229 maxResultsGroupBox->setLayout(maxResultsGrid);
230
231 descriptionGrid = new QGridLayout;
232 descriptionGrid->addWidget(labelDescription, 0, 0);
233
234 descriptionGroupBox = new QGroupBox(tr(""));
235 descriptionGroupBox->setLayout(descriptionGrid);
236
237 buttonGrid = new QGridLayout;
238 buttonGrid->addWidget(getButton, 0, 0);
239 buttonGrid->addWidget(clearButton, 0, 1);
240
241 buttonGroupBox = new QGroupBox(tr(""));
242 buttonGroupBox->setLayout(buttonGrid);
243
244 mainLayout = new QVBoxLayout(this);
245 mainLayout->addWidget(criteriaGroupBox);
246 mainLayout->addWidget(locationGroupBox);
247 mainLayout->addWidget(rangeGroupBox);
248 mainLayout->addWidget(maxResultsGroupBox);
249 mainLayout->addWidget(descriptionGroupBox);
250 mainLayout->addWidget(buttonGroupBox);
251 mainLayout->setAlignment(Qt::AlignCenter);
252
253 searchDockContents = new QWidget(this);
254 searchDockContents->setLayout(mainLayout);
255
256 searchDock = new QDockWidget(this);
257 searchDock->setFeatures(QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetMovable);
258 searchDock->setWidget(searchDockContents);
259 }
260
viewLogHistory_processResponse(const Response & resp)261 void TabLog::viewLogHistory_processResponse(const Response &resp)
262 {
263 const Response_ViewLogHistory &response = resp.GetExtension(Response_ViewLogHistory::ext);
264 if (resp.response_code() != Response::RespOk) {
265 QMessageBox::critical(static_cast<QWidget *>(parent()), tr("Message History"),
266 tr("Failed to collect message history information."));
267 return;
268 }
269
270 if (response.log_message_size() == 0) {
271 QMessageBox::information(static_cast<QWidget *>(parent()), tr("Message History"),
272 tr("There are no messages for the selected filters."));
273 return;
274 }
275
276 int roomCounter = 0, gameCounter = 0, chatCounter = 0;
277 roomTable->setRowCount(roomCounter);
278 gameTable->setRowCount(gameCounter);
279 chatTable->setRowCount(chatCounter);
280
281 for (int i = 0; i < response.log_message_size(); ++i) {
282 ServerInfo_ChatMessage message = response.log_message(i);
283 if (QString::fromStdString(message.target_type()) == "room") {
284 roomTable->insertRow(roomCounter);
285 roomTable->setItem(roomCounter, 0, new QTableWidgetItem(QString::fromStdString(message.time())));
286 roomTable->setItem(roomCounter, 1, new QTableWidgetItem(QString::fromStdString(message.sender_name())));
287 roomTable->setItem(roomCounter, 2, new QTableWidgetItem(QString::fromStdString(message.sender_ip())));
288 roomTable->setItem(roomCounter, 3, new QTableWidgetItem(QString::fromStdString(message.message())));
289 roomTable->setItem(roomCounter, 4, new QTableWidgetItem(QString::fromStdString(message.target_id())));
290 roomTable->setItem(roomCounter, 5, new QTableWidgetItem(QString::fromStdString(message.target_name())));
291 ++roomCounter;
292 }
293
294 if (QString::fromStdString(message.target_type()) == "game") {
295 gameTable->insertRow(gameCounter);
296 gameTable->setItem(gameCounter, 0, new QTableWidgetItem(QString::fromStdString(message.time())));
297 gameTable->setItem(gameCounter, 1, new QTableWidgetItem(QString::fromStdString(message.sender_name())));
298 gameTable->setItem(gameCounter, 2, new QTableWidgetItem(QString::fromStdString(message.sender_ip())));
299 gameTable->setItem(gameCounter, 3, new QTableWidgetItem(QString::fromStdString(message.message())));
300 gameTable->setItem(gameCounter, 4, new QTableWidgetItem(QString::fromStdString(message.target_id())));
301 gameTable->setItem(gameCounter, 5, new QTableWidgetItem(QString::fromStdString(message.target_name())));
302 ++gameCounter;
303 }
304
305 if (QString::fromStdString(message.target_type()) == "chat") {
306 chatTable->insertRow(chatCounter);
307 chatTable->setItem(chatCounter, 0, new QTableWidgetItem(QString::fromStdString(message.time())));
308 chatTable->setItem(chatCounter, 1, new QTableWidgetItem(QString::fromStdString(message.sender_name())));
309 chatTable->setItem(chatCounter, 2, new QTableWidgetItem(QString::fromStdString(message.sender_ip())));
310 chatTable->setItem(chatCounter, 3, new QTableWidgetItem(QString::fromStdString(message.message())));
311 chatTable->setItem(chatCounter, 4, new QTableWidgetItem(QString::fromStdString(message.target_id())));
312 chatTable->setItem(chatCounter, 5, new QTableWidgetItem(QString::fromStdString(message.target_name())));
313 ++chatCounter;
314 }
315 }
316
317 if (roomCounter) {
318 roomTable->show();
319 roomTable->resizeColumnsToContents();
320 } else {
321 roomTable->hide();
322 }
323
324 if (gameCounter) {
325 gameTable->resizeColumnsToContents();
326 gameTable->show();
327 } else {
328 gameTable->hide();
329 }
330
331 if (chatCounter) {
332 chatTable->resizeColumnsToContents();
333 chatTable->show();
334 } else {
335 chatTable->hide();
336 }
337 }
338
restartLayout()339 void TabLog::restartLayout()
340 {
341 searchDock->setFloating(false);
342 addDockWidget(Qt::LeftDockWidgetArea, searchDock);
343 searchDock->setVisible(true);
344 }
345