23 #include "cfgircdefinenetworkdialog.h"
24 #include "ui_cfgircdefinenetworkdialog.h"
26 #include "configuration/passwordscfg.h"
27 #include "gui/commongui.h"
28 #include "irc/chatnetworknamer.h"
29 #include "irc/configuration/chatnetworkscfg.h"
30 #include "irc/entities/ircnetworkentity.h"
31 #include "strings.hpp"
33 #include <QMessageBox>
36 DClass<CFGIRCDefineNetworkDialog> :
public Ui::CFGIRCDefineNetworkDialog
39 static const int MAX_IRC_COMMAND_LENGTH = 512;
41 QList<IRCNetworkEntity> existingNetworks;
42 QString originalDescription;
53 initFrom(initValuesEntity);
56 CFGIRCDefineNetworkDialog::CFGIRCDefineNetworkDialog(QWidget *parent)
62 CFGIRCDefineNetworkDialog::~CFGIRCDefineNetworkDialog()
66 void CFGIRCDefineNetworkDialog::accept()
68 if (!validateDescription())
70 QStringList offenders = validateAutojoinCommands();
71 if (!offenders.isEmpty())
73 if (!askToAcceptAnywayWhenCommandsBad(offenders))
79 bool CFGIRCDefineNetworkDialog::askToAcceptAnywayWhenCommandsBad(
const QStringList &offenders)
81 assert(!offenders.isEmpty() &&
"no offenders");
82 QString header = tr(
"These commands have violated the IRC maximum byte "
84 QString footer = tr(
"\n\nIf saved, the script may not run properly.\n\n"
85 "Do you wish to save the script anyway?");
86 QStringList formattedOffenders = formatOffenders(offenders.mid(0, 10));
87 QString body = formattedOffenders.join(
"\n\n");
88 if (formattedOffenders.size() < offenders.size())
89 body += tr(
"\n\n... and %n more ...",
"", offenders.size() - formattedOffenders.size());
90 QString msg = header + body + footer;
91 QMessageBox::StandardButton result = QMessageBox::warning(
92 this, tr(
"Doomseeker - IRC Commands Problem"), msg,
93 QMessageBox::Yes | QMessageBox::Cancel);
94 return result == QMessageBox::Yes;
97 QStringList CFGIRCDefineNetworkDialog::autojoinCommands()
const
99 return d->teAutojoinCommands->toPlainText().split(
"\n");
102 void CFGIRCDefineNetworkDialog::construct()
108 setHideNickservPassword(passCfg.isHidingPasswords());
109 setHideServerPassword(passCfg.isHidingPasswords());
112 QStringList CFGIRCDefineNetworkDialog::formatOffenders(
const QStringList &offenders)
const
114 QStringList offendersFormatted;
115 for (
const QString &offender : offenders)
117 offendersFormatted << tr(
"\t%1 (...)").arg(offender.left(40));
119 return offendersFormatted;
126 QString autojoinChannels = d->teAutojoinChannels->toPlainText();
127 autojoinChannels.remove(
'\r').replace(
'\n',
' ');
129 entity.setAddress(d->leAddress->text().trimmed());
130 entity.setAutojoinChannels(autojoinChannels.split(
" ", Qt::SkipEmptyParts));
131 entity.setAutojoinCommands(autojoinCommands());
132 entity.setDescription(d->leDescription->text().trimmed());
133 entity.setNickservCommand(d->leNickservCommand->text().trimmed());
134 entity.setNickservPassword(d->leNickservPassword->text());
135 entity.setPassword(d->leServerPassword->text());
136 entity.setPort(d->spinPort->value());
141 void CFGIRCDefineNetworkDialog::initFrom(
const IRCNetworkEntity &networkEntity)
143 d->originalDescription = networkEntity.
description();
144 d->leAddress->setText(networkEntity.
address());
145 d->teAutojoinChannels->setPlainText(networkEntity.
autojoinChannels().join(
" "));
146 d->teAutojoinCommands->setPlainText(networkEntity.
autojoinCommands().join(
"\n"));
147 d->leDescription->setText(networkEntity.
description());
148 d->leNickservCommand->setText(networkEntity.nickservCommand());
149 d->leNickservPassword->setText(networkEntity.nickservPassword());
150 d->leServerPassword->setText(networkEntity.
password());
151 d->spinPort->setValue(networkEntity.
port());
154 bool CFGIRCDefineNetworkDialog::isDescriptionUnique()
const
156 QString current = d->leDescription->text().trimmed().toLower();
157 if (d->originalDescription.trimmed().toLower() == current)
164 if (network.description().trimmed().toLower() == current)
170 bool CFGIRCDefineNetworkDialog::isValidDescription()
const
172 return ChatNetworkNamer::isValidName(d->leDescription->text());
175 QList<IRCNetworkEntity> CFGIRCDefineNetworkDialog::listExistingNetworks()
const
177 if (!d->existingNetworks.isEmpty())
178 return d->existingNetworks;
183 QStringList CFGIRCDefineNetworkDialog::validateAutojoinCommands()
const
185 QStringList offenders;
186 for (
const QString &command : autojoinCommands())
189 offenders << command;
196 d->existingNetworks = networks;
199 void CFGIRCDefineNetworkDialog::setHideNickservPassword(
bool hide)
201 d->cbHideNickservPassword->blockSignals(
true);
202 d->cbHideNickservPassword->setChecked(hide);
203 d->cbHideNickservPassword->blockSignals(
false);
204 d->leNickservPassword->setEchoMode(hide ? QLineEdit::Password : QLineEdit::Normal);
207 void CFGIRCDefineNetworkDialog::setHideServerPassword(
bool hide)
209 d->cbHideServerPassword->blockSignals(
true);
210 d->cbHideServerPassword->setChecked(hide);
211 d->cbHideServerPassword->blockSignals(
false);
212 d->leServerPassword->setEchoMode(hide ? QLineEdit::Password : QLineEdit::Normal);
215 bool CFGIRCDefineNetworkDialog::validateDescription()
217 if (d->leDescription->text().trimmed().isEmpty())
219 QMessageBox::critical(
this, tr(
"Invalid IRC network description"),
220 tr(
"Network description cannot be empty."));
223 if (!isDescriptionUnique())
225 QMessageBox::critical(
this, tr(
"Invalid IRC network description"),
226 tr(
"There already is a network with such description."));
229 if (!isValidDescription())
231 QString msg = tr(
"Network description is invalid.\n\n"
232 "Only letters, digits, spaces and \"%1\" are allowed.")
233 .arg(ChatNetworkNamer::additionalAllowedChars());
234 QMessageBox::critical(
this, tr(
"Invalid IRC network description"), msg);