1 /*
2  * Hedgewars, a free turn based strategy game
3  * Copyright (c) 2004-2015 Andrey Korotaev <unC0Rr@gmail.com>
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; version 2 of the License
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18 
19 #include <QGridLayout>
20 #include <QLabel>
21 #include <QLineEdit>
22 #include <QSpinBox>
23 #include <QPushButton>
24 #include <QTextBrowser>
25 #include <QTableWidget>
26 #include <QHeaderView>
27 
28 #include "pageadmin.h"
29 #include "chatwidget.h"
30 #include "bandialog.h"
31 
bodyLayoutDefinition()32 QLayout * PageAdmin::bodyLayoutDefinition()
33 {
34     QVBoxLayout * pageLayout = new QVBoxLayout();
35 
36     QTabWidget * tabs = new QTabWidget(this);
37     pageLayout->addWidget(tabs);
38     QWidget * page1 = new QWidget(this);
39     QWidget * page2 = new QWidget(this);
40     tabs->addTab(page1, tr("General"));
41     tabs->addTab(page2, tr("Bans"));
42 
43     // page 1
44     {
45         QGridLayout * tab1Layout = new QGridLayout(page1);
46 
47         // 0
48         pbAsk = addButton(tr("Fetch data"), tab1Layout, 0, 0, 1, 3);
49 
50         // 1
51         QLabel * lblSMN = new QLabel(this);
52         lblSMN->setText(tr("Server message for latest version:"));
53         tab1Layout->addWidget(lblSMN, 1, 0);
54 
55         leServerMessageNew = new QLineEdit(this);
56         tab1Layout->addWidget(leServerMessageNew, 1, 1);
57 
58         // 2
59         QLabel * lblSMO = new QLabel(this);
60         lblSMO->setText(tr("Server message for previous versions:"));
61         tab1Layout->addWidget(lblSMO, 2, 0);
62 
63         leServerMessageOld = new QLineEdit(this);
64         tab1Layout->addWidget(leServerMessageOld, 2, 1);
65 
66         // 3
67         QLabel * lblP = new QLabel(this);
68         lblP->setText(tr("Latest version protocol number:"));
69         tab1Layout->addWidget(lblP, 3, 0);
70 
71         sbProtocol = new QSpinBox(this);
72         tab1Layout->addWidget(sbProtocol, 3, 1);
73 
74         // 4
75         QLabel * lblPreview = new QLabel(this);
76         //: MOTD = Message Of The Day, the message which is shown to players joining the server
77         lblPreview->setText(tr("MOTD preview:"));
78         tab1Layout->addWidget(lblPreview, 4, 0);
79 
80         tb = new QTextBrowser(this);
81         tb->setOpenExternalLinks(true);
82         tb->document()->setDefaultStyleSheet(HWChatWidget::styleSheet());
83         tab1Layout->addWidget(tb, 4, 1, 1, 2);
84 
85         // 5
86         pbClearAccountsCache = addButton(tr("Clear Accounts Cache"), tab1Layout, 5, 0);
87 
88         // 6
89         pbSetSM = addButton(tr("Set data"), tab1Layout, 6, 0, 1, 3);
90     }
91 
92     // page 2
93     {
94         QGridLayout * tab2Layout = new QGridLayout(page2);
95         twBans = new QTableWidget(this);
96         twBans->setColumnCount(3);
97         twBans->setHorizontalHeaderLabels(QStringList()
98                               //: IP = short for "IP address" (Internet Protocol). Nick = short for "nick name"
99                               << tr("IP/Nick")
100                               << tr("Expiration")
101                               << tr("Reason")
102                     );
103         twBans->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
104         twBans->horizontalHeader()->setSectionsClickable(false);
105         twBans->verticalHeader()->hide();
106         twBans->setEditTriggers(QAbstractItemView::NoEditTriggers);
107         twBans->setSelectionBehavior(QAbstractItemView::SelectRows);
108         twBans->setSelectionMode(QAbstractItemView::SingleSelection);
109         twBans->setAlternatingRowColors(true);
110         tab2Layout->addWidget(twBans, 0, 1, 4, 1);
111 
112         QPushButton * btnRefresh = addButton(tr("Refresh"), tab2Layout, 0, 0);
113         QPushButton * btnAdd = addButton(tr("Add"), tab2Layout, 1, 0);
114         QPushButton * btnRemove = addButton(tr("Remove"), tab2Layout, 2, 0);
115 
116         connect(btnRefresh, SIGNAL(clicked()), this, SIGNAL(bansListRequest()));
117         connect(btnRefresh, SIGNAL(clicked()), this, SLOT(onRefreshClicked()));
118         connect(btnAdd, SIGNAL(clicked()), this, SLOT(onAddClicked()));
119         connect(btnRemove, SIGNAL(clicked()), this, SLOT(onRemoveClicked()));
120     }
121 
122     return pageLayout;
123 }
124 
connectSignals()125 void PageAdmin::connectSignals()
126 {
127     connect(pbAsk, SIGNAL(clicked()), this, SIGNAL(askServerVars()));
128     connect(leServerMessageNew, SIGNAL(textChanged(QString)), tb, SLOT(setHtml(const QString &)));
129     connect(leServerMessageOld, SIGNAL(textChanged(QString)), tb, SLOT(setHtml(const QString &)));
130     connect(pbClearAccountsCache, SIGNAL(clicked()), this, SIGNAL(clearAccountsCache()));
131     connect(pbSetSM, SIGNAL(clicked()), this, SLOT(smChanged()));
132 }
133 
PageAdmin(QWidget * parent)134 PageAdmin::PageAdmin(QWidget* parent) : AbstractPage(parent)
135 {
136     initPage();
137 }
138 
smChanged()139 void PageAdmin::smChanged()
140 {
141     emit setServerMessageNew(leServerMessageNew->text());
142     emit setServerMessageOld(leServerMessageOld->text());
143     emit setProtocol(sbProtocol->value());
144 }
145 
serverMessageNew(const QString & str)146 void PageAdmin::serverMessageNew(const QString & str)
147 {
148     leServerMessageNew->setText(str);
149 }
150 
serverMessageOld(const QString & str)151 void PageAdmin::serverMessageOld(const QString & str)
152 {
153     leServerMessageOld->setText(str);
154 }
155 
protocol(int proto)156 void PageAdmin::protocol(int proto)
157 {
158     sbProtocol->setValue(proto);
159 }
160 
onAddClicked()161 void PageAdmin::onAddClicked()
162 {
163     BanDialog dialog(this);
164 
165     if(dialog.exec())
166     {
167         if(dialog.byIP())
168         {
169             emit banIP(dialog.banId(), dialog.reason(), dialog.duration());
170         } else
171         {
172             emit banNick(dialog.banId(), dialog.reason(), dialog.duration());
173         }
174 
175         emit bansListRequest();
176     }
177 }
178 
onRemoveClicked()179 void PageAdmin::onRemoveClicked()
180 {
181     QList<QTableWidgetItem *> sel = twBans->selectedItems();
182 
183     if(sel.size())
184     {
185         emit removeBan(twBans->item(sel[0]->row(), 0)->data(Qt::DisplayRole).toString());
186         emit bansListRequest();
187     }
188 }
189 
setBansList(const QStringList & bans)190 void PageAdmin::setBansList(const QStringList & bans)
191 {
192     if(bans.size() % 4)
193         return;
194 
195     twBans->setRowCount(bans.size() / 4);
196 
197     for(int i = 0; i < bans.size(); i += 4)
198     {
199         if(!twBans->item(i / 4, 0))
200         {
201             twBans->setItem(i / 4, 0, new QTableWidgetItem());
202             twBans->setItem(i / 4, 1, new QTableWidgetItem());
203             twBans->setItem(i / 4, 2, new QTableWidgetItem());
204         }
205 
206         twBans->item(i / 4, 0)->setData(Qt::DisplayRole, bans[i + 1]);
207         twBans->item(i / 4, 1)->setData(Qt::DisplayRole, bans[i + 3]);
208         twBans->item(i / 4, 2)->setData(Qt::DisplayRole, bans[i + 2]);
209     }
210 }
211 
onRefreshClicked()212 void PageAdmin::onRefreshClicked()
213 {
214     twBans->setRowCount(0);
215 }
216