summaryrefslogtreecommitdiffstats
path: root/libcommuni/examples/qmlbot/qml/main.qml
blob: 2dad45845bca62ac5f1d51f3c47d607d95d850c0 (plain)
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.
 */

import QtQml 2.0
import Communi 3.0

QtObject {
    id: bot

    property string channel: "#communi"

    property Irc irc: Irc { id: irc }
    property IrcCommand command: IrcCommand { id: command }

    property IrcBufferModel model: IrcBufferModel {
        id: model

//! [connection]
        connection: IrcConnection {
            id: connection

            host: "irc.freenode.net"
            userName: "communi"
            nickName: "QmlBot" + Math.round(Math.random() * 9999)
            realName: qsTr("Communi %1 QML bot example").arg(irc.version())

            Component.onCompleted: {
                // queue a command to automatically join a channel when connected
                sendCommand(command.createJoin(channel))
                open()
            }
//! [connection]

//! [receive]
            onMessageReceived: {
                if (message.type === IrcMessage.Private) {
                    // - in private, reply to the message sender
                    // - on channel, reply to the target channel
                    parser.target = message.private ? message.nick : message.target

                    var command = parser.parse(message.content)
                    if (command) {
                        // send the command to the IRC server
                        sendCommand(command)
                        if (command.type === IrcCommand.Quit) {
                            // close the connection & quit the app when a !quit command was received
                            close()
                            Qt.quit()
                        }
                    }
                }
            }
//! [receive]
        }
    }

//! [parser]
    property IrcCommandParser parser: IrcCommandParser {
        id: parser

        // keep the parser aware of the context
        channels: model.channels

        // - on channel, respond to: "!<command> <params>" and "bot: <command> <params>"
        // - in query, respond to: "!<command> <params>" and "<command> <params>"
        triggers: connection.network.isChannel(target) ? ["!", connection.nickName + ":"] : ["!", ""]

        Component.onCompleted: {
            // teach the bot some commands
            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...>");
        }
    }
//! [parser]
}