diff --git a/js/bdapi.js b/js/bdapi.js index 6fc4a82..dd85970 100644 --- a/js/bdapi.js +++ b/js/bdapi.js @@ -8,37 +8,76 @@ * Plugin Template: https://gist.github.com/Jiiks/71edd5af0beafcd08956 */ +function BdApi() {} + //Joins a server //code = server invite code BdApi.joinServer = function(code) { - + opublicServers.joinServer(code); }; //Inject CSS to document head //id = id of element //css = custom css BdApi.injectCSS = function(id, css) { - + $("head").append('') + $("#" + id).html(css); }; //Clear css/remove any element //id = id of element BdApi.clearCSS = function(id) { - + $("#"+id).remove(); }; //Get another plugin //name = name of plugin BdApi.getPlugin = function(name) { - + if(bdplugins.hasOwnProperty(name)) { + return bdplugins[name]["plugin"]; + } + return null; }; //Get ipc for reason BdApi.getIpc = function() { - + return betterDiscordIPC; }; //Get BetterDiscord Core BdApi.getCore = function() { - + return mainCore; +}; + +//Attempts to get user id by username +//Name = username +//Since Discord hides users if there's too many, this will often fail +BdApi.getUserIdByName = function(name) { + var users = $(".member-username"); + + for(var i = 0 ; i < users.length ; i++) { + var user = $(users[i]); + if(user.text() == name) { + var avatarUrl = user.closest(".member").find(".avatar-small").css("background-image"); + return avatarUrl.match(/\d+/); + } + } + return null; +}; + +//Attempts to get username by id +//ID = user id +//Since Discord hides users if there's too many, this will often fail +var gg; +BdApi.getUserNameById = function(id) { + var users = $(".avatar-small"); + + for(var i = 0 ; i < users.length ; i++) { + var user = $(users[i]); + var url = user.css("background-image"); + if(id == url.match(/\d+/)) { + return user.parent().find(".member-username").text(); + } + } + return null; }; \ No newline at end of file diff --git a/js/core.js b/js/core.js index 5baac4a..28e289f 100644 --- a/js/core.js +++ b/js/core.js @@ -1,22 +1,15 @@ /* BetterDiscordApp Core JavaScript - * Version: 1.5 + * Version: 1.52 * Author: Jiiks | http://jiiks.net * Date: 27/08/2015 - 16:36 * Last Update: 24/010/2015 - 17:27 * https://github.com/Jiiks/BetterDiscordApp */ -/* - * =Changelog= - * -v1.5 - * --Synchronized loading - * --jsv 1.3 - * --Voice mode - */ -var settingsPanel, emoteModule, utils, quickEmoteMenu, opublicServers, voiceMode; -var jsVersion = 1.3; -var supportedVersion = "0.1.5"; +var settingsPanel, emoteModule, utils, quickEmoteMenu, opublicServers, voiceMode, pluginModule, themeModule; +var jsVersion = 1.54; +var supportedVersion = "0.2.3"; var mainObserver; @@ -24,38 +17,123 @@ var twitchEmoteUrlStart = "https://static-cdn.jtvnw.net/emoticons/v1/"; var twitchEmoteUrlEnd = "/1.0"; var ffzEmoteUrlStart = "https://cdn.frankerfacez.com/emoticon/"; var ffzEmoteUrlEnd = "/1"; -var bttvEmoteUrlStart = ""; -var bttvEmoteUrlEnd = ""; +var bttvEmoteUrlStart = "https://cdn.betterttv.net/emote/"; +var bttvEmoteUrlEnd = "/1x"; var mainCore; var settings = { - "Save logs locally": { "id": "bda-gs-0", "info": "Saves chat logs locally", "implemented":false }, - "Public Servers": { "id": "bda-gs-1", "info": "BETA : Display public servers button", "implemented":true}, - "Minimal Mode": { "id": "bda-gs-2", "info": "Hide elements and reduce the size of elements.", "implemented":true}, - "Voice Mode": { "id": "bda-gs-4", "info": "Only show voice chat", "implemented":true}, - "Hide Channels": { "id": "bda-gs-3", "info": "Hide channels in minimal mode", "implemented":true}, - "Quick Emote Menu": { "id": "bda-es-0", "info": "Show quick emote menu for adding emotes", "implemented":true }, - "FrankerFaceZ Emotes": { "id": "bda-es-1", "info": "Show FrankerFaceZ Emotes", "implemented":true }, - "BetterTTV Emotes": { "id": "bda-es-2", "info": "Show BetterTTV Emotes", "implemented":true }, - "Emote Autocomplete": { "id": "bda-es-3", "info": "Autocomplete emote commands", "implemented":false }, - "Emote Auto Capitalization": { "id": "bda-es-4", "info": "Autocapitalize emote commands", "implemented":true }, - "Override Default Emotes": { "id": "bda-es-5", "info": "Override default emotes", "implemented":false } + "Save logs locally": { "id": "bda-gs-0", "info": "Saves chat logs locally", "implemented": false }, + "Public Servers": { "id": "bda-gs-1", "info": "Display public servers button", "implemented": true }, + "Minimal Mode": { "id": "bda-gs-2", "info": "Hide elements and reduce the size of elements.", "implemented": true }, + "Voice Mode": { "id": "bda-gs-4", "info": "Only show voice chat", "implemented": true }, + "Hide Channels": { "id": "bda-gs-3", "info": "Hide channels in minimal mode", "implemented": true }, + "Quick Emote Menu": { "id": "bda-es-0", "info": "Show quick emote menu for adding emotes", "implemented": true }, + "Show Emotes": { "id": "bda-es-7", "info": "Show any emotes", "implemented": true }, + "FrankerFaceZ Emotes": { "id": "bda-es-1", "info": "Show FrankerFaceZ Emotes", "implemented": true }, + "BetterTTV Emotes": { "id": "bda-es-2", "info": "Show BetterTTV Emotes", "implemented": true }, + "Emote Autocomplete": { "id": "bda-es-3", "info": "Autocomplete emote commands", "implemented": false }, + "Emote Auto Capitalization": { "id": "bda-es-4", "info": "Autocapitalize emote commands", "implemented": true }, + "Override Default Emotes": { "id": "bda-es-5", "info": "Override default emotes", "implemented": false }, + "Show Names": { "id": "bda-es-6", "info": "Show emote names on hover", "implemented": true } +} + +var links = { + "Jiiks.net": { "text": "Jiiks.net", "href": "http://jiiks.net", "target": "_blank" }, + "twitter": { "text": "Twitter", "href": "http://twitter.com/jiiksi", "target": "_blank" }, + "github": { "text": "Github", "href": "http://github.com/jiiks", "target": "_blank" } }; var defaultCookie = { - "version":jsVersion, - "bda-gs-0":false, - "bda-gs-1":true, - "bda-gs-2":false, - "bda-gs-3":false, - "bda-gs-4":false, - "bda-es-0":true, - "bda-es-1":false, - "bda-es-2":false, - "bda-es-3":false, - "bda-es-4":false, - "bda-es-5":true + "version": jsVersion, + "bda-gs-0": false, + "bda-gs-1": true, + "bda-gs-2": false, + "bda-gs-3": false, + "bda-gs-4": false, + "bda-es-0": true, + "bda-es-1": false, + "bda-es-2": false, + "bda-es-3": false, + "bda-es-4": false, + "bda-es-5": true, + "bda-es-6": true, + "bda-es-7": true, + "bda-jd": true +}; + +var bdchangelog = { + "changes": { + "favemotes": { + "title": "Favorite Emotes!", + "text": "You can now favorite emotes and have them listed in the quick emote menu!", + "img": "" + }, + "plugins": { + "title": "Plugins!", + "text": "Combined with Core 0.2.3, you can now write JavaScript plugins for Discord!", + "img": "" + }, + "settingsmenu": { + "title": "Settings Menu!", + "text": "New and improved settings menu!", + "img": "" + }, + "csseditor": { + "title": "New CSS Editor!", + "text": "New CSS Editor powered by CodeMirror!", + "img": "" + }, + "minimalmode": { + "title": "Minimal mode makeover!", + "text": "New and improved minimal mode!", + "img": "" + } + }, + "fixes": { + "reload": { + "title": "Reload Fix!", + "text": "Fixed an issue that caused Discord to crash on reload!", + "img": "" + }, + "eemotes": { + "title": "Edit Emotes!", + "text": "Edited messages now display emotes properly!", + "img": "" + }, + "pservers": { + "title": "Public Servers", + "text": "Public servers have been fixed!", + "img": "" + }, + "other": { + "title": "Bugfixes!", + "text": "Several smaller bugs fixed!", + "img": "" + } + }, + "upcoming": { + "ignore": { + "title": "Ignore User!", + "text": "Ignore users you don't like!", + "img": "" + }, + "themes": { + "title": "Custom themes!", + "text": "Write your own or download custom themes!", + "img": "" + }, + "favemotes": { + "title": "Favorite emotes!", + "text": "Add your favorite emote(s) to the quick emote menu!", + "img": "" + }, + "more": { + "title": "More Things!", + "text": "More things but probably not in the next version!", + "img": "" + } + } }; var settingsCookie = {}; @@ -64,18 +142,20 @@ function Core() {} Core.prototype.init = function() { + var self = this; + if(version < supportedVersion) { - alert("BetterDiscord v" + version + "(your version)" + " is not supported by the latest js("+jsVersion+"). Please download the latest version from GitHub."); + alert("BetterDiscord v" + version + "(your version)" + " is not supported by the latest js("+jsVersion+"). Please download the latest version from betterdiscord.net"); return; } utils = new Utils(); + utils.getHash(); emoteModule = new EmoteModule(); quickEmoteMenu = new QuickEmoteMenu(); voiceMode = new VoiceMode(); emoteModule.init(); - emoteModule.autoCapitalize(); this.initSettings(); this.initObserver(); @@ -83,32 +163,74 @@ Core.prototype.init = function() { //Incase were too fast function gwDefer() { console.log(new Date().getTime() + " Defer"); - if($(".guilds-wrapper").size() > 0) { + if($(".guilds-wrapper .guilds").children().length > 0) { console.log(new Date().getTime() + " Defer Loaded"); var guilds = $(".guilds li:first-child"); guilds.after($("
  • ", { id: "bd-pub-li", css: { "height": "20px", "display": settingsCookie["bda-gs-1"] == true ? "" : "none" } }).append($("
    ", { class: "guild-inner", css: { "height": "20px", "border-radius": "4px" } }).append($("").append($("
    ", { css: { "line-height": "20px", "font-size": "12px" }, text: "public", id: "bd-pub-button" }))))); - guilds.after($("
  • ", {id:"tc-settings-li"}).append($("
    ", { class: "guild-inner" }).append($("").append($("
    ", { class: "avatar-small", id: "tc-settings-button" }))))); + + var showChannelsButton = $("' + + '
    ' + + '
    ' + + '
    '; + + if(bdchangelog.changes != null) { + changeLog += '' + + '

    ' + + ' New Stuff' + + '

    ' + + '
      '; + + for(var change in bdchangelog.changes) { + change = bdchangelog.changes[change]; + + changeLog += '' + + '
    • ' + + ' '+change.title+'' + + '
      '+change.text+'
      ' + + '
    • '; + } + + changeLog += '
    '; + } + + if(bdchangelog.fixes != null) { + changeLog += '' + + '

    ' + + ' Fixed' + + '

    ' + + '
      '; + + for(var fix in bdchangelog.fixes) { + fix = bdchangelog.fixes[fix]; + + changeLog += '' + + '
    • ' + + ' '+fix.title+'' + + '
      '+fix.text+'
      ' + + '
    • '; + } + + changeLog += '
    '; + } + + if(bdchangelog.upcoming != null) { + changeLog += '' + + '

    ' + + ' Coming Soon' + + '

    ' + + '
      '; + + for(var upc in bdchangelog.upcoming) { + upc = bdchangelog.upcoming[upc]; + + changeLog += '' + + '
    • ' + + ' '+upc.title+'' + + '
      '+upc.text+'
      ' + + '
    • '; + } + + changeLog += '
    '; + } + + changeLog += '' + + '
    ' + + '
    ' + + ' ' + + '
    ' + + '
  • ' + + '
    '; + + return changeLog; +}; diff --git a/js/emotemodule.js b/js/emotemodule.js index c9b0948..3bced7d 100644 --- a/js/emotemodule.js +++ b/js/emotemodule.js @@ -18,15 +18,21 @@ var emotesBTTV = {}; var emotesTwitch = { "emotes": { "emote": { "image_id": 0 } } }; //for ide var subEmotesTwitch = {}; -//TODO Use emotesTwitch for autocap -var twitchAc = {"4head":"4Head","anele":"ANELE","argieb8":"ArgieB8","arsonnosexy":"ArsonNoSexy","asianglow":"AsianGlow","atgl":"AtGL","athenapms":"AthenaPMS","ativy":"AtIvy","atww":"AtWW","babyrage":"BabyRage","batchest":"BatChest","bcwarrior":"BCWarrior","biblethump":"BibleThump","bigbrother":"BigBrother","bionicbunion":"BionicBunion","blargnaut":"BlargNaut","bloodtrail":"BloodTrail","bort":"BORT","brainslug":"BrainSlug","brokeback":"BrokeBack","buddhabar":"BuddhaBar","coolcat":"CoolCat","corgiderp":"CorgiDerp","cougarhunt":"CougarHunt","daesuppy":"DAESuppy","dansgame":"DansGame","dathass":"DatHass","datsheffy":"DatSheffy","dbstyle":"DBstyle","deexcite":"deExcite","deilluminati":"deIlluminati","dendiface":"DendiFace","dogface":"DogFace","doomguy":"DOOMGuy","eagleeye":"EagleEye","elegiggle":"EleGiggle","evilfetus":"EvilFetus","failfish":"FailFish","fpsmarksman":"FPSMarksman","frankerz":"FrankerZ","freakinstinkin":"FreakinStinkin","fungineer":"FUNgineer","funrun":"FunRun","fuzzyotteroo":"FuzzyOtterOO","gasjoker":"GasJoker","gingerpower":"GingerPower","grammarking":"GrammarKing","hassanchop":"HassanChop","heyguys":"HeyGuys","hotpokket":"HotPokket","humblelife":"HumbleLife","itsboshytime":"ItsBoshyTime","jebaited":"Jebaited","jkanstyle":"JKanStyle","joncarnage":"JonCarnage","kapow":"KAPOW","kappa":"Kappa","kappapride":"KappaPride","keepo":"Keepo","kevinturtle":"KevinTurtle","kippa":"Kippa","kreygasm":"Kreygasm","kzskull":"KZskull","mau5":"Mau5","mcat":"mcaT","mechasupes":"MechaSupes","mrdestructoid":"MrDestructoid","mvgame":"MVGame","nightbat":"NightBat","ninjatroll":"NinjaTroll","nonospot":"NoNoSpot","notatk":"NotATK","notlikethis":"NotLikeThis","omgscoots":"OMGScoots","onehand":"OneHand","opieop":"OpieOP","optimizeprime":"OptimizePrime","osbeaver":"OSbeaver","osbury":"OSbury","osdeo":"OSdeo","osfrog":"OSfrog","oskomodo":"OSkomodo","osrob":"OSrob","ossloth":"OSsloth","panicbasket":"panicBasket","panicvis":"PanicVis","pazpazowitz":"PazPazowitz","peopleschamp":"PeoplesChamp","permasmug":"PermaSmug","picomause":"PicoMause","pipehype":"PipeHype","pjharley":"PJHarley","pjsalt":"PJSalt","pmstwin":"PMSTwin","pogchamp":"PogChamp","poooound":"Poooound","praiseit":"PraiseIt","prchase":"PRChase","punchtrees":"PunchTrees","puppeyface":"PuppeyFace","raccattack":"RaccAttack","ralpherz":"RalpherZ","redcoat":"RedCoat","residentsleeper":"ResidentSleeper","ritzmitz":"RitzMitz","rulefive":"RuleFive","shadylulu":"ShadyLulu","shazam":"Shazam","shazamicon":"shazamicon","shazbotstix":"ShazBotstix","shibez":"ShibeZ","smorc":"SMOrc","smskull":"SMSkull","sobayed":"SoBayed","soonerlater":"SoonerLater","srihead":"SriHead","ssssss":"SSSsss","stonelightning":"StoneLightning","strawbeary":"StrawBeary","supervinlin":"SuperVinlin","swiftrage":"SwiftRage","tbbaconbiscuit":"tbBaconBiscuit","tbchickenbiscuit":"tbChickenBiscuit","tbquesarito":"tbQuesarito","tbsausagebiscuit":"tbSausageBiscuit","tbspicy":"tbSpicy","tbsriracha":"tbSriracha","tf2john":"TF2John","theking":"TheKing","theringer":"TheRinger","thetarfu":"TheTarFu","thething":"TheThing","thunbeast":"ThunBeast","tinyface":"TinyFace","toospicy":"TooSpicy","trihard":"TriHard","ttours":"TTours","uleetbackup":"UleetBackup","unclenox":"UncleNox","unsane":"UnSane","vaultboy":"VaultBoy","volcania":"Volcania","wholewheat":"WholeWheat","winwaker":"WinWaker","wtruck":"WTRuck","wutface":"WutFace","youwhy":"YouWHY"}; +function EmoteModule() { +} -function EmoteModule() {} +EmoteModule.prototype.init = function() { +}; -EmoteModule.prototype.init = function() {}; +EmoteModule.prototype.getBlacklist = function() { + $.getJSON("https://cdn.rawgit.com/Jiiks/betterDiscordApp/"+_hash+"/emotefilter.json", function(data) { bemotes = data.blacklist; }); +}; EmoteModule.prototype.obsCallback = function(mutation) { var self = this; + + if(!settingsCookie["bda-es-7"]) return; + for(var i = 0 ; i < mutation.addedNodes.length ; ++i) { var next = mutation.addedNodes.item(i); if(next) { @@ -50,10 +56,13 @@ EmoteModule.prototype.getNodes = function(node) { nodes.push(next); } + return nodes; }; -//TODO Functional titles +var bemotes = []; +var spoilered = []; + EmoteModule.prototype.injectEmote = function(node) { if(typeof emotesTwitch === 'undefined') return; @@ -61,62 +70,126 @@ EmoteModule.prototype.injectEmote = function(node) { if(!node.parentElement) return; var parent = node.parentElement; + if(parent.tagName != "SPAN") return; + + var edited = false; + + if($(parent.parentElement).hasClass("edited")) { + parent = parent.parentElement.parentElement.firstChild; //:D + edited = true; + } + + //if(!$(parent.parentElement).hasClass("markup") && !$(parent.parentElement).hasClass("message-content")) return; - var parentInnerHTML = parent.innerHTML; - var words = parentInnerHTML.split(/\s+/g); + function inject() { + if(!$(parent.parentElement).hasClass("markup") && !$(parent.parentElement).hasClass("message-content")) { return; } - if(!words) return; + var parentInnerHTML = parent.innerHTML; + var words = parentInnerHTML.split(/\s+/g); - words.some(function(word) { + if(!words) return; - if(word.length < 4) { - return; - } - - if(emotesTwitch.emotes.hasOwnProperty(word)) { - parentInnerHTML = parentInnerHTML.replace(word, "<\/img>"); - return; - } + words.some(function(word) { + + if(word.slice(0, 4) == "[!s]" ) { + + parentInnerHTML = parentInnerHTML.replace("[!s]", ""); + var markup = $(parent).parent(); + var reactId = markup.attr("data-reactid"); + + if(spoilered.indexOf(reactId) > -1) { + return; + } + + markup.addClass("spoiler"); + markup.on("click", function() { + $(this).removeClass("spoiler"); + spoilered.push($(this).attr("data-reactid")); + }); - if(typeof emotesFfz !== 'undefined' && settingsCookie["bda-es-1"]) { - if(emotesFfz.hasOwnProperty(word)) { - parentInnerHTML = parentInnerHTML.replace(word, "<\/img>"); return; } - } - - if(typeof emotesBTTV !== 'undefined' && settingsCookie["bda-es-2"]) { - if(emotesBTTV.hasOwnProperty(word)) { - parentInnerHTML = parentInnerHTML.replace(word, "<\/img>"); + + if(word.length < 4) { return; } - } - if (subEmotesTwitch.hasOwnProperty(word)) { - parentInnerHTML = parentInnerHTML.replace(word, "<\/img>"); - } - }); + if($.inArray(word, bemotes) != -1) return; - if(parent.parentElement == null) return; + if (emotesTwitch.emotes.hasOwnProperty(word)) { + var len = Math.round(word.length / 4); + parentInnerHTML = parentInnerHTML.replace(word, '' + word.substr(0, len) + '); + return; + } - var oldHeight = parent.parentElement.offsetHeight; - parent.innerHTML = parentInnerHTML; - var newHeight = parent.parentElement.offsetHeight; + if (typeof emotesFfz !== 'undefined' && settingsCookie["bda-es-1"]) { + if (emotesFfz.hasOwnProperty(word)) { + var len = Math.round(word.length / 4); + var name = word.substr(0, len) + "\uFDD9" + word.substr(len, len) + "\uFDD9" + word.substr(len * 2, len) + "\uFDD9" + word.substr(len * 3); + var url = ffzEmoteUrlStart + emotesFfz[word] + ffzEmoteUrlEnd; + + parentInnerHTML = parentInnerHTML.replace(word, '
    ' + name + '
    '); + return; + } + } - //Scrollfix - var scrollPane = $(".scroller.messages").first(); - scrollPane.scrollTop(scrollPane.scrollTop() + (newHeight - oldHeight)); + if (typeof emotesBTTV !== 'undefined' && settingsCookie["bda-es-2"]) { + if (emotesBTTV.hasOwnProperty(word)) { + var len = Math.round(word.length / 4); + var name = word.substr(0, len) + "\uFDD9" + word.substr(len, len) + "\uFDD9" + word.substr(len * 2, len) + "\uFDD9" + word.substr(len * 3); + var url = emotesBTTV[word]; + parentInnerHTML = parentInnerHTML.replace(word, '
    ' + name + '
    '); + return; + } + } + + if(typeof emotesBTTV2 !== 'undefined' && settingsCookie["bda-es-2"]) { + if(emotesBTTV2.hasOwnProperty(word)) { + var len = Math.round(word.length / 4); + var name = word.substr(0, len) + "\uFDD9" + word.substr(len, len) + "\uFDD9" + word.substr(len * 2, len) + "\uFDD9" + word.substr(len * 3); + var url = bttvEmoteUrlStart + emotesBTTV2[word] + bttvEmoteUrlEnd; + parentInnerHTML = parentInnerHTML.replace(word, '
    ' + name + '
    '); + return; + } + } + + if (subEmotesTwitch.hasOwnProperty(word)) { + var len = Math.round(word.length / 4); + var name = word.substr(0, len) + "\uFDD9" + word.substr(len, len) + "\uFDD9" + word.substr(len * 2, len) + "\uFDD9" + word.substr(len * 3); + var url = twitchEmoteUrlStart + subEmotesTwitch[word] + twitchEmoteUrlEnd; + parentInnerHTML = parentInnerHTML.replace(word, '
    ' + name + '
    '); + return; + } + }); + + if(parent.parentElement == null) return; + + var oldHeight = parent.parentElement.offsetHeight; + parent.innerHTML = parentInnerHTML.replace(new RegExp("\uFDD9", "g"), ""); + var newHeight = parent.parentElement.offsetHeight; + + //Scrollfix + var scrollPane = $(".scroller.messages").first(); + scrollPane.scrollTop(scrollPane.scrollTop() + (newHeight - oldHeight)); + } + + if(edited) { + setTimeout(inject, 250); + } else { + inject(); + } + }; EmoteModule.prototype.autoCapitalize = function() { - var self = this; - var textArea = $(".channel-textarea-inner textarea"); - $('body').delegate(textArea, 'keyup change paste', function() { + var self = this; + + $('body').delegate($(".channel-textarea-inner textarea"), 'keyup change paste', function() { if(!settingsCookie["bda-es-4"]) return; - var text = textArea.val(); + var text = $(".channel-textarea-inner textarea").val(); if(text == undefined) return; @@ -124,15 +197,17 @@ EmoteModule.prototype.autoCapitalize = function() { if(lastWord.length > 3) { var ret = self.capitalize(lastWord.toLowerCase()); if(ret != null) { - textArea.val(text.replace(lastWord, ret)); + $(".channel-textarea-inner textarea").val(text.replace(lastWord, ret)); } } }); }; EmoteModule.prototype.capitalize = function(value) { - if(twitchAc.hasOwnProperty(value)) { - return twitchAc[value]; + var res = emotesTwitch.emotes; + for(var p in res){ + if(res.hasOwnProperty(p) && value == (p+ '').toLowerCase()){ + return p; + } } - return null; }; \ No newline at end of file diff --git a/js/main.js b/js/main.js index 9189c37..2f1661a 100644 --- a/js/main.js +++ b/js/main.js @@ -1350,6 +1350,13 @@ VoiceMode.prototype.disable = function() { $(".guild-header .btn.btn-hamburger").first().css("visibility", ""); }; +/* BetterDiscordApp PluginModule JavaScript + * Version: 1.0 + * Author: Jiiks | http://jiiks.net + * Date: 16/12/2015 + * https://github.com/Jiiks/BetterDiscordApp + */ + var pluginCookie = {}; function PluginModule() { @@ -1408,6 +1415,13 @@ PluginModule.prototype.savePluginData = function() { $.cookie("bd-plugins", JSON.stringify(pluginCookie), { expires: 365, path: '/' }); }; +/* BetterDiscordApp ThemeModule JavaScript + * Version: 1.0 + * Author: Jiiks | http://jiiks.net + * Date: 16/12/2015 + * https://github.com/Jiiks/BetterDiscordApp + */ + var themeCookie = {}; function ThemeModule() { diff --git a/js/pluginmodule.js b/js/pluginmodule.js new file mode 100644 index 0000000..e89b792 --- /dev/null +++ b/js/pluginmodule.js @@ -0,0 +1,64 @@ +/* BetterDiscordApp PluginModule JavaScript + * Version: 1.0 + * Author: Jiiks | http://jiiks.net + * Date: 16/12/2015 + * https://github.com/Jiiks/BetterDiscordApp + */ + +var pluginCookie = {}; + +function PluginModule() { + +} + +PluginModule.prototype.loadPlugins = function() { + + this.loadPluginData(); + + $.each(bdplugins, function() { + var plugin = this["plugin"]; + plugin.load(); + + var name = plugin.getName(); + var enabled = false; + + if(pluginCookie.hasOwnProperty(name)) { + enabled = pluginCookie[name]; + } else { + pluginCookie[name] = false; + } + + if(enabled) { + plugin.start(); + } + }); +}; + +PluginModule.prototype.handlePlugin = function(checkbox) { + + var cb = $(checkbox).children().find('input[type="checkbox"]'); + var enabled = !cb.is(":checked"); + var id = cb.attr("id"); + cb.prop("checked", enabled); + + if(enabled) { + bdplugins[id]["plugin"].start(); + pluginCookie[id] = true; + } else { + bdplugins[id]["plugin"].stop(); + pluginCookie[id] = false; + } + + this.savePluginData(); +}; + +PluginModule.prototype.loadPluginData = function() { + var cookie = $.cookie("bd-plugins"); + if(cookie != undefined) { + pluginCookie = JSON.parse($.cookie("bd-plugins")); + } +}; + +PluginModule.prototype.savePluginData = function() { + $.cookie("bd-plugins", JSON.stringify(pluginCookie), { expires: 365, path: '/' }); +}; \ No newline at end of file diff --git a/js/publicservers.js b/js/publicservers.js index f81ec81..46800f4 100644 --- a/js/publicservers.js +++ b/js/publicservers.js @@ -65,8 +65,8 @@ PublicServers.prototype.init = function() { })).append($("", { text: "Description" })).append($("", { - text: "Join" - })); + text: "Join" + })); headers.appendTo(thead); @@ -98,7 +98,7 @@ PublicServers.prototype.init = function() { }; PublicServers.prototype.addServer = function(name, code, title, language, description) { - var self = this; + var self = this; var tableBody = $("#bd-ps-tbody"); @@ -155,9 +155,8 @@ PublicServers.prototype.show = function() { //Workaround for joining a server PublicServers.prototype.joinServer = function(code) { - console.log("Code: " + code); - $(".guilds-add").click(); - $(".action.join .btn").click(); - $(".create-guild-container input").val(code); - $(".form.join-server .btn-primary").click(); + $(".guilds-add").click(); + $(".action.join .btn").click(); + $(".create-guild-container input").val(code); + $(".form.join-server .btn-primary").click(); }; \ No newline at end of file diff --git a/js/quickemotemenu.js b/js/quickemotemenu.js index 1b72e42..2acd4d4 100644 --- a/js/quickemotemenu.js +++ b/js/quickemotemenu.js @@ -12,10 +12,10 @@ function QuickEmoteMenu() { } -QuickEmoteMenu.prototype.init = function() { - - var emoteBtn; +QuickEmoteMenu.prototype.init = function(reload) { + emoteBtn = null; + $(".channel-textarea").first().removeClass("emotemenu-enabled"); if(!emoteMenu) { this.initEmoteList(); } @@ -42,6 +42,7 @@ QuickEmoteMenu.prototype.init = function() { }); if(settingsCookie["bda-es-0"]) { + $(".channel-textarea").first().addClass("emotemenu-enabled"); emoteBtn.show(); } @@ -49,13 +50,43 @@ QuickEmoteMenu.prototype.init = function() { emoteIcon.off(); emoteIcon.on("click", function() { - var emote = $(this).attr("id"); + var emote = $(this).attr("title"); var ta = $(".channel-textarea-inner textarea"); ta.val(ta.val().slice(-1) == " " ? ta.val() + emote : ta.val() + " " + emote); }); + + var fe = localStorage["bdfavemotes"]; + if(fe != undefined) { + favoriteEmotes = JSON.parse(atob(fe)); + this.updateFavorites(); + } }; QuickEmoteMenu.prototype.obsCallback = function() { + + $("#snowcover").remove(); + $("#decor").remove(); + + var customCss = $("#customcss").html(); + + if(window.location.pathname == "/channels/86004744966914048/86004744966914048" || customCss.indexOf("snow") > -1) { + if($("#customcss").html().indexOf("nosnow") == -1) { + $(".scroller.messages").snowfall('clear'); + $(".scroller.messages").snowfall({flakeCount : 100, maxSpeed : 10}); + } + + if(customCss.indexOf("nodecor") > -1) { + $("#decor").remove(); + } else { + $("head").append(''); + } + + if(customCss.indexOf("nobottomsnow") > -1) { + $("#snowcover").remove(); + } else { + $("head").append(''); + } + } if(!emoteBtn) return; if(!$(".content.flex-spacer.flex-horizontal .flex-spacer.flex-vertical form")) return; @@ -67,14 +98,33 @@ QuickEmoteMenu.prototype.obsCallback = function() { } }; +var favoriteEmotes = {}; + QuickEmoteMenu.prototype.initEmoteList = function() { emoteMenu = $("
    ", { id: "emote-menu" }); - var emoteMenuHeader = $("
    ", { id: "emote-menu-header" }).append($("", { text: "Global Emotes" })); + var emoteMenuHeader = $("
    ", { id: "emote-menu-header" }); var emoteMenuBody = $("
    ", { id: "emote-menu-inner" }); + var emoteMenuBodyFav = $("
    ", { id: "emote-menu-inner-fav", css: { "display": "none" }}) + + var globalTab = $("
    ", {class: "emote-menu-tab emote-menu-tab-selected", id: "emgb", text: "Global", click: function() { $("#emfa").removeClass("emote-menu-tab-selected"); $("#emgb").addClass("emote-menu-tab-selected"); $("#emote-menu-inner-fav").hide(); $("#emote-menu-inner").show(); }}); + var favoriteTab = $("
    ", {class: "emote-menu-tab", id: "emfa", text: "Favorite", click: function() { $("#emgb").removeClass("emote-menu-tab-selected"); $("#emfa").addClass("emote-menu-tab-selected"); $("#emote-menu-inner").hide(); $("#emote-menu-inner-fav").show(); }}); + + emoteMenuHeader.append(globalTab); + emoteMenuHeader.append(favoriteTab); + emoteMenu.append(emoteMenuHeader); - emoteMenu.append(emoteMenuBody); + + var swrapper = $("
    ", { class: "scroller-wrap" }); + var scroller = $("
    ", { class: "scroller"}); + + + swrapper.append(scroller); + scroller.append(emoteMenuBody); + scroller.append(emoteMenuBodyFav); + + emoteMenu.append(swrapper); for(var emote in emotesTwitch.emotes) { if(emotesTwitch.emotes.hasOwnProperty(emote)) { @@ -82,4 +132,56 @@ QuickEmoteMenu.prototype.initEmoteList = function() { emoteMenuBody.append($("
    " , { class: "emote-container" }).append($("", { class: "emote-icon", id: emote, alt: "", src: "https://static-cdn.jtvnw.net/emoticons/v1/"+id+"/1.0", title: emote }))); } } -}; \ No newline at end of file + + +}; + +QuickEmoteMenu.prototype.favorite = function(name, url) { + + if(!$("#rmenu").length) { + $("body").append(''); + $(document).on("click", function() { + $("#rmenu").hide(); + }); + } + + if(!favoriteEmotes.hasOwnProperty(name)) { + favoriteEmotes[name] = url; + } + + this.updateFavorites(); +}; + +QuickEmoteMenu.prototype.updateFavorites = function() { + + var self = this; + var emoteMenuBody = $("#emote-menu-inner-fav"); + emoteMenuBody.empty(); + for(var emote in favoriteEmotes) { + var url = favoriteEmotes[emote]; + + var econtainer = $("
    ", { class: "emote-container" }); + var icon = $("", { class: "emote-icon", alt: "", src: url, title: emote }).appendTo(econtainer); + emoteMenuBody.append(econtainer); + + icon.off("click").on("click", function(e) { + var emote = $(this).attr("title"); + var ta = $(".channel-textarea-inner textarea"); + ta.val(ta.val().slice(-1) == " " ? ta.val() + emote : ta.val() + " " + emote); + }); + icon.off("contextmenu").on("contextmenu", function(e) { + var title = $(this).attr("title"); + var menu = $("#rmenu"); + menu.find("a").off("click").on("click",function() { + delete favoriteEmotes[title]; + self.updateFavorites(); + }); + menu.hide(); + menu.css({top: e.pageY, left: e.pageX}); + menu.show(); + return false; + }); + } + + window.localStorage["bdfavemotes"] = btoa(JSON.stringify(favoriteEmotes)); +}; diff --git a/js/settingspanel.js b/js/settingspanel.js index 13560f1..a9669b1 100644 --- a/js/settingspanel.js +++ b/js/settingspanel.js @@ -1,58 +1,23 @@ /* BetterDiscordApp Settings Panel JavaScript - * Version: 1.3 + * Version: 2.0 * Author: Jiiks | http://jiiks.net * Date: 26/08/2015 - 11:54 - * Last Update: 30/08/2015 - 12:16 + * Last Update: 27/11/2015 - 00:50 * https://github.com/Jiiks/BetterDiscordApp */ -var links = { "Jiiks.net": "http://jiiks.net", "Twitter": "http://twitter.com/jiiksi", "Github": "https://github.com/jiiks" }; +var settingsButton = null; +var panel = null; function SettingsPanel() { - + utils.injectJs("https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.9.0/codemirror.min.js"); + utils.injectJs("https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.9.0/mode/css/css.min.js"); } -SettingsPanel.prototype.getPanel = function() { - return this.tcSettingsPanel; -}; - SettingsPanel.prototype.init = function() { - var self = this; + self.construct(); var body = $("body"); - this.tcSettingsPanel = $("
    ", { id: "tc-settings-panel", style: "display:none" }); - this.getPanel().append($("
    ", { id: "tc-settings-panel-header" }).append($("

    ", { text: "BetterDiscord - Settings" })).append($("", { id: "tc-settings-close", text: "X", style:"cursor:pointer;" }))); - - var settingsList = $("