-
Notifications
You must be signed in to change notification settings - Fork 2
/
50-rss.js
73 lines (63 loc) · 2.71 KB
/
50-rss.js
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
'use strict';
const RSS = require('rss');
module.exports = function(RED) {
function RSSNode(config) {
RED.nodes.createNode(this, config);
const node = this;
this.feedOptionRules = config.feedOptionRules;
this.itemOptionRules = config.itemOptionRules;
node.on('input', function(msg) {
try {
const items = msg.payload;
// Construct feed options based on rules configured
const feedOptions = {};
for (let rule of node.feedOptionRules) {
if (rule.type === 'str') {
feedOptions[rule.name] = rule.value;
}
else if (rule.type === 'msg') {
feedOptions[rule.name] = RED.util.getMessageProperty(msg, rule.value);
}
else if (rule.type === 'flow') {
feedOptions[rule.name] = node.context().flow.get(rule.value);
}
else if (rule.type === 'global') {
feedOptions[rule.name] = node.context().global.get(rule.value);
}
}
const feed = new RSS(feedOptions);
for (let item of items) {
const itemOptions = {};
// Construct item options based on rules configured
for (let rule of node.itemOptionRules) {
if (rule.type === 'str') {
itemOptions[rule.name] = rule.value;
}
else if (rule.type === 'item') {
if (rule.value) {
const property = RED.util.getMessageProperty(item, rule.value);
if (property !== undefined) {
itemOptions[rule.name] = property;
}
}
}
else if (rule.type === 'flow') {
itemOptions[rule.name] = node.context().flow.get(rule.value);
}
else if (rule.type === 'global') {
itemOptions[rule.name] = node.context().global.get(rule.value);
}
}
feed.item(itemOptions);
}
// Overwrite the payload but otherwise keep the message intact
msg.payload = feed.xml();
node.send(msg);
}
catch (ex) {
console.log(ex);
}
});
}
RED.nodes.registerType('rss', RSSNode);
};