diff options
| author | Markus Mittendrein <git@maxmitti.tk> | 2015-09-09 19:00:56 +0200 |
|---|---|---|
| committer | Markus Mittendrein <git@maxmitti.tk> | 2015-09-09 19:02:23 +0200 |
| commit | 8a6d4b06f2291c363f3dea17837ed20893852453 (patch) | |
| tree | c091375499e35eaa1810586454e0834c06e6c9b2 /src/libcommuni/examples/bot | |
| parent | f554a27046f203e56a07baaf214d90834942e3f5 (diff) | |
| download | manager-8a6d4b06f2291c363f3dea17837ed20893852453.tar.gz manager-8a6d4b06f2291c363f3dea17837ed20893852453.zip | |
Cleanup repo with some directories
Diffstat (limited to 'src/libcommuni/examples/bot')
| -rw-r--r-- | src/libcommuni/examples/bot/bot.pro | 17 | ||||
| -rw-r--r-- | src/libcommuni/examples/bot/ircbot.cpp | 84 | ||||
| -rw-r--r-- | src/libcommuni/examples/bot/ircbot.h | 37 | ||||
| -rw-r--r-- | src/libcommuni/examples/bot/main.cpp | 59 |
4 files changed, 197 insertions, 0 deletions
diff --git a/src/libcommuni/examples/bot/bot.pro b/src/libcommuni/examples/bot/bot.pro new file mode 100644 index 0000000..1f4f434 --- /dev/null +++ b/src/libcommuni/examples/bot/bot.pro @@ -0,0 +1,17 @@ +###################################################################### +# Communi +###################################################################### + +TEMPLATE = app +TARGET = bot +DEPENDPATH += . +INCLUDEPATH += . +CONFIG += console +CONFIG -= app_bundle +QT = core network + +# Input +HEADERS += ircbot.h +SOURCES += ircbot.cpp main.cpp + +include(../examples.pri) diff --git a/src/libcommuni/examples/bot/ircbot.cpp b/src/libcommuni/examples/bot/ircbot.cpp new file mode 100644 index 0000000..1891e62 --- /dev/null +++ b/src/libcommuni/examples/bot/ircbot.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include "ircbot.h" +#include <IrcMessage> +#include <IrcCommand> +#include <QCoreApplication> +#include <QTimer> + +IrcBot::IrcBot(QObject* parent) : IrcConnection(parent) +{ +//! [messages] + connect(this, SIGNAL(privateMessageReceived(IrcPrivateMessage*)), this, SLOT(processMessage(IrcPrivateMessage*))); +//! [messages] + +//! [commands] + parser.addCommand(IrcCommand::CtcpAction, "ACT [target] <message...>"); + parser.addCommand(IrcCommand::Custom, "HELP (<command...>)"); + parser.addCommand(IrcCommand::Nick, "NICK <nick>"); + parser.addCommand(IrcCommand::Join, "JOIN <#channel> (<key>)"); + parser.addCommand(IrcCommand::Part, "PART (<#channel>) (<message...>)"); + parser.addCommand(IrcCommand::Quit, "QUIT (<message...>)"); + parser.addCommand(IrcCommand::Message, "SAY [target] <message...>"); +//! [commands] + + bufferModel.setConnection(this); +//! [channels] + connect(&bufferModel, SIGNAL(channelsChanged(QStringList)), &parser, SLOT(setChannels(QStringList))); +//! [channels] +} + +void IrcBot::join(QString channel) +{ + sendCommand(IrcCommand::createJoin(channel)); +} + +//![receive] +void IrcBot::processMessage(IrcPrivateMessage* message) +{ + if (message->isPrivate()) { + // private message: reply to the message sender + // => triggers: "!<cmd> <params>" and "<cmd> <params>" + parser.setTarget(message->nick()); + parser.setTriggers(QStringList() << "!" << ""); + } else { + // channel message: reply to the target channel + // => triggers: "!<cmd> <params>" and "bot: <cmd> <params>" + parser.setTarget(message->target()); + parser.setTriggers(QStringList() << "!" << nickName().append(":")); + } + + IrcCommand* cmd = parser.parse(message->content()); + if (cmd) { + if (cmd->type() == IrcCommand::Custom && cmd->parameters().value(0) == "HELP") { + help(cmd->parameters().mid(1)); + } else { + sendCommand(cmd); + + if (cmd->type() == IrcCommand::Quit) { + connect(this, SIGNAL(disconnected()), qApp, SLOT(quit())); + QTimer::singleShot(1000, qApp, SLOT(quit())); + } + } + } +} +//![receive] + +void IrcBot::help(QStringList commands) +{ + if (commands.isEmpty()) + commands = parser.commands(); + + QString target = parser.target(); + foreach (const QString& command, commands) { + QString syntax = parser.syntax(command); + sendCommand(IrcCommand::createMessage(target, syntax)); + } +} diff --git a/src/libcommuni/examples/bot/ircbot.h b/src/libcommuni/examples/bot/ircbot.h new file mode 100644 index 0000000..1a88a01 --- /dev/null +++ b/src/libcommuni/examples/bot/ircbot.h @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#ifndef IRCBOT_H +#define IRCBOT_H + +#include <IrcConnection> +#include <IrcBufferModel> +#include <IrcCommandParser> + +class IrcBot : public IrcConnection +{ + Q_OBJECT + +public: + IrcBot(QObject* parent = 0); + +public slots: + void join(QString channel); + +private slots: + void processMessage(IrcPrivateMessage* message); + +private: + void help(QStringList commands); + + IrcCommandParser parser; + IrcBufferModel bufferModel; +}; + +#endif // IRCBOT_H diff --git a/src/libcommuni/examples/bot/main.cpp b/src/libcommuni/examples/bot/main.cpp new file mode 100644 index 0000000..526f776 --- /dev/null +++ b/src/libcommuni/examples/bot/main.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2008-2014 The Communi Project + * + * This example is free, and not covered by the BSD license. There is no + * restriction applied to their modification, redistribution, using and so on. + * You can study them, modify them, use them in your own program - either + * completely or partially. + */ + +#include <QtCore> +#include "ircbot.h" + +int main(int argc, char* argv[]) +{ + QCoreApplication app(argc, argv); + + // enable debug output + qputenv("IRC_DEBUG", "1"); + qsrand(QTime::currentTime().msec()); + + IrcBot bot; + bot.setHost("irc.freenode.net"); + bot.setUserName("communi"); + bot.setNickName("Bot" + QString::number(qrand() % 9999)); + bot.setRealName("Communi " + Irc::version() + " example bot"); + + bool joined = false; + QStringList args = app.arguments(); + for (int i = 0; i < args.count(); ++i) { + QString arg = args.at(i); + if (arg == "-help") { + qDebug() << "Usage:" << argv[0] << "(-host <host>) (-port <port>) (-ssl) (-nick <nick>) (-user <user>) (-password <password>) (-channel <channel>)"; + return 0; + } else if (arg == "-port") { + bool ok = false; + int port = args.value(++i).toInt(&ok); + if (ok) + bot.setPort(port); + } else if (arg == "-ssl") { + bot.setSecure(true); + } else if (arg == "-host") { + bot.setHost(args.value(++i)); + } else if (arg == "-user") { + bot.setUserName(args.value(++i)); + } else if (arg == "-password") { + bot.setPassword(args.value(++i)); + } else if (arg == "-nick") { + bot.setNickName(args.value(++i)); + } else if (arg == "-channel") { + bot.join(args.value(++i)); + joined = true; + } + } + if (!joined) + bot.join("#communi"); + + bot.open(); + return app.exec(); +} |
