<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel rdf:about="https://let.hatelabo.jp/austinburk/rss">
    <link>https://let.hatelabo.jp/austinburk/rss</link>
    <description></description>
    <title>Bookmarklets from austinburk</title>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="https://let.hatelabo.jp/austinburk/let/hJmc98yUje17"/>
        <rdf:li rdf:resource="https://let.hatelabo.jp/austinburk/let/hLHU6PPgg9Ya"/>
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="https://let.hatelabo.jp/austinburk/let/hJmc98yUje17">
    <link>https://let.hatelabo.jp/austinburk/let/hJmc98yUje17</link>
    <dc:date>2018-06-01T20:46:28Z</dc:date>
    <description></description>
    <dc:creator>austinburk</dc:creator>
    <title>[Let] CORS bypass example (for fetching user blocklist)</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Faustinburk%2Flet%2FhJmc98yUje17.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;CORS bypass example (for fetching user blocklist)&lt;/a&gt;&lt;pre&gt;// ==UserScript==
// @title        CORS bypass example (for fetching user blocklist)
// @name        CORS bypass example (for fetching user blocklist)
// @namespace   id:austinburk
// @include     http://h.hatena.ne.jp/*
// @version     1
// @grant	GM.xmlHttpRequest
// @run-at      document-idle
// ==/UserScript==

var exampleXHR = GM.xmlHttpRequest({
  method: &amp;quot;GET&amp;quot;,
  url: &amp;quot;http://n.hatena.ne.jp/setting/ignore.json&amp;quot;,
  onload: function(response) {
    alert(response.responseText);
  }
});

&lt;/pre&gt;</content:encoded>
  </item>
  <item rdf:about="https://let.hatelabo.jp/austinburk/let/hLHU6PPgg9Ya">
    <link>https://let.hatelabo.jp/austinburk/let/hLHU6PPgg9Ya</link>
    <dc:date>2018-05-10T00:43:08Z</dc:date>
    <description>Filter spam using data from Haiku Anti-Spam. Very first (beta/testing/unreleased) version, soon to be improved.</description>
    <dc:creator>austinburk</dc:creator>
    <title>[Let] Sudohaiku</title>
    <content:encoded>&lt;a href="javascript:%22https%3A%2F%2Flet.st-hatelabo.com%2Faustinburk%2Flet%2FhLHU6PPgg9Ya.bookmarklet.js%20%28arg%29%22.replace%28%2F%28%5CS%2B%29%5Cs%2B%28%5CS%2A%29%2F%2Cfunction%28s%2Curl%2Carg%29%7Bs%3Ddocument.createElement%28%22script%22%29%3Bs.charset%3D%22utf-8%22%3Bs.src%3Durl%2B%22%3Fs%3D%22%2BencodeURIComponent%28arg%29%3Bdocument.body.appendChild%28s%29%7D%29%3Bvoid%280%29%3B"&gt;Sudohaiku&lt;/a&gt;&lt;pre&gt;// ==UserScript==
// @name        Sudohaiku
// @title Sudohaiku
// @namespace   apburk@lightni.ng
// @description Filter spam using data from Haiku Anti-Spam. Very first (beta/testing/unreleased) version, soon to be improved.
// @include     http://h.hatena.ne.jp/*
// @version     1
// @run-at      document-idle
// ==/UserScript==



//document.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, addNewHaikuListener);
function addNewHaikuListener() {

    var userScores;

    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function() {
        if (this.readyState == 4 &amp;amp;&amp;amp; this.status == 200) {
            userScores = JSON.parse(this.responseText);

        }
    };
    xmlhttp.open(&amp;quot;GET&amp;quot;, &amp;quot;https://haikuantispam.lightni.ng/api/recent_scores.json&amp;quot;, false);
    xmlhttp.send();



    var initialEntryList = document.querySelector(&amp;quot;body#index div#container div#main div.stream div.streambody div.entries div.tl-entry-list&amp;quot;);
    initialEntryList.childNodes.forEach(function(entry) {
        if (entry.querySelector(&amp;quot;div.list-body&amp;quot;) != null) {
            username = entry.querySelector(&amp;quot;div.list-body &amp;gt; div.info &amp;gt; span.username &amp;gt; a&amp;quot;).title.substring(3);

            if (username in userScores &amp;amp;&amp;amp; userScores[username] &amp;gt;= 5) {
                console.log(&amp;quot;Hid spam from &amp;quot; +username);
                entry.innerHTML = &amp;quot;&amp;lt;i&amp;gt;Spam hidden (id:&amp;quot; + username + &amp;quot; has avg spam score &amp;quot; + userScores[username] + &amp;quot; &amp;gt;= 5)&amp;lt;/i&amp;gt;&amp;quot;;
                entry.style.padding = &amp;quot;0px 0px 0px 50px&amp;quot;;
                entry.style[&amp;quot;font-size&amp;quot;] = &amp;quot;10px&amp;quot;;

            }
        }
    });

    var haikuList = document.querySelector(&amp;quot;body#index div#container div#main div.stream div.streambody div.entries div.tl-entry-list&amp;quot;);
    haikuList.addEventListener( 'DOMNodeInserted', function ( event ) {

        if( event.target.parentNode == haikuList ) {
            [].forEach.call(event.target.children, function(element) {
                username = element.querySelector(&amp;quot;div.list-body &amp;gt; div.info &amp;gt; span.username &amp;gt; a&amp;quot;).title.substring(3);

                if (username in userScores &amp;amp;&amp;amp; userScores[username] &amp;gt;= 5) {
                    console.log(&amp;quot;Hid spam from &amp;quot; +username);
                    element.innerHTML = &amp;quot;&amp;lt;i&amp;gt;Spam hidden (id:&amp;quot; + username + &amp;quot; has avg spam score &amp;quot; + userScores[username] + &amp;quot; &amp;gt;= 5)&amp;lt;/i&amp;gt;&amp;quot;;
                    element.style.padding = &amp;quot;0px 0px 0px 50px&amp;quot;;
                    element.style[&amp;quot;font-size&amp;quot;] = &amp;quot;10px&amp;quot;;
                }
            });
        }
    }, false );
}
addNewHaikuListener();&lt;/pre&gt;</content:encoded>
  </item>
</rdf:RDF>
