Add hourly updates from @sifen_trackbot to event timer
This is VERY hackish, it was literally a "gee wouldn't it be cool if it could do this? *whip out editor and start coding like a madman*" things. But it works (for now). Needs a lot of future proofing (and general rewriting) though.
This commit is contained in:
parent
679ab68e2e
commit
0953aa809b
4 changed files with 398 additions and 0 deletions
333
web_app/js/external/twitterFetcher.js
vendored
Normal file
333
web_app/js/external/twitterFetcher.js
vendored
Normal file
|
@ -0,0 +1,333 @@
|
|||
/*********************************************************************
|
||||
* #### Twitter Post Fetcher v13.0 ####
|
||||
* Coded by Jason Mayes 2015. A present to all the developers out there.
|
||||
* www.jasonmayes.com
|
||||
* Please keep this disclaimer with my code if you use it. Thanks. :-)
|
||||
* Got feedback or questions, ask here:
|
||||
* http://www.jasonmayes.com/projects/twitterApi/
|
||||
* Github: https://github.com/jasonmayes/Twitter-Post-Fetcher
|
||||
* Updates will be posted to this site.
|
||||
*********************************************************************/
|
||||
(function(root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as an anonymous module.
|
||||
define([], factory);
|
||||
} else if (typeof exports === 'object') {
|
||||
// Node. Does not work with strict CommonJS, but
|
||||
// only CommonJS-like environments that support module.exports,
|
||||
// like Node.
|
||||
module.exports = factory();
|
||||
} else {
|
||||
// Browser globals.
|
||||
factory();
|
||||
}
|
||||
}(this, function() {
|
||||
var domNode = '';
|
||||
var maxTweets = 20;
|
||||
var parseLinks = true;
|
||||
var queue = [];
|
||||
var inProgress = false;
|
||||
var printTime = true;
|
||||
var printUser = true;
|
||||
var formatterFunction = null;
|
||||
var supportsClassName = true;
|
||||
var showRts = true;
|
||||
var customCallbackFunction = null;
|
||||
var showInteractionLinks = true;
|
||||
var showImages = false;
|
||||
var targetBlank = true;
|
||||
var lang = 'en';
|
||||
var permalinks = true;
|
||||
var script = null;
|
||||
var scriptAdded = false;
|
||||
|
||||
function handleTweets(tweets){
|
||||
if (customCallbackFunction === null) {
|
||||
var x = tweets.length;
|
||||
var n = 0;
|
||||
var element = document.getElementById(domNode);
|
||||
var html = '<ul>';
|
||||
while(n < x) {
|
||||
html += '<li>' + tweets[n] + '</li>';
|
||||
n++;
|
||||
}
|
||||
html += '</ul>';
|
||||
element.innerHTML = html;
|
||||
} else {
|
||||
customCallbackFunction(tweets);
|
||||
}
|
||||
}
|
||||
|
||||
function strip(data) {
|
||||
return data.replace(/<b[^>]*>(.*?)<\/b>/gi, function(a,s){return s;})
|
||||
.replace(/class=".*?"|data-query-source=".*?"|dir=".*?"|rel=".*?"/gi,
|
||||
'');
|
||||
}
|
||||
|
||||
function targetLinksToNewWindow(el) {
|
||||
var links = el.getElementsByTagName('a');
|
||||
for (var i = links.length - 1; i >= 0; i--) {
|
||||
links[i].setAttribute('target', '_blank');
|
||||
}
|
||||
}
|
||||
|
||||
function getElementsByClassName (node, classname) {
|
||||
var a = [];
|
||||
var regex = new RegExp('(^| )' + classname + '( |$)');
|
||||
var elems = node.getElementsByTagName('*');
|
||||
for (var i = 0, j = elems.length; i < j; i++) {
|
||||
if(regex.test(elems[i].className)){
|
||||
a.push(elems[i]);
|
||||
}
|
||||
}
|
||||
return a;
|
||||
}
|
||||
|
||||
function extractImageUrl(image_data) {
|
||||
if (image_data !== undefined) {
|
||||
var data_src = image_data.innerHTML.match(/data-srcset="([A-z0-9%_\.-]+)/i)[0];
|
||||
return decodeURIComponent(data_src).split('"')[1];
|
||||
}
|
||||
}
|
||||
|
||||
var twitterFetcher = {
|
||||
fetch: function(config) {
|
||||
if (config.maxTweets === undefined) {
|
||||
config.maxTweets = 20;
|
||||
}
|
||||
if (config.enableLinks === undefined) {
|
||||
config.enableLinks = true;
|
||||
}
|
||||
if (config.showUser === undefined) {
|
||||
config.showUser = true;
|
||||
}
|
||||
if (config.showTime === undefined) {
|
||||
config.showTime = true;
|
||||
}
|
||||
if (config.dateFunction === undefined) {
|
||||
config.dateFunction = 'default';
|
||||
}
|
||||
if (config.showRetweet === undefined) {
|
||||
config.showRetweet = true;
|
||||
}
|
||||
if (config.customCallback === undefined) {
|
||||
config.customCallback = null;
|
||||
}
|
||||
if (config.showInteraction === undefined) {
|
||||
config.showInteraction = true;
|
||||
}
|
||||
if (config.showImages === undefined) {
|
||||
config.showImages = false;
|
||||
}
|
||||
if (config.linksInNewWindow === undefined) {
|
||||
config.linksInNewWindow = true;
|
||||
}
|
||||
if (config.showPermalinks === undefined) {
|
||||
config.showPermalinks = true;
|
||||
}
|
||||
|
||||
if (inProgress) {
|
||||
queue.push(config);
|
||||
} else {
|
||||
inProgress = true;
|
||||
|
||||
domNode = config.domId;
|
||||
maxTweets = config.maxTweets;
|
||||
parseLinks = config.enableLinks;
|
||||
printUser = config.showUser;
|
||||
printTime = config.showTime;
|
||||
showRts = config.showRetweet;
|
||||
formatterFunction = config.dateFunction;
|
||||
customCallbackFunction = config.customCallback;
|
||||
showInteractionLinks = config.showInteraction;
|
||||
showImages = config.showImages;
|
||||
targetBlank = config.linksInNewWindow;
|
||||
permalinks = config.showPermalinks;
|
||||
|
||||
var head = document.getElementsByTagName('head')[0];
|
||||
if (script !== null) {
|
||||
head.removeChild(script);
|
||||
}
|
||||
script = document.createElement('script');
|
||||
script.type = 'text/javascript';
|
||||
script.src = 'https://cdn.syndication.twimg.com/widgets/timelines/' +
|
||||
config.id + '?&lang=' + (config.lang || lang) +
|
||||
'&callback=twitterFetcher.callback&' +
|
||||
'suppress_response_codes=true&rnd=' + Math.random();
|
||||
head.appendChild(script);
|
||||
}
|
||||
},
|
||||
callback: function(data) {
|
||||
var div = document.createElement('div');
|
||||
div.innerHTML = data.body;
|
||||
if (typeof(div.getElementsByClassName) === 'undefined') {
|
||||
supportsClassName = false;
|
||||
}
|
||||
|
||||
var tweets = [];
|
||||
var authors = [];
|
||||
var times = [];
|
||||
var images = [];
|
||||
var rts = [];
|
||||
var tids = [];
|
||||
var permalinksURL = [];
|
||||
var x = 0;
|
||||
|
||||
if (supportsClassName) {
|
||||
var tmp = div.getElementsByClassName('tweet');
|
||||
while (x < tmp.length) {
|
||||
if (tmp[x].getElementsByClassName('retweet-credit').length > 0) {
|
||||
rts.push(true);
|
||||
} else {
|
||||
rts.push(false);
|
||||
}
|
||||
if (!rts[x] || rts[x] && showRts) {
|
||||
tweets.push(tmp[x].getElementsByClassName('e-entry-title')[0]);
|
||||
tids.push(tmp[x].getAttribute('data-tweet-id'));
|
||||
authors.push(tmp[x].getElementsByClassName('p-author')[0]);
|
||||
times.push(tmp[x].getElementsByClassName('dt-updated')[0]);
|
||||
permalinksURL.push(tmp[x].getElementsByClassName('permalink')[0]);
|
||||
if (tmp[x].getElementsByClassName('inline-media')[0] !== undefined) {
|
||||
images.push(tmp[x].getElementsByClassName('inline-media')[0]);
|
||||
} else {
|
||||
images.push(undefined);
|
||||
}
|
||||
}
|
||||
x++;
|
||||
}
|
||||
} else {
|
||||
var tmp = getElementsByClassName(div, 'tweet');
|
||||
while (x < tmp.length) {
|
||||
tweets.push(getElementsByClassName(tmp[x], 'e-entry-title')[0]);
|
||||
tids.push(tmp[x].getAttribute('data-tweet-id'));
|
||||
authors.push(getElementsByClassName(tmp[x], 'p-author')[0]);
|
||||
times.push(getElementsByClassName(tmp[x], 'dt-updated')[0]);
|
||||
permalinksURL.push(getElementsByClassName(tmp[x], 'permalink')[0]);
|
||||
if (getElementsByClassName(tmp[x], 'inline-media')[0] !== undefined) {
|
||||
images.push(getElementsByClassName(tmp[x], 'inline-media')[0]);
|
||||
} else {
|
||||
images.push(undefined);
|
||||
}
|
||||
|
||||
if (getElementsByClassName(tmp[x], 'retweet-credit').length > 0) {
|
||||
rts.push(true);
|
||||
} else {
|
||||
rts.push(false);
|
||||
}
|
||||
x++;
|
||||
}
|
||||
}
|
||||
|
||||
if (tweets.length > maxTweets) {
|
||||
tweets.splice(maxTweets, (tweets.length - maxTweets));
|
||||
authors.splice(maxTweets, (authors.length - maxTweets));
|
||||
times.splice(maxTweets, (times.length - maxTweets));
|
||||
rts.splice(maxTweets, (rts.length - maxTweets));
|
||||
images.splice(maxTweets, (images.length - maxTweets));
|
||||
permalinksURL.splice(maxTweets, (permalinksURL.length - maxTweets));
|
||||
}
|
||||
|
||||
var arrayTweets = [];
|
||||
var x = tweets.length;
|
||||
var n = 0;
|
||||
while(n < x) {
|
||||
if (typeof(formatterFunction) !== 'string') {
|
||||
var datetimeText = times[n].getAttribute('datetime');
|
||||
var newDate = new Date(times[n].getAttribute('datetime')
|
||||
.replace(/-/g,'/').replace('T', ' ').split('+')[0]);
|
||||
var dateString = formatterFunction(newDate, datetimeText);
|
||||
times[n].setAttribute('aria-label', dateString);
|
||||
|
||||
if (tweets[n].innerText) {
|
||||
// IE hack.
|
||||
if (supportsClassName) {
|
||||
times[n].innerText = dateString;
|
||||
} else {
|
||||
var h = document.createElement('p');
|
||||
var t = document.createTextNode(dateString);
|
||||
h.appendChild(t);
|
||||
h.setAttribute('aria-label', dateString);
|
||||
times[n] = h;
|
||||
}
|
||||
} else {
|
||||
times[n].textContent = dateString;
|
||||
}
|
||||
}
|
||||
var op = '';
|
||||
if (parseLinks) {
|
||||
if (targetBlank) {
|
||||
targetLinksToNewWindow(tweets[n]);
|
||||
if (printUser) {
|
||||
targetLinksToNewWindow(authors[n]);
|
||||
}
|
||||
}
|
||||
if (printUser) {
|
||||
op += '<div class="user">' + strip(authors[n].innerHTML) +
|
||||
'</div>';
|
||||
}
|
||||
op += '<p class="tweet">' + strip(tweets[n].innerHTML) + '</p>';
|
||||
if (printTime) {
|
||||
if (permalinks) {
|
||||
op += '<p class="timePosted"><a href="' + permalinksURL[n] +
|
||||
'">' + times[n].getAttribute('aria-label') + '</a></p>';
|
||||
} else {
|
||||
op += '<p class="timePosted">' +
|
||||
times[n].getAttribute('aria-label') + '</p>';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (tweets[n].innerText) {
|
||||
if (printUser) {
|
||||
op += '<p class="user">' + authors[n].innerText + '</p>';
|
||||
}
|
||||
op += '<p class="tweet">' + tweets[n].innerText + '</p>';
|
||||
if (printTime) {
|
||||
op += '<p class="timePosted">' + times[n].innerText + '</p>';
|
||||
}
|
||||
|
||||
} else {
|
||||
if (printUser) {
|
||||
op += '<p class="user">' + authors[n].textContent + '</p>';
|
||||
}
|
||||
op += '<p class="tweet">' + tweets[n].textContent + '</p>';
|
||||
if (printTime) {
|
||||
op += '<p class="timePosted">' + times[n].textContent + '</p>';
|
||||
}
|
||||
}
|
||||
}
|
||||
if (showInteractionLinks) {
|
||||
op += '<p class="interact"><a href="https://twitter.com/intent/' +
|
||||
'tweet?in_reply_to=' + tids[n] + '" class="twitter_reply_icon"' +
|
||||
(targetBlank ? ' target="_blank">' : '>') +
|
||||
'Reply</a><a href="https://twitter.com/intent/retweet?tweet_id=' +
|
||||
tids[n] + '" class="twitter_retweet_icon"' +
|
||||
(targetBlank ? ' target="_blank">' : '>') + 'Retweet</a>' +
|
||||
'<a href="https://twitter.com/intent/favorite?tweet_id=' +
|
||||
tids[n] + '" class="twitter_fav_icon"' +
|
||||
(targetBlank ? ' target="_blank">' : '>') + 'Favorite</a></p>';
|
||||
}
|
||||
|
||||
if (showImages && images[n] !== undefined) {
|
||||
op += '<div class="media">' +
|
||||
'<img src="' + extractImageUrl(images[n]) +
|
||||
'" alt="Image from tweet" />' + '</div>';
|
||||
}
|
||||
|
||||
arrayTweets.push(op);
|
||||
n++;
|
||||
}
|
||||
handleTweets(arrayTweets);
|
||||
inProgress = false;
|
||||
|
||||
if (queue.length > 0) {
|
||||
twitterFetcher.fetch(queue[0]);
|
||||
queue.splice(0,1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// It must be a global variable because it will be called by JSONP.
|
||||
window.twitterFetcher = twitterFetcher;
|
||||
|
||||
return twitterFetcher;
|
||||
}));
|
Loading…
Add table
Add a link
Reference in a new issue