SHOW:
|
|
- or go back to the newest paste.
1 | // ==UserScript== | |
2 | // @name Detect new comments on Hashtable's blog | |
3 | // @namespace http://h16free.pltplp.net/ | |
4 | - | // @version 0.1 |
4 | + | // @version 0.2 |
5 | - | // @description enter something useful |
5 | + | // @description Detect new comments since last visit on h16free.com blog. This version supports comments on multiple pages |
6 | // @match http://h16free.com/* | |
7 | // @copyright 2013, Etienne Bernard | |
8 | // ==/UserScript== | |
9 | ||
10 | // a function that loads jQuery and calls a callback function when jQuery has finished loading | |
11 | function addJQuery(callback) { | |
12 | var script = document.createElement("script"); | |
13 | script.setAttribute("src", "//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"); | |
14 | script.addEventListener('load', function() { | |
15 | var script = document.createElement("script"); | |
16 | script.textContent = "window.jQ=jQuery.noConflict(true);(" + callback.toString() + ")();"; | |
17 | document.body.appendChild(script); | |
18 | }, false); | |
19 | document.body.appendChild(script); | |
20 | } | |
21 | ||
22 | // the guts of this userscript | |
23 | function main() { | |
24 | ||
25 | var cookies; | |
26 | var readCookie = function(name,c,C,i){ | |
27 | if(cookies){ return cookies[name]; } | |
28 | c = document.cookie.split('; '); | |
29 | cookies = {}; | |
30 | for(i=c.length-1; i>=0; i--){ | |
31 | C = c[i].split('='); | |
32 | cookies[C[0]] = C[1]; | |
33 | } | |
34 | return cookies[name]; | |
35 | }; | |
36 | ||
37 | var articleId = jQ('article.entry-plain').attr('id'); | |
38 | if (articleId) { | |
39 | articleId = articleId.substr(5); | |
40 | - | var cookieName = 'post' + articleId; |
40 | + | // Get comments' page |
41 | var hr = jQ('article.comment-block:first header a').attr('href'); | |
42 | - | var cookie = readCookie(cookieName); |
42 | + | var commentPage = parseInt(hr.replace(/#.*/, '').replace(/^.*comment-page-/, ''), 10); |
43 | var cookieName = 'lastVisits'; | |
44 | - | var lastViewed = parseInt(cookie, 10); |
44 | + | |
45 | var cookie = readCookie('lastVisits'); | |
46 | - | var t = new Date(jQ(this).attr('datetime')) |
46 | + | var lastVisits = {}; |
47 | if (cookie !== undefined) { | |
48 | lastVisits = JSON.parse(cookie); | |
49 | } | |
50 | // Get last visit time | |
51 | var key = 'p' + articleId + '-' + commentPage; | |
52 | - | } |
52 | + | var lastViewed = lastVisits[key]; |
53 | - | document.cookie = cookieName + '=' + (new Date().getTime()) + ';path=/;expires=Tue, 31 Dec 2019 23:00:00 GMT'; |
53 | + | if (lastViewed !== undefined) { |
54 | // Mark as new | |
55 | jQ('article.comment-block > header > a > time').each(function() { | |
56 | var t = new Date(jQ(this).attr('datetime')); | |
57 | t = t.getTime() - 7200000; // Fix timezone | |
58 | if (t > lastViewed) { | |
59 | jQ(this).parents('article').parent('li').css('outline', '2px dotted red'); | |
60 | } | |
61 | }); | |
62 | } | |
63 | lastVisits[key] = new Date().getTime(); | |
64 | // Set cookie for next time | |
65 | document.cookie = cookieName + '=' + JSON.stringify(lastVisits) + ';path=/;expires=Tue, 31 Dec 2019 23:00:00 GMT'; | |
66 | } | |
67 | } | |
68 | ||
69 | // load jQuery and execute the main function | |
70 | addJQuery(main); |