void AliasManager::expand(const QString &alias, const BufferInfo &bufferInfo, const QString &msg, CommandList &list) { const Network *net = network(bufferInfo.networkId()); if(!net) { // FIXME send error as soon as we have a method for that! return; } QRegExp paramRangeR("\\$(\\d+)\\.\\.(\\d*)"); QStringList commands = alias.split(QRegExp("; ?")); QStringList params = msg.split(' '); QStringList expandedCommands; for(int i = 0; i < commands.count(); i++) { QString command = commands[i]; // replace ranges like $1..3 if(!params.isEmpty()) { int pos; while((pos = paramRangeR.indexIn(command)) != -1) { int start = paramRangeR.cap(1).toInt(); bool ok; int end = paramRangeR.cap(2).toInt(&ok); if(!ok) { end = params.count(); } if(end < start) command = command.replace(pos, paramRangeR.matchedLength(), QString()); else { command = command.replace(pos, paramRangeR.matchedLength(), QStringList(params.mid(start - 1, end - start + 1)).join(" ")); } } } for(int j = params.count(); j > 0; j--) { IrcUser *ircUser = net->ircUser(params[j - 1]); command = command.replace(QString("$%1:hostname").arg(j), ircUser ? ircUser->host() : QString("*")); command = command.replace(QString("$%1").arg(j), params[j - 1]); } command = command.replace("$0", msg); command = command.replace("$channelname", bufferInfo.bufferName()); // legacy command = command.replace("$channel", bufferInfo.bufferName()); command = command.replace("$currentnick", net->myNick()); // legacy command = command.replace("$nick", net->myNick()); expandedCommands << command; } while(!expandedCommands.isEmpty()) { QString command; if(expandedCommands[0].trimmed().toLower().startsWith("/wait")) { command = expandedCommands.join("; "); expandedCommands.clear(); } else { command = expandedCommands.takeFirst(); } list.append(qMakePair(bufferInfo, command)); } }
void ClientUserInputHandler::handleJoin(const BufferInfo &bufferInfo, const QString &text) { if (text.isEmpty()) { Client::messageModel()->insertErrorMessage(bufferInfo, tr("/JOIN expects a channel")); return; } switchBuffer(bufferInfo.networkId(), text.section(' ', 0, 0)); // send to core defaultHandler("JOIN", bufferInfo, text); }
void ClientUserInputHandler::handleQuery(const BufferInfo &bufferInfo, const QString &text) { if (text.isEmpty()) { Client::messageModel()->insertErrorMessage(bufferInfo, tr("/QUERY expects at least a nick")); return; } switchBuffer(bufferInfo.networkId(), text.section(' ', 0, 0)); // send to core defaultHandler("QUERY", bufferInfo, text); }
void Bb10Ui::partChannel() { QVariantList index = m_channelListView->selected(); if (index.length() < 2) return; QModelIndex modelIndex = static_cast<DataModelAdapter*>(m_channelListView->dataModel())->getQModelIndex(index); BufferInfo bufInfo = modelIndex.data(NetworkModel::BufferInfoRole).value<BufferInfo>(); QString reason = Client::identity(Client::network(bufInfo.networkId())->identity())->partReason(); Client::userInput(bufInfo, QString("/PART %1").arg(reason)); }
/***************************************** * QueryBufferItem *****************************************/ QueryBufferItem::QueryBufferItem(const BufferInfo &bufferInfo, NetworkItem *parent) : BufferItem(bufferInfo, parent), _ircUser(0) { setFlags(flags() | Qt::ItemIsDropEnabled | Qt::ItemIsEditable); const Network *net = Client::network(bufferInfo.networkId()); if (!net) return; IrcUser *ircUser = net->ircUser(bufferInfo.bufferName()); setIrcUser(ircUser); }
void ClientUserInputHandler::handleIgnore(const BufferInfo &bufferInfo, const QString &text) { if (text.isEmpty()) { emit Client::instance()->displayIgnoreList(""); return; } // If rule contains no ! or @, we assume it is just a nickname, and turn it into an ignore rule for that nick QString rule = (text.contains('!') || text.contains('@')) ? text : text + "!*@*"; Client::ignoreListManager()->requestAddIgnoreListItem( IgnoreListManager::IgnoreType::SenderIgnore, rule, false, // Use a dynamic ignore rule, for reversibility IgnoreListManager::StrictnessType::SoftStrictness, // Use current network as scope IgnoreListManager::ScopeType::NetworkScope, Client::network(bufferInfo.networkId())->networkName(), true ); }
// this would be the place for a client-side hook void ClientUserInputHandler::handleUserInput(const BufferInfo &bufferInfo, const QString &msg) { if (msg.isEmpty()) return; if (!msg.startsWith('/')) { if (_nickRx.indexIn(msg) == 0) { const Network *net = Client::network(bufferInfo.networkId()); IrcUser *user = net ? net->ircUser(_nickRx.cap(1)) : 0; if (user) user->setLastSpokenTo(bufferInfo.bufferId(), QDateTime::currentDateTime().toUTC()); } } AliasManager::CommandList clist = Client::aliasManager()->processInput(bufferInfo, msg); for (int i = 0; i < clist.count(); i++) { QString cmd = clist.at(i).second.section(' ', 0, 0).remove(0, 1).toUpper(); QString payload = clist.at(i).second.section(' ', 1); handle(cmd, Q_ARG(BufferInfo, clist.at(i).first), Q_ARG(QString, payload)); } }
QDebug operator<<(QDebug dbg, const BufferInfo &b) { dbg.nospace() << "(bufId: " << b.bufferId() << ", netId: " << b.networkId() << ", groupId: " << b.groupId() << ", buf: " << b.bufferName() << ")"; return dbg.space(); }
void ClientUserInputHandler::handleList(const BufferInfo &bufferInfo, const QString &text) { Q_UNUSED(text) Client::instance()->displayChannelList(bufferInfo.networkId()); }