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-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));
}
}
|