From: Marcus Eggenberger Date: Tue, 30 Dec 2008 13:17:46 +0000 (+0100) Subject: Wait for it... X-Git-Tag: 0.4.0~305 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=0d2e5ff7439fe7bf9f24f1f55763881382ecb12a Wait for it... introducing /wait. Usage: "/wait 5; hi there" Will send the message "hi there" to the current buffer after 5 seconds. wait is a non-blocking call. --- diff --git a/src/core/userinputhandler.cpp b/src/core/userinputhandler.cpp index 70db4342..4b4c0796 100644 --- a/src/core/userinputhandler.cpp +++ b/src/core/userinputhandler.cpp @@ -354,6 +354,25 @@ void UserInputHandler::handleVoice(const BufferInfo &bufferInfo, const QString & emit putCmd("MODE", serverEncode(params)); } +void UserInputHandler::handleWait(const BufferInfo &bufferInfo, const QString &msg) { + int splitPos = msg.indexOf(';'); + if(splitPos <= 0) + return; + + bool ok; + int delay = msg.left(splitPos).trimmed().toInt(&ok); + if(!ok) + return; + + delay *= 1000; + + QString command = msg.mid(splitPos + 1).trimmed(); + if(command.isEmpty()) + return; + + _delayedCommands[startTimer(delay)] = Command(bufferInfo, command); +} + void UserInputHandler::handleWho(const BufferInfo &bufferInfo, const QString &msg) { Q_UNUSED(bufferInfo) emit putCmd("WHO", serverEncode(msg.split(' '))); @@ -383,6 +402,7 @@ void UserInputHandler::expand(const QString &alias, const BufferInfo &bufferInfo 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]; @@ -412,6 +432,17 @@ void UserInputHandler::expand(const QString &alias, const BufferInfo &bufferInfo command = command.replace("$0", msg); command = command.replace("$channelname", bufferInfo.bufferName()); command = command.replace("$currentnick", network()->myNick()); + expandedCommands << command; + } + + while(!expandedCommands.isEmpty()) { + QString command; + if(expandedCommands[0].trimmed().toLower().startsWith("/wait")) { + command = expandedCommands.join("; "); + expandedCommands.clear(); + } else { + command = expandedCommands.takeFirst(); + } handleUserInput(bufferInfo, command); } } @@ -467,3 +498,13 @@ int UserInputHandler::lastParamOverrun(const QString &cmd, const QListtimerId())) { + QObject::timerEvent(event); + return; + } + Command command = _delayedCommands.take(event->timerId()); + event->accept(); + handleUserInput(command.bufferInfo, command.command); +} diff --git a/src/core/userinputhandler.h b/src/core/userinputhandler.h index f7bd01dc..fe0c3c61 100644 --- a/src/core/userinputhandler.h +++ b/src/core/userinputhandler.h @@ -60,6 +60,7 @@ public slots: void handleSay(const BufferInfo &bufferInfo, const QString &text); void handleTopic(const BufferInfo &bufferInfo, const QString &text); void handleVoice(const BufferInfo &bufferInfo, const QString &text); + void handleWait(const BufferInfo &bufferInfo, const QString &text); void handleWho(const BufferInfo &bufferInfo, const QString &text); void handleWhois(const BufferInfo &bufferInfo, const QString &text); void handleWhowas(const BufferInfo &bufferInfo, const QString &text); @@ -68,11 +69,23 @@ public slots: void issueQuit(const QString &reason); +protected: + void timerEvent(QTimerEvent *event); + private: void expand(const QString &alias, const BufferInfo &bufferInfo, const QString &msg); void banOrUnban(const BufferInfo &bufferInfo, const QString &text, bool ban); void putPrivmsg(const QByteArray &target, const QByteArray &message); int lastParamOverrun(const QString &cmd, const QList ¶ms); + + struct Command { + BufferInfo bufferInfo; + QString command; + Command(const BufferInfo &info, const QString &command) : bufferInfo(info), command(command) {} + Command() {} + }; + + QHash _delayedCommands; };