23 #include "cfgircdefinenetworkdialog.h"
24 #include "ui_cfgircdefinenetworkdialog.h"
26 #include "irc/chatnetworknamer.h"
27 #include "irc/configuration/chatnetworkscfg.h"
28 #include "irc/entities/ircnetworkentity.h"
29 #include "strings.hpp"
31 #include <QMessageBox>
34 DClass<CFGIRCDefineNetworkDialog> :
public Ui::CFGIRCDefineNetworkDialog
37 static const int MAX_IRC_COMMAND_LENGTH = 512;
39 QList<IRCNetworkEntity> existingNetworks;
40 QString originalDescription;
51 initFrom(initValuesEntity);
54 CFGIRCDefineNetworkDialog::CFGIRCDefineNetworkDialog(QWidget *parent)
60 CFGIRCDefineNetworkDialog::~CFGIRCDefineNetworkDialog()
64 void CFGIRCDefineNetworkDialog::accept()
66 if (!validateDescription())
68 QStringList offenders = validateAutojoinCommands();
69 if (!offenders.isEmpty())
71 if (!askToAcceptAnywayWhenCommandsBad(offenders))
77 bool CFGIRCDefineNetworkDialog::askToAcceptAnywayWhenCommandsBad(
const QStringList &offenders)
79 assert(!offenders.isEmpty() &&
"no offenders");
80 QString header = tr(
"These commands have violated the IRC maximum byte "
82 QString footer = tr(
"\n\nIf saved, the script may not run properly.\n\n"
83 "Do you wish to save the script anyway?");
84 QStringList formattedOffenders = formatOffenders(offenders.mid(0, 10));
85 QString body = formattedOffenders.join(
"\n\n");
86 if (formattedOffenders.size() < offenders.size())
87 body += tr(
"\n\n... and %n more ...",
"", offenders.size() - formattedOffenders.size());
88 QString msg = header + body + footer;
89 QMessageBox::StandardButton result = QMessageBox::warning(
90 this, tr(
"Doomseeker - IRC Commands Problem"), msg,
91 QMessageBox::Yes | QMessageBox::Cancel);
92 return result == QMessageBox::Yes;
95 QStringList CFGIRCDefineNetworkDialog::autojoinCommands()
const
97 return d->teAutojoinCommands->toPlainText().split(
"\n");
100 void CFGIRCDefineNetworkDialog::buttonClicked(QAbstractButton *button)
102 auto pButton = (QPushButton *)button;
103 if (pButton == d->buttonBox->button(QDialogButtonBox::Ok))
109 void CFGIRCDefineNetworkDialog::construct()
113 connect(d->buttonBox, SIGNAL(clicked(QAbstractButton*)), SLOT(buttonClicked(QAbstractButton*)));
116 QStringList CFGIRCDefineNetworkDialog::formatOffenders(
const QStringList &offenders)
const
118 QStringList offendersFormatted;
119 for (
const QString &offender : offenders)
121 offendersFormatted << tr(
"\t%1 (...)").arg(offender.left(40));
123 return offendersFormatted;
130 QString autojoinChannels = d->teAutojoinChannels->toPlainText();
131 autojoinChannels.remove(
'\r').replace(
'\n',
' ');
133 entity.setAddress(d->leAddress->text().trimmed());
134 entity.setAutojoinChannels(autojoinChannels.split(
" ", Qt::SkipEmptyParts));
135 entity.setAutojoinCommands(autojoinCommands());
136 entity.setDescription(d->leDescription->text().trimmed());
137 entity.setNickservCommand(d->leNickservCommand->text().trimmed());
138 entity.setNickservPassword(d->leNickservPassword->text());
139 entity.setPassword(d->leServerPassword->text());
140 entity.setPort(d->spinPort->value());
145 void CFGIRCDefineNetworkDialog::initFrom(
const IRCNetworkEntity &networkEntity)
147 d->originalDescription = networkEntity.
description();
148 d->leAddress->setText(networkEntity.
address());
149 d->teAutojoinChannels->setPlainText(networkEntity.
autojoinChannels().join(
" "));
150 d->teAutojoinCommands->setPlainText(networkEntity.
autojoinCommands().join(
"\n"));
151 d->leDescription->setText(networkEntity.
description());
152 d->leNickservCommand->setText(networkEntity.nickservCommand());
153 d->leNickservPassword->setText(networkEntity.nickservPassword());
154 d->leServerPassword->setText(networkEntity.
password());
155 d->spinPort->setValue(networkEntity.
port());
158 bool CFGIRCDefineNetworkDialog::isDescriptionUnique()
const
160 QString current = d->leDescription->text().trimmed().toLower();
161 if (d->originalDescription.trimmed().toLower() == current)
168 if (network.description().trimmed().toLower() == current)
174 bool CFGIRCDefineNetworkDialog::isValidDescription()
const
176 return ChatNetworkNamer::isValidName(d->leDescription->text());
179 QList<IRCNetworkEntity> CFGIRCDefineNetworkDialog::listExistingNetworks()
const
181 if (!d->existingNetworks.isEmpty())
182 return d->existingNetworks;
187 QStringList CFGIRCDefineNetworkDialog::validateAutojoinCommands()
const
189 QStringList offenders;
190 for (
const QString &command : autojoinCommands())
193 offenders << command;
200 d->existingNetworks = networks;
203 bool CFGIRCDefineNetworkDialog::validateDescription()
205 if (d->leDescription->text().trimmed().isEmpty())
207 QMessageBox::critical(
this, tr(
"Invalid IRC network description"),
208 tr(
"Network description cannot be empty."));
211 if (!isDescriptionUnique())
213 QMessageBox::critical(
this, tr(
"Invalid IRC network description"),
214 tr(
"There already is a network with such description."));
217 if (!isValidDescription())
219 QString msg = tr(
"Network description is invalid.\n\n"
220 "Only letters, digits, spaces and \"%1\" are allowed.")
221 .arg(ChatNetworkNamer::additionalAllowedChars());
222 QMessageBox::critical(
this, tr(
"Invalid IRC network description"), msg);