1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
/*
* Copyright (C) 2008-2020 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));
}
}
|