Thu, 20 May 2010 14:33:09 +0100
Reply to messages with the same (the incoming) message type
0 | 1 | local verse = require "verse"; |
2 | local st = require "util.stanza"; | |
3 | ||
4 | module("riddim", package.seeall); | |
5 | plugins = {}; | |
6 | ||
7 | local riddim_mt = {}; | |
8 | riddim_mt.__index = riddim_mt; | |
9 | ||
10 | function new(stream, config) | |
11 | if not stream then | |
12 | error("riddim.new(): Verse stream required as first parameter", 2); | |
13 | end | |
3
d1a9fb6495c6
Don't allow loading the same plugin more than once
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
14 | return setmetatable({ stream = stream, config = config or {}, plugins = {} }, riddim_mt); |
0 | 15 | end |
16 | ||
17 | -- self.conn is ready for stanzas | |
18 | function riddim_mt:start() | |
19 | self:event("started"); | |
20 | self.stream:hook("stanza", function (stanza) | |
21 | local body = stanza:get_child("body"); | |
22 | local event = { | |
23 | sender = { jid = stanza.attr.from }; | |
24 | body = (body and body:get_text()) or nil; | |
25 | stanza = stanza; | |
26 | }; | |
27 | if stanza.name == "message" then | |
28 | local replied; | |
29 | local bot = self; | |
30 | function event:reply(reply) | |
31 | if replied then return false; end | |
32 | replied = true; | |
15
22e6c003a83a
Reply to messages with the same (the incoming) message type
Chris <jugg@hotmail.com>
parents:
14
diff
changeset
|
33 | return bot:send_message(stanza.attr.from, stanza.attr.type, reply); |
0 | 34 | end |
35 | end | |
36 | local ret; | |
37 | if stanza.name == "iq" and (stanza.attr.type == "get" or stanza.attr.type == "set") then | |
38 | local xmlns = stanza.tags[1] and stanza.tags[1].attr.xmlns; | |
39 | if xmlns then | |
40 | event.xmlns = xmlns; | |
41 | print(event.stanza) | |
42 | ret = self:event("iq/"..xmlns, event); | |
43 | if not ret then | |
44 | ret = self:event(stanza.name, event); | |
45 | end | |
46 | end | |
47 | else | |
48 | ret = self:event(stanza.name, event); | |
49 | end | |
50 | ||
51 | if ret and type(ret) == "table" and ret.name then | |
52 | self:send(ret); | |
53 | end | |
54 | return ret; | |
55 | end, 1); | |
56 | end | |
57 | ||
58 | function riddim_mt:send(s) | |
59 | return self.stream:send(tostring(s)); | |
60 | end | |
61 | ||
62 | function riddim_mt:event(name, ...) | |
63 | return self.stream:event("bot/"..name, ...); | |
64 | end | |
65 | ||
66 | function riddim_mt:hook(name, ...) | |
67 | return self.stream:hook("bot/"..name, ...); | |
68 | end | |
69 | ||
15
22e6c003a83a
Reply to messages with the same (the incoming) message type
Chris <jugg@hotmail.com>
parents:
14
diff
changeset
|
70 | function riddim_mt:send_message(to, type, text) |
22e6c003a83a
Reply to messages with the same (the incoming) message type
Chris <jugg@hotmail.com>
parents:
14
diff
changeset
|
71 | self:send(st.message({ to = to, type = type }):tag("body"):text(text)); |
0 | 72 | end |
73 | ||
74 | function riddim_mt:add_plugin(name) | |
3
d1a9fb6495c6
Don't allow loading the same plugin more than once
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
75 | if not self.plugins[name] then |
d1a9fb6495c6
Don't allow loading the same plugin more than once
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
76 | self.plugins[name] = require("riddim.plugins."..name); |
d1a9fb6495c6
Don't allow loading the same plugin more than once
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
77 | return riddim.plugins[name](self); |
d1a9fb6495c6
Don't allow loading the same plugin more than once
Matthew Wild <mwild1@gmail.com>
parents:
2
diff
changeset
|
78 | end |
0 | 79 | end |
80 | ||
81 | -- Built-in bot starter | |
82 | if not (... and package.loaded[...] ~= nil) then | |
83 | require "verse.client"; | |
84 | ||
85 | -- Config loading | |
86 | local chunk, err = loadfile("config.lua"); | |
87 | if not chunk then | |
88 | print("File or syntax error:", err); | |
89 | return 1; | |
90 | end | |
91 | ||
92 | local config = {}; | |
93 | setfenv(chunk, setmetatable(config, {__index = _G})); | |
94 | local ok, err = pcall(chunk); | |
95 | if not ok then | |
96 | print("Error while processing config:", err); | |
97 | return 1; | |
98 | end | |
99 | setmetatable(config, nil); | |
100 | ||
101 | if not config.jid then | |
102 | io.write("Enter the bot's JID: "); | |
103 | config.jid = io.read("*l"); | |
104 | end | |
105 | ||
106 | if not config.password then | |
107 | io.write("Enter the password for "..config.jid..": "); | |
108 | config.password = io.read("*l"); | |
109 | end | |
110 | ||
111 | -- Create the stream object and bot object | |
112 | local c = verse.new(); | |
113 | local b = riddim.new(c, config); | |
114 | ||
115 | if config.debug then | |
116 | c:hook("incoming-raw", print); | |
117 | end | |
118 | ||
14
3df63aaba9e3
Decouple plugins from base implementation (in particular no plugins are now loaded by default)
Chris <jugg@hotmail.com>
parents:
11
diff
changeset
|
119 | for _, plugin in ipairs(config.plugins or {}) do |
2
6b31cc678fd7
Add configured plugins to the bot instead of the stream
Matthew Wild <mwild1@gmail.com>
parents:
1
diff
changeset
|
120 | b:add_plugin(plugin); |
0 | 121 | end |
122 | ||
123 | b:hook("started", function () | |
6
b0fec41e695b
initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
5
diff
changeset
|
124 | local presence = verse.presence() |
b0fec41e695b
initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
5
diff
changeset
|
125 | if b.caps then |
b0fec41e695b
initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
5
diff
changeset
|
126 | presence:add_child(b:caps()) |
b0fec41e695b
initial implementation of disco responses (XEP-0030) and entity caps sending (XEP-0115)
Hubert Chathi <hubert@uhoreg.ca>
parents:
5
diff
changeset
|
127 | end |
11
7bb53dcf93d4
Fix to send initial presence again
Hubert Chathi <hubert@uhoreg.ca>
parents:
8
diff
changeset
|
128 | b:send(presence); |
0 | 129 | end); |
130 | ||
131 | c:hook("binding-success", function () b:start(); end) | |
5
d9ed6e7d9936
allow specifying connect host and port in config file
Hubert Chathi <hubert@uhoreg.ca>
parents:
3
diff
changeset
|
132 | |
d9ed6e7d9936
allow specifying connect host and port in config file
Hubert Chathi <hubert@uhoreg.ca>
parents:
3
diff
changeset
|
133 | if config.connect_host then |
d9ed6e7d9936
allow specifying connect host and port in config file
Hubert Chathi <hubert@uhoreg.ca>
parents:
3
diff
changeset
|
134 | c.connect_host = config.connect_host |
d9ed6e7d9936
allow specifying connect host and port in config file
Hubert Chathi <hubert@uhoreg.ca>
parents:
3
diff
changeset
|
135 | end |
d9ed6e7d9936
allow specifying connect host and port in config file
Hubert Chathi <hubert@uhoreg.ca>
parents:
3
diff
changeset
|
136 | if config.connect_port then |
d9ed6e7d9936
allow specifying connect host and port in config file
Hubert Chathi <hubert@uhoreg.ca>
parents:
3
diff
changeset
|
137 | c.connect_port = config.connect_port |
d9ed6e7d9936
allow specifying connect host and port in config file
Hubert Chathi <hubert@uhoreg.ca>
parents:
3
diff
changeset
|
138 | end |
0 | 139 | |
140 | c:connect_client(config.jid, config.password); | |
141 | ||
142 | verse.loop(); | |
143 | end | |
144 | ||
145 | return _M; |