2015-08-27 15:46:53 +02:00
/ * B e t t e r D i s c o r d A p p C o r e J a v a S c r i p t
2015-10-26 06:27:55 +01:00
* Version : 1.5
2015-08-27 15:46:53 +02:00
* Author : Jiiks | http : //jiiks.net
* Date : 27 / 08 / 2015 - 16 : 36
2015-10-26 06:27:55 +01:00
* Last Update : 24 / 010 / 2015 - 17 : 27
2015-08-27 15:46:53 +02:00
* https : //github.com/Jiiks/BetterDiscordApp
* /
2015-10-26 06:27:55 +01:00
/ *
* = 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" ;
2015-08-29 11:36:47 +02:00
var mainObserver ;
2015-08-27 15:46:53 +02:00
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 = "" ;
2015-10-26 06:27:55 +01:00
var mainCore ;
2015-08-27 15:46:53 +02:00
2015-08-29 11:36:47 +02:00
var settings = {
"Save logs locally" : { "id" : "bda-gs-0" , "info" : "Saves chat logs locally" , "implemented" : false } ,
2015-10-26 06:27:55 +01:00
"Public Servers" : { "id" : "bda-gs-1" , "info" : "BETA : Display public servers button" , "implemented" : true } ,
2015-08-30 11:17:06 +02:00
"Minimal Mode" : { "id" : "bda-gs-2" , "info" : "Hide elements and reduce the size of elements." , "implemented" : true } ,
2015-10-26 06:27:55 +01:00
"Voice Mode" : { "id" : "bda-gs-4" , "info" : "Only show voice chat" , "implemented" : true } ,
2015-08-30 11:17:06 +02:00
"Hide Channels" : { "id" : "bda-gs-3" , "info" : "Hide channels in minimal mode" , "implemented" : true } ,
2015-08-29 11:36:47 +02:00
"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 } ,
2015-10-26 06:27:55 +01:00
"BetterTTV Emotes" : { "id" : "bda-es-2" , "info" : "Show BetterTTV Emotes" , "implemented" : true } ,
2015-08-29 11:36:47 +02:00
"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 }
} ;
var defaultCookie = {
"version" : jsVersion ,
"bda-gs-0" : false ,
"bda-gs-1" : true ,
2015-08-30 11:17:06 +02:00
"bda-gs-2" : false ,
"bda-gs-3" : false ,
2015-10-26 06:27:55 +01:00
"bda-gs-4" : false ,
2015-08-29 11:36:47 +02:00
"bda-es-0" : true ,
"bda-es-1" : false ,
"bda-es-2" : false ,
"bda-es-3" : false ,
"bda-es-4" : false ,
"bda-es-5" : true
} ;
var settingsCookie = { } ;
2015-08-27 15:46:53 +02:00
2015-10-26 06:27:55 +01:00
function Core ( ) { }
2015-08-27 15:46:53 +02:00
2015-10-26 06:27:55 +01:00
Core . prototype . init = function ( ) {
2015-08-27 15:46:53 +02:00
2015-10-26 06:27:55 +01:00
if ( version < supportedVersion ) {
alert ( "BetterDiscord v" + version + "(your version)" + " is not supported by the latest js(" + jsVersion + "). Please download the latest version from GitHub." ) ;
return ;
}
2015-08-29 11:36:47 +02:00
2015-08-27 15:46:53 +02:00
utils = new Utils ( ) ;
emoteModule = new EmoteModule ( ) ;
quickEmoteMenu = new QuickEmoteMenu ( ) ;
2015-10-26 06:27:55 +01:00
voiceMode = new VoiceMode ( ) ;
2015-08-27 15:46:53 +02:00
emoteModule . init ( ) ;
2015-08-29 11:36:47 +02:00
this . initSettings ( ) ;
this . initObserver ( ) ;
2015-10-26 06:27:55 +01:00
//Incase were too fast
function gwDefer ( ) {
console . log ( new Date ( ) . getTime ( ) + " Defer" ) ;
if ( $ ( ".guilds-wrapper .guilds" ) . children ( ) . length > 0 ) {
console . log ( new Date ( ) . getTime ( ) + " Defer Loaded" ) ;
var guilds = $ ( ".guilds li:first-child" ) ;
guilds . after ( $ ( "<li></li>" , { id : "bd-pub-li" , css : { "height" : "20px" , "display" : settingsCookie [ "bda-gs-1" ] == true ? "" : "none" } } ) . append ( $ ( "<div/>" , { class : "guild-inner" , css : { "height" : "20px" , "border-radius" : "4px" } } ) . append ( $ ( "<a/>" ) . append ( $ ( "<div/>" , { css : { "line-height" : "20px" , "font-size" : "12px" } , text : "public" , id : "bd-pub-button" } ) ) ) ) ) ;
guilds . after ( $ ( "<li/>" , { id : "tc-settings-li" } ) . append ( $ ( "<div/>" , { class : "guild-inner" } ) . append ( $ ( "<a/>" ) . append ( $ ( "<div/>" , { class : "avatar-small" , id : "tc-settings-button" } ) ) ) ) ) ;
2015-08-27 15:46:53 +02:00
2015-08-31 15:20:33 +02:00
settingsPanel = new SettingsPanel ( ) ;
settingsPanel . init ( ) ;
2015-10-26 06:27:55 +01:00
2015-08-31 15:20:33 +02:00
quickEmoteMenu . init ( false ) ;
2015-10-26 06:27:55 +01:00
$ ( "#tc-settings-button" ) . on ( "click" , function ( ) { settingsPanel . show ( ) ; } ) ;
$ ( "#bd-pub-button" ) . on ( "click" , function ( ) { opublicServers . show ( ) ; } ) ;
opublicServers = new PublicServers ( ) ;
opublicServers . init ( ) ;
emoteModule . autoCapitalize ( ) ;
2015-08-31 15:20:33 +02:00
} else {
2015-10-26 06:27:55 +01:00
setTimeout ( gwDefer , 100 ) ;
2015-08-31 15:20:33 +02:00
}
2015-10-26 06:27:55 +01:00
}
2015-08-31 15:59:34 +02:00
2015-10-26 06:27:55 +01:00
$ ( document ) . ready ( function ( ) {
setTimeout ( gwDefer , 1000 ) ;
} ) ;
} ;
2015-08-27 15:46:53 +02:00
2015-08-29 11:36:47 +02:00
Core . prototype . initSettings = function ( ) {
if ( $ . cookie ( "better-discord" ) == undefined ) {
settingsCookie = defaultCookie ;
this . saveSettings ( ) ;
} else {
this . loadSettings ( ) ;
for ( var setting in defaultCookie ) {
if ( settingsCookie [ setting ] == undefined ) {
2015-10-26 06:27:55 +01:00
settingsCookie [ setting ] = defaultCookie [ setting ] ;
2015-08-29 11:36:47 +02:00
this . saveSettings ( ) ;
}
2015-08-27 15:46:53 +02:00
}
}
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
2015-08-29 11:36:47 +02:00
Core . prototype . saveSettings = function ( ) {
$ . cookie ( "better-discord" , JSON . stringify ( settingsCookie ) , { expires : 365 , path : '/' } ) ;
2015-10-26 06:27:55 +01:00
} ;
2015-08-29 11:36:47 +02:00
Core . prototype . loadSettings = function ( ) {
settingsCookie = JSON . parse ( $ . cookie ( "better-discord" ) ) ;
2015-10-26 06:27:55 +01:00
} ;
2015-08-29 11:36:47 +02:00
Core . prototype . initObserver = function ( ) {
mainObserver = new MutationObserver ( function ( mutations ) {
mutations . forEach ( function ( mutation ) {
2015-08-29 21:02:20 +02:00
if ( mutation . target . getAttribute ( 'class' ) != null ) {
if ( mutation . target . getAttribute ( 'class' ) . indexOf ( "titlebar" ) != - 1 ) {
quickEmoteMenu . obsCallback ( ) ;
2015-10-31 22:24:40 +01:00
voiceMode . obsCallback ( ) ;
2015-08-29 21:02:20 +02:00
}
2015-08-29 11:36:47 +02:00
}
emoteModule . obsCallback ( mutation ) ;
} ) ;
} ) ;
2015-10-26 06:27:55 +01:00
//noinspection JSCheckFunctionSignatures
2015-08-29 11:36:47 +02:00
mainObserver . observe ( document , { childList : true , subtree : true } ) ;
2015-10-26 06:27:55 +01:00
} ;
2015-08-29 11:36:47 +02:00
2015-08-27 15:46:53 +02:00
/ * B e t t e r D i s c o r d A p p E m o t e M o d u l e J a v a S c r i p t
2015-10-26 06:27:55 +01:00
* Version : 1.5
2015-08-27 15:46:53 +02:00
* Author : Jiiks | http : //jiiks.net
* Date : 26 / 08 / 2015 - 15 : 29
2015-10-14 08:50:34 +02:00
* Last Update : 14 / 10 / 2015 - 09 : 48
2015-08-27 15:46:53 +02:00
* https : //github.com/Jiiks/BetterDiscordApp
* Note : Due to conflicts autocapitalize only supports global emotes
* /
2015-10-26 06:27:55 +01:00
/ *
* = Changelog =
* - v1 . 5
* -- Twitchemotes . com api
* /
2015-08-27 15:46:53 +02:00
var emotesFfz = { } ;
var emotesBTTV = { } ;
2015-10-26 06:27:55 +01:00
var emotesTwitch = { "emotes" : { "emote" : { "image_id" : 0 } } } ; //for ide
var subEmotesTwitch = { } ;
2015-08-27 15:46:53 +02:00
2015-10-26 06:27:55 +01:00
//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" } ;
2015-08-27 15:46:53 +02:00
2015-10-26 06:27:55 +01:00
function EmoteModule ( ) { }
2015-08-29 11:36:47 +02:00
2015-10-26 06:27:55 +01:00
EmoteModule . prototype . init = function ( ) { } ;
2015-08-27 15:46:53 +02:00
2015-08-29 11:36:47 +02:00
EmoteModule . prototype . obsCallback = function ( mutation ) {
var self = this ;
2015-10-29 14:46:08 +01:00
2015-08-29 11:36:47 +02:00
for ( var i = 0 ; i < mutation . addedNodes . length ; ++ i ) {
var next = mutation . addedNodes . item ( i ) ;
if ( next ) {
2015-10-29 14:54:58 +01:00
console . log ( "Next: " + next ) ;
2015-08-29 11:36:47 +02:00
var nodes = self . getNodes ( next ) ;
for ( var node in nodes ) {
2015-10-26 06:27:55 +01:00
if ( nodes . hasOwnProperty ( node ) ) {
self . injectEmote ( nodes [ node ] ) ;
2015-10-29 14:52:12 +01:00
console . log ( nodes [ node ] ) ;
2015-10-26 06:27:55 +01:00
}
2015-08-29 11:36:47 +02:00
}
}
}
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
EmoteModule . prototype . getNodes = function ( node ) {
var next ;
var nodes = [ ] ;
2015-10-29 15:53:43 +01:00
var treeWalker = document . createTreeWalker ( node , NodeFilter . SHOW _TEXT ) ;
2015-08-27 15:46:53 +02:00
while ( next = treeWalker . nextNode ( ) ) {
nodes . push ( next ) ;
}
2015-10-29 15:51:21 +01:00
2015-10-29 15:53:43 +01:00
2015-08-27 15:46:53 +02:00
return nodes ;
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
2015-10-27 16:41:46 +01:00
var bemotes = [ "double" , "triple" , "quadra" , "penta" ] ;
2015-10-26 06:27:55 +01:00
//TODO Functional titles
2015-08-27 15:46:53 +02:00
EmoteModule . prototype . injectEmote = function ( node ) {
if ( typeof emotesTwitch === 'undefined' ) return ;
if ( ! node . parentElement ) return ;
var parent = node . parentElement ;
if ( parent . tagName != "SPAN" ) return ;
var parentInnerHTML = parent . innerHTML ;
var words = parentInnerHTML . split ( " " ) ;
if ( ! words ) return ;
words . some ( function ( word ) {
2015-10-27 16:43:37 +01:00
2015-10-27 16:47:36 +01:00
if ( $ . inArray ( word , bemotes ) != - 1 ) return ;
2015-10-30 02:28:37 +01:00
if ( word . length < 4 ) {
return ;
}
2015-10-26 06:27:55 +01:00
if ( emotesTwitch . emotes . hasOwnProperty ( word ) ) {
parentInnerHTML = parentInnerHTML . replace ( word , "<img src=" + twitchEmoteUrlStart + emotesTwitch . emotes [ word ] . image _id + twitchEmoteUrlEnd + " ><\/img>" ) ;
return ;
}
if ( typeof emotesFfz !== 'undefined' && settingsCookie [ "bda-es-1" ] ) {
2015-08-27 15:46:53 +02:00
if ( emotesFfz . hasOwnProperty ( word ) ) {
2015-10-26 06:27:55 +01:00
parentInnerHTML = parentInnerHTML . replace ( word , "<img src=" + ffzEmoteUrlStart + emotesFfz [ word ] + ffzEmoteUrlEnd + " ><\/img>" ) ;
return ;
}
}
if ( typeof emotesBTTV !== 'undefined' && settingsCookie [ "bda-es-2" ] ) {
if ( emotesBTTV . hasOwnProperty ( word ) ) {
parentInnerHTML = parentInnerHTML . replace ( word , "<img src=" + emotesBTTV [ word ] + " ><\/img>" ) ;
return ;
2015-08-27 15:46:53 +02:00
}
}
2015-10-26 06:27:55 +01:00
if ( subEmotesTwitch . hasOwnProperty ( word ) ) {
parentInnerHTML = parentInnerHTML . replace ( word , "<img src=" + twitchEmoteUrlStart + subEmotesTwitch [ word ] + twitchEmoteUrlEnd + " ><\/img>" ) ;
}
2015-08-27 15:46:53 +02:00
} ) ;
2015-10-26 06:27:55 +01:00
if ( parent . parentElement == null ) return ;
2015-10-14 08:50:34 +02:00
var oldHeight = parent . parentElement . offsetHeight ;
2015-08-27 15:46:53 +02:00
parent . innerHTML = parentInnerHTML ;
2015-10-14 08:50:34 +02:00
var newHeight = parent . parentElement . offsetHeight ;
2015-10-26 06:27:55 +01:00
//Scrollfix
var scrollPane = $ ( ".scroller.messages" ) . first ( ) ;
2015-10-14 08:50:34 +02:00
scrollPane . scrollTop ( scrollPane . scrollTop ( ) + ( newHeight - oldHeight ) ) ;
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
EmoteModule . prototype . autoCapitalize = function ( ) {
2015-10-26 06:27:55 +01:00
2015-08-27 15:46:53 +02:00
var self = this ;
2015-08-31 15:36:28 +02:00
2015-08-27 15:46:53 +02:00
$ ( 'body' ) . delegate ( $ ( ".channel-textarea-inner textarea" ) , 'keyup change paste' , function ( ) {
2015-08-29 11:36:47 +02:00
if ( ! settingsCookie [ "bda-es-4" ] ) return ;
2015-08-27 15:46:53 +02:00
var text = $ ( ".channel-textarea-inner textarea" ) . val ( ) ;
2015-08-29 11:36:47 +02:00
if ( text == undefined ) return ;
2015-08-27 15:46:53 +02:00
var lastWord = text . split ( " " ) . pop ( ) ;
if ( lastWord . length > 3 ) {
var ret = self . capitalize ( lastWord . toLowerCase ( ) ) ;
if ( ret != null ) {
$ ( ".channel-textarea-inner textarea" ) . val ( text . replace ( lastWord , ret ) ) ;
}
}
} ) ;
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
EmoteModule . prototype . capitalize = function ( value ) {
if ( twitchAc . hasOwnProperty ( value ) ) {
return twitchAc [ value ] ;
}
return null ;
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
2015-10-26 06:27:55 +01:00
/ * B e t t e r D i s c o r d A p p P u b l i c S e v e r s J a v a S c r i p t s
2015-08-31 15:20:33 +02:00
* Version : 1.0
* Author : Jiiks | http : //jiiks.net
* Date : 27 / 08 / 2015 - 14 : 16
* https : //github.com/Jiiks/BetterDiscordApp
* /
2015-10-26 06:27:55 +01:00
var publicServers = { "servers" : { "server" : { "code" : 0 , "icon" : null , "title" : "title" , "language" : "EN" , "description" : "description" } } } ; //for ide
2015-08-31 15:20:33 +02:00
function PublicServers ( ) {
}
2015-10-26 06:27:55 +01:00
PublicServers . prototype . getPanel = function ( ) {
return this . container ;
} ;
2015-08-31 15:20:33 +02:00
PublicServers . prototype . init = function ( ) {
2015-10-26 06:27:55 +01:00
var self = this ;
this . container = $ ( "<div/>" , {
id : "bd-ps-container" ,
style : "display:none"
} ) ;
var header = $ ( "<div/>" , {
id : "bd-ps-header"
} ) ;
$ ( "<h2/>" , {
text : "Public Servers"
} ) . appendTo ( header ) ;
$ ( "<span/>" , {
id : "bd-ps-close" ,
style : "cursor:pointer;" ,
text : "X"
} ) . appendTo ( header ) ;
header . appendTo ( this . getPanel ( ) ) ;
var psbody = $ ( "<div/>" , {
id : "bd-ps-body"
} ) ;
psbody . appendTo ( this . getPanel ( ) ) ;
var table = $ ( "<table/>" , {
border : "0"
} ) ;
var thead = $ ( "<thead/>" ) ;
thead . appendTo ( table ) ;
var headers = $ ( "<tr/>" , {
} ) . append ( $ ( "<th/>" , {
text : "Name"
} ) ) . append ( $ ( "<th/>" , {
text : "Code"
} ) ) . append ( $ ( "<th/>" , {
text : "Language"
} ) ) . append ( $ ( "<th/>" , {
text : "Description"
2015-10-27 22:58:43 +01:00
} ) ) . append ( $ ( "<th/>" , {
text : "Join"
2015-10-26 06:27:55 +01:00
} ) ) ;
headers . appendTo ( thead ) ;
var tbody = $ ( "<tbody/>" , {
id : "bd-ps-tbody"
} ) ;
tbody . appendTo ( table ) ;
table . appendTo ( psbody ) ;
$ ( "body" ) . append ( this . getPanel ( ) ) ;
$ ( "#bd-ps-close" ) . on ( "click" , function ( ) { self . show ( ) ; } ) ;
var servers = publicServers . servers ;
for ( var server in servers ) {
if ( servers . hasOwnProperty ( server ) ) {
var s = servers [ server ] ;
var code = s . code ;
var title = s . title ;
var language = s . language ;
var description = s . description ;
this . addServer ( server , code , title , language , description ) ;
}
}
} ;
PublicServers . prototype . addServer = function ( name , code , title , language , description ) {
2015-10-27 22:58:43 +01:00
var self = this ;
2015-10-26 06:27:55 +01:00
var tableBody = $ ( "#bd-ps-tbody" ) ;
var desc = $ ( "<td/>" ) . append ( $ ( "<div/>" , {
class : "bd-ps-description" ,
text : description
} ) ) ;
var tr = $ ( "<tr/>" ) ;
tr . append ( $ ( "<td/>" , {
text : title
} ) ) ;
tr . append ( $ ( "<td/>" , {
css : {
"-webkit-user-select" : "initial" ,
"user-select" : "initial"
} ,
text : code
} ) ) ;
tr . append ( $ ( "<td/>" , {
text : language
} ) ) ;
2015-10-27 23:04:41 +01:00
tr . append ( desc ) ;
2015-10-27 23:13:23 +01:00
tr . append ( $ ( "<td/>" ) . append ( $ ( "<button/>" , {
2015-10-27 22:58:43 +01:00
text : "Join" ,
2015-10-27 23:04:41 +01:00
css : {
"height" : "30px" ,
"display" : "block" ,
"margin-top" : "10px" ,
"background-color" : "#36393E" ,
"border" : "1px solid #404040" ,
"outline" : "1px solid #000" ,
"color" : "#EDEDED"
} ,
2015-10-27 22:58:43 +01:00
click : function ( ) { self . joinServer ( code ) ; }
2015-10-27 23:13:23 +01:00
} ) ) ) ;
2015-10-27 22:58:43 +01:00
2015-10-26 06:27:55 +01:00
tableBody . append ( tr ) ;
} ;
PublicServers . prototype . show = function ( ) {
this . getPanel ( ) . toggle ( ) ;
var li = $ ( "#bd-pub-li" ) ;
li . removeClass ( ) ;
if ( this . getPanel ( ) . is ( ":visible" ) ) {
li . addClass ( "active" ) ;
}
} ;
2015-08-27 15:46:53 +02:00
2015-10-27 22:58:43 +01:00
//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 ( ) ;
2015-10-27 23:13:23 +01:00
} ;
2015-10-27 22:58:43 +01:00
2015-08-27 15:46:53 +02:00
/ * B e t t e r D i s c o r d A p p Q u i c k E m o t e M e n u J a v a S c r i p t
2015-10-26 06:27:55 +01:00
* Version : 1.3
2015-08-27 15:46:53 +02:00
* Author : Jiiks | http : //jiiks.net
* Date : 26 / 08 / 2015 - 11 : 49
2015-08-29 11:36:47 +02:00
* Last Update : 29 / 08 / 2015 - 11 : 46
2015-08-27 15:46:53 +02:00
* https : //github.com/Jiiks/BetterDiscordApp
* /
2015-08-29 11:36:47 +02:00
var emoteBtn , emoteMenu ;
2015-08-27 15:46:53 +02:00
function QuickEmoteMenu ( ) {
}
2015-10-26 06:27:55 +01:00
QuickEmoteMenu . prototype . init = function ( reload ) {
2015-08-31 15:36:28 +02:00
2015-08-29 11:36:47 +02:00
emoteBtn = null ;
if ( ! emoteMenu ) {
this . initEmoteList ( ) ;
}
2015-08-27 15:46:53 +02:00
var menuOpen ;
2015-08-29 11:36:47 +02:00
emoteBtn = $ ( "<div/>" , { id : "twitchcord-button-container" , style : "display:none" } ) . append ( $ ( "<button/>" , { id : "twitchcord-button" , onclick : "return false;" } ) ) ;
2015-08-27 15:46:53 +02:00
$ ( ".content.flex-spacer.flex-horizontal .flex-spacer.flex-vertical form" ) . append ( emoteBtn ) ;
2015-08-29 11:36:47 +02:00
emoteMenu . detach ( ) ;
2015-08-27 15:46:53 +02:00
emoteBtn . append ( emoteMenu ) ;
2015-08-29 11:36:47 +02:00
2015-08-27 15:46:53 +02:00
$ ( "#twitchcord-button" ) . on ( "click" , function ( ) {
menuOpen = ! menuOpen ;
if ( menuOpen ) {
emoteMenu . addClass ( "emotemenu-open" ) ;
$ ( this ) . addClass ( "twitchcord-button-open" ) ;
} else {
emoteMenu . removeClass ( ) ;
$ ( this ) . removeClass ( ) ;
}
} ) ;
2015-08-29 11:36:47 +02:00
if ( settingsCookie [ "bda-es-0" ] ) {
2015-08-27 15:46:53 +02:00
emoteBtn . show ( ) ;
}
2015-10-26 06:27:55 +01:00
var emoteIcon = $ ( ".emote-icon" ) ;
emoteIcon . off ( ) ;
emoteIcon . on ( "click" , function ( ) {
var emote = $ ( this ) . attr ( "id" ) ;
var ta = $ ( ".channel-textarea-inner textarea" ) ;
ta . val ( ta . val ( ) . slice ( - 1 ) == " " ? ta . val ( ) + emote : ta . val ( ) + " " + emote ) ;
} ) ;
} ;
2015-08-29 11:36:47 +02:00
QuickEmoteMenu . prototype . obsCallback = function ( ) {
if ( ! emoteBtn ) return ;
if ( ! $ ( ".content.flex-spacer.flex-horizontal .flex-spacer.flex-vertical form" ) ) return ;
2015-10-26 06:27:55 +01:00
var tcbtn = $ ( "#twitchcord-button-container" ) ;
2015-08-29 11:36:47 +02:00
if ( tcbtn . parent ( ) . prop ( "tagName" ) == undefined ) {
quickEmoteMenu = new QuickEmoteMenu ( ) ;
quickEmoteMenu . init ( true ) ;
}
2015-10-26 06:27:55 +01:00
} ;
2015-08-29 11:36:47 +02:00
QuickEmoteMenu . prototype . initEmoteList = function ( ) {
emoteMenu = $ ( "<div/>" , { id : "emote-menu" } ) ;
var emoteMenuHeader = $ ( "<div/>" , { id : "emote-menu-header" } ) . append ( $ ( "<span/>" , { text : "Global Emotes" } ) ) ;
var emoteMenuBody = $ ( "<div/>" , { id : "emote-menu-inner" } ) ;
emoteMenu . append ( emoteMenuHeader ) ;
emoteMenu . append ( emoteMenuBody ) ;
2015-10-26 06:27:55 +01:00
for ( var emote in emotesTwitch . emotes ) {
if ( emotesTwitch . emotes . hasOwnProperty ( emote ) ) {
var id = emotesTwitch . emotes [ emote ] . image _id ;
emoteMenuBody . append ( $ ( "<div/>" , { class : "emote-container" } ) . append ( $ ( "<img/>" , { class : "emote-icon" , id : emote , alt : "" , src : "https://static-cdn.jtvnw.net/emoticons/v1/" + id + "/1.0" , title : emote } ) ) ) ;
}
2015-08-27 15:46:53 +02:00
}
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
/ * B e t t e r D i s c o r d A p p S e t t i n g s P a n e l J a v a S c r i p t
2015-08-30 11:17:06 +02:00
* Version : 1.3
2015-08-27 15:46:53 +02:00
* Author : Jiiks | http : //jiiks.net
* Date : 26 / 08 / 2015 - 11 : 54
2015-08-30 11:17:06 +02:00
* Last Update : 30 / 08 / 2015 - 12 : 16
2015-08-27 15:46:53 +02:00
* https : //github.com/Jiiks/BetterDiscordApp
* /
2015-08-31 16:13:02 +02:00
var links = { "Jiiks.net" : "http://jiiks.net" , "Twitter" : "http://twitter.com/jiiksi" , "Github" : "https://github.com/jiiks" } ;
2015-08-29 11:36:47 +02:00
2015-08-27 15:46:53 +02:00
function SettingsPanel ( ) {
}
SettingsPanel . prototype . getPanel = function ( ) {
return this . tcSettingsPanel ;
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
SettingsPanel . prototype . init = function ( ) {
var self = this ;
2015-10-26 06:27:55 +01:00
var body = $ ( "body" ) ;
2015-08-31 15:20:33 +02:00
this . tcSettingsPanel = $ ( "<div/>" , { id : "tc-settings-panel" , style : "display:none" } ) ;
2015-08-27 15:46:53 +02:00
this . getPanel ( ) . append ( $ ( "<div/>" , { id : "tc-settings-panel-header" } ) . append ( $ ( "<h2/>" , { text : "BetterDiscord - Settings" } ) ) . append ( $ ( "<span/>" , { id : "tc-settings-close" , text : "X" , style : "cursor:pointer;" } ) ) ) ;
var settingsList = $ ( "<ul/>" ) ;
this . getPanel ( ) . append ( $ ( "<div/>" , { id : "tc-settings-panel-body" } ) . append ( settingsList ) ) ;
$ . each ( settings , function ( key , value ) {
var son = "tc-switch-on" ;
var sof = "tc-switch-off" ;
2015-08-28 09:42:05 +02:00
if ( settingsCookie [ value . id ] ) {
2015-08-27 15:46:53 +02:00
son = "tc-switch-on active" ;
} else {
sof = "tc-switch-off active" ;
}
2015-08-31 15:36:28 +02:00
2015-08-30 11:17:06 +02:00
settingsList . append ( $ ( "<li/>" ) . append ( $ ( "<h2/>" , { text : key } ) ) . append ( $ ( "<span/>" , { html : " - <span>" + value . info + "</span>" + ( value . implemented == false ? '<span style="color:red"> Coming Soon</span>' : "" ) } ) ) . append ( $ ( "<div/>" , { class : value . implemented ? "tc-switch" : "tc-switch disabled" , id : value . id } ) . append ( $ ( "<span/>" , { class : sof , text : "OFF" } ) ) . append ( $ ( "<span/>" , { class : son , text : "ON" } ) ) ) ) ;
2015-10-26 06:27:55 +01:00
} ) ;
2015-08-27 15:46:53 +02:00
var settingsFooter = $ ( "<div/>" , { id : "tc-settings-panel-footer" } ) ;
2015-08-29 11:36:47 +02:00
settingsFooter . append ( $ ( "<span/>" , { id : "tc-about" , text : "BDA v" + version + "(js " + jsVersion + ") by Jiiks | Settings are automatically saved." } ) ) ;
2015-08-27 15:46:53 +02:00
var tcLinks = $ ( "<span/>" , { id : "tc-links" } ) ;
$ . each ( links , function ( key , value ) {
2015-08-31 16:13:02 +02:00
tcLinks . append ( $ ( "<a/>" , { href : value , text : key , target : "_blank" } ) ) ;
2015-08-27 15:46:53 +02:00
tcLinks . append ( $ ( "<span/>" , { text : " | " } ) ) ;
2015-10-26 06:27:55 +01:00
} ) ;
2015-08-27 15:46:53 +02:00
settingsFooter . append ( tcLinks ) ;
this . getPanel ( ) . append ( settingsFooter ) ;
2015-10-26 06:27:55 +01:00
body . append ( this . getPanel ( ) ) ;
$ ( "#tc-settings-close" ) . on ( "click" , function ( ) { self . show ( ) ; } ) ;
2015-08-27 15:46:53 +02:00
$ ( ".tc-switch" ) . on ( "click" , function ( ) { self . handler ( $ ( this ) ) } ) ;
2015-08-30 11:17:06 +02:00
if ( settingsCookie [ "bda-es-0" ] ) {
$ ( "#twitchcord-button-container" ) . show ( ) ;
} else {
$ ( "#twitchcord-button-container" ) . hide ( ) ;
}
if ( settingsCookie [ "bda-gs-2" ] ) {
2015-10-26 06:27:55 +01:00
body . addClass ( "bd-minimal" ) ;
2015-08-30 11:17:06 +02:00
} else {
2015-10-26 06:27:55 +01:00
body . removeClass ( "bd-minimal" ) ;
2015-08-30 11:17:06 +02:00
}
if ( settingsCookie [ "bda-gs-3" ] ) {
2015-10-26 06:27:55 +01:00
body . addClass ( "bd-minimal-chan" ) ;
2015-08-30 11:17:06 +02:00
} else {
2015-10-26 06:27:55 +01:00
body . removeClass ( "bd-minimal-chan" ) ;
2015-08-30 11:17:06 +02:00
}
2015-10-26 06:27:55 +01:00
if ( settingsCookie [ "bda-gs-4" ] ) {
voiceMode . enable ( ) ;
}
} ;
2015-08-27 15:46:53 +02:00
SettingsPanel . prototype . show = function ( ) {
this . getPanel ( ) . toggle ( ) ;
2015-10-26 06:27:55 +01:00
var settingsLi = $ ( "#tc-settings-li" ) ;
settingsLi . removeClass ( ) ;
2015-08-27 15:46:53 +02:00
if ( this . getPanel ( ) . is ( ":visible" ) ) {
2015-10-26 06:27:55 +01:00
settingsLi . addClass ( "active" ) ;
2015-08-27 15:46:53 +02:00
}
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
SettingsPanel . prototype . handler = function ( e ) {
var sid = e . attr ( "id" ) ;
var enabled = settingsCookie [ sid ] ;
enabled = ! enabled ;
settingsCookie [ sid ] = enabled ;
var swoff = $ ( "#" + sid + " .tc-switch-off" ) ;
var swon = $ ( "#" + sid + " .tc-switch-on" ) ;
swoff . removeClass ( "active" ) ;
swon . removeClass ( "active" ) ;
if ( enabled ) {
swon . addClass ( "active" ) ;
} else {
swoff . addClass ( "active" ) ;
}
2015-08-29 11:36:47 +02:00
if ( settingsCookie [ "bda-es-0" ] ) {
2015-08-27 15:46:53 +02:00
$ ( "#twitchcord-button-container" ) . show ( ) ;
} else {
$ ( "#twitchcord-button-container" ) . hide ( ) ;
}
2015-08-30 11:17:06 +02:00
if ( settingsCookie [ "bda-gs-2" ] ) {
$ ( "body" ) . addClass ( "bd-minimal" ) ;
} else {
$ ( "body" ) . removeClass ( "bd-minimal" ) ;
}
if ( settingsCookie [ "bda-gs-3" ] ) {
$ ( "body" ) . addClass ( "bd-minimal-chan" ) ;
} else {
$ ( "body" ) . removeClass ( "bd-minimal-chan" ) ;
}
2015-10-26 06:27:55 +01:00
if ( settingsCookie [ "bda-gs-1" ] ) {
$ ( "#bd-pub-li" ) . show ( ) ;
} else {
$ ( "#bd-pub-li" ) . hide ( ) ;
}
if ( settingsCookie [ "bda-gs-4" ] ) {
voiceMode . enable ( ) ;
} else {
voiceMode . disable ( ) ;
}
2015-08-27 15:46:53 +02:00
2015-08-31 15:51:41 +02:00
mainCore . saveSettings ( ) ;
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
/ * B e t t e r D i s c o r d A p p U t i l i t i e s J a v a S c r i p t
* Version : 1.0
* Author : Jiiks | http : //jiiks.net
* Date : 26 / 08 / 2015 - 15 : 54
* https : //github.com/Jiiks/BetterDiscordApp
* /
function Utils ( ) {
}
Utils . prototype . getTextArea = function ( ) {
return $ ( ".channel-textarea-inner textarea" ) ;
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
Utils . prototype . jqDefer = function ( fnc ) {
if ( window . jQuery ) { fnc ( ) ; } else { setTimeout ( function ( ) { this . jqDefer ( fnc ) } , 100 ) }
2015-10-26 06:27:55 +01:00
} ;
/ * B e t t e r D i s c o r d A p p V o i c e M o d e J a v a S c r i p t
* Version : 1.0
* Author : Jiiks | http : //jiiks.net
* Date : 25 / 10 / 2015 - 19 : 10
* https : //github.com/Jiiks/BetterDiscordApp
* /
function VoiceMode ( ) {
2015-08-31 15:36:28 +02:00
}
2015-10-26 06:27:55 +01:00
2015-10-31 22:24:40 +01:00
VoiceMode . prototype . obsCallback = function ( ) {
2015-10-31 22:28:09 +01:00
var self = this ;
2015-10-31 22:24:40 +01:00
if ( settingsCookie [ "bda-gs-4" ] ) {
2015-10-31 22:28:09 +01:00
self . disable ( ) ;
setTimeout ( function ( ) {
self . enable ( ) ;
} , 200 ) ;
2015-10-31 22:24:40 +01:00
}
}
2015-10-26 06:27:55 +01:00
VoiceMode . prototype . enable = function ( ) {
$ ( ".scroller.guild-channels ul" ) . first ( ) . css ( "display" , "none" ) ;
$ ( ".scroller.guild-channels header" ) . first ( ) . css ( "display" , "none" ) ;
$ ( ".flex-vertical.flex-spacer" ) . first ( ) . css ( "overflow" , "hidden" ) ;
$ ( ".chat.flex-vertical.flex-spacer" ) . first ( ) . css ( "visibility" , "hidden" ) . css ( "min-width" , "0px" ) ;
$ ( ".flex-vertical.channels-wrap" ) . first ( ) . css ( "width" , "100%" ) ;
$ ( ".guild-header .btn.btn-hamburger" ) . first ( ) . css ( "visibility" , "hidden" ) ;
} ;
VoiceMode . prototype . disable = function ( ) {
$ ( ".scroller.guild-channels ul" ) . first ( ) . css ( "display" , "" ) ;
$ ( ".scroller.guild-channels header" ) . first ( ) . css ( "display" , "" ) ;
$ ( ".flex-vertical.flex-spacer" ) . first ( ) . css ( "overflow" , "" ) ;
$ ( ".chat.flex-vertical.flex-spacer" ) . first ( ) . css ( "visibility" , "" ) . css ( "min-width" , "" ) ;
$ ( ".flex-vertical.channels-wrap" ) . first ( ) . css ( "width" , "" ) ;
$ ( ".guild-header .btn.btn-hamburger" ) . first ( ) . css ( "visibility" , "" ) ;
} ;