+void CoreUserInputHandler::handleUnban(const BufferInfo& bufferInfo, const QString& msg)
+{
+ banOrUnban(bufferInfo, msg, false);
+}
+
+void CoreUserInputHandler::banOrUnban(const BufferInfo& bufferInfo, const QString& msg, bool ban)
+{
+ QString banChannel;
+ QString banUser;
+
+ QStringList params = msg.split(" ");
+
+ if (!params.isEmpty() && isChannelName(params[0])) {
+ banChannel = params.takeFirst();
+ }
+ else if (bufferInfo.type() == BufferInfo::ChannelBuffer) {
+ banChannel = bufferInfo.bufferName();
+ }
+ else {
+ emit displayMsg(NetworkInternalMessage(
+ Message::Error,
+ BufferInfo::StatusBuffer,
+ "",
+ QString("Error: channel unknown in command: /BAN %1").arg(msg)
+ ));
+ return;
+ }
+
+ if (!params.isEmpty() && !params.contains("!") && network()->ircUser(params[0])) {
+ IrcUser* ircuser = network()->ircUser(params[0]);
+ // generalizedHost changes <nick> to *!ident@*.sld.tld.
+ QString generalizedHost = ircuser->host();
+ if (generalizedHost.isEmpty()) {
+ emit displayMsg(NetworkInternalMessage(
+ Message::Error,
+ BufferInfo::StatusBuffer,
+ "",
+ QString("Error: host unknown in command: /BAN %1").arg(msg)
+ ));
+ return;
+ }
+
+ static QRegExp ipAddress(R"(\d+\.\d+\.\d+\.\d+)");
+ if (ipAddress.exactMatch(generalizedHost)) {
+ int lastDotPos = generalizedHost.lastIndexOf('.') + 1;
+ generalizedHost.replace(lastDotPos, generalizedHost.length() - lastDotPos, '*');
+ }
+ else if (generalizedHost.lastIndexOf(".") != -1 && generalizedHost.lastIndexOf(".", generalizedHost.lastIndexOf(".") - 1) != -1) {
+ int secondLastPeriodPosition = generalizedHost.lastIndexOf(".", generalizedHost.lastIndexOf(".") - 1);
+ generalizedHost.replace(0, secondLastPeriodPosition, "*");
+ }
+ banUser = QString("*!%1@%2").arg(ircuser->user(), generalizedHost);
+ }
+ else {
+ banUser = params.join(" ");
+ }
+
+ QString banMode = ban ? "+b" : "-b";
+ QString banMsg = QString("MODE %1 %2 %3").arg(banChannel, banMode, banUser);
+ emit putRawLine(serverEncode(banMsg));