#include "networkconnection.h"
#include "network.h"
#include "ctcphandler.h"
+#include "ircuser.h"
#include <QDebug>
}
void UserInputHandler::handleBan(const BufferInfo &bufferInfo, const QString &msg) {
- if(bufferInfo.type() != BufferInfo::ChannelBuffer)
+ 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(Message::Error, BufferInfo::StatusBuffer, "", QString("Error: channel unknown in command: /BAN %1").arg(msg));
return;
-
- //TODO: find suitable default hostmask if msg gives only nickname
- // Example: MODE &oulu +b *!*@*
- QByteArray banMsg = serverEncode(bufferInfo.bufferName()) + " +b " + channelEncode(bufferInfo.bufferName(), msg);
- emit putCmd("MODE", banMsg);
+ }
+
+ 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(Message::Error, BufferInfo::StatusBuffer, "", QString("Error: host unknown in command: /BAN %1").arg(msg));
+ return;
+ }
+
+ 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()).arg(generalizedHost);
+ } else {
+ banUser = params.join(" ");
+ }
+
+ QString banMsg = QString("MODE %1 +b %2").arg(banChannel).arg(banUser);
+ qDebug() << banMsg;
+ emit putRawLine(serverEncode(banMsg));
}
void UserInputHandler::handleCtcp(const BufferInfo &bufferInfo, const QString &msg) {
QAction *deVoiceAction = modeMenu->addAction(tr("Devoice %1").arg(nick));
QMenu *kickBanMenu = nickContextMenu.addMenu(tr("Kick/Ban"));
- //TODO: add kick message from network identity (kick reason)
QAction *kickAction = kickBanMenu->addAction(tr("Kick %1").arg(nick));
+ QAction *banAction = kickBanMenu->addAction(tr("Ban %1").arg(nick));
QAction *kickBanAction = kickBanMenu->addAction(tr("Kickban %1").arg(nick));
- kickBanMenu->setEnabled(false);
QAction *ignoreAction = nickContextMenu.addAction(tr("Ignore"));
ignoreAction->setEnabled(false);
else if(action == deVoiceAction) { executeCommand(bufferInfo, QString("/DEVOICE %1").arg(nick)); }
else if(action == kickAction) { executeCommand(bufferInfo, QString("/KICK %1").arg(nick)); }
- else if(action == kickBanAction) { executeCommand(bufferInfo, QString("/KICKBAN %1").arg(nick)); }
+ else if(action == banAction) { executeCommand(bufferInfo, QString("/BAN %1").arg(nick)); }
+ else if(action == kickBanAction) { executeCommand(bufferInfo, QString("/KICK %1").arg(nick));
+ executeCommand(bufferInfo, QString("/BAN %1").arg(nick)); }
else if(action == queryAction) { executeCommand(bufferInfo, QString("/QUERY %1").arg(nick)); }
}