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
2016-04-02 09:14:20 +02:00
* Version : 1.53
2015-08-27 15:46:53 +02:00
* Author : Jiiks | http : //jiiks.net
* Date : 27 / 08 / 2015 - 16 : 36
2016-04-02 09:14:20 +02:00
* Last Update : 02 / 04 / 2016
2015-08-27 15:46:53 +02:00
* https : //github.com/Jiiks/BetterDiscordApp
* /
2016-04-08 00:21:30 +02:00
var settingsPanel , emoteModule , utils , quickEmoteMenu , opublicServers , voiceMode , pluginModule , themeModule , customCssEditor ;
var jsVersion = 1.61 ;
2016-01-17 00:05:29 +01:00
var supportedVersion = "0.2.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" ;
2015-12-10 04:01:24 +01:00
var bttvEmoteUrlStart = "https://cdn.betterttv.net/emote/" ;
var bttvEmoteUrlEnd = "/1x" ;
2015-08-27 15:46:53 +02:00
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 = {
2016-04-08 00:21:30 +02:00
"Save logs locally" : { "id" : "bda-gs-0" , "info" : "Saves chat logs locally" , "implemented" : false , "hidden" : false } ,
"Public Servers" : { "id" : "bda-gs-1" , "info" : "Display public servers button" , "implemented" : true , "hidden" : false } ,
"Minimal Mode" : { "id" : "bda-gs-2" , "info" : "Hide elements and reduce the size of elements." , "implemented" : true , "hidden" : false } ,
"Voice Mode" : { "id" : "bda-gs-4" , "info" : "Only show voice chat" , "implemented" : true , "hidden" : false } ,
"Hide Channels" : { "id" : "bda-gs-3" , "info" : "Hide channels in minimal mode" , "implemented" : true , "hidden" : false } ,
"Quick Emote Menu" : { "id" : "bda-es-0" , "info" : "Show quick emote menu for adding emotes" , "implemented" : true , "hidden" : false } ,
"Show Emotes" : { "id" : "bda-es-7" , "info" : "Show any emotes" , "implemented" : true , "hidden" : false } ,
"FrankerFaceZ Emotes" : { "id" : "bda-es-1" , "info" : "Show FrankerFaceZ Emotes" , "implemented" : true , "hidden" : false } ,
"BetterTTV Emotes" : { "id" : "bda-es-2" , "info" : "Show BetterTTV Emotes" , "implemented" : true , "hidden" : false } ,
"Emote Autocomplete" : { "id" : "bda-es-3" , "info" : "Autocomplete emote commands" , "implemented" : false , "hidden" : false } ,
"Emote Auto Capitalization" : { "id" : "bda-es-4" , "info" : "Autocapitalize emote commands" , "implemented" : true , "hidden" : false } ,
"Override Default Emotes" : { "id" : "bda-es-5" , "info" : "Override default emotes" , "implemented" : false , "hidden" : false } ,
"Show Names" : { "id" : "bda-es-6" , "info" : "Show emote names on hover" , "implemented" : true , "hidden" : false } ,
"Show emote modifiers" : { "id" : "bda-es-8" , "info" : "Enable/Disable emote mods" , "implemented" : true , "hidden" : false } ,
"Voice Disconnect" : { "id" : "bda-dc-0" , "info" : "Disconnect from voice server when closing Discord" , "implemented" : true , "hidden" : false } ,
"Custom css live update" : { "id" : "bda-css-0" , "info" : "" , "implemented" : true , "hidden" : true } ,
"Custom css auto udpate" : { "id" : "bda-css-1" , "info" : "" , "implemented" : true , "hidden" : true }
2016-01-08 16:33:43 +01:00
} ;
2015-08-29 11:36:47 +02:00
2015-11-27 01:14:33 +01:00
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" }
} ;
2015-08-29 11:36:47 +02:00
var defaultCookie = {
2016-01-08 16:33:43 +01:00
"version" : jsVersion ,
2015-11-29 18:21:58 +01:00
"bda-gs-0" : false ,
"bda-gs-1" : true ,
2015-12-23 22:48:59 +01:00
"bda-gs-2" : false ,
2015-11-29 18:21:58 +01:00
"bda-gs-3" : false ,
"bda-gs-4" : false ,
"bda-es-0" : true ,
2015-12-23 09:56:16 +01:00
"bda-es-1" : true ,
2015-12-23 22:48:59 +01:00
"bda-es-2" : true ,
2015-11-29 18:21:58 +01:00
"bda-es-3" : false ,
"bda-es-4" : false ,
"bda-es-5" : true ,
"bda-es-6" : true ,
"bda-es-7" : true ,
2016-04-02 09:56:19 +02:00
"bda-es-8" : true ,
2016-04-08 00:21:30 +02:00
"bda-jd" : true ,
"bda-es-8" : true ,
"bda-dc-0" : false ,
"bda-css-0" : false ,
"bda-css-1" : false
2015-11-29 18:21:58 +01:00
} ;
var bdchangelog = {
2015-12-11 10:21:16 +01:00
"changes" : {
2016-04-08 00:21:30 +02:00
"cccss" : {
"title" : "v1.61 : New custom CSS editor" ,
"text" : "The custom CSS editor now has options and can be detached!" ,
"img" : ""
} ,
"vdc" : {
"title" : "v1.61 : Voice Disconnect" ,
"text" : "Disconnect from voice server when closing Discord!" ,
"img" : ""
} ,
2016-04-07 14:08:16 +02:00
"pslist" : {
"title" : "v1.60 : New public server list!" ,
"text" : 'New and shiny public server list powered by <a href="https://www.discordservers.com/" target="_blank">DiscordServers.com</a>!' ,
"img" : ""
} ,
2015-12-27 16:39:10 +01:00
"api" : {
2016-04-07 14:08:16 +02:00
"title" : "v1.59 : New plugin api callback" ,
2016-04-04 16:22:53 +02:00
"text" : "Use the `observer(e)` callback instead of creating your own MutationObserver" ,
"img" : ""
} ,
"emotemods" : {
2016-04-07 14:08:16 +02:00
"title" : "v1.59 : New emote mods!" ,
2016-04-04 16:22:53 +02:00
"text" : "The following emote mods have been added: :shake2, :shake3, :flap" ,
"img" : ""
} ,
"minmode" : {
2016-04-07 14:08:16 +02:00
"title" : "v1.59: Minimal mode" ,
2016-04-04 16:22:53 +02:00
"text" : "Minimal mode embed fixed size has been removed" ,
"img" : ""
}
} ,
"fixes" : {
"emotes" : {
2016-04-07 14:08:16 +02:00
"title" : "v1.59 : Native sub emote mods" ,
2016-04-04 16:22:53 +02:00
"text" : "Emote mods now work with native sub emotes!" ,
"img" : ""
} ,
"emotes2" : {
2016-04-07 14:08:16 +02:00
"title" : "v1.59 : Emote mods and custom emotes" ,
2016-04-04 16:22:53 +02:00
"text" : "Emote mods will no longer interfere with custom emotes using :" ,
2015-11-29 18:21:58 +01:00
"img" : ""
}
}
2015-08-29 11:36:47 +02:00
} ;
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
2016-01-08 16:33:43 +01:00
Core . prototype . init = function ( ) {
2015-11-27 11:07:59 +01:00
var self = this ;
2016-01-08 16:33:43 +01:00
if ( version < supportedVersion ) {
this . alert ( "Not Supported" , "BetterDiscord v" + version + "(your version)" + " is not supported by the latest js(" + jsVersion + ").<br><br> Please download the latest version from <a href='https://betterdiscord.net' target='_blank'>BetterDiscord.net</a>" ) ;
2015-10-26 06:27:55 +01:00
return ;
}
2015-08-29 11:36:47 +02:00
2015-08-27 15:46:53 +02:00
utils = new Utils ( ) ;
2015-12-31 18:27:43 +01:00
var sock = new BdWSocket ( ) ;
sock . start ( ) ;
2015-11-01 12:37:04 +01:00
utils . getHash ( ) ;
2015-08-27 15:46:53 +02:00
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" ) ;
2016-01-08 16:33:43 +01:00
if ( $ ( ".guilds-wrapper .guilds" ) . children ( ) . length > 0 ) {
2015-10-26 06:27:55 +01:00
console . log ( new Date ( ) . getTime ( ) + " Defer Loaded" ) ;
2016-01-13 23:53:18 +01:00
var guilds = $ ( ".guilds>li:first-child" ) ;
2015-10-26 06:27:55 +01:00
2015-11-27 11:07:59 +01:00
var showChannelsButton = $ ( "<button/>" , {
class : "btn" ,
id : "bd-show-channels" ,
text : "R" ,
css : {
"cursor" : "pointer"
} ,
2016-01-08 16:33:43 +01:00
click : function ( ) {
2015-11-27 11:07:59 +01:00
settingsCookie [ "bda-gs-3" ] = false ;
$ ( "body" ) . removeClass ( "bd-minimal-chan" ) ;
self . saveSettings ( ) ;
}
} ) ;
$ ( ".guilds-wrapper" ) . prepend ( showChannelsButton ) ;
opublicServers = new PublicServers ( ) ;
2016-04-08 00:21:30 +02:00
customCssEditor = new CustomCssEditor ( ) ;
2015-12-12 07:07:56 +01:00
pluginModule = new PluginModule ( ) ;
pluginModule . loadPlugins ( ) ;
2016-01-08 16:33:43 +01:00
if ( typeof ( themesupport2 ) !== "undefined" ) {
2015-12-15 08:37:15 +01:00
themeModule = new ThemeModule ( ) ;
themeModule . loadThemes ( ) ;
}
2015-12-12 07:07:56 +01: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 ) ;
2016-01-08 16:33:43 +01:00
$ ( "#tc-settings-button" ) . on ( "click" , function ( ) {
settingsPanel . show ( ) ;
} ) ;
2016-04-07 14:22:33 +02:00
2016-04-08 00:21:30 +02:00
window . addEventListener ( "beforeunload" , function ( ) {
if ( settingsCookie [ "bda-dc-0" ] ) {
$ ( '.btn.btn-disconnect' ) . click ( ) ;
}
} ) ;
2015-12-11 04:24:28 +01:00
opublicServers . init ( ) ;
2015-10-26 06:27:55 +01:00
emoteModule . autoCapitalize ( ) ;
2015-11-29 18:21:58 +01:00
/*Display new features in BetterDiscord*/
2016-01-08 16:33:43 +01:00
if ( settingsCookie [ "version" ] < jsVersion ) {
2015-11-29 18:21:58 +01:00
var cl = self . constructChangelog ( ) ;
$ ( "body" ) . append ( cl ) ;
settingsCookie [ "version" ] = jsVersion ;
self . saveSettings ( ) ;
}
2015-12-27 16:39:10 +01:00
2015-12-12 03:28:42 +01:00
$ ( "head" ) . append ( "<style>.CodeMirror{ min-width:100%; }</style>" ) ;
2016-01-07 09:01:20 +01:00
$ ( "head" ) . append ( '<style id="bdemotemenustyle"></style>' ) ;
2016-01-02 08:06:25 +01:00
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
2016-01-08 16:33:43 +01:00
$ ( document ) . ready ( function ( ) {
2015-10-26 06:27:55 +01:00
setTimeout ( gwDefer , 1000 ) ;
} ) ;
} ;
2015-08-27 15:46:53 +02:00
2016-01-08 16:33:43 +01:00
Core . prototype . initSettings = function ( ) {
if ( $ . cookie ( "better-discord" ) == undefined ) {
2015-08-29 11:36:47 +02:00
settingsCookie = defaultCookie ;
this . saveSettings ( ) ;
} else {
this . loadSettings ( ) ;
2016-01-08 16:33:43 +01:00
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
2016-01-08 16:33:43 +01: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
2016-01-08 16:33:43 +01:00
Core . prototype . loadSettings = function ( ) {
2015-08-29 11:36:47 +02:00
settingsCookie = JSON . parse ( $ . cookie ( "better-discord" ) ) ;
2015-10-26 06:27:55 +01:00
} ;
2016-01-07 10:19:46 +01:00
var botlist = [ "119598467310944259" ] ; //Temp
2016-01-08 16:33:43 +01:00
Core . prototype . initObserver = function ( ) {
mainObserver = new MutationObserver ( function ( mutations ) {
mutations . forEach ( function ( mutation ) {
2016-04-04 16:22:53 +02:00
if ( typeof pluginModule !== "undefined" ) pluginModule . rawObserver ( mutation ) ;
2016-01-08 16:33:43 +01:00
if ( mutation . target . getAttribute ( 'class' ) != null ) {
2016-01-24 04:16:40 +01:00
//console.log(mutation.target)
if ( mutation . target . classList . contains ( 'title-wrap' ) || mutation . target . classList . contains ( 'chat' ) ) {
2015-08-29 21:02:20 +02:00
quickEmoteMenu . obsCallback ( ) ;
2015-11-19 00:35:39 +01:00
voiceMode . obsCallback ( ) ;
2016-01-08 16:33:43 +01:00
if ( typeof pluginModule !== "undefined" ) pluginModule . channelSwitch ( ) ;
2015-12-27 16:39:10 +01:00
}
2016-01-08 16:33:43 +01:00
if ( mutation . target . getAttribute ( 'class' ) . indexOf ( 'scroller messages' ) != - 1 ) {
if ( typeof pluginModule !== "undefined" ) pluginModule . newMessage ( ) ;
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
2016-01-08 16:33:43 +01:00
mainObserver . observe ( document , {
childList : true ,
subtree : true
} ) ;
2015-10-26 06:27:55 +01:00
} ;
2015-08-29 11:36:47 +02:00
2016-01-08 16:33:43 +01:00
Core . prototype . constructChangelog = function ( ) {
2015-11-29 18:21:58 +01:00
var changeLog = '' +
'<div id="bd-wn-modal" class="modal" style="opacity:1;">' +
' <div class="modal-inner">' +
' <div id="bdcl" class="change-log"> ' +
' <div class="header">' +
2016-04-02 09:14:20 +02:00
' <strong>What\'s new in BetterDiscord JS' + jsVersion + '</strong>' +
2015-11-29 18:21:58 +01:00
' <button class="close" onclick=\'$("#bd-wn-modal").remove();\'></button>' +
' </div><!--header-->' +
' <div class="scroller-wrap">' +
' <div class="scroller">' ;
2016-01-08 16:33:43 +01:00
if ( bdchangelog . changes != null ) {
2015-11-29 18:21:58 +01:00
changeLog += '' +
'<h1 class="changelog-added">' +
' <span>New Stuff</span>' +
'</h1>' +
'<ul>' ;
2016-01-08 16:33:43 +01:00
for ( var change in bdchangelog . changes ) {
2015-11-29 18:21:58 +01:00
change = bdchangelog . changes [ change ] ;
changeLog += '' +
'<li>' +
2016-01-08 16:33:43 +01:00
' <strong>' + change . title + '</strong>' +
' <div>' + change . text + '</div>' +
2015-11-29 18:21:58 +01:00
'</li>' ;
}
changeLog += '</ul>' ;
}
2016-01-08 16:33:43 +01:00
if ( bdchangelog . fixes != null ) {
2015-11-29 18:21:58 +01:00
changeLog += '' +
'<h1 class="changelog-fixed">' +
' <span>Fixed</span>' +
'</h1>' +
'<ul>' ;
2016-01-08 16:33:43 +01:00
for ( var fix in bdchangelog . fixes ) {
2015-11-29 18:21:58 +01:00
fix = bdchangelog . fixes [ fix ] ;
changeLog += '' +
'<li>' +
2016-01-08 16:33:43 +01:00
' <strong>' + fix . title + '</strong>' +
' <div>' + fix . text + '</div>' +
2015-11-29 18:21:58 +01:00
'</li>' ;
}
changeLog += '</ul>' ;
}
2016-01-08 16:33:43 +01:00
if ( bdchangelog . upcoming != null ) {
2015-11-29 18:21:58 +01:00
changeLog += '' +
'<h1 class="changelog-in-progress">' +
' <span>Coming Soon</span>' +
'</h1>' +
'<ul>' ;
2016-01-08 16:33:43 +01:00
for ( var upc in bdchangelog . upcoming ) {
2015-11-29 18:21:58 +01:00
upc = bdchangelog . upcoming [ upc ] ;
changeLog += '' +
'<li>' +
2016-01-08 16:33:43 +01:00
' <strong>' + upc . title + '</strong>' +
' <div>' + upc . text + '</div>' +
2015-11-29 18:21:58 +01:00
'</li>' ;
}
changeLog += '</ul>' ;
}
changeLog += '' +
' </div><!--scoller-->' +
' </div><!--scroller-wrap-->' +
' <div class="footer">' +
' </div><!--footer-->' +
' </div><!--change-log-->' +
' </div><!--modal-inner-->' +
'</div><!--modal-->' ;
return changeLog ;
} ;
2016-01-08 16:33:43 +01:00
Core . prototype . alert = function ( title , text ) {
2015-12-23 09:56:16 +01:00
$ ( "body" ) . append ( '' +
2016-01-08 16:33:43 +01:00
'<div class="bd-alert">' +
' <div class="bd-alert-header">' +
' <span>' + title + '</span>' +
' <div class="bd-alert-closebtn" onclick="$(this).parent().parent().remove();">× </div>' +
' </div>' +
' <div class="bd-alert-body">' +
' <div class="scroller-wrap dark fade">' +
' <div class="scroller">' + text + '</div>' +
' </div>' +
' </div>' +
'</div>' ) ;
2015-12-23 09:56:16 +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 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 = { } ;
2016-01-08 16:33:43 +01:00
var emotesTwitch = {
"emotes" : {
"emote" : {
"image_id" : 0
}
}
} ; //for ide
2015-10-26 06:27:55 +01:00
var subEmotesTwitch = { } ;
2015-08-27 15:46:53 +02:00
2016-01-08 16:33:43 +01:00
function EmoteModule ( ) { }
2015-08-29 11:36:47 +02:00
2016-01-08 16:33:43 +01:00
EmoteModule . prototype . init = function ( ) { } ;
2015-11-01 12:57:10 +01:00
2016-01-08 16:33:43 +01:00
EmoteModule . prototype . getBlacklist = function ( ) {
2016-01-17 00:08:52 +01:00
$ . getJSON ( "https://cdn.rawgit.com/Jiiks/betterDiscordApp/" + _hash + "/data/emotefilter.json" , function ( data ) {
2016-01-08 16:33:43 +01:00
bemotes = data . blacklist ;
} ) ;
2015-11-01 12:44:25 +01:00
} ;
2015-08-27 15:46:53 +02:00
2016-01-08 16:33:43 +01:00
EmoteModule . prototype . obsCallback = function ( mutation ) {
2015-08-29 11:36:47 +02:00
var self = this ;
2015-10-29 14:46:08 +01:00
2016-01-08 16:33:43 +01:00
if ( ! settingsCookie [ "bda-es-7" ] ) return ;
$ ( ".emoji" ) . each ( function ( ) {
2015-12-27 16:39:10 +01:00
var t = $ ( this ) ;
2016-01-08 16:33:43 +01:00
if ( t . attr ( "src" ) . indexOf ( ".png" ) != - 1 ) {
2016-04-04 16:22:53 +02:00
var next = t . next ( ) ;
var newText = t . attr ( "alt" ) ;
if ( next . size ( ) > 0 ) {
if ( next . prop ( "tagName" ) == "SPAN" ) {
newText += next . text ( ) ;
next . remove ( ) ;
}
}
if ( t . parent ( ) . prop ( "tagName" ) != "SPAN" ) {
t . replaceWith ( "<span>" + newText + "</span>" ) ;
} else {
t . replaceWith ( newText ) ;
}
2015-12-27 16:39:10 +01:00
}
} ) ;
2015-11-27 01:14:33 +01:00
2016-01-08 16:33:43 +01:00
for ( var i = 0 ; i < mutation . addedNodes . length ; ++ i ) {
2015-08-29 11:36:47 +02:00
var next = mutation . addedNodes . item ( i ) ;
2016-01-08 16:33:43 +01:00
if ( next ) {
2015-08-29 11:36:47 +02:00
var nodes = self . getNodes ( next ) ;
2016-01-08 16:33:43 +01:00
for ( var node in nodes ) {
if ( nodes . hasOwnProperty ( node ) ) {
2015-10-26 06:27:55 +01:00
self . injectEmote ( nodes [ node ] ) ;
}
2015-08-29 11:36:47 +02:00
}
}
}
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
2016-01-08 16:33:43 +01:00
EmoteModule . prototype . getNodes = function ( node ) {
2015-08-27 15:46:53 +02:00
var next ;
var nodes = [ ] ;
2015-10-31 22:49:42 +01:00
var treeWalker = document . createTreeWalker ( node , NodeFilter . SHOW _TEXT , null , false ) ;
2015-08-27 15:46:53 +02:00
2016-01-08 16:33:43 +01:00
while ( next = treeWalker . nextNode ( ) ) {
2015-08-27 15:46:53 +02:00
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-11-01 12:44:25 +01:00
var bemotes = [ ] ;
2015-11-28 00:41:48 +01:00
var spoilered = [ ] ;
2015-10-27 16:41:46 +01:00
2016-01-08 16:33:43 +01:00
EmoteModule . prototype . injectEmote = function ( node ) {
2015-08-27 15:46:53 +02:00
2016-01-08 16:33:43 +01:00
if ( typeof emotesTwitch === 'undefined' ) return ;
2015-08-27 15:46:53 +02:00
2016-01-08 16:33:43 +01:00
if ( ! node . parentElement ) return ;
2015-08-27 15:46:53 +02:00
var parent = node . parentElement ;
2016-01-08 16:33:43 +01:00
if ( parent . tagName != "SPAN" ) return ;
2016-03-30 16:56:01 +02:00
if ( ! $ ( parent . parentElement ) . hasClass ( "markup" ) && ! $ ( parent . parentElement ) . hasClass ( "message-content" ) ) {
return ;
}
2015-12-11 10:13:38 +01:00
var edited = false ;
2016-01-08 16:33:43 +01:00
if ( $ ( parent . parentElement ) . hasClass ( "edited" ) ) {
2016-04-04 16:22:53 +02:00
parent = parent . parentElement . parentElement . firstChild ;
2015-12-11 10:13:38 +01:00
edited = true ;
}
2016-01-08 16:33:43 +01:00
2015-12-11 10:13:38 +01:00
function inject ( ) {
var parentInnerHTML = parent . innerHTML ;
var words = parentInnerHTML . split ( /\s+/g ) ;
2015-08-27 15:46:53 +02:00
2016-01-08 16:33:43 +01:00
if ( ! words ) return ;
2015-10-27 16:43:37 +01:00
2016-01-08 16:33:43 +01:00
words . some ( function ( word ) {
if ( word . slice ( 0 , 4 ) == "[!s]" ) {
2015-11-28 00:29:53 +01:00
2015-12-11 10:13:38 +01:00
parentInnerHTML = parentInnerHTML . replace ( "[!s]" , "" ) ;
var markup = $ ( parent ) . parent ( ) ;
var reactId = markup . attr ( "data-reactid" ) ;
2016-01-08 16:33:43 +01:00
if ( spoilered . indexOf ( reactId ) > - 1 ) {
2015-12-11 10:13:38 +01:00
return ;
}
2015-11-28 00:41:48 +01:00
2015-12-11 10:13:38 +01:00
markup . addClass ( "spoiler" ) ;
2016-01-08 16:33:43 +01:00
markup . on ( "click" , function ( ) {
2015-12-11 10:13:38 +01:00
$ ( this ) . removeClass ( "spoiler" ) ;
spoilered . push ( $ ( this ) . attr ( "data-reactid" ) ) ;
} ) ;
2015-11-28 00:41:48 +01:00
return ;
}
2015-12-23 23:01:03 +01:00
2016-01-08 16:33:43 +01:00
if ( word . length < 4 ) {
2015-12-11 10:21:16 +01:00
return ;
}
2015-12-23 23:22:28 +01:00
2016-01-08 16:33:43 +01:00
if ( word == "ClauZ" ) {
parentInnerHTML = parentInnerHTML . replace ( "ClauZ" , '<img src="https://cdn.frankerfacez.com/emoticon/70852/1" style="width:25px; transform:translate(-29px, -14px);"></img>' ) ;
return ;
}
2015-12-11 07:46:37 +01:00
2016-04-02 07:23:30 +02:00
var useEmoteCss = false ;
var sWord = word ;
var emoteClass = "" ;
2016-04-04 16:22:53 +02:00
var allowedClasses = [ "emoteflip" , "emotespin" , "emotepulse" , "emotespin2" , "emotespin3" , "emote1spin" , "emote2spin" , "emote3spin" , "emotetr" , "emotebl" , "emotebr" , "emoteshake" , "emoteshake2" , "emoteshake3" , "emoteflap" ] ;
2016-04-02 07:23:30 +02:00
if ( word . indexOf ( ":" ) > - 1 ) {
2016-04-04 16:22:53 +02:00
// userEmoteCss = true;
//sWord = word.split(":")[0];
var split = word . split ( /:(?!.*:)/ ) ;
if ( split [ 0 ] != "" && split [ 1 ] != "" ) {
userEmoteCss = true ;
sWord = split [ 0 ] ;
if ( settingsCookie [ "bda-es-8" ] ) {
// emoteClass = "emote" + word.split(":")[1];
emoteClass = "emote" + split [ 1 ] ;
if ( allowedClasses . indexOf ( emoteClass ) < 0 ) {
emoteClass = "" ;
}
2016-04-02 09:56:19 +02:00
}
2016-03-30 16:56:01 +02:00
}
2016-04-02 07:23:30 +02:00
}
2016-04-03 01:47:11 +02:00
if ( $ . inArray ( sWord , bemotes ) != - 1 ) return ;
2016-04-02 07:23:30 +02:00
if ( emotesTwitch . emotes . hasOwnProperty ( sWord ) ) {
var len = Math . round ( sWord . length / 4 ) ;
var name = sWord . substr ( 0 , len ) + "\uFDD9" + sWord . substr ( len , len ) + "\uFDD9" + sWord . substr ( len * 2 , len ) + "\uFDD9" + sWord . substr ( len * 3 ) ;
var url = twitchEmoteUrlStart + emotesTwitch . emotes [ sWord ] . image _id + twitchEmoteUrlEnd ;
2016-04-02 09:56:19 +02:00
parentInnerHTML = parentInnerHTML . replace ( word , '<div class="emotewrapper"><img class="emote ' + emoteClass + '" alt="' + name + '" src="' + url + '"/><input onclick=\'quickEmoteMenu.favorite(\"' + name + '\", \"' + url + '\");\' class="fav" title="Favorite!" type="button"></div>' ) ;
2015-12-11 10:13:38 +01:00
return ;
}
2015-10-26 06:27:55 +01:00
2016-04-02 07:23:30 +02:00
if ( subEmotesTwitch . hasOwnProperty ( sWord ) ) {
var len = Math . round ( sWord . length / 4 ) ;
var name = sWord . substr ( 0 , len ) + "\uFDD9" + sWord . substr ( len , len ) + "\uFDD9" + sWord . substr ( len * 2 , len ) + "\uFDD9" + sWord . substr ( len * 3 ) ;
var url = twitchEmoteUrlStart + subEmotesTwitch [ sWord ] + twitchEmoteUrlEnd ;
2016-04-02 09:56:19 +02:00
parentInnerHTML = parentInnerHTML . replace ( word , '<div class="emotewrapper"><img class="emote ' + emoteClass + '" alt="' + name + '" src="' + url + '"/><input onclick=\'quickEmoteMenu.favorite(\"' + name + '\", \"' + url + '\");\' class="fav" title="Favorite!" type="button"></div>' ) ;
2016-03-05 06:19:10 +01:00
return ;
}
2016-04-02 07:23:30 +02:00
2015-12-11 10:21:16 +01:00
if ( typeof emotesFfz !== 'undefined' && settingsCookie [ "bda-es-1" ] ) {
2016-04-02 07:23:30 +02:00
if ( emotesFfz . hasOwnProperty ( sWord ) ) {
var len = Math . round ( sWord . length / 4 ) ;
var name = sWord . substr ( 0 , len ) + "\uFDD9" + sWord . substr ( len , len ) + "\uFDD9" + sWord . substr ( len * 2 , len ) + "\uFDD9" + sWord . substr ( len * 3 ) ;
var url = ffzEmoteUrlStart + emotesFfz [ sWord ] + ffzEmoteUrlEnd ;
2016-04-02 09:56:19 +02:00
parentInnerHTML = parentInnerHTML . replace ( word , '<div class="emotewrapper"><img class="emote ' + emoteClass + '" alt="' + name + '" src="' + url + '"/><input onclick=\'quickEmoteMenu.favorite(\"' + name + '\", \"' + url + '\");\' class="fav" title="Favorite!" type="button"></div>' ) ;
2015-12-11 10:21:16 +01:00
return ;
}
}
if ( typeof emotesBTTV !== 'undefined' && settingsCookie [ "bda-es-2" ] ) {
2016-04-02 07:23:30 +02:00
if ( emotesBTTV . hasOwnProperty ( sWord ) ) {
var len = Math . round ( sWord . length / 4 ) ;
var name = sWord . substr ( 0 , len ) + "\uFDD9" + sWord . substr ( len , len ) + "\uFDD9" + sWord . substr ( len * 2 , len ) + "\uFDD9" + sWord . substr ( len * 3 ) ;
var url = emotesBTTV [ sWord ] ;
2016-04-02 09:56:19 +02:00
parentInnerHTML = parentInnerHTML . replace ( word , '<div class="emotewrapper"><img class="emote ' + emoteClass + '" alt="' + name + '" src="' + url + '"/><input onclick=\'quickEmoteMenu.favorite(\"' + name + '\", \"' + url + '\");\' class="fav" title="Favorite!" type="button"></div>' ) ;
2015-12-11 10:21:16 +01:00
return ;
}
2015-08-27 15:46:53 +02:00
}
2016-01-08 16:33:43 +01:00
if ( typeof emotesBTTV2 !== 'undefined' && settingsCookie [ "bda-es-2" ] ) {
2016-04-02 07:23:30 +02:00
if ( emotesBTTV2 . hasOwnProperty ( sWord ) ) {
var len = Math . round ( sWord . length / 4 ) ;
var name = sWord . substr ( 0 , len ) + "\uFDD9" + sWord . substr ( len , len ) + "\uFDD9" + sWord . substr ( len * 2 , len ) + "\uFDD9" + sWord . substr ( len * 3 ) ;
var url = bttvEmoteUrlStart + emotesBTTV2 [ sWord ] + bttvEmoteUrlEnd ;
2016-04-02 09:56:19 +02:00
parentInnerHTML = parentInnerHTML . replace ( word , '<div class="emotewrapper"><img class="emote ' + emoteClass + '" alt="' + name + '" src="' + url + '"/><input onclick=\'quickEmoteMenu.favorite(\"' + name + '\", \"' + url + '\");\' class="fav" title="Favorite!" type="button"></div>' ) ;
2015-12-11 10:21:16 +01:00
return ;
}
}
} ) ;
2015-08-27 15:46:53 +02:00
2016-01-08 16:33:43 +01:00
if ( parent . parentElement == null ) return ;
2015-10-26 06:27:55 +01:00
2015-12-11 10:21:16 +01:00
var oldHeight = parent . parentElement . offsetHeight ;
parent . innerHTML = parentInnerHTML . replace ( new RegExp ( "\uFDD9" , "g" ) , "" ) ;
var newHeight = parent . parentElement . offsetHeight ;
2015-10-14 08:50:34 +02:00
2015-12-11 10:21:16 +01:00
var scrollPane = $ ( ".scroller.messages" ) . first ( ) ;
scrollPane . scrollTop ( scrollPane . scrollTop ( ) + ( newHeight - oldHeight ) ) ;
2016-04-07 14:08:16 +02:00
2016-01-08 16:33:43 +01:00
}
if ( edited ) {
setTimeout ( inject , 250 ) ;
} else {
inject ( ) ;
}
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
2016-01-08 16:33:43 +01: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
2016-01-08 16:33:43 +01:00
$ ( 'body' ) . delegate ( $ ( ".channel-textarea-inner textarea" ) , 'keyup change paste' , function ( ) {
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
2016-01-08 16:33:43 +01:00
if ( text == undefined ) return ;
2015-08-29 11:36:47 +02:00
2015-08-27 15:46:53 +02:00
var lastWord = text . split ( " " ) . pop ( ) ;
2016-01-08 16:33:43 +01:00
if ( lastWord . length > 3 ) {
if ( lastWord == "danSgame" ) return ;
2015-08-27 15:46:53 +02:00
var ret = self . capitalize ( lastWord . toLowerCase ( ) ) ;
2016-01-08 16:33:43 +01:00
if ( ret !== null && ret !== undefined ) {
2015-08-27 15:46:53 +02:00
$ ( ".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
2016-01-08 16:33:43 +01:00
EmoteModule . prototype . capitalize = function ( value ) {
2015-12-11 07:43:36 +01:00
var res = emotesTwitch . emotes ;
2016-01-08 16:33:43 +01:00
for ( var p in res ) {
if ( res . hasOwnProperty ( p ) && value == ( p + '' ) . toLowerCase ( ) ) {
2015-12-11 07:43:36 +01:00
return p ;
}
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-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
* /
function PublicServers ( ) {
}
2016-01-08 16:33:43 +01:00
PublicServers . prototype . getPanel = function ( ) {
2015-10-26 06:27:55 +01:00
return this . container ;
} ;
2016-01-08 16:33:43 +01:00
PublicServers . prototype . init = function ( ) {
2016-04-07 14:22:33 +02:00
var self = this ;
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"
} ) ) ) ) ) ;
$ ( "#bd-pub-button" ) . on ( "click" , function ( ) {
2016-04-07 14:24:02 +02:00
self . show ( ) ;
2016-04-07 14:22:33 +02:00
} ) ;
2016-04-07 14:08:16 +02:00
var panelBase = "" ;
panelBase += "<div id=\"pubs-container\">" ;
panelBase += " <div id=\"pubs-spinner\">" ;
panelBase += " <span class=\"spinner\" type=\"wandering-cubes\"><span class=\"spinner-inner spinner-wandering-cubes\"><span class=\"spinner-item\"><\/span><span class=\"spinner-item\"><\/span><\/span><\/span>" ;
panelBase += " <\/div>" ;
panelBase += " <div id=\"pubs-header\">" ;
panelBase += " <h2 id=\"pubs-header-title\">Public Servers<\/h2>" ;
panelBase += " <button id=\"sbtn\">Search<\/button>" ;
panelBase += " <input id=\"sterm\" type=\"text\" placeholder=\"Search term...\"\/>" ;
panelBase += " <\/div>" ;
panelBase += " <div class=\"scroller-wrap\">" ;
panelBase += " <div class=\"scroller\">" ;
panelBase += " <div id=\"slist\" class=\"servers-listing\">" ;
panelBase += " " ;
panelBase += " <\/div>" ;
panelBase += " <\/div>" ;
panelBase += " <\/div>" ;
panelBase += " <div id=\"pubs-footer\">" ;
panelBase += " <div>Server list provided by <a href=\"https:\/\/www.discordservers.com\/\" target=\"_blank\">DiscordServers.com<\/a><\/div>" ;
panelBase += " <\/div>" ;
panelBase += "<\/div>" ;
this . container = panelBase ;
2016-04-07 14:22:33 +02:00
if ( $ ( "#bd-pub-li" ) . length < 1 ) {
setTimeout ( function ( ) {
self . init ( ) ;
} , 250 ) ;
}
2016-04-07 14:08:16 +02:00
} ;
2015-08-31 15:20:33 +02:00
2015-10-26 06:27:55 +01:00
2016-04-07 14:08:16 +02:00
PublicServers . prototype . show = function ( ) {
var self = this ;
$ ( "body" ) . append ( this . getPanel ( ) ) ;
2015-10-26 06:27:55 +01:00
2016-04-07 14:08:16 +02:00
var dataset = {
"sort" : [ {
"online" : "desc"
} ] ,
"from" : 0 ,
"size" : 20 ,
"query" : {
"filtered" : {
"query" : {
"match_all" : { }
}
}
}
} ;
2015-10-26 06:27:55 +01:00
2016-04-07 14:08:16 +02:00
$ ( "#sbtn" ) . on ( "click" , function ( ) {
self . search ( ) ;
2015-10-26 06:27:55 +01:00
} ) ;
2016-04-07 14:08:16 +02:00
$ ( "#sterm" ) . on ( "keyup" , function ( e ) {
if ( e . keyCode == 13 ) {
self . search ( ) ;
}
2015-10-26 06:27:55 +01:00
} ) ;
2016-04-07 14:08:16 +02:00
this . loadServers ( dataset , false ) ;
var self = this ;
$ ( document ) . on ( "mouseup.bdps" , function ( e ) {
if ( ! $ ( "#bd-pub-button" ) . is ( e . target ) && ! $ ( "#pubs-container" ) . is ( e . target ) && $ ( "#pubs-container" ) . has ( e . target ) . length === 0 ) {
self . hide ( ) ;
}
2016-01-08 16:33:43 +01:00
} ) ;
2016-04-07 14:08:16 +02:00
} ;
2015-10-26 06:27:55 +01:00
2016-04-07 14:08:16 +02:00
PublicServers . prototype . hide = function ( ) {
$ ( "#pubs-container" ) . remove ( ) ;
$ ( document ) . off ( "mouseup.bdps" ) ;
2015-10-26 06:27:55 +01:00
} ;
2016-04-07 14:08:16 +02:00
PublicServers . prototype . loadServers = function ( dataset , search ) {
2015-10-27 22:58:43 +01:00
var self = this ;
2016-04-07 14:08:16 +02:00
$ ( "#sbtn" ) . prop ( "disabled" , true ) ;
$ ( "#sterm" ) . prop ( "disabled" , true ) ;
$ ( "#slist" ) . empty ( ) ;
$ ( "#pubs-spinner" ) . show ( ) ;
$ . ajax ( {
type : "POST" ,
dataType : "json" ,
url : "https://search-discordservers-izrtub5nprzrl76ugyy6hdooe4.us-west-1.es.amazonaws.com/app/_search" ,
crossDomain : true ,
data : JSON . stringify ( dataset ) ,
success : function ( data ) {
var hits = data . hits . hits ;
if ( search ) {
$ ( "#pubs-header-title" ) . text ( "Public Servers - Search Results: " + hits . length ) ;
} else {
$ ( "#pubs-header-title" ) . text ( "Public Servers" ) ;
}
hits . forEach ( function ( hit ) {
var source = hit . _source ;
var icode = source . invite _code ;
var html = '<div class="server-row">' ;
html += '<div class="server-icon" style="background-image:url(' + source . icon + ')"></div>' ;
html += '<div class="server-info server-name">' ;
html += '<span>' + source . name + ' by ' + source . owner . name + '</span>' ;
html += '</div>' ;
html += '<div class="server-info server-members">' ;
html += '<span>' + source . online + '/' + source . members + ' Members</span>' ;
html += '</div>' ;
html += '<div class="server-info server-region">' ;
html += '<span>' + source . region + '</span>' ;
html += '</div>' ;
html += '<div class="server-info">' ;
html += '<button data-server-invite-code=' + icode + '>Join</button>' ;
html += '</div>' ;
html += '</div>' ;
$ ( "#slist" ) . append ( html ) ;
$ ( "button[data-server-invite-code=" + icode + "]" ) . on ( "click" , function ( ) {
self . joinServer ( icode ) ;
} ) ;
} ) ;
2015-10-27 23:04:41 +01:00
} ,
2016-04-07 14:08:16 +02:00
done : function ( ) {
$ ( "#pubs-spinner" ) . hide ( ) ;
$ ( "#sbtn" ) . prop ( "disabled" , false ) ;
$ ( "#sterm" ) . prop ( "disabled" , false ) ;
} ,
always : function ( ) {
$ ( "#pubs-spinner" ) . hide ( ) ;
$ ( "#sbtn" ) . prop ( "disabled" , false ) ;
$ ( "#sterm" ) . prop ( "disabled" , false ) ;
} ,
error : function ( ) {
$ ( "#pubs-spinner" ) . hide ( ) ;
$ ( "#sbtn" ) . prop ( "disabled" , false ) ;
$ ( "#sterm" ) . prop ( "disabled" , false ) ;
} ,
complete : function ( ) {
$ ( "#pubs-spinner" ) . hide ( ) ;
$ ( "#sbtn" ) . prop ( "disabled" , false ) ;
$ ( "#sterm" ) . prop ( "disabled" , false ) ;
}
} ) ;
2015-10-26 06:27:55 +01:00
} ;
2016-04-07 14:08:16 +02:00
PublicServers . prototype . search = function ( ) {
var dataset = {
"sort" : [ {
"online" : "desc"
} ] ,
"from" : 0 ,
"size" : 20 ,
"query" : {
"filtered" : {
"query" : {
"match_all" : { }
}
}
}
} ;
var filter = {
"filter" : {
"and" : [ {
"query" : {
"match_phrase_prefix" : {
"name" : $ ( "#sterm" ) . val ( )
}
}
} ]
}
} ;
if ( $ ( "#sterm" ) . val ( ) ) {
$ . extend ( dataset , filter ) ;
2015-10-26 06:27:55 +01:00
}
2016-04-07 14:08:16 +02:00
this . loadServers ( dataset , true ) ;
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
2015-10-27 22:58:43 +01:00
//Workaround for joining a server
2016-01-08 16:33:43 +01:00
PublicServers . prototype . joinServer = function ( code ) {
2015-10-27 22:58:43 +01:00
$ ( ".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 ;
2016-01-07 09:01:20 +01:00
var eiarr = [ 1 , 3 , 4 , 6 , 7 , 8 , 10 , 11 , 12 , 13 , 14 ] ;
2015-08-29 11:36:47 +02:00
2015-08-27 15:46:53 +02:00
function QuickEmoteMenu ( ) {
}
2016-01-08 16:33:43 +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 ;
2015-11-28 00:29:53 +01:00
$ ( ".channel-textarea" ) . first ( ) . removeClass ( "emotemenu-enabled" ) ;
2016-01-08 16:33:43 +01:00
if ( ! emoteMenu ) {
2015-08-29 11:36:47 +02:00
this . initEmoteList ( ) ;
}
2015-08-27 15:46:53 +02:00
var menuOpen ;
2015-08-29 11:36:47 +02:00
2016-01-08 16:33:43 +01: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
2016-01-08 16:33:43 +01:00
$ ( "#twitchcord-button" ) . on ( "click" , function ( ) {
2015-08-27 15:46:53 +02:00
menuOpen = ! menuOpen ;
2016-01-08 16:33:43 +01:00
if ( menuOpen ) {
$ ( "#bdemotemenustyle" ) . html ( '.twitchcord-button-open { background-image:url(https://static-cdn.jtvnw.net/emoticons/v1/' + eiarr [ Math . floor ( Math . random ( ) * eiarr . length ) ] + '/1.0) !important; }' ) ;
2015-08-27 15:46:53 +02:00
emoteMenu . addClass ( "emotemenu-open" ) ;
$ ( this ) . addClass ( "twitchcord-button-open" ) ;
} else {
emoteMenu . removeClass ( ) ;
$ ( this ) . removeClass ( ) ;
}
2015-12-23 09:22:19 +01:00
return false ;
2015-08-27 15:46:53 +02:00
} ) ;
2016-01-08 16:33:43 +01:00
$ ( document ) . off ( "click.bdem" ) . on ( "click.bdem" , function ( ) {
if ( menuOpen ) {
2015-12-23 09:22:19 +01:00
menuOpen = ! menuOpen ;
emoteMenu . removeClass ( ) ;
$ ( "#twitchcord-button" ) . removeClass ( ) ;
}
} ) ;
2015-08-27 15:46:53 +02:00
2016-01-08 16:33:43 +01:00
$ ( "#emote-menu" ) . on ( "click" , function ( ) {
$ ( "#rmenu" ) . hide ( ) ;
return false ;
} ) ;
if ( settingsCookie [ "bda-es-0" ] ) {
2015-11-28 00:29:53 +01:00
$ ( ".channel-textarea" ) . first ( ) . addClass ( "emotemenu-enabled" ) ;
2015-08-27 15:46:53 +02:00
emoteBtn . show ( ) ;
}
2015-10-26 06:27:55 +01:00
var emoteIcon = $ ( ".emote-icon" ) ;
emoteIcon . off ( ) ;
2016-01-08 16:33:43 +01:00
emoteIcon . on ( "click" , function ( ) {
2015-12-14 06:22:52 +01:00
var emote = $ ( this ) . attr ( "title" ) ;
2015-10-26 06:27:55 +01:00
var ta = $ ( ".channel-textarea-inner textarea" ) ;
ta . val ( ta . val ( ) . slice ( - 1 ) == " " ? ta . val ( ) + emote : ta . val ( ) + " " + emote ) ;
} ) ;
2016-01-08 16:33:43 +01:00
2015-12-14 06:22:52 +01:00
var fe = localStorage [ "bdfavemotes" ] ;
2016-01-08 16:33:43 +01:00
if ( fe != undefined ) {
2015-12-14 06:22:52 +01:00
favoriteEmotes = JSON . parse ( atob ( fe ) ) ;
this . updateFavorites ( ) ;
}
2015-10-26 06:27:55 +01:00
} ;
2015-08-29 11:36:47 +02:00
2015-12-31 18:27:43 +01:00
var bdfw = { } ;
2016-01-08 16:33:43 +01:00
QuickEmoteMenu . prototype . obsCallback = function ( ) {
if ( ! emoteBtn ) return ;
if ( ! $ ( ".content.flex-spacer.flex-horizontal .flex-spacer.flex-vertical form" ) ) return ;
2015-08-29 11:36:47 +02:00
2015-10-26 06:27:55 +01:00
var tcbtn = $ ( "#twitchcord-button-container" ) ;
2016-01-08 16:33:43 +01:00
if ( tcbtn . parent ( ) . prop ( "tagName" ) == undefined ) {
2015-08-29 11:36:47 +02:00
quickEmoteMenu = new QuickEmoteMenu ( ) ;
quickEmoteMenu . init ( true ) ;
}
2015-10-26 06:27:55 +01:00
} ;
2015-08-29 11:36:47 +02:00
2015-12-14 06:22:52 +01:00
var favoriteEmotes = { } ;
2016-01-08 16:33:43 +01:00
QuickEmoteMenu . prototype . initEmoteList = function ( ) {
2015-08-29 11:36:47 +02:00
2016-01-08 16:33:43 +01:00
emoteMenu = $ ( "<div/>" , {
id : "emote-menu"
} ) ;
var emoteMenuHeader = $ ( "<div/>" , {
id : "emote-menu-header"
} ) ;
var emoteMenuBody = $ ( "<div/>" , {
id : "emote-menu-inner"
} ) ;
var emoteMenuBodyFav = $ ( "<div/>" , {
id : "emote-menu-inner-fav" ,
css : {
"display" : "none"
}
2016-01-24 04:16:40 +01:00
} ) ;
2016-01-08 16:33:43 +01:00
var globalTab = $ ( "<div/>" , {
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 = $ ( "<div/>" , {
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 ( ) ;
}
} ) ;
2015-08-29 11:36:47 +02:00
2015-12-14 06:22:52 +01:00
emoteMenuHeader . append ( globalTab ) ;
emoteMenuHeader . append ( favoriteTab ) ;
2016-01-08 16:33:43 +01:00
2015-08-29 11:36:47 +02:00
emoteMenu . append ( emoteMenuHeader ) ;
2016-01-08 16:33:43 +01:00
var swrapper = $ ( "<div/>" , {
class : "scroller-wrap"
} ) ;
var scroller = $ ( "<div/>" , {
class : "scroller"
} ) ;
2015-12-14 06:22:52 +01:00
swrapper . append ( scroller ) ;
scroller . append ( emoteMenuBody ) ;
scroller . append ( emoteMenuBodyFav ) ;
2016-01-08 16:33:43 +01:00
2015-12-14 06:22:52 +01:00
emoteMenu . append ( swrapper ) ;
2015-08-29 11:36:47 +02:00
2016-01-08 16:33:43 +01:00
for ( var emote in emotesTwitch . emotes ) {
if ( emotesTwitch . emotes . hasOwnProperty ( emote ) ) {
2015-10-26 06:27:55 +01:00
var id = emotesTwitch . emotes [ emote ] . image _id ;
2016-01-08 16:33:43 +01:00
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-10-26 06:27:55 +01:00
}
2015-08-27 15:46:53 +02:00
}
2015-12-14 06:22:52 +01:00
} ;
2016-01-08 16:33:43 +01:00
QuickEmoteMenu . prototype . favorite = function ( name , url ) {
if ( ! favoriteEmotes . hasOwnProperty ( name ) ) {
2015-12-14 06:22:52 +01:00
favoriteEmotes [ name ] = url ;
}
2016-01-08 16:33:43 +01:00
2015-12-14 06:22:52 +01:00
this . updateFavorites ( ) ;
} ;
2016-01-08 16:33:43 +01:00
QuickEmoteMenu . prototype . updateFavorites = function ( ) {
if ( ! $ ( "#rmenu" ) . length ) {
2015-12-23 09:16:30 +01:00
$ ( "body" ) . append ( '<div id="rmenu"><ul><a href="#">Remove</a></ul></div>' ) ;
2016-01-08 16:33:43 +01:00
$ ( document ) . on ( "click" , function ( ) {
2015-12-23 09:16:30 +01:00
$ ( "#rmenu" ) . hide ( ) ;
} ) ;
}
2015-12-14 06:24:49 +01:00
2016-04-02 07:23:30 +02:00
$ ( "#rmenu" ) . on ( "click" , function ( e ) { $ ( this ) . hide ( ) ; return false ; } ) ;
2015-12-14 06:22:52 +01:00
var self = this ;
var emoteMenuBody = $ ( "#emote-menu-inner-fav" ) ;
emoteMenuBody . empty ( ) ;
2016-01-08 16:33:43 +01:00
for ( var emote in favoriteEmotes ) {
2015-12-14 06:22:52 +01:00
var url = favoriteEmotes [ emote ] ;
2016-01-08 16:33:43 +01:00
var econtainer = $ ( "<div/>" , {
class : "emote-container"
} ) ;
var icon = $ ( "<img/>" , {
class : "emote-icon" ,
alt : "" ,
src : url ,
title : emote
} ) . appendTo ( econtainer ) ;
2015-12-14 06:22:52 +01:00
emoteMenuBody . append ( econtainer ) ;
2016-01-08 16:33:43 +01:00
icon . off ( "click" ) . on ( "click" , function ( e ) {
2015-12-14 06:22:52 +01:00
var emote = $ ( this ) . attr ( "title" ) ;
var ta = $ ( ".channel-textarea-inner textarea" ) ;
ta . val ( ta . val ( ) . slice ( - 1 ) == " " ? ta . val ( ) + emote : ta . val ( ) + " " + emote ) ;
} ) ;
2016-01-08 16:33:43 +01:00
icon . off ( "contextmenu" ) . on ( "contextmenu" , function ( e ) {
2015-12-14 06:22:52 +01:00
var title = $ ( this ) . attr ( "title" ) ;
var menu = $ ( "#rmenu" ) ;
2016-01-08 16:33:43 +01:00
menu . find ( "a" ) . off ( "click" ) . on ( "click" , function ( ) {
2015-12-14 06:22:52 +01:00
delete favoriteEmotes [ title ] ;
self . updateFavorites ( ) ;
} ) ;
menu . hide ( ) ;
2016-01-08 16:33:43 +01:00
menu . css ( {
top : e . pageY ,
left : e . pageX
} ) ;
2015-12-14 06:22:52 +01:00
menu . show ( ) ;
return false ;
} ) ;
}
2016-01-08 16:33:43 +01:00
2015-12-14 06:22:52 +01:00
window . localStorage [ "bdfavemotes" ] = btoa ( JSON . stringify ( favoriteEmotes ) ) ;
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
2016-04-08 00:21:30 +02:00
function CustomCssEditor ( ) { }
CustomCssEditor . prototype . init = function ( ) {
var self = this ;
self . hideBackdrop = false ;
self . editor = CodeMirror . fromTextArea ( document . getElementById ( "bd-custom-css-ta" ) , {
lineNumbers : true ,
mode : 'css' ,
indentUnit : 4 ,
theme : 'neat'
} ) ;
self . editor . on ( "change" , function ( cm ) {
var css = cm . getValue ( ) ;
self . applyCustomCss ( css , false , false ) ;
} ) ;
var attachEditor = "" ;
attachEditor += "<div id=\"bd-customcss-attach-controls\">" ;
attachEditor += " <ul class=\"checkbox-group\">" ;
attachEditor += " <li>" ;
attachEditor += " <div class=\"checkbox\" onclick=\"settingsPanel.updateSetting(this);\">" ;
attachEditor += " <div class=\"checkbox-inner\"><input id=\"bda-css-0\" type=\"checkbox\" " + ( settingsCookie [ "bda-css-0" ] ? "checked" : "" ) + "><span><\/span><\/div>" ;
attachEditor += " <span title=\"Update client css while typing\">Live Update<\/span>" ;
attachEditor += " <\/div>" ;
attachEditor += " <\/li>" ;
attachEditor += " <li>" ;
attachEditor += " <div class=\"checkbox\" onclick=\"settingsPanel.updateSetting(this);\">" ;
attachEditor += " <div class=\"checkbox-inner\"><input id=\"bda-css-1\" type=\"checkbox\" " + ( settingsCookie [ "bda-css-1" ] ? "checked" : "" ) + "><span><\/span><\/div>" ;
attachEditor += " <span title=\"Autosave css to localstorage when typing\">Autosave<\/span>" ;
attachEditor += " <\/div>" ;
attachEditor += " <\/li>" ;
attachEditor += " <li>" ;
attachEditor += " <div class=\"checkbox\" onclick=\"settingsPanel.updateSetting(this);\">" ;
attachEditor += " <div class=\"checkbox-inner\"><input id=\"bda-css-2\" type=\"checkbox\" " + ( customCssEditor . hideBackdrop ? "checked" : "" ) + "><span><\/span><\/div>" ;
attachEditor += " <span title=\"Hide the callout backdrop to disable modal close events\">Hide Backdrop<\/span>" ;
attachEditor += " <\/div>" ;
attachEditor += " <\/li>" ;
attachEditor += " <\/ul>" ;
attachEditor += " <div id=\"bd-customcss-detach-controls-buttons\">" ;
attachEditor += " <button class=\"btn btn-primary\" id=\"bd-customcss-detached-update\" onclick=\"return false;\">Update<\/button>" ;
attachEditor += " <button class=\"btn btn-primary\" id=\"bd-customcss-detached-save\" onclick=\"return false;\">Save<\/button>" ;
attachEditor += " <button class=\"btn btn-primary\" id=\"bd-customcss-detached-detach\" onclick=\"customCssEditor.detach(); return false;\">Detach</button>" ;
attachEditor += " <\/div>" ;
attachEditor += "<\/div>" ;
this . attachEditor = attachEditor ;
$ ( "#bd-customcss-innerpane" ) . append ( attachEditor ) ;
$ ( "#bd-customcss-detached-update" ) . on ( "click" , function ( ) {
self . applyCustomCss ( self . editor . getValue ( ) , true , false ) ;
return false ;
} ) ;
$ ( "#bd-customcss-detached-save" ) . on ( "click" , function ( ) {
self . applyCustomCss ( self . editor . getValue ( ) , false , true ) ;
return false ;
} ) ;
var detachEditor = "" ;
detachEditor += "<div id=\"bd-customcss-detach-container\">" ;
detachEditor += " <div id=\"bd-customcss-detach-editor\">" ;
detachEditor += " <\/div>" ;
detachEditor += "<\/div>" ;
this . detachedEditor = detachEditor ;
} ;
CustomCssEditor . prototype . attach = function ( ) {
$ ( "#editor-detached" ) . hide ( ) ;
$ ( "#app-mount" ) . removeClass ( "bd-detached-editor" ) ;
$ ( "#bd-customcss-pane" ) . append ( $ ( "#bd-customcss-innerpane" ) ) ;
$ ( "#bd-customcss-detached-detach" ) . show ( ) ;
$ ( "#bd-customcss-detach-container" ) . remove ( ) ;
} ;
CustomCssEditor . prototype . detach = function ( ) {
var self = this ;
this . attach ( ) ;
$ ( "#editor-detached" ) . show ( ) ;
$ ( "#bd-customcss-detached-detach" ) . hide ( ) ;
$ ( "#app-mount" ) . addClass ( "bd-detached-editor" ) ;
$ ( ".app" ) . parent ( ) . append ( this . detachedEditor ) ;
$ ( "#bd-customcss-detach-editor" ) . append ( $ ( "#bd-customcss-innerpane" ) ) ;
} ;
CustomCssEditor . prototype . applyCustomCss = function ( css , forceupdate , forcesave ) {
if ( $ ( "#customcss" ) . length == 0 ) {
$ ( "head" ) . append ( '<style id="customcss"></style>' ) ;
}
if ( forceupdate || settingsCookie [ "bda-css-0" ] ) {
$ ( "#customcss" ) . html ( css ) ;
}
if ( forcesave || settingsCookie [ "bda-css-1" ] ) {
localStorage . setItem ( "bdcustomcss" , btoa ( css ) ) ;
}
} ;
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-11-27 01:14:33 +01:00
* Version : 2.0
2015-08-27 15:46:53 +02:00
* Author : Jiiks | http : //jiiks.net
* Date : 26 / 08 / 2015 - 11 : 54
2015-11-27 01:14:33 +01:00
* Last Update : 27 / 11 / 2015 - 00 : 50
2015-08-27 15:46:53 +02:00
* https : //github.com/Jiiks/BetterDiscordApp
* /
2015-11-27 01:14:33 +01:00
var settingsButton = null ;
var panel = null ;
2015-08-29 11:36:47 +02:00
2015-08-27 15:46:53 +02:00
function SettingsPanel ( ) {
2015-12-12 03:28:42 +01:00
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" ) ;
2016-01-08 16:33:43 +01:00
utils . injectJs ( "https://cdnjs.cloudflare.com/ajax/libs/Sortable/1.4.2/Sortable.min.js" ) ;
2015-08-27 15:46:53 +02:00
}
2016-01-08 16:33:43 +01:00
SettingsPanel . prototype . init = function ( ) {
2015-08-27 15:46:53 +02:00
var self = this ;
2015-11-27 01:14:33 +01:00
self . construct ( ) ;
var body = $ ( "body" ) ;
2015-08-30 11:17:06 +02:00
2016-01-08 16:33:43 +01:00
if ( settingsCookie [ "bda-es-0" ] ) {
2015-08-30 11:17:06 +02:00
$ ( "#twitchcord-button-container" ) . show ( ) ;
} else {
$ ( "#twitchcord-button-container" ) . hide ( ) ;
}
2016-01-08 16:33:43 +01:00
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
}
2016-01-08 16:33:43 +01: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
2016-01-08 16:33:43 +01:00
if ( settingsCookie [ "bda-gs-4" ] ) {
2015-10-26 06:27:55 +01:00
voiceMode . enable ( ) ;
}
2015-11-27 01:14:33 +01:00
2015-12-04 00:02:32 +01:00
if ( settingsCookie [ "bda-es-6" ] ) {
//Pretty emote titles
2016-01-08 16:33:43 +01:00
emoteNamePopup = $ ( "<div class='tipsy tipsy-se' style='display: block; top: 82px; left: 1630.5px; visibility: visible; opacity: 0.8;'><div class='tipsy-inner'></div></div>" ) ;
$ ( document ) . on ( "mouseover" , ".emote" , function ( ) {
var x = $ ( this ) . offset ( ) ;
var title = $ ( this ) . attr ( "alt" ) ;
$ ( emoteNamePopup ) . find ( ".tipsy-inner" ) . text ( title ) ;
$ ( emoteNamePopup ) . css ( 'left' , x . left - 25 ) ;
$ ( emoteNamePopup ) . css ( 'top' , x . top - 32 ) ;
$ ( "div[data-reactid='.0.1.1']" ) . append ( $ ( emoteNamePopup ) ) ;
} ) ;
$ ( document ) . on ( "mouseleave" , ".emote" , function ( ) {
2016-01-24 04:16:40 +01:00
$ ( ".tipsy" ) . remove ( ) ;
2016-01-08 16:33:43 +01:00
} ) ;
2015-12-04 00:02:32 +01:00
} else {
2016-01-08 16:33:43 +01:00
$ ( document ) . off ( 'mouseover' , '.emote' ) ;
2015-12-04 00:02:32 +01:00
}
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
2015-12-12 03:28:42 +01:00
var customCssInitialized = false ;
var lastTab = "" ;
2015-11-27 01:14:33 +01:00
2016-01-08 16:33:43 +01:00
SettingsPanel . prototype . changeTab = function ( tab ) {
2015-12-12 07:52:54 +01:00
var self = this ;
2016-01-08 16:33:43 +01:00
2015-12-12 03:28:42 +01:00
lastTab = tab ;
2016-01-08 16:33:43 +01:00
2015-12-12 03:28:42 +01:00
var controlGroups = $ ( "#bd-control-groups" ) ;
$ ( ".bd-tab" ) . removeClass ( "selected" ) ;
$ ( ".bd-pane" ) . hide ( ) ;
2016-01-08 16:33:43 +01:00
$ ( "#" + tab ) . addClass ( "selected" ) ;
2015-12-12 03:28:42 +01:00
$ ( "#" + tab . replace ( "tab" , "pane" ) ) . show ( ) ;
2016-01-08 16:33:43 +01:00
switch ( tab ) {
case "bd-settings-tab" :
2015-12-12 03:28:42 +01:00
break ;
2016-01-08 16:33:43 +01:00
case "bd-customcss-tab" :
if ( ! customCssInitialized ) {
2016-04-08 00:21:30 +02:00
customCssEditor . init ( ) ;
2016-01-08 16:33:43 +01:00
customCssInitialized = true ;
}
2015-12-12 03:28:42 +01:00
break ;
2016-01-08 16:33:43 +01:00
case "bd-plugins-tab" :
2015-12-12 03:28:42 +01:00
break ;
2016-01-08 16:33:43 +01:00
case "bd-themes-tab" :
controlGroups . html ( "<span>Coming soon</span>" ) ;
2015-12-12 03:28:42 +01:00
break ;
}
} ;
2015-11-28 04:17:39 +01:00
2016-01-08 16:33:43 +01:00
SettingsPanel . prototype . updateSetting = function ( checkbox ) {
var cb = $ ( checkbox ) . children ( ) . find ( 'input[type="checkbox"]' ) ;
var enabled = ! cb . is ( ":checked" ) ;
var id = cb . attr ( "id" ) ;
cb . prop ( "checked" , enabled ) ;
2015-11-27 01:14:33 +01:00
2016-04-08 00:21:30 +02:00
if ( id == "bda-css-2" ) {
$ ( "#app-mount" ) . removeClass ( "bd-hide-bd" ) ;
customCssEditor . hideBackdrop = enabled ;
if ( enabled ) {
$ ( "#app-mount" ) . addClass ( "bd-hide-bd" )
}
}
2016-01-08 16:33:43 +01:00
settingsCookie [ id ] = enabled ;
2015-11-27 01:14:33 +01:00
2016-01-08 16:33:43 +01:00
if ( settingsCookie [ "bda-es-0" ] ) {
$ ( "#twitchcord-button-container" ) . show ( ) ;
} else {
$ ( "#twitchcord-button-container" ) . hide ( ) ;
}
2015-11-27 01:14:33 +01:00
2016-01-08 16:33:43 +01: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" ) ;
}
if ( settingsCookie [ "bda-gs-1" ] ) {
$ ( "#bd-pub-li" ) . show ( ) ;
} else {
$ ( "#bd-pub-li" ) . hide ( ) ;
}
if ( settingsCookie [ "bda-gs-4" ] ) {
voiceMode . enable ( ) ;
} else {
voiceMode . disable ( ) ;
}
if ( settingsCookie [ "bda-es-6" ] ) {
//Pretty emote titles
emoteNamePopup = $ ( "<div class='tipsy tipsy-se' style='display: block; top: 82px; left: 1630.5px; visibility: visible; opacity: 0.8;'><div class='tipsy-inner'></div></div>" ) ;
$ ( document ) . on ( "mouseover" , ".emote" , function ( ) {
var x = $ ( this ) . offset ( ) ;
var title = $ ( this ) . attr ( "alt" ) ;
$ ( emoteNamePopup ) . find ( ".tipsy-inner" ) . text ( title ) ;
$ ( emoteNamePopup ) . css ( 'left' , x . left - 25 ) ;
$ ( emoteNamePopup ) . css ( 'top' , x . top - 32 ) ;
$ ( "div[data-reactid='.0.1.1']" ) . append ( $ ( emoteNamePopup ) ) ;
} ) ;
$ ( document ) . on ( "mouseleave" , ".emote" , function ( ) {
2016-01-24 04:16:40 +01:00
$ ( ".tipsy" ) . remove ( ) ;
2016-01-08 16:33:43 +01:00
} ) ;
} else {
$ ( document ) . off ( 'mouseover' , '.emote' ) ;
}
2015-11-27 01:14:33 +01:00
2016-01-08 16:33:43 +01:00
mainCore . saveSettings ( ) ;
2016-01-24 04:16:40 +01:00
} ;
2015-08-27 15:46:53 +02:00
2016-01-08 16:33:43 +01:00
SettingsPanel . prototype . construct = function ( ) {
2015-12-12 03:28:42 +01:00
var self = this ;
2016-01-08 16:33:43 +01:00
2015-12-12 03:28:42 +01:00
panel = $ ( "<div/>" , {
id : "bd-pane" ,
class : "settings-inner" ,
css : {
"display" : "none"
}
} ) ;
2016-01-08 16:33:43 +01:00
2015-12-12 03:28:42 +01:00
var settingsInner = '' +
2016-01-08 16:33:43 +01:00
'<div class="scroller-wrap">' +
' <div class="scroller settings-wrapper settings-panel">' +
' <div class="tab-bar TOP">' +
' <div class="tab-bar-item bd-tab" id="bd-settings-tab" onclick="settingsPanel.changeTab(\'bd-settings-tab\');">Settings</div>' +
' <div class="tab-bar-item bd-tab" id="bd-customcss-tab" onclick="settingsPanel.changeTab(\'bd-customcss-tab\');">Custom CSS</div>' +
' <div class="tab-bar-item bd-tab" id="bd-plugins-tab" onclick="settingsPanel.changeTab(\'bd-plugins-tab\');">Plugins</div>' +
' <div class="tab-bar-item bd-tab" id="bd-themes-tab" onclick="settingsPanel.changeTab(\'bd-themes-tab\');">Themes</div>' +
' </div>' +
' <div class="bd-settings">' +
' <div class="bd-pane control-group" id="bd-settings-pane" style="display:none;">' +
' <ul class="checkbox-group">' ;
for ( var setting in settings ) {
2015-11-27 01:14:33 +01:00
var sett = settings [ setting ] ;
var id = sett [ "id" ] ;
2016-04-08 00:21:30 +02:00
if ( sett [ "implemented" ] && ! sett [ "hidden" ] ) {
2015-11-27 01:14:33 +01:00
2015-12-12 03:28:42 +01:00
settingsInner += '' +
2016-01-08 16:33:43 +01:00
'<li>' +
2015-12-12 03:28:42 +01:00
'<div class="checkbox" onclick="settingsPanel.updateSetting(this);" >' +
2016-01-08 16:33:43 +01:00
'<div class="checkbox-inner">' +
'<input type="checkbox" id="' + id + '" ' + ( settingsCookie [ id ] ? "checked" : "" ) + '>' +
'<span></span>' +
'</div>' +
'<span>' + setting + " - " + sett [ "info" ] +
'</span>' +
2015-12-12 03:28:42 +01:00
'</div>' +
2016-01-08 16:33:43 +01:00
'</li>' ;
2015-11-27 01:14:33 +01:00
}
2015-08-30 11:17:06 +02:00
}
2016-01-08 16:33:43 +01:00
2015-12-12 07:52:54 +01:00
var ccss = atob ( localStorage . getItem ( "bdcustomcss" ) ) ;
2016-04-08 00:21:30 +02:00
customCssEditor . applyCustomCss ( ccss , true , false ) ;
2016-01-08 16:33:43 +01:00
2015-12-12 03:28:42 +01:00
settingsInner += '</ul>' +
2016-01-08 16:33:43 +01:00
' </div>' +
'' +
' <div class="bd-pane control-group" id="bd-customcss-pane" style="display:none;">' +
2016-04-08 00:21:30 +02:00
' <div id="editor-detached" style="display:none;">' +
' <h3>Editor Detached</h3>' +
' <button class="btn btn-primary" onclick="customCssEditor.attach(); return false;">Attach</button>' +
' </div>' +
' <div id="bd-customcss-innerpane"><textarea id="bd-custom-css-ta">' + ccss + '</textarea></div>' +
2016-01-08 16:33:43 +01:00
' </div>' +
'' +
' <div class="bd-pane control-group" id="bd-plugins-pane" style="display:none;">' +
' <table class="bd-g-table">' +
' <thead><tr><th>Name</th><th>Description</th><th>Author</th><th>Version</th><th></th><th></th></tr></thead><tbody>' ;
2015-12-12 07:07:56 +01:00
2016-01-08 16:33:43 +01:00
$ . each ( bdplugins , function ( ) {
var plugin = this [ "plugin" ] ;
2015-12-15 08:37:15 +01:00
settingsInner += '' +
'<tr>' +
2016-01-08 16:33:43 +01:00
' <td>' + plugin . getName ( ) + '</td>' +
' <td width="99%"><textarea>' + plugin . getDescription ( ) + '</textarea></td>' +
' <td>' + plugin . getAuthor ( ) + '</td>' +
' <td>' + plugin . getVersion ( ) + '</td>' +
' <td><button class="bd-psb" onclick="pluginModule.showSettings(\'' + plugin . getName ( ) + '\'); return false;"></button></td>' +
2015-12-15 08:37:15 +01:00
' <td>' +
2016-01-08 16:33:43 +01:00
' <div class="checkbox" onclick="pluginModule.handlePlugin(this);">' +
' <div class="checkbox-inner">' +
' <input id="' + plugin . getName ( ) + '" type="checkbox" ' + ( pluginCookie [ plugin . getName ( ) ] ? "checked" : "" ) + '>' +
2015-12-15 08:37:15 +01:00
' <span></span>' +
' </div>' +
' </div>' +
' </td>' +
'</tr>' ;
2016-01-08 16:33:43 +01:00
} ) ;
settingsInner += '</tbody></table>' +
' </div>' +
' <div class="bd-pane control-group" id="bd-themes-pane" style="display:none;">' ;
if ( typeof ( themesupport2 ) === "undefined" ) {
settingsInner += '' +
' Your version does not support themes. Download the latest version.' ;
} else {
settingsInner += '' +
' <table class="bd-g-table">' +
' <thead><tr><th>Name</th><th>Description</th><th>Author</th><th>Version</th><th></th></tr></thead><tbody>' ;
$ . each ( bdthemes , function ( ) {
settingsInner += '' +
'<tr>' +
' <td>' + this [ "name" ] . replace ( /_/g , " " ) + '</td>' +
' <td width="99%"><textarea>' + this [ "description" ] + '</textarea></td>' +
' <td>' + this [ "author" ] + '</td>' +
' <td>' + this [ "version" ] + '</td>' +
' <td>' +
' <div class="checkbox" onclick="themeModule.handleTheme(this);">' +
' <div class="checkbox-inner">' +
' <input id="ti' + this [ "name" ] + '" type="checkbox" ' + ( themeCookie [ this [ "name" ] ] ? "checked" : "" ) + '>' +
' <span></span>' +
' </div>' +
' </div>' +
' </td>' +
'</tr>' ;
2015-12-15 08:37:15 +01:00
} ) ;
settingsInner += '</tbody></table>' ;
}
2016-01-08 16:33:43 +01:00
2015-12-15 08:37:15 +01:00
settingsInner += '' +
2016-01-08 16:33:43 +01:00
' </div>' +
'' +
' </div>' +
' </div>' +
' <div style="background:#2E3136; color:#ADADAD; height:30px; position:absolute; bottom:0; left:0; right:0;">' +
' <span style="line-height:30px;margin-left:10px;">BetterDiscord v' + version + '(JSv' + jsVersion + ') by Jiiks</span>' +
' <span style="float:right;line-height:30px;margin-right:10px;"><a href="http://betterdiscord.net" target="_blank">BetterDiscord.net</a></span>' +
' </div>' +
'</div>' ;
2015-11-27 01:14:33 +01:00
function showSettings ( ) {
$ ( ".tab-bar-item" ) . removeClass ( "selected" ) ;
settingsButton . addClass ( "selected" ) ;
$ ( ".form .settings-right .settings-inner" ) . first ( ) . hide ( ) ;
panel . show ( ) ;
2016-01-08 16:33:43 +01:00
if ( lastTab == "" ) {
2015-12-12 03:28:42 +01:00
self . changeTab ( "bd-settings-tab" ) ;
} else {
self . changeTab ( lastTab ) ;
}
2015-10-26 06:27:55 +01:00
}
2015-11-27 01:14:33 +01:00
settingsButton = $ ( "<div/>" , {
class : "tab-bar-item" ,
text : "BetterDiscord" ,
id : "bd-settings-new" ,
click : showSettings
} ) ;
2015-12-12 03:28:42 +01:00
panel . html ( settingsInner ) ;
2015-11-27 01:14:33 +01:00
function defer ( ) {
2016-01-08 16:33:43 +01:00
if ( $ ( ".btn.btn-settings" ) . length < 1 ) {
2015-11-27 01:14:33 +01:00
setTimeout ( defer , 100 ) ;
2016-01-08 16:33:43 +01:00
} else {
$ ( ".btn.btn-settings" ) . first ( ) . on ( "click" , function ( ) {
2015-11-27 01:14:33 +01:00
function innerDefer ( ) {
2016-01-08 16:33:43 +01:00
if ( $ ( ".modal-inner" ) . first ( ) . is ( ":visible" ) ) {
2015-11-27 01:14:33 +01:00
panel . hide ( ) ;
var tabBar = $ ( ".tab-bar.SIDE" ) . first ( ) ;
2016-01-08 16:33:43 +01:00
$ ( ".tab-bar.SIDE .tab-bar-item" ) . click ( function ( ) {
2015-11-27 01:14:33 +01:00
$ ( ".form .settings-right .settings-inner" ) . first ( ) . show ( ) ;
$ ( "#bd-settings-new" ) . removeClass ( "selected" ) ;
panel . hide ( ) ;
} ) ;
tabBar . append ( settingsButton ) ;
2015-12-21 14:51:15 +01:00
$ ( ".form .settings-right .settings-inner" ) . last ( ) . after ( panel ) ;
2015-11-27 01:14:33 +01:00
$ ( "#bd-settings-new" ) . removeClass ( "selected" ) ;
} else {
setTimeout ( innerDefer , 100 ) ;
}
}
innerDefer ( ) ;
} ) ;
}
2015-10-26 06:27:55 +01:00
}
2015-11-27 01:14:33 +01:00
defer ( ) ;
2016-01-08 16:33:43 +01: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 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
* /
2015-11-01 12:37:04 +01:00
var _hash ;
2016-01-08 16:33:43 +01:00
2015-08-27 15:46:53 +02:00
function Utils ( ) {
}
2016-01-08 16:33:43 +01:00
Utils . prototype . getTextArea = function ( ) {
2015-08-27 15:46:53 +02:00
return $ ( ".channel-textarea-inner textarea" ) ;
2015-10-26 06:27:55 +01:00
} ;
2015-08-27 15:46:53 +02:00
2016-01-08 16:33:43 +01:00
Utils . prototype . jqDefer = function ( fnc ) {
if ( window . jQuery ) {
fnc ( ) ;
} else {
setTimeout ( function ( ) {
2016-01-24 04:16:40 +01:00
this . jqDefer ( fnc ) ;
} , 100 ) ;
2016-01-08 16:33:43 +01:00
}
2015-10-26 06:27:55 +01:00
} ;
2016-01-08 16:33:43 +01:00
Utils . prototype . getHash = function ( ) {
$ . getJSON ( "https://api.github.com/repos/Jiiks/BetterDiscordApp/commits/master" , function ( data ) {
2015-11-01 12:37:04 +01:00
_hash = data . sha ;
2015-11-01 13:13:13 +01:00
emoteModule . getBlacklist ( ) ;
2015-11-01 12:37:04 +01:00
} ) ;
2015-12-11 01:09:59 +01:00
} ;
2015-11-01 12:37:04 +01:00
2016-01-08 16:33:43 +01:00
Utils . prototype . loadHtml = function ( html , callback ) {
var container = $ ( "<div/>" , {
class : "bd-container"
} ) . appendTo ( "body" ) ;
//TODO Inject these in next core update
html = '//cdn.rawgit.com/Jiiks/BetterDiscordApp/' + _hash + '/html/' + html + '.html' ;
2015-12-11 04:24:28 +01:00
2016-01-08 16:33:43 +01:00
container . load ( html , callback ( ) ) ;
2015-11-01 12:37:04 +01:00
} ;
2016-01-08 16:33:43 +01:00
Utils . prototype . injectJs = function ( uri ) {
2015-12-12 03:28:42 +01:00
$ ( "<script/>" , {
type : "text/javascript" ,
src : uri
} ) . appendTo ( $ ( "body" ) ) ;
} ;
2016-01-08 16:33:43 +01:00
Utils . prototype . injectCss = function ( uri ) {
2015-12-12 03:28:42 +01:00
$ ( "<link/>" , {
type : "text/css" ,
rel : "stylesheet" ,
href : uri
} ) . appendTo ( $ ( "head" ) ) ;
} ;
2015-12-11 01:09:59 +01:00
2016-01-08 16:33:43 +01:00
Utils . prototype . log = function ( message ) {
console . info ( "%c[BetterDiscord]%c " + message , "color:teal; font-weight:bold;" , "" ) ;
2015-12-31 18:27:43 +01:00
} ;
2016-01-08 16:33:43 +01:00
Utils . prototype . err = function ( message ) {
console . info ( "%c[BetterDiscord]%c " + message , "color:red; font-weight:bold;" , "" ) ;
2015-12-31 18:27:43 +01: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 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
2016-01-08 16:33:43 +01:00
VoiceMode . prototype . obsCallback = function ( ) {
2015-11-19 00:35:39 +01:00
var self = this ;
2016-01-08 16:33:43 +01:00
if ( settingsCookie [ "bda-gs-4" ] ) {
2015-11-19 00:35:39 +01:00
self . disable ( ) ;
2016-01-08 16:33:43 +01:00
setTimeout ( function ( ) {
2015-11-19 00:35:39 +01:00
self . enable ( ) ;
} , 300 ) ;
}
2016-01-24 04:16:40 +01:00
} ;
2015-10-31 22:24:40 +01:00
2016-01-08 16:33:43 +01:00
VoiceMode . prototype . enable = function ( ) {
2015-10-26 06:27:55 +01:00
$ ( ".scroller.guild-channels ul" ) . first ( ) . css ( "display" , "none" ) ;
$ ( ".scroller.guild-channels header" ) . first ( ) . css ( "display" , "none" ) ;
2015-10-31 22:40:49 +01:00
$ ( ".app.flex-vertical" ) . first ( ) . css ( "overflow" , "hidden" ) ;
2015-10-26 06:27:55 +01:00
$ ( ".chat.flex-vertical.flex-spacer" ) . first ( ) . css ( "visibility" , "hidden" ) . css ( "min-width" , "0px" ) ;
2015-10-31 22:30:51 +01:00
$ ( ".flex-vertical.channels-wrap" ) . first ( ) . css ( "flex-grow" , "100000" ) ;
2015-10-26 06:27:55 +01:00
$ ( ".guild-header .btn.btn-hamburger" ) . first ( ) . css ( "visibility" , "hidden" ) ;
} ;
2016-01-08 16:33:43 +01:00
VoiceMode . prototype . disable = function ( ) {
2015-10-26 06:27:55 +01:00
$ ( ".scroller.guild-channels ul" ) . first ( ) . css ( "display" , "" ) ;
$ ( ".scroller.guild-channels header" ) . first ( ) . css ( "display" , "" ) ;
2015-11-19 00:35:39 +01:00
$ ( ".app.flex-vertical" ) . first ( ) . css ( "overflow" , "" ) ;
2015-10-26 06:27:55 +01:00
$ ( ".chat.flex-vertical.flex-spacer" ) . first ( ) . css ( "visibility" , "" ) . css ( "min-width" , "" ) ;
2015-10-31 22:30:51 +01:00
$ ( ".flex-vertical.channels-wrap" ) . first ( ) . css ( "flex-grow" , "" ) ;
2015-10-26 06:27:55 +01:00
$ ( ".guild-header .btn.btn-hamburger" ) . first ( ) . css ( "visibility" , "" ) ;
2015-12-11 07:43:36 +01:00
} ;
2015-12-16 12:21:46 +01:00
/ * B e t t e r D i s c o r d A p p P l u g i n M o d u l e J a v a S c r i p t
* Version : 1.0
* Author : Jiiks | http : //jiiks.net
* Date : 16 / 12 / 2015
* https : //github.com/Jiiks/BetterDiscordApp
* /
2015-12-12 07:07:56 +01:00
var pluginCookie = { } ;
2015-12-11 07:43:36 +01:00
function PluginModule ( ) {
2016-01-08 16:33:43 +01:00
2015-12-11 07:43:36 +01:00
}
2016-01-08 16:33:43 +01:00
PluginModule . prototype . loadPlugins = function ( ) {
2015-12-11 07:43:36 +01:00
2015-12-12 07:07:56 +01:00
this . loadPluginData ( ) ;
2016-01-08 16:33:43 +01:00
$ . each ( bdplugins , function ( ) {
2015-12-12 07:07:56 +01:00
var plugin = this [ "plugin" ] ;
plugin . load ( ) ;
2016-01-08 16:33:43 +01:00
2015-12-12 07:07:56 +01:00
var name = plugin . getName ( ) ;
var enabled = false ;
2016-01-08 16:33:43 +01:00
if ( pluginCookie . hasOwnProperty ( name ) ) {
2015-12-12 07:07:56 +01:00
enabled = pluginCookie [ name ] ;
} else {
pluginCookie [ name ] = false ;
}
2016-01-08 16:33:43 +01:00
if ( enabled ) {
2015-12-12 07:07:56 +01:00
plugin . start ( ) ;
}
} ) ;
2015-12-11 07:43:36 +01:00
} ;
2016-01-08 16:33:43 +01:00
PluginModule . prototype . handlePlugin = function ( checkbox ) {
2015-12-12 07:07:56 +01:00
var cb = $ ( checkbox ) . children ( ) . find ( 'input[type="checkbox"]' ) ;
var enabled = ! cb . is ( ":checked" ) ;
var id = cb . attr ( "id" ) ;
cb . prop ( "checked" , enabled ) ;
2016-01-08 16:33:43 +01:00
if ( enabled ) {
2015-12-12 17:29:06 +01:00
bdplugins [ id ] [ "plugin" ] . start ( ) ;
2015-12-12 07:07:56 +01:00
pluginCookie [ id ] = true ;
} else {
2015-12-12 17:29:06 +01:00
bdplugins [ id ] [ "plugin" ] . stop ( ) ;
2015-12-12 07:07:56 +01:00
pluginCookie [ id ] = false ;
}
2016-01-08 16:33:43 +01:00
2015-12-12 07:07:56 +01:00
this . savePluginData ( ) ;
2015-12-11 07:43:36 +01:00
} ;
2016-01-08 16:33:43 +01:00
PluginModule . prototype . showSettings = function ( plugin ) {
if ( bdplugins [ plugin ] != null ) {
if ( typeof bdplugins [ plugin ] . plugin . getSettingsPanel === "function" ) {
2015-12-22 09:44:14 +01:00
var panel = bdplugins [ plugin ] . plugin . getSettingsPanel ( ) ;
2016-01-08 16:33:43 +01:00
$ ( ".modal-inner" ) . off ( "click.bdpsm" ) . on ( "click.bdpsm" , function ( e ) {
if ( $ ( "#bd-psm-id" ) . length ) {
2015-12-22 10:09:20 +01:00
$ ( ".bd-psm" ) . remove ( ) ;
} else {
$ ( ".bd-psm" ) . attr ( "id" , "bd-psm-id" ) ;
}
2016-01-08 16:33:43 +01:00
2015-12-22 10:09:20 +01:00
} ) ;
2015-12-22 09:44:14 +01:00
$ ( ".modal" ) . append ( '<div class="bd-psm"><div class="scroller-wrap" style="height:100%"><div id="bd-psm-s" class="scroller" style="padding:10px;"></div></div></div>' ) ;
$ ( "#bd-psm-s" ) . append ( panel ) ;
}
}
} ;
2016-01-08 16:33:43 +01:00
PluginModule . prototype . loadPluginData = function ( ) {
2015-12-12 07:07:56 +01:00
var cookie = $ . cookie ( "bd-plugins" ) ;
2016-01-08 16:33:43 +01:00
if ( cookie != undefined ) {
pluginCookie = JSON . parse ( $ . cookie ( "bd-plugins" ) ) ;
2015-12-12 07:07:56 +01:00
}
} ;
2015-12-11 07:43:36 +01:00
2016-01-08 16:33:43 +01:00
PluginModule . prototype . savePluginData = function ( ) {
$ . cookie ( "bd-plugins" , JSON . stringify ( pluginCookie ) , {
expires : 365 ,
path : '/'
} ) ;
2015-12-12 09:50:25 +01:00
} ;
2016-01-08 16:33:43 +01:00
PluginModule . prototype . newMessage = function ( ) {
$ . each ( bdplugins , function ( ) {
if ( ! pluginCookie [ this . plugin . getName ( ) ] ) return ;
if ( typeof this . plugin . onMessage === "function" ) {
2015-12-27 16:39:10 +01:00
this . plugin . onMessage ( ) ;
}
} ) ;
} ;
2016-01-08 16:33:43 +01:00
PluginModule . prototype . channelSwitch = function ( ) {
$ . each ( bdplugins , function ( ) {
if ( ! pluginCookie [ this . plugin . getName ( ) ] ) return ;
if ( typeof this . plugin . onSwitch === "function" ) {
this . plugin . onSwitch ( ) ;
2015-12-27 16:39:10 +01:00
}
} ) ;
} ;
2016-01-08 16:33:43 +01:00
PluginModule . prototype . socketEvent = function ( e , data ) {
$ . each ( bdplugins , function ( ) {
if ( ! pluginCookie [ this . plugin . getName ( ) ] ) return ;
if ( typeof this . plugin . socketEvent === "function" ) {
2016-01-07 07:44:14 +01:00
this . plugin . socketEvent ( data ) ;
}
} ) ;
2016-01-07 07:35:40 +01:00
} ;
2016-04-04 16:22:53 +02:00
PluginModule . prototype . rawObserver = function ( e ) {
$ . each ( bdplugins , function ( ) {
if ( ! pluginCookie [ this . plugin . getName ( ) ] ) return ;
if ( typeof this . plugin . observer === "function" ) {
this . plugin . observer ( e ) ;
}
} ) ;
} ;
2015-12-27 16:39:10 +01:00
2015-12-16 12:21:46 +01:00
/ * B e t t e r D i s c o r d A p p T h e m e M o d u l e J a v a S c r i p t
* Version : 1.0
* Author : Jiiks | http : //jiiks.net
* Date : 16 / 12 / 2015
* https : //github.com/Jiiks/BetterDiscordApp
* /
2015-12-15 08:37:15 +01:00
var themeCookie = { } ;
function ThemeModule ( ) {
2016-01-08 16:33:43 +01:00
2015-12-15 08:37:15 +01:00
}
2016-01-08 16:33:43 +01:00
ThemeModule . prototype . loadThemes = function ( ) {
2015-12-15 08:37:15 +01:00
this . loadThemeData ( ) ;
2016-01-08 16:33:43 +01:00
$ . each ( bdthemes , function ( ) {
2015-12-15 08:37:15 +01:00
var name = this [ "name" ] ;
var enabled = false ;
2016-01-08 16:33:43 +01:00
if ( themeCookie . hasOwnProperty ( name ) ) {
if ( themeCookie [ name ] ) {
2015-12-15 08:37:15 +01:00
enabled = true ;
}
} else {
themeCookie [ name ] = false ;
}
2016-01-08 16:33:43 +01:00
if ( enabled ) {
$ ( "head" ) . append ( '<style id="' + name + '">' + unescape ( bdthemes [ name ] [ "css" ] ) + '</style>' ) ;
2015-12-15 08:37:15 +01:00
}
} ) ;
} ;
2016-01-08 16:33:43 +01:00
ThemeModule . prototype . handleTheme = function ( checkbox ) {
2015-12-15 08:37:15 +01:00
var cb = $ ( checkbox ) . children ( ) . find ( 'input[type="checkbox"]' ) ;
var enabled = ! cb . is ( ":checked" ) ;
var id = cb . attr ( "id" ) . substring ( 2 ) ;
cb . prop ( "checked" , enabled ) ;
2016-01-08 16:33:43 +01:00
if ( enabled ) {
$ ( "head" ) . append ( '<style id="' + id + '">' + unescape ( bdthemes [ id ] [ "css" ] ) + '</style>' ) ;
2015-12-15 08:37:15 +01:00
themeCookie [ id ] = true ;
} else {
2016-01-08 16:33:43 +01:00
$ ( "#" + id ) . remove ( ) ;
2015-12-15 08:37:15 +01:00
themeCookie [ id ] = false ;
}
2016-01-08 16:33:43 +01:00
2015-12-15 08:37:15 +01:00
this . saveThemeData ( ) ;
} ;
2016-01-08 16:33:43 +01:00
ThemeModule . prototype . loadThemeData = function ( ) {
2015-12-15 08:37:15 +01:00
var cookie = $ . cookie ( "bd-themes" ) ;
2016-01-08 16:33:43 +01:00
if ( cookie != undefined ) {
2015-12-15 08:37:15 +01:00
themeCookie = JSON . parse ( $ . cookie ( "bd-themes" ) ) ;
}
} ;
2016-01-08 16:33:43 +01:00
ThemeModule . prototype . saveThemeData = function ( ) {
$ . cookie ( "bd-themes" , JSON . stringify ( themeCookie ) , {
expires : 365 ,
path : '/'
} ) ;
2015-12-15 08:37:15 +01:00
} ;
2015-12-31 18:27:43 +01:00
/*BDSocket*/
var bdSocket ;
var bdws ;
function BdWSocket ( ) {
bdws = this ;
}
2016-01-08 16:33:43 +01:00
BdWSocket . prototype . start = function ( ) {
2015-12-31 18:27:43 +01:00
var self = this ;
2016-02-12 20:35:12 +01:00
/ * $ . a j a x ( {
2016-01-08 16:33:43 +01:00
method : "GET" ,
url : "https://discordapp.com/api/gateway" ,
headers : {
authorization : localStorage . token . match ( /\"(.+)\"/ ) [ 1 ]
} ,
success : function ( data ) {
2015-12-31 18:27:43 +01:00
self . open ( data . url ) ;
}
2016-02-12 20:35:12 +01:00
} ) ; * /
2015-12-31 18:27:43 +01:00
} ;
2016-01-08 16:33:43 +01:00
BdWSocket . prototype . open = function ( host ) {
2015-12-31 18:27:43 +01:00
utils . log ( "Socket Host: " + host ) ;
try {
bdSocket = new WebSocket ( host ) ;
2016-01-08 16:33:43 +01:00
bdSocket . onopen = this . onOpen ;
2015-12-31 18:27:43 +01:00
bdSocket . onmessage = this . onMessage ;
bdSocket . onerror = this . onError ;
bdSocket . onclose = this . onClose ;
2016-01-08 16:33:43 +01:00
} catch ( err ) {
utils . log ( err ) ;
}
2015-12-31 18:27:43 +01:00
} ;
2016-01-08 16:33:43 +01:00
BdWSocket . prototype . onOpen = function ( ) {
2015-12-31 18:27:43 +01:00
utils . log ( "Socket Open" ) ;
var data = {
op : 2 ,
d : {
token : JSON . parse ( localStorage . getItem ( 'token' ) ) ,
properties : JSON . parse ( localStorage . getItem ( 'superProperties' ) ) ,
v : 3
}
} ;
bdws . send ( data ) ;
} ;
2016-01-08 16:33:43 +01:00
BdWSocket . prototype . onMessage = function ( e ) {
2015-12-31 18:27:43 +01:00
var packet , data , type ;
try {
packet = JSON . parse ( e . data ) ;
data = packet . d ;
type = packet . t ;
2016-01-08 16:33:43 +01:00
} catch ( err ) {
2015-12-31 18:27:43 +01:00
utils . err ( err ) ;
return ;
}
2016-01-08 16:33:43 +01:00
switch ( type ) {
case "READY" :
2016-01-24 04:16:40 +01:00
bdSocket . interval = setInterval ( function ( ) { bdws . send ( {
2016-01-08 16:33:43 +01:00
op : 1 ,
d : Date . now ( )
2016-01-24 04:16:40 +01:00
} ) ; } , data . heartbeat _interval ) ;
2016-01-08 16:33:43 +01:00
utils . log ( "Socket Ready" ) ;
break ;
case "PRESENCE_UPDATE" :
pluginModule . socketEvent ( "PRESENCE_UPDATE" , data ) ;
break ;
case "TYPING_START" :
pluginModule . socketEvent ( "TYPING_START" , data ) ;
break ;
case "MESSAGE_CREATE" :
pluginModule . socketEvent ( "MESSAGE_CREATE" , data ) ;
break ;
case "MESSAGE_UPDATE" :
pluginModule . socketEvent ( "MESSAGE_UPDATE" , data ) ;
break ;
default :
break ;
2015-12-31 18:27:43 +01:00
}
} ;
2016-01-08 16:33:43 +01:00
BdWSocket . prototype . onError = function ( e ) {
2016-01-07 07:35:40 +01:00
utils . log ( "Socket Error - " + e . message ) ;
2015-12-31 18:27:43 +01:00
} ;
2016-01-08 16:33:43 +01:00
BdWSocket . prototype . onClose = function ( e ) {
2015-12-31 18:27:43 +01:00
utils . log ( "Socket Closed - " + e . code + " : " + e . reason ) ;
2016-01-07 07:53:03 +01:00
clearInterval ( bdSocket . interval ) ;
2016-01-07 07:35:40 +01:00
bdws . start ( ) ;
2015-12-31 18:27:43 +01:00
} ;
2016-01-08 16:33:43 +01:00
BdWSocket . prototype . send = function ( data ) {
if ( bdSocket . readyState == 1 ) {
2016-01-07 10:19:46 +01:00
bdSocket . send ( JSON . stringify ( data ) ) ;
}
2015-12-31 18:27:43 +01:00
} ;
2016-01-08 16:33:43 +01:00
BdWSocket . prototype . getSocket = function ( ) {
2016-01-07 07:35:40 +01:00
return bdSocket ;
} ;
2015-12-12 09:50:25 +01:00
/ * B e t t e r D i s c o r d A p p A P I f o r P l u g i n s
* Version : 1.0
* Author : Jiiks | http : //jiiks.net
* Date : 11 / 12 / 2015
* Last Update : 11 / 12 / 2015
* https : //github.com/Jiiks/BetterDiscordApp
*
* Plugin Template : https : //gist.github.com/Jiiks/71edd5af0beafcd08956
* /
function BdApi ( ) { }
//Joins a server
//code = server invite code
2016-01-08 16:33:43 +01:00
BdApi . joinServer = function ( code ) {
opublicServers . joinServer ( code ) ;
2015-12-12 09:50:25 +01:00
} ;
//Inject CSS to document head
//id = id of element
//css = custom css
2016-01-08 16:33:43 +01:00
BdApi . injectCSS = function ( id , css ) {
2016-01-24 04:16:40 +01:00
$ ( "head" ) . append ( '<style id="' + id + '"></style>' ) ;
2015-12-12 09:50:25 +01:00
$ ( "#" + id ) . html ( css ) ;
} ;
//Clear css/remove any element
//id = id of element
2016-01-08 16:33:43 +01:00
BdApi . clearCSS = function ( id ) {
$ ( "#" + id ) . remove ( ) ;
2015-12-12 09:50:25 +01:00
} ;
//Get another plugin
//name = name of plugin
2016-01-08 16:33:43 +01:00
BdApi . getPlugin = function ( name ) {
if ( bdplugins . hasOwnProperty ( name ) ) {
2015-12-12 17:29:06 +01:00
return bdplugins [ name ] [ "plugin" ] ;
2015-12-12 09:50:25 +01:00
}
return null ;
} ;
//Get ipc for reason
2016-01-08 16:33:43 +01:00
BdApi . getIpc = function ( ) {
return betterDiscordIPC ;
2015-12-12 09:50:25 +01:00
} ;
//Get BetterDiscord Core
2016-01-08 16:33:43 +01:00
BdApi . getCore = function ( ) {
return mainCore ;
2015-12-12 13:53:07 +01:00
} ;
2015-12-12 13:54:21 +01:00
//Attempts to get user id by username
//Name = username
//Since Discord hides users if there's too many, this will often fail
2016-01-08 16:33:43 +01:00
BdApi . getUserIdByName = function ( name ) {
2015-12-12 17:54:44 +01:00
var users = $ ( ".member-username" ) ;
2016-01-08 16:33:43 +01:00
for ( var i = 0 ; i < users . length ; i ++ ) {
2015-12-12 17:54:44 +01:00
var user = $ ( users [ i ] ) ;
2016-01-08 16:33:43 +01:00
if ( user . text ( ) == name ) {
2015-12-12 17:54:44 +01:00
var avatarUrl = user . closest ( ".member" ) . find ( ".avatar-small" ) . css ( "background-image" ) ;
return avatarUrl . match ( /\d+/ ) ;
}
}
return null ;
2015-12-12 13:53:07 +01:00
} ;
2015-12-12 13:54:21 +01:00
//Attempts to get username by id
//ID = user id
//Since Discord hides users if there's too many, this will often fail
2015-12-12 17:54:44 +01:00
var gg ;
2016-01-08 16:33:43 +01:00
BdApi . getUserNameById = function ( id ) {
2015-12-12 17:54:44 +01:00
var users = $ ( ".avatar-small" ) ;
2016-01-08 16:33:43 +01:00
for ( var i = 0 ; i < users . length ; i ++ ) {
2015-12-12 17:54:44 +01:00
var user = $ ( users [ i ] ) ;
var url = user . css ( "background-image" ) ;
2016-01-08 16:33:43 +01:00
if ( id == url . match ( /\d+/ ) ) {
2015-12-12 17:54:44 +01:00
return user . parent ( ) . find ( ".member-username" ) . text ( ) ;
}
}
return null ;
2016-01-07 07:35:40 +01:00
} ;
2016-01-07 07:44:14 +01:00
//Set current game
//game = game
2016-01-08 16:33:43 +01:00
BdApi . setPlaying = function ( game ) {
bdws . send ( {
"op" : 3 ,
"d" : {
"idle_since" : null ,
"game" : {
"name" : game
}
}
} ) ;
2016-01-07 07:35:40 +01:00
} ;
2016-01-07 07:44:14 +01:00
//Set current status
//idle_since = date
//status = status
2016-01-08 16:33:43 +01:00
BdApi . setStatus = function ( idle _since , status ) {
bdws . send ( {
"op" : 3 ,
"d" : {
"idle_since" : idle _since ,
"game" : {
"name" : status
}
}
} ) ;
2016-04-08 00:21:30 +02:00
} ;