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));
  }
}
Example #2
0
void Bb10Ui::onChannelListTriggered(const QVariantList index)
{
    // Headers are not clickable
    if (index.length() < 2)
        return;
    QModelIndex modelIndex = qobject_cast<DataModelAdapter*>(m_channelListView->dataModel())->getQModelIndex(index);
    BufferInfo bufferInfo = modelIndex.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
    BufferId id = bufferInfo.bufferId();
    if (!id.isValid())
        return;

    QString bufferName = bufferInfo.bufferName();
    
    qDebug() << "xxxxx Bb10Ui::onChannelListTriggered bufferInfo = " << bufferInfo << " index = " << index << " modelIndex = " << modelIndex;
    ChatView *view = qobject_cast<ChatView *>(m_chatViews.value(id));
    if (!view) {
        view = new ChatView(id, bufferName);
        m_chatViews[id] = view;
    }
    m_currentBufferId = id;
    Client::bufferModel()->switchToBuffer(id);
    Client::networkModel()->clearBufferActivity(id);
    Client::setBufferLastSeenMsg(id, view->getLastMsgId());
    Client::backlogManager()->checkForBacklog(id);
    navPanePush(view->getPage());

    // ask channelListView to update the appearance
    qobject_cast<DataModelAdapter*>(m_channelListView->dataModel())->handleBufferModelDataChanged(modelIndex, modelIndex);
}
Example #3
0
void Bb10Ui::joinChannel()
{
    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 bufferName = bufInfo.bufferName();
    switchToOrJoinChat(bufferName, false);
}
Example #4
0
void Bb10Ui::onChannelAdded(QVariantList index)
{
    QModelIndex modelIndex = qobject_cast<DataModelAdapter*>(m_channelListView->dataModel())->getQModelIndex(index);
    BufferInfo bufferInfo = modelIndex.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
    if (m_toBeJoined.length() && bufferInfo.bufferName() == m_toBeJoined) {
        while (m_currentBufferId != -1)
            navPanePop();
        onChannelListTriggered(index);
    }
    Client::bufferModel()->sort(0);
}
Example #5
0
void TopicWidget::on_topicLineEdit_textEntered() {
  QModelIndex currentIdx = currentIndex();
  if(currentIdx.isValid() && currentIdx.data(NetworkModel::BufferTypeRole) == BufferInfo::ChannelBuffer) {
    BufferInfo bufferInfo = currentIdx.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
    if(ui.topicLineEdit->text().isEmpty())
      Client::userInput(bufferInfo, QString("/quote TOPIC %1 :").arg(bufferInfo.bufferName()));
    else
      Client::userInput(bufferInfo, QString("/topic %1").arg(ui.topicLineEdit->text()));
  }
  switchPlain();
}
/*****************************************
*  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);
}
QString NetworkModelController::nickName(const QModelIndex &index) const
{
    IrcUser *ircUser = qobject_cast<IrcUser *>(index.data(NetworkModel::IrcUserRole).value<QObject *>());
    if (ircUser)
        return ircUser->nick();

    BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
    if (!bufferInfo.isValid())
        return QString();
    if (bufferInfo.type() != BufferInfo::QueryBuffer)
        return QString();

    return bufferInfo.bufferName(); // FIXME this might break with merged queries maybe
}
void ContextMenuActionProvider::addIrcUserActions(QMenu *menu, const QModelIndex &index)
{
    // this can be called: a) as a nicklist context menu (index has IrcUserItemType)
    //                     b) as a query buffer context menu (index has BufferItemType and is a QueryBufferItem)
    //                     c) right-click in a query chatview (same as b), index will be the corresponding QueryBufferItem)
    //                     d) right-click on some nickname (_contextItem will be non-null, _filter -> chatview, index -> message buffer)

    if (contextItem().isNull()) {
        // cases a, b, c
        bool haveQuery = indexList().count() == 1 && findQueryBuffer(index).isValid();
        NetworkModel::ItemType itemType = static_cast<NetworkModel::ItemType>(index.data(NetworkModel::ItemTypeRole).toInt());
        addAction(_nickModeMenuAction, menu, itemType == NetworkModel::IrcUserItemType);
        addAction(_nickCtcpMenuAction, menu);

        IrcUser *ircUser = qobject_cast<IrcUser *>(index.data(NetworkModel::IrcUserRole).value<QObject *>());
        if (ircUser) {
            Network *network = ircUser->network();
            // only show entries for usermode +h if server supports it
            if (network && network->prefixModes().contains('h')) {
                action(NickHalfop)->setVisible(true);
                action(NickDehalfop)->setVisible(true);
            }
            else {
                action(NickHalfop)->setVisible(false);
                action(NickDehalfop)->setVisible(false);
            }
            // ignoreliststuff
            QString bufferName;
            BufferInfo bufferInfo = index.data(NetworkModel::BufferInfoRole).value<BufferInfo>();
            if (bufferInfo.type() == BufferInfo::ChannelBuffer)
                bufferName = bufferInfo.bufferName();
            QMap<QString, bool> ignoreMap = Client::ignoreListManager()->matchingRulesForHostmask(ircUser->hostmask(), ircUser->network()->networkName(), bufferName);
            addIgnoreMenu(menu, ircUser->hostmask(), ignoreMap);
            // end of ignoreliststuff
        }
        menu->addSeparator();
        addAction(NickQuery, menu, itemType == NetworkModel::IrcUserItemType && !haveQuery && indexList().count() == 1);
        addAction(NickSwitchTo, menu, itemType == NetworkModel::IrcUserItemType && haveQuery);
        menu->addSeparator();
        addAction(NickWhois, menu, true);
    }
    else if (!contextItem().isEmpty() && messageFilter()) {
        // case d
        // TODO
    }
}
Example #9
0
QDebug operator<<(QDebug dbg, const BufferInfo &b)
{
    dbg.nospace() << "(bufId: " << b.bufferId() << ", netId: " << b.networkId() << ", groupId: " << b.groupId() << ", buf: " << b.bufferName() << ")";
    return dbg.space();
}