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