1
0
mirror of https://github.com/node-red/node-red.git synced 2023-10-10 13:36:53 +02:00

Get tweets from specific people

fixes #80
This commit is contained in:
Nicholas O'Leary 2013-11-22 23:07:08 +00:00
parent 88be896f1c
commit e88dcd4aba
2 changed files with 70 additions and 4 deletions

View File

@ -111,10 +111,11 @@
<select type="text" id="node-input-user" style="display: inline-block; vertical-align: middle; width:60%;"> <select type="text" id="node-input-user" style="display: inline-block; vertical-align: middle; width:60%;">
<option value="false">all public tweets</option> <option value="false">all public tweets</option>
<option value="true">the tweets of who you follow</option> <option value="true">the tweets of who you follow</option>
<option value="user">the tweets of specific users</option>
</select> </select>
</div> </div>
<div class="form-row"> <div class="form-row">
<label for="node-input-tags"><i class="icon-tags"></i> for</label> <label for="node-input-tags"><i class="icon-tags"></i> <span id="node-input-tags-label">for</span></label>
<input type="text" id="node-input-tags" placeholder="comma-separated words, @ids, #tags"> <input type="text" id="node-input-tags" placeholder="comma-separated words, @ids, #tags">
</div> </div>
<div class="form-row"> <div class="form-row">
@ -141,7 +142,7 @@
defaults: { defaults: {
twitter: {type:"twitter-credentials",required:true}, twitter: {type:"twitter-credentials",required:true},
tags: {value:"",required:true}, tags: {value:"",required:true},
user: {value:"false",required:true}, user: {value:"public",required:true},
name: {value:""}, name: {value:""},
topic: {value:"tweets"} topic: {value:"tweets"}
}, },
@ -153,6 +154,21 @@
}, },
labelStyle: function() { labelStyle: function() {
return this.name?"node_label_italic":""; return this.name?"node_label_italic":"";
},
oneditprepare: function() {
$("#node-input-user").change(function() {
var type = $("#node-input-user option:selected").val();
if (type == "user") {
$("#node-input-tags-label").html("User");
$("#node-input-tags").attr("placeholder","comma-separated @twitter handles");
} else {
$("#node-input-tags-label").html("for");
$("#node-input-tags").attr("placeholder","comma-separated words, @ids, #hashtags");
}
});
$("#node-input-user").change();
} }
}); });
</script> </script>

View File

@ -44,10 +44,55 @@ function TwitterInNode(n) {
}); });
var node = this; var node = this;
if (this.tags !== "") { if (this.user === "user") {
node.poll_ids = [];
node.since_ids = {};
var users = node.tags.split(",");
for (var i=0;i<users.length;i++) {
var user = users[i].replace(" ","");
twit.getUserTimeline({
screen_name:user,
trim_user:0,
count:1
},function() {
var u = user+"";
return function(err,cb) {
if (cb[0]) {
node.since_ids[u] = cb[0].id_str;
} else {
node.since_ids[u] = '0';
}
node.poll_ids.push(setInterval(function() {
twit.getUserTimeline({
screen_name:u,
trim_user:0,
since_id:node.since_ids[u]
},function(err,cb) {
if (cb) {
for (var t=cb.length-1;t>=0;t-=1) {
var tweet = cb[t];
var where = tweet.user.location||"";
var la = tweet.lang || tweet.user.lang;
//console.log(tweet.user.location,"=>",tweet.user.screen_name,"=>",pay);
var msg = { topic:node.topic+"/"+tweet.user.screen_name, payload:tweet.text, location:where, lang:la, tweet:tweet };
node.send(msg);
if (t == 0) {
node.since_ids[u] = tweet.id_str;
}
}
}
if (err) {
node.error(err);
}
});
},60000));
}
}());
}
} else if (this.tags !== "") {
try { try {
var thing = 'statuses/filter'; var thing = 'statuses/filter';
if (this.user == "true") { thing = 'user'; } if (this.user === "true") { thing = 'user'; }
var st = { track: [node.tags] }; var st = { track: [node.tags] };
var bits = node.tags.split(","); var bits = node.tags.split(",");
if ((bits.length > 0) && (bits.length % 4 == 0)) { if ((bits.length > 0) && (bits.length % 4 == 0)) {
@ -110,6 +155,11 @@ function TwitterInNode(n) {
this.active = false; this.active = false;
this.stream.destroy(); this.stream.destroy();
} }
if (this.poll_ids) {
for (var i=0;i<this.poll_ids.length;i++) {
clearInterval(this.poll_ids[i]);
}
}
}); });
} }
RED.nodes.registerType("twitter in",TwitterInNode); RED.nodes.registerType("twitter in",TwitterInNode);