2015-06-13 19:46:44 +02:00
<!--
2016-09-27 18:56:35 +02:00
Copyright 2013, 2016 IBM Corp.
2015-06-13 19:46:44 +02:00
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
< script type = "text/x-red" data-template-name = "twitter-credentials" >
< div class = "form-row" id = "node-config-twitter-row" > < / div >
< input type = "hidden" id = "node-config-input-screen_name" >
< / script >
< script type = "text/javascript" >
(function() {
var twitterConfigNodeId = null;
var twitterConfigNodeIntervalId = null;
2015-07-15 00:03:46 +02:00
2015-06-13 19:46:44 +02:00
RED.nodes.registerType('twitter-credentials',{
category: 'config',
defaults: {
screen_name: {value:""}
},
credentials: {
screen_name: {type:"text"},
access_token: {type: "password"},
access_token_secret: {type:"password"}
},
label: function() {
return this.screen_name;
},
exportable: false,
oneditprepare: function() {
2015-07-17 14:52:19 +02:00
var twitterConfigNodeId = this.id;
2015-06-16 11:36:19 +02:00
var clickhere = this._("twitter.label.clickhere");
var twitterID = this._("twitter.label.twitter-id");
function showTwitterAuthStart() {
var pathname = document.location.pathname;
if (pathname.slice(-1) != "/") {
pathname += "/";
}
var callback = encodeURIComponent(location.protocol+"//"+location.hostname+":"+location.port+pathname+"twitter-credentials/"+twitterConfigNodeId+"/auth/callback");
$("#node-config-dialog-ok").button("disable");
$("#node-config-twitter-row").html('< div style = "text-align: center; margin-top: 20px; " > < a class = "btn" id = "node-config-twitter-start" href = "twitter-credentials/'+twitterConfigNodeId+'/auth?callback='+callback+'" target = "_blank" > '+clickhere+'< / a > < / div > ');
$("#node-config-twitter-start").click(function() {
twitterConfigNodeIntervalId = window.setTimeout(pollTwitterCredentials,2000);
});
}
function updateTwitterScreenName(sn) {
$("#node-config-input-screen_name").val(sn);
$("#node-config-twitter-row").html('< label > < i class = "fa fa-user" > < / i > '+twitterID+'< / label > < span class = "input-xlarge uneditable-input" > '+sn+'< / span > ');
}
function pollTwitterCredentials(e) {
$.getJSON('credentials/twitter-credentials/'+twitterConfigNodeId,function(data) {
if (data.screen_name) {
updateTwitterScreenName(data.screen_name);
twitterConfigNodeIntervalId = null;
$("#node-config-dialog-ok").button("enable");
} else {
twitterConfigNodeIntervalId = window.setTimeout(pollTwitterCredentials,2000);
}
})
}
2015-06-16 15:38:36 +02:00
if (!this.screen_name || this.screen_name === "") {
2015-06-13 19:46:44 +02:00
showTwitterAuthStart();
} else {
if (this.credentials.screen_name) {
updateTwitterScreenName(this.credentials.screen_name);
} else {
showTwitterAuthStart();
}
}
},
oneditsave: function() {
if (twitterConfigNodeIntervalId) {
window.clearTimeout(twitterConfigNodeIntervalId);
}
},
oneditcancel: function(adding) {
if (twitterConfigNodeIntervalId) {
window.clearTimeout(twitterConfigNodeIntervalId);
}
}
});
})();
< / script >
< script type = "text/x-red" data-template-name = "twitter in" >
< div class = "form-row" >
2015-06-16 11:36:19 +02:00
< label for = "node-input-twitter" > < i class = "fa fa-user" > < / i > < span data-i18n = "twitter.label.twitter-id" > < / span > < / label >
2015-06-13 19:46:44 +02:00
< input type = "text" id = "node-input-twitter" >
< / div >
< div class = "form-row" >
2015-06-16 11:36:19 +02:00
< label for = "node-input-user" > < i class = "fa fa-search" > < / i > < span data-i18n = "twitter.label.search" > < / span > < / label >
2015-06-13 19:46:44 +02:00
< select type = "text" id = "node-input-user" style = "display: inline-block; vertical-align: middle; width:60%;" >
2015-06-16 11:36:19 +02:00
< option value = "false" data-i18n = "twitter.search.public" > < / option >
< option value = "true" data-i18n = "twitter.search.follow" > < / option >
< option value = "user" data-i18n = "twitter.search.user" > < / option >
< option value = "dm" data-i18n = "twitter.search.direct" > < / option >
2015-06-13 19:46:44 +02:00
< / select >
< / div >
< div class = "form-row" id = "node-input-tags-row" >
2015-06-16 11:36:19 +02:00
< label for = "node-input-tags" > < i class = "fa fa-tags" > < / i > < span id = "node-input-tags-label" data-i18n = "twitter.label.for" > < / span > < / label >
< input type = "text" id = "node-input-tags" data-i18n = "[placeholder]twitter.placeholder.for" >
2015-06-13 19:46:44 +02:00
< / div >
< div class = "form-row" >
2015-06-16 12:16:29 +02:00
< label for = "node-input-name" > < i class = "fa fa-tag" > < / i > < span data-i18n = "node-red:common.label.name" > < / span > < / label >
< input type = "text" id = "node-input-name" data-i18n = "[placeholder]node-red:common.label.name" >
2015-06-13 19:46:44 +02:00
< / div >
2015-06-16 11:36:19 +02:00
< div class = "form-tips" > < span data-i18n = "[html]twitter.tip" > < / span > < / div >
2015-06-13 19:46:44 +02:00
< / script >
< script type = "text/x-red" data-help-name = "twitter in" >
< p > Twitter input node. Can be used to search either:
2016-09-30 00:30:13 +02:00
< ul > < li > the public stream for tweets containing the configured search term< / li >
< li > all the tweets from accounts that the authenticated user follows< / li >
< li > all tweets by specified users< / li >
2015-06-13 19:46:44 +02:00
< li > direct messages received by the authenticated user< / li >
< / ul > < / p >
2016-09-27 22:21:28 +02:00
< p > Use space for < i > and< / i > and comma , for < i > or< / i > when searching for multiple terms.
If you want to pass in the search term(s) via the < code > msg.payload< / code > , leave the < b > for< / b > field blank.< / p >
2016-02-12 15:05:10 +01:00
< p > Sets the < code > msg.topic< / code > to < i > tweets/< / i > and then appends the senders screen name.< / p >
< p > Sets < code > msg.location< / code > to the tweeters location if known.< / p >
< p > Sets < code > msg.tweet< / code > to the full tweet object as documented by < a href = "https://dev.twitter.com/overview/api/tweets" > Twitter< / a > .
2016-09-30 00:30:13 +02:00
< p > < b > Note:< / b > when set to follow specific users, or your direct messages, the node is subject to
the rate limiting of the Twitter API. If you deploy the flows multiple times within a 15 minute window, you may
exceed the limit and will see errors from the node. These errors will clear automatically when the current 15
minute window passes.< / p >
2015-06-13 19:46:44 +02:00
< / script >
< script type = "text/javascript" >
RED.nodes.registerType('twitter in',{
category: 'social-input',
color:"#C0DEED",
defaults: {
twitter: {type:"twitter-credentials",required:true},
2016-09-27 18:34:04 +02:00
tags: {value:""},
2015-06-13 19:46:44 +02:00
user: {value:"false",required:true},
name: {value:""},
topic: {value:"tweets"}
},
2016-09-27 22:21:28 +02:00
inputs: 1,
outputs: 1,
2015-06-13 19:46:44 +02:00
icon: "twitter.png",
label: function() {
if (this.name) {
return this.name;
}
2016-09-30 00:30:13 +02:00
var uname = RED.nodes.node(this.twitter);
2015-06-13 19:46:44 +02:00
if (this.user == "dm") {
2016-09-30 00:30:13 +02:00
return (uname?uname.label()+" ":"")+this._("twitter.label.dmslabel");
2015-06-13 19:46:44 +02:00
} else if (this.user == "user") {
2015-06-16 11:36:19 +02:00
return this.tags+" "+this._("twitter.label.tweetslabel");
2015-06-13 19:46:44 +02:00
}
2016-09-27 22:21:28 +02:00
else if (this.user == "true") {
2016-09-30 00:30:13 +02:00
return this._("twitter.label.followers") + (uname?(" "+uname.label()):"");
2016-09-27 22:21:28 +02:00
}
return "twitter";
2015-06-13 19:46:44 +02:00
},
labelStyle: function() {
return this.name?"node_label_italic":"";
},
oneditprepare: function() {
2015-06-16 11:36:19 +02:00
var userlabel = this._("twitter.label.user");
var userph = this._("twitter.placeholder.user");
var forlabel = this._("twitter.label.for");
var forph = this._("twitter.placeholder.for");
2015-06-13 19:46:44 +02:00
$("#node-input-user").change(function() {
var type = $("#node-input-user option:selected").val();
if (type == "user") {
$("#node-input-tags-row").show();
2015-06-16 11:36:19 +02:00
$("#node-input-tags-label").html(userlabel);
$("#node-input-tags").attr("placeholder",userph);
2016-09-28 18:09:58 +02:00
} else if ((type == "dm")||(type == "true")) {
2015-06-13 19:46:44 +02:00
$("#node-input-tags-row").hide();
} else {
$("#node-input-tags-row").show();
2015-06-16 11:36:19 +02:00
$("#node-input-tags-label").html(forlabel);
$("#node-input-tags").attr("placeholder",forph);
2015-06-13 19:46:44 +02:00
}
});
$("#node-input-user").change();
2016-09-27 22:21:28 +02:00
}//,
// oneditsave: function() {
2016-09-28 18:09:58 +02:00
// if ($('#node-input-tags').val() === '' & & $("#node-input-user option:selected").val() === 'false') {
2016-09-27 22:21:28 +02:00
// this.inputs=1;
// }
// else {
// //set back the default state of 0 inputs
// this.inputs=0;
// }
// }
2015-06-13 19:46:44 +02:00
});
< / script >
< script type = "text/x-red" data-template-name = "twitter out" >
< div class = "form-row" >
2015-06-16 11:36:19 +02:00
< label for = "node-input-twitter" > < i class = "fa fa-user" > < / i > < span data-i18n = "twitter.label.twitter-id" > < / span > < / label >
2015-06-13 19:46:44 +02:00
< input type = "text" id = "node-input-twitter" >
< / div >
< div class = "form-row" >
2015-06-16 12:16:29 +02:00
< label for = "node-input-name" > < i class = "fa fa-tag" > < / i > < span data-i18n = "node-red:common.label.name" > < / span > < / label >
< input type = "text" id = "node-input-name" data-i18n = "[placeholder]node-red:common.label.name" >
2015-06-13 19:46:44 +02:00
< / div >
< / script >
< script type = "text/x-red" data-help-name = "twitter out" >
2016-02-12 15:05:10 +01:00
< p > Twitter out node. Tweets the < code > msg.payload< / code > .< / p >
2015-06-13 19:46:44 +02:00
< p > To send a Direct Message (DM) - use a payload like "D {username} {message}"< / p >
2016-02-12 15:05:10 +01:00
< p > If < code > msg.media< / code > exists and is a Buffer object, this node will treat it
2015-06-13 19:46:44 +02:00
as an image and attach it to the tweet.< / p >
2016-02-12 15:05:10 +01:00
< p > If < code > msg.params< / code > exists and is an object of name:value pairs,
2015-09-04 10:20:37 +02:00
this node will treat it as parameters for the update request.< / p >
2015-06-13 19:46:44 +02:00
< / script >
< script type = "text/javascript" >
RED.nodes.registerType('twitter out',{
category: 'social-output',
color:"#C0DEED",
defaults: {
twitter: {type:"twitter-credentials",required:true},
name: {value:"Tweet"}
},
inputs:1,
outputs:0,
icon: "twitter.png",
align: "right",
label: function() {
return this.name;
}
});
< / script >