/ Published in: JavaScript
Expand |
Embed | Plain Text
// ==UserScript== // @name Easy Flair // @namespace http://www.reddit.com/r/Assistance/ // @description Modify a user's flair easily. // @author RogueDarkJedi // @homepage http://gamespotting.net/sandbox/easyFlairGen.php // @version 1.8 // @include http://www.reddit.com/r/Assistance/comments/* // ==/UserScript== function getUserHash() { var saveHash = document.getElementById("saveHash"); saveHash.innerHTML = reddit.modhash; } var easyFlair = { user: "", isOpen: false, style: "", modHash: "", userElement: null, config: { /* Subreddit name */ thisSub: "Assistance", individualFlairs: false, width: 32, height: 32, flairSheet: "", flairs: [], }, addGlobalRule : function(css) { easyFlair.style += css + "\n"; }, injectStyle : function() { var style, head = document.getElementsByTagName('head')[0]; if (!head) return; style = document.createElement('style'); style.type = 'text/css'; style.innerHTML = easyFlair.style; head.appendChild(style); }, closePanel : function() { var flairPanel = document.getElementById("flairPanel"); flairPanel.setAttribute("class", "easyFlair hideFlair"); easyFlair.isOpen = false; easyFlair.user = ""; easyFlair.userElement = null; }, setUserFlair: function(event) { event.preventDefault(); var cssType = event.target.getAttribute("class").toString().replace("flair-", ""); var theUser = easyFlair.user; var userRequested = easyFlair.userElement; //alert(cssType + " " + easyFlair.user + " " + easyFlair.modHash); GM_xmlhttpRequest({ method: "POST", url: "http://www.reddit.com/api/flair", data: "css_class=" + cssType + "&id=%23flair-4xc05&name="+ easyFlair.user +"&r="+ easyFlair.thisSub +"&renderstyle=html&uh=" + easyFlair.modHash + "", headers: { "Content-Type": "application/x-www-form-urlencoded" }, onerror: function(response) { alert("Error! Could not give flair to " + theUser + "! Reddit didn't respond!"); easyFlair.closePanel(); }, onload: function(response) { if(response.status == 404) alert("Error! Could not give flair to " + theUser + "! Reddit didn't respond!"); else { var flairResponse = document.createElement("span"); flairResponse.setAttribute("class", "flair flair-" + cssType); userRequested.appendChild(flairResponse); } easyFlair.closePanel(); } }); }, mouseOutHide : function(event) { event.stopPropagation(); event.cancelBubble = true; if(easyFlair.isOpen == false || (event.relatedTarget == null || event.relatedTarget.parentNode.id == "flairPanel" || event.relatedTarget.parentNode.id == "flairOptions" || event.relatedTarget.id == "flairPanel")) return; easyFlair.closePanel(); }, openPanel: function(event) { easyFlair.isOpen = true; easyFlair.userElement = event.target; /* Set object position to where the cursor is in this event */ var flairPanelGrab = document.getElementById("flairPanel"); flairPanelGrab.setAttribute("class", "easyFlair"); var xpos = event.pageX, ypos = event.pageY; flairPanelGrab.setAttribute("style", "top: " + ypos + "px; left: " + xpos + "px;"); }, rollOverUser : function(event) { if(event.target.nodeName == "A" && easyFlair.isOpen == false) { /* Check to see if it is a user */ var link = event.target.href; if(((/reddit.com\/user\/*/i)).exec(link) != null) { /* Save username */ easyFlair.user = link.toString().replace((/^http:\/\/www.reddit.com\/user\/+/), "", "i").replace("/", ""); easyFlair.openPanel(event); } } }, inject : function() { /* Pure hax */ var saveHash = document.createElement("div"); saveHash.setAttribute("class","hideFlair"); saveHash.setAttribute("id", "saveHash"); document.body.appendChild(saveHash); var script = document.createElement('script'); script.appendChild(document.createTextNode('('+ getUserHash +')();')); (document.body || document.head || document.documentElement).appendChild(script); /* Create the flair panel */ var panel = document.createElement("div"); panel.setAttribute("id", "flairPanel"); panel.setAttribute("class","easyFlair hideFlair"); var panelFlairs = "<div id='flairOptions'>"; for(var i = 0; i < easyFlair.config.flairs.length; ++i) panelFlairs += "<a class='flair-" + easyFlair.config.flairs[i] + "'> </a>"; panel.innerHTML = panelFlairs + "</div>"; document.body.appendChild(panel); easyFlair.addGlobalRule(".easyFlair {border: 1px solid #E1B000; background-color: #FFFDCC; position: absolute; text-align: center; z-index: 999; }"); easyFlair.addGlobalRule(".hideFlair { display: none !important; }"); if(!easyFlair.config.individualFlairs) { easyFlair.addGlobalRule("#flairOptions { padding: 0 !important; text-indent: 0px !important; vertical-align: inherit !important; }"); easyFlair.addGlobalRule("#flairOptions a { background-image: url("+ easyFlair.config.flairSheet +"); display: inline-block !important; width: "+easyFlair.config.width+"px !important; height: "+easyFlair.config.height+"px !important;}"); } easyFlair.injectStyle(); easyFlair.modHash = document.getElementById("saveHash").innerHTML; document.getElementById("flairOptions").addEventListener("click", easyFlair.setUserFlair, false); document.addEventListener("mouseover", easyFlair.rollOverUser, false); document.getElementById("flairPanel").addEventListener("mouseout", easyFlair.mouseOutHide, false); }, getFlair : function() { var styleSheet = "http://www.reddit.com/r/"+ easyFlair.config.thisSub +"/stylesheet.css"; GM_xmlhttpRequest({ method: "GET", url: styleSheet, onerror: function(response) { alert("Error! Could not get flair! Reddit didn't respond!"); }, onload: function(response) { var cssData = response.responseText; /* The following was derived from http://userscripts.org/scripts/review/94898 */ var pos = cssData.indexOf(".flair", end), end = 0, i = 0; /* Getting image */ if(pos != -1) { end = cssData.indexOf(")", pos); var bgcode = cssData.slice(pos, end).toString(); pos = bgcode.indexOf("htt"); easyFlair.config.flairSheet = bgcode.slice(pos).toString(); /* Seeing if each .flair- has a background or if it's done in just .flair */ if(easyFlair.config.flairSheet.length <= 10) easyFlair.config.individualFlairs = true; } pos = end = 0; /* Getting flairs */ while ((pos = cssData.indexOf(".flair-", end)) != -1) { end = cssData.indexOf(" {", pos); var flairRule = cssData.slice(pos, end); var removeOtherRules = flairRule.indexOf(" "); if(removeOtherRules != -1) flairRule = flairRule.slice(0, removeOtherRules); var newFlairRule = flairRule.replace(".flair-", "").replace(" ", "").replace(",", "").toString(); /* Check for duplicates */ if(easyFlair.config.flairs.indexOf(newFlairRule) == -1) easyFlair.config.flairs[i++] = newFlairRule; } easyFlair.inject(); } }); }, init : function() { /* Only execute if we are logged in */ if(!document.getElementById("mail")) return; easyFlair.getFlair(); } }; easyFlair.init();
You need to login to post a comment.
