2017-04-04 07:53:27 +02:00
/* global $ */
/* global Materialize */
/* global Mustache */
/* global guild_id */
2017-04-05 08:25:07 +02:00
/* global bot_client_id */
2017-04-05 21:06:51 +02:00
/* global moment */
2017-05-26 04:58:04 +02:00
/* global localStorage */
2017-06-09 06:22:33 +02:00
/* global visitors_enabled */
2017-06-15 21:58:15 +02:00
/* global cheet */
2017-08-19 07:09:13 +02:00
/* global location */
/* global io */
2017-09-06 09:11:32 +02:00
/* global twemoji */
2017-09-15 08:25:03 +02:00
/* global jQuery */
2017-09-21 09:12:49 +02:00
/* global grecaptcha */
2017-09-23 19:38:14 +02:00
/* global hljs */
/* global linkify */
2017-11-04 03:58:26 +01:00
/* global unauth_captcha_enabled */
2017-11-13 02:26:00 +01:00
/* global soundManager */
2018-01-05 09:52:22 +01:00
/* global disabled */
2018-03-16 04:31:25 +01:00
/* global wdtEmojiBundle */
/* global EmojiConvertor */
2018-03-25 06:43:39 +02:00
/* global post_timeout */
2018-11-17 21:33:39 +01:00
/* global is_peak */
2019-01-28 04:03:25 +01:00
/* global cookie_test_s2_URL */
2017-04-04 07:53:27 +02:00
2017-04-13 02:42:32 +02:00
( function ( ) {
2018-07-04 08:35:01 +02:00
const theme _options = [ "DiscordDark" , "FireWyvern" , "IceWyvern" , "MetroEdge" , "BetterTitan" ] ; // All the avaliable theming names
2018-02-18 23:50:24 +01:00
const badges _options = [ "administrator" , "partner" , "supporter" , "discordbotsorgvoted" ] ; // All badges avaliable
2017-05-26 01:17:22 +02:00
2017-05-26 05:16:23 +02:00
var user _def _css ; // Saves the user defined css
2017-07-20 04:26:35 +02:00
var has _already _been _initially _resized = false ; // keep track if the embed initially been resized
2017-10-29 03:00:21 +01:00
var has _handled _noscroll = false ; // Prevent scrolling to bottom of embed at load if false
2017-04-13 02:42:32 +02:00
var logintimer ; // timer to keep track of user inactivity after hitting login
var last _message _id ; // last message tracked
2017-08-09 03:26:11 +02:00
var selected _channel = null ; // user selected channel
2017-04-13 08:05:04 +02:00
var guild _channels = { } ; // all server channels used to highlight channels in messages
2017-08-22 09:53:41 +02:00
var emoji _store = [ ] ; // all server emojis
2017-05-24 06:42:01 +02:00
var current _username _discrim ; // Current username/discrim pair, eg EndenDraogn#4151
2017-08-27 09:55:08 +02:00
var current _user _discord _id ; // Current user discord snowflake id, eg mine is 140252024666062848
2017-06-09 06:22:33 +02:00
var visitor _mode = false ; // Keep track of if using the visitor mode or authenticate mode
2017-08-21 06:26:51 +02:00
var socket = null ; // Socket.io object
2018-06-28 10:05:08 +02:00
var socket _last _ack = null ; // Socket.io last acknowledgement Moment obj
var socket _error _should _refetch = false ; // If true, the next ack will trigger a http refetch if socket connected
2017-08-22 08:57:30 +02:00
var authenticated _users _list = [ ] ; // List of all authenticated users
var unauthenticated _users _list = [ ] ; // List of all guest users
var discord _users _list = [ ] ; // List of all discord users that are probably online
2017-08-25 08:37:14 +02:00
var guild _channels _list = [ ] ; // guild channels, but as a list of them
2017-09-15 08:25:03 +02:00
var message _users _cache = { } ; // {"name#discrim": {"data": {}, "msgs": []} Cache of the users fetched from websockets to paint the messages
2017-09-01 09:28:44 +02:00
var shift _pressed = false ; // Track down if shift pressed on messagebox
2017-09-24 06:17:06 +02:00
var global _guest _icon = null ; // Guest icon
2017-11-13 02:26:00 +01:00
var notification _sound = null ; // Sound Manager 2 demonstrative.mp3 object https://notificationsounds.com/message-tones/demonstrative-516
var notification _sound _setting ; // nothing, mentions, newmsgs - to control what new sound it makes
2018-01-17 22:54:17 +01:00
var display _richembeds ; // true/false - if rich embeds should be displayed
2018-03-04 07:29:16 +01:00
var guild _roles _list = [ ] ; // List of all guild roles
2018-03-19 20:04:51 +01:00
var all _users = [ ] ; // List of all the users in guild
2018-08-06 04:28:59 +02:00
var is _dragging _chatcontainer = false ; // Track if is dragging on chatcontainer (does not trigger messagebox focus) or not
2018-08-06 04:51:18 +02:00
var localstorage _avaliable = false ; // Check if localstorage is avaliable on this browser
2019-01-02 00:47:23 +01:00
var shouldUtilizeGateway = false ; // Don't connect to gateway until page is focused or has interaction.
2018-12-31 21:54:19 +01:00
var discord _users _list _enabled = false ; // Allow automatic population of discord users list
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function element _in _view ( element , fullyInView ) {
var pageTop = $ ( window ) . scrollTop ( ) ;
var pageBottom = pageTop + $ ( window ) . height ( ) ;
var elementTop = $ ( element ) . offset ( ) . top ;
var elementBottom = elementTop + $ ( element ) . height ( ) ;
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
if ( fullyInView === true ) {
return ( ( pageTop < elementTop ) && ( pageBottom > elementBottom ) ) ;
} else {
return ( ( elementTop <= pageBottom ) && ( elementBottom >= pageTop ) ) ;
}
2017-04-05 05:46:48 +02:00
}
2017-06-10 05:43:23 +02:00
2019-01-02 01:10:22 +01:00
// https://stackoverflow.com/questions/2956966/javascript-telling-setinterval-to-only-fire-x-amount-of-times
function setIntervalX ( callback , delay , repetitions ) {
var x = 0 ;
var intervalID = window . setInterval ( function ( ) {
callback ( ) ;
if ( ++ x === repetitions ) {
window . clearInterval ( intervalID ) ;
}
} , delay ) ;
}
2017-06-10 05:43:23 +02:00
String . prototype . replaceAll = function ( target , replacement ) {
return this . split ( target ) . join ( replacement ) ;
} ;
2018-02-06 08:10:55 +01:00
function zeroPad ( discrim ) {
var str = "" + discrim ;
var pad = "0000" ;
return pad . substring ( 0 , pad . length - str . length ) + str ;
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function query _guild ( ) {
2017-06-09 06:22:33 +02:00
var url = "/api/query_guild" ;
if ( visitor _mode ) {
url = url += "_visitor" ;
}
2017-04-13 02:42:32 +02:00
var funct = $ . ajax ( {
dataType : "json" ,
2017-06-09 06:22:33 +02:00
url : url ,
2017-04-13 02:42:32 +02:00
data : { "guild_id" : guild _id }
2017-04-04 07:53:27 +02:00
} ) ;
2017-04-13 02:42:32 +02:00
return funct . promise ( ) ;
2017-04-04 07:53:27 +02:00
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function create _authenticated _user ( ) {
var funct = $ . ajax ( {
method : "POST" ,
dataType : "json" ,
url : "/api/create_authenticated_user" ,
data : { "guild_id" : guild _id }
} ) ;
return funct . promise ( ) ;
2017-04-04 07:53:27 +02:00
}
2017-04-14 08:10:13 +02:00
2017-09-21 09:12:49 +02:00
function create _unauthenticated _user ( username , captchaResponse ) {
2017-04-13 02:42:32 +02:00
var funct = $ . ajax ( {
method : "POST" ,
dataType : "json" ,
url : "/api/create_unauthenticated_user" ,
2017-09-21 09:12:49 +02:00
data : { "username" : username , "guild_id" : guild _id , "captcha_response" : captchaResponse }
2017-04-10 01:40:11 +02:00
} ) ;
2017-04-13 02:42:32 +02:00
return funct . promise ( ) ;
2017-04-04 07:53:27 +02:00
}
2017-08-10 23:27:08 +02:00
function change _unauthenticated _username ( username ) {
var funct = $ . ajax ( {
method : "POST" ,
dataType : "json" ,
url : "/api/change_unauthenticated_username" ,
data : { "username" : username , "guild_id" : guild _id }
} ) ;
return funct . promise ( ) ;
}
2017-04-14 08:10:13 +02:00
2017-12-14 06:22:06 +01:00
function fetch ( channel _id , after ) {
if ( after === undefined ) {
after = null ;
}
2017-06-09 06:22:33 +02:00
var url = "/api/fetch" ;
if ( visitor _mode ) {
url += "_visitor" ;
}
2017-04-13 02:42:32 +02:00
var funct = $ . ajax ( {
method : "GET" ,
dataType : "json" ,
2017-06-09 06:22:33 +02:00
url : url ,
2017-04-13 02:42:32 +02:00
data : { "guild_id" : guild _id , "channel_id" : channel _id , "after" : after }
2017-04-10 01:40:11 +02:00
} ) ;
2017-04-13 02:42:32 +02:00
return funct . promise ( ) ;
2017-04-04 07:53:27 +02:00
}
2017-04-14 08:10:13 +02:00
2018-08-17 05:12:21 +02:00
function post ( channel _id , content , file ) {
if ( content == "" ) {
content = null ;
}
var data = null ;
var ajaxobj = {
2017-04-13 02:42:32 +02:00
method : "POST" ,
dataType : "json" ,
2018-08-17 05:12:21 +02:00
url : "/api/post"
}
if ( file ) {
data = new FormData ( ) ;
data . append ( "guild_id" , guild _id ) ;
data . append ( "channel_id" , channel _id ) ;
if ( content ) {
data . append ( "content" , content ) ;
}
data . append ( "file" , file ) ;
ajaxobj . cache = false ;
ajaxobj . contentType = false ;
ajaxobj . processData = false ;
ajaxobj . xhr = function ( ) {
var myXhr = $ . ajaxSettings . xhr ( ) ;
if ( myXhr . upload ) {
// For handling the progress of the upload
myXhr . upload . addEventListener ( 'progress' , function ( e ) {
if ( e . lengthComputable ) {
2018-08-17 07:06:46 +02:00
$ ( "#filemodalprogress-inner" ) . css ( "width" , ( e . loaded / e . total ) * 100 + "%" )
2018-08-17 05:12:21 +02:00
}
} , false ) ;
}
return myXhr ;
}
} else {
data = { "guild_id" : guild _id , "channel_id" : channel _id , "content" : content } ;
}
ajaxobj . data = data ;
var funct = $ . ajax ( ajaxobj ) ;
2017-04-13 02:42:32 +02:00
return funct . promise ( ) ;
2017-04-04 07:53:27 +02:00
}
2017-05-23 20:58:49 +02:00
2017-05-24 07:03:48 +02:00
function discord _embed ( ) {
var funct = $ . ajax ( {
dataType : "json" ,
url : "https://discordapp.com/api/guilds/" + guild _id + "/widget.json" ,
} ) ;
return funct . promise ( ) ;
}
2017-12-09 19:47:22 +01:00
function api _user ( user _id ) {
2017-12-07 07:49:32 +01:00
var funct = $ . ajax ( {
dataType : "json" ,
2017-12-09 19:47:22 +01:00
url : "/api/user/" + guild _id + "/" + user _id ,
2017-12-07 07:49:32 +01:00
} ) ;
return funct . promise ( ) ;
}
2018-08-20 21:43:12 +02:00
function list _users ( ) {
var funct = $ . ajax ( {
dataType : "json" ,
url : "/api/user/" + guild _id ,
} ) ;
return funct . promise ( ) ;
}
2018-12-31 21:54:19 +01:00
function server _members ( ) {
var url = "/api/server_members" ;
if ( visitor _mode ) {
url = url += "_visitor" ;
}
var funct = $ . ajax ( {
dataType : "json" ,
url : url ,
data : { "guild_id" : guild _id }
} ) ;
return funct . promise ( ) ;
}
2018-08-06 04:51:18 +02:00
function performLocalStorageTest ( ) {
var test = 'test' ;
try {
localStorage . setItem ( test , test ) ;
localStorage . removeItem ( test ) ;
localstorage _avaliable = true ;
return true ;
} catch ( e ) {
localstorage _avaliable = false ;
return false ;
}
}
2018-11-06 05:33:18 +01:00
function enableGateway ( event ) {
if ( shouldUtilizeGateway ) {
return ;
}
$ ( document ) . off ( "click focus" , enableGateway ) ;
$ ( "main" ) . off ( "mousewheel" , enableGateway ) ;
shouldUtilizeGateway = true ;
initiate _websockets ( ) ;
}
function inIframe ( ) {
try {
return window . self !== window . top ;
} catch ( e ) {
return true ;
}
}
function isSameDomain ( ) {
try {
return location . hostname == parent . location . hostname ;
} catch ( e ) {
return false ;
}
}
2017-05-23 20:58:49 +02:00
$ ( function ( ) {
2018-08-06 04:51:18 +02:00
performLocalStorageTest ( ) ;
2017-05-26 05:16:23 +02:00
if ( $ ( "#user-defined-css" ) . length > 0 ) {
user _def _css = $ ( "#user-defined-css" ) . text ( ) ;
}
2018-11-06 05:33:18 +01:00
// is not in iframe
2018-11-17 21:33:39 +01:00
if ( ( ! inIframe ( ) || isSameDomain ( ) ) && ! is _peak ) {
2018-11-06 05:33:18 +01:00
shouldUtilizeGateway = true ;
} else {
2019-01-02 00:47:23 +01:00
if ( is _peak ) {
$ ( document ) . on ( "click focus" , enableGateway ) ;
2018-11-17 21:33:39 +01:00
$ ( "main" ) . on ( "mousewheel" , enableGateway ) ;
2019-01-02 00:47:23 +01:00
} else {
shouldUtilizeGateway = true ;
2018-11-17 21:33:39 +01:00
}
2018-11-06 05:33:18 +01:00
}
2019-02-25 18:59:58 +01:00
$ ( "#upload-file-btn" ) . hide ( ) ;
$ ( "#send-msg-btn" ) . hide ( ) ;
2017-05-26 00:50:15 +02:00
$ ( 'select' ) . material _select ( ) ;
2017-06-10 04:20:22 +02:00
$ ( "#loginmodal" ) . modal ( {
dismissible : visitors _enabled , // Modal can be dismissed by clicking outside of the modal
opacity : . 5 , // Opacity of modal background
inDuration : 300 , // Transition in duration
outDuration : 200 , // Transition out duration
startingTop : '4%' , // Starting top style attribute
endingTop : '10%' , // Ending top style attribute
}
) ;
$ ( '#loginmodal' ) . modal ( 'open' ) ;
2017-09-21 09:12:49 +02:00
$ ( "#recaptchamodal" ) . modal ( {
dismissible : true ,
opacity : . 5 ,
inDuration : 400 ,
outDuration : 400 ,
startingTop : '40%' ,
endingTop : '30%' ,
} ) ;
2017-05-26 00:50:15 +02:00
$ ( "#userembedmodal" ) . modal ( {
dismissible : true ,
opacity : . 5 ,
inDuration : 400 ,
outDuration : 400 ,
} ) ;
2018-01-28 01:43:06 +01:00
$ ( "#nsfwmodal" ) . modal ( {
dismissible : true ,
opacity : . 3 ,
inDuration : 400 ,
outDuration : 400 ,
} ) ;
2018-08-17 05:12:21 +02:00
$ ( "#filemodal" ) . modal ( {
dismissible : true ,
opacity : . 3 ,
inDuration : 400 ,
outDuration : 400 ,
complete : function ( ) { $ ( "#fileinput" ) . val ( "" ) ; }
} ) ;
2017-12-07 07:49:32 +01:00
$ ( "#usercard" ) . modal ( {
opacity : . 5 ,
} ) ;
2017-05-23 20:58:49 +02:00
2018-12-31 21:54:19 +01:00
$ ( "#members-btn" ) . click ( function ( ) {
var sm = server _members ( ) ;
sm . done ( function ( data ) {
$ ( "#members-spinner" ) . hide ( ) ;
discord _users _list _enabled = data . widgetenabled ;
fill _discord _members ( data . discordmembers ) ;
fill _authenticated _users ( data . embedmembers . authenticated ) ;
fill _unauthenticated _users ( data . embedmembers . unauthenticated ) ;
} ) ;
} ) ;
2017-05-26 00:50:15 +02:00
$ ( "#nameplate" ) . click ( function ( ) {
$ ( "#userembedmodal" ) . modal ( "open" ) ;
} ) ;
2017-06-09 06:22:33 +02:00
$ ( "#visitor_login_btn" ) . click ( function ( ) {
$ ( "#loginmodal" ) . modal ( "open" ) ;
} ) ;
2018-01-28 01:43:06 +01:00
$ ( "#proceed_nsfw_btn" ) . click ( function ( ) {
var channel _id = $ ( "#proceed_nsfw_btn" ) . attr ( "channel_id" ) ;
var should _animate = parseInt ( $ ( "#proceed_nsfw_btn" ) . attr ( "should_animate" ) ) ;
$ ( "#nsfwmodal" ) . modal ( "close" ) ;
select _channel ( channel _id , should _animate , true ) ;
} ) ;
$ ( "#dismiss_nsfw_btn" ) . click ( function ( ) {
$ ( "#nsfwmodal" ) . modal ( "close" ) ;
} ) ;
2018-08-17 05:12:21 +02:00
$ ( "#upload-file-btn" ) . click ( function ( ) {
$ ( "#fileinput" ) . trigger ( 'click' ) ;
} ) ;
$ ( "#proceed_fileupload_btn" ) . click ( function ( ) {
$ ( "#messagebox-filemodal" ) . trigger ( jQuery . Event ( "keydown" , { keyCode : 13 } ) ) ;
} ) ;
$ ( "#fileinput" ) . change ( function ( e ) {
var files = e . target . files ;
if ( files && files . length > 0 ) {
$ ( "#messagebox-filemodal" ) . val ( $ ( "#messagebox" ) . val ( ) ) ;
$ ( "#filename" ) . text ( $ ( "#fileinput" ) [ 0 ] . files [ 0 ] . name ) ;
$ ( "#filemodal" ) . modal ( "open" ) ;
$ ( "#messagebox-filemodal" ) . focus ( ) ;
var file = files [ 0 ] ;
var file _size = file . size ;
var file _max _size = 4 * 1024 * 1024 ;
if ( file _size > file _max _size ) {
$ ( "#filemodal" ) . modal ( "close" ) ;
Materialize . toast ( 'Your file is too powerful! The maximum file size is 4 megabytes.' , 5000 ) ;
return ;
}
var name = file . name ;
var extension = name . substr ( - 4 ) . toLowerCase ( ) ;
var image _extensions = [ ".png" , ".jpg" , ".jpeg" , ".gif" ] ;
$ ( "#filepreview" ) . hide ( ) ;
if ( FileReader && image _extensions . indexOf ( extension ) > - 1 ) {
var reader = new FileReader ( ) ;
reader . onload = function ( ) {
$ ( "#filepreview" ) . show ( ) ;
$ ( "#filepreview" ) [ 0 ] . src = reader . result ;
} ;
reader . readAsDataURL ( file ) ;
}
}
} ) ;
2017-08-08 05:14:17 +02:00
$ ( "#theme-selector" ) . change ( function ( ) {
2017-05-26 00:50:15 +02:00
var theme = $ ( "#theme-selector option:selected" ) . val ( ) ;
2017-08-08 05:14:17 +02:00
var keep _custom _css = $ ( "#overwrite_theme_custom_css_checkbox" ) . is ( ':checked' ) ;
changeTheme ( theme , keep _custom _css ) ;
} ) ;
$ ( "#overwrite_theme_custom_css_checkbox" ) . change ( function ( ) {
var keep _custom _css = $ ( "#overwrite_theme_custom_css_checkbox" ) . is ( ':checked' ) ;
changeTheme ( null , keep _custom _css ) ;
2017-05-26 00:50:15 +02:00
} ) ;
2017-05-26 01:17:22 +02:00
2017-09-23 19:38:14 +02:00
hljs . configure ( { useBR : true } ) ;
linkify . options . defaults . ignoreTags = [ "code" ] ;
2018-03-16 04:31:25 +01:00
wdtEmojiBundle . defaults . emojiSheets = {
'apple' : 'https://cdnjs.cloudflare.com/ajax/libs/wdt-emoji-bundle/0.2.1/sheets/sheet_apple_64_indexed_128.png' ,
'google' : 'https://cdnjs.cloudflare.com/ajax/libs/wdt-emoji-bundle/0.2.1/sheets/sheet_google_64_indexed_128.png' ,
'twitter' : 'https://cdnjs.cloudflare.com/ajax/libs/wdt-emoji-bundle/0.2.1/sheets/sheet_twitter_64_indexed_128.png' ,
'emojione' : 'https://cdnjs.cloudflare.com/ajax/libs/wdt-emoji-bundle/0.2.1/sheets/sheet_emojione_64_indexed_128.png'
} ;
wdtEmojiBundle . defaults . pickerColors = [ 'gray' ] ;
wdtEmojiBundle . defaults . emojiType = 'twitter' ;
wdtEmojiBundle . init ( '#messagebox' ) ;
2017-05-26 01:17:22 +02:00
var themeparam = getParameterByName ( 'theme' ) ;
2018-08-06 04:51:18 +02:00
var localstore _theme = "" ;
if ( localstorage _avaliable ) {
localstore _theme = localStorage . getItem ( "theme" ) ;
}
2017-08-08 05:14:17 +02:00
if ( ( themeparam && $ . inArray ( themeparam , theme _options ) != - 1 ) || ( localstore _theme ) ) {
2017-05-26 04:58:04 +02:00
var theme ;
if ( themeparam ) {
theme = themeparam ;
} else {
theme = localstore _theme ;
}
2017-10-04 08:04:27 +02:00
changeTheme ( theme , true , false ) ;
2017-05-26 01:17:22 +02:00
$ ( "#theme-selector option" ) . removeAttr ( 'selected' ) ;
2017-05-26 04:58:04 +02:00
$ ( "#theme-selector option[value=" + theme + "]" ) . attr ( 'selected' , 'selected' ) ;
$ ( 'select' ) . material _select ( ) ;
2017-05-26 01:17:22 +02:00
}
2017-05-26 05:16:23 +02:00
2017-11-13 02:26:00 +01:00
$ ( "[name=notification_sound_radiobtn]" ) . click ( function ( event ) {
changeNotificationSound ( event . target . value ) ;
} ) ;
2018-08-06 04:51:18 +02:00
var localstore _notification _sound = "" ;
if ( localstorage _avaliable ) {
localstore _notification _sound = localStorage . getItem ( "notification_sound" ) ;
}
2017-11-13 02:26:00 +01:00
if ( localstore _notification _sound ) {
changeNotificationSound ( localstore _notification _sound ) ;
} else {
changeNotificationSound ( "mentions" ) ;
}
notification _sound = soundManager . createSound ( {
id : 'notification_sound_id' ,
url : "/static/audio/demonstrative.mp3" ,
volume : 8 ,
} ) ;
2018-01-17 22:54:17 +01:00
$ ( "[name=richembed_toggle_radiobtn]" ) . click ( function ( event ) {
display _richembeds = event . target . value == "true" ;
localStorage . setItem ( "display_richembeds" , display _richembeds ) ;
$ ( "[name=richembed_toggle_radiobtn][value=" + display _richembeds + "]" ) . prop ( "checked" , true ) ;
} ) ;
2018-08-06 04:51:18 +02:00
var localstore _display _richembeds = "" ;
if ( localstorage _avaliable ) {
localstore _display _richembeds = localStorage . getItem ( "display_richembeds" ) ;
}
2018-01-17 22:54:17 +01:00
if ( localstore _display _richembeds ) {
display _richembeds = ! ( localstore _display _richembeds == "false" ) ;
} else {
display _richembeds = true ;
}
$ ( "[name=richembed_toggle_radiobtn][value=" + display _richembeds + "]" ) . prop ( "checked" , true ) ;
2017-06-10 04:20:22 +02:00
var dembed = discord _embed ( ) ;
dembed . done ( function ( data ) {
2019-03-01 23:30:28 +01:00
if ( data . instant _invite ) {
$ ( "#modal_invite_btn" ) . show ( ) . attr ( "href" , data . instant _invite ) ;
$ ( "#instant-inv" ) . show ( ) . attr ( "href" , data . instant _invite ) ;
} else {
$ ( "#modal_invite_btn" ) . hide ( ) ;
$ ( "#instant-inv" ) . hide ( ) ;
}
} ) ;
dembed . fail ( function ( ) {
$ ( "#modal_invite_btn" ) . hide ( ) ;
$ ( "#instant-inv" ) . hide ( ) ;
2017-06-10 04:20:22 +02:00
} ) ;
2017-10-29 03:00:21 +01:00
if ( getParameterByName ( "noscroll" ) != "true" ) {
has _handled _noscroll = true ;
}
2017-07-20 04:26:35 +02:00
$ ( window ) . resize ( function ( ) {
// For those who decides to hide the embed at first load (display: none), resulting in the messages being not scrolled down.
if ( ! has _already _been _initially _resized ) {
has _already _been _initially _resized = true ;
2017-10-29 03:00:21 +01:00
if ( has _handled _noscroll ) {
2018-08-08 05:57:28 +02:00
if ( getParameterByName ( "scrollbartheme" ) ) {
$ ( "main" ) . mCustomScrollbar ( "scrollTo" , "bottom" , { scrollEasing : "easeOut" } ) ;
} else {
$ ( "main" ) . animate ( { scrollTop : $ ( "#chatcontent" ) . height ( ) } , "slow" ) ;
}
2017-10-29 03:00:21 +01:00
} else {
has _handled _noscroll = true ;
Materialize . toast ( 'Continue scrolling to read on...' , 5000 ) ;
}
2017-07-20 04:26:35 +02:00
}
} ) ;
2018-08-06 04:28:59 +02:00
$ ( "#chatcontent" )
. mousedown ( function ( ) {
$ ( window ) . mousemove ( function ( ) {
is _dragging _chatcontainer = true ;
$ ( window ) . unbind ( "mousemove" ) ;
} ) ;
} )
. mouseup ( function ( ) {
var wasDragging = is _dragging _chatcontainer ;
is _dragging _chatcontainer = false ;
$ ( window ) . unbind ( "mousemove" ) ;
if ( ! wasDragging ) {
$ ( "#messagebox" ) . focus ( ) ;
}
} ) ;
2018-08-05 09:55:18 +02:00
2018-08-09 05:26:24 +02:00
var showScrollbar = getParameterByName ( "lockscrollbar" ) == "true" ;
2018-08-08 04:05:06 +02:00
if ( showScrollbar ) {
showScrollbar = 2 ;
} else {
showScrollbar = 0 ;
}
var scrollbarTheme = getParameterByName ( "scrollbartheme" ) ;
2018-08-08 05:57:28 +02:00
if ( scrollbarTheme ) {
$ ( "main" ) . mCustomScrollbar ( {
autoHideScrollbar : ! showScrollbar ,
2018-11-06 05:33:18 +01:00
theme : scrollbarTheme ,
2018-08-08 05:57:28 +02:00
} ) ;
2018-08-10 00:29:27 +02:00
$ ( "body" ) . addClass ( "custom-scrollbars" ) ;
2018-08-08 04:05:06 +02:00
}
2018-01-05 09:52:22 +01:00
if ( disabled ) {
Materialize . toast ( 'This server is currently disabled. If you are an administrator of this server, please get in touch with a TitanEmbeds team member to lift the ban.' , 100000 ) ;
return ;
}
2017-08-27 23:47:25 +02:00
primeEmbed ( ) ;
2018-10-28 03:40:03 +01:00
setInterval ( send _socket _heartbeat , 30000 ) ;
2017-08-30 20:48:26 +02:00
if ( getParameterByName ( "username" ) ) {
$ ( "#custom_username_field" ) . val ( getParameterByName ( "username" ) ) ;
}
2017-05-23 20:58:49 +02:00
} ) ;
2017-05-26 00:50:15 +02:00
2017-11-13 02:26:00 +01:00
function changeNotificationSound ( sound ) {
var soundTypes = [ "newmsgs" , "mentions" , "nothing" ] ;
if ( $ . inArray ( sound , soundTypes ) != - 1 ) {
notification _sound _setting = sound ;
$ ( "[name=notification_sound_radiobtn][value=" + sound + "]" ) . prop ( "checked" , true ) ;
localStorage . setItem ( "notification_sound" , sound ) ;
}
}
2017-12-14 06:22:06 +01:00
function changeTheme ( theme , keep _custom _css , modifyLocalStore ) {
if ( theme === undefined ) {
theme = null ;
}
if ( keep _custom _css === undefined ) {
keep _custom _css = true ;
}
if ( modifyLocalStore === undefined ) {
modifyLocalStore = true ;
}
2017-05-26 01:17:22 +02:00
if ( theme == "" ) {
$ ( "#css-theme" ) . attr ( "href" , "" ) ;
2017-05-26 05:16:23 +02:00
$ ( "#user-defined-css" ) . text ( user _def _css ) ;
2017-10-04 08:04:27 +02:00
if ( modifyLocalStore ) {
localStorage . removeItem ( "theme" ) ;
}
2017-08-08 05:14:17 +02:00
} else if ( $ . inArray ( theme , theme _options ) != - 1 || theme == null ) {
if ( ! keep _custom _css ) {
$ ( "#user-defined-css" ) . text ( "" ) ;
} else {
$ ( "#user-defined-css" ) . text ( user _def _css ) ;
}
if ( theme ) {
$ ( "#css-theme" ) . attr ( "href" , "/static/themes/" + theme + "/css/style.css" ) ;
2017-10-04 08:04:27 +02:00
if ( modifyLocalStore ) {
localStorage . setItem ( "theme" , theme ) ;
}
2017-08-08 05:14:17 +02:00
}
2017-05-26 01:17:22 +02:00
}
}
/* https://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript */
function getParameterByName ( name , url ) {
if ( ! url ) url = window . location . href ;
name = name . replace ( /[\[\]]/g , "\\$&" ) ;
var regex = new RegExp ( "[?&]" + name + "(=([^&#]*)|&|#|$)" ) ,
results = regex . exec ( url ) ;
if ( ! results ) return null ;
if ( ! results [ 2 ] ) return '' ;
return decodeURIComponent ( results [ 2 ] . replace ( /\+/g , " " ) ) ;
}
2017-06-09 06:22:33 +02:00
function setVisitorMode ( enabled ) {
if ( ! visitors _enabled ) {
return ;
}
visitor _mode = enabled ;
if ( visitor _mode ) {
$ ( "#visitor_mode_message" ) . show ( ) ;
$ ( "#messagebox" ) . hide ( ) ;
2017-08-13 12:14:03 +02:00
$ ( "#emoji-tray-toggle" ) . hide ( ) ;
2018-03-19 22:21:28 +01:00
$ ( ".wdt-emoji-picker" ) . hide ( ) ;
2018-08-17 05:12:21 +02:00
$ ( "#upload-file-btn" ) . hide ( ) ;
2019-02-25 18:59:58 +01:00
$ ( "#send-msg-btn" ) . hide ( ) ;
2017-06-09 06:22:33 +02:00
} else {
$ ( "#visitor_mode_message" ) . hide ( ) ;
$ ( "#messagebox" ) . show ( ) ;
2017-08-13 12:14:03 +02:00
$ ( "#emoji-tray-toggle" ) . show ( ) ;
2018-03-19 22:21:28 +01:00
$ ( ".wdt-emoji-picker" ) . show ( ) ;
2018-08-17 05:12:21 +02:00
$ ( "#upload-file-btn" ) . show ( ) ;
2019-02-25 18:59:58 +01:00
$ ( "#send-msg-btn" ) . show ( ) ;
2017-06-09 06:22:33 +02:00
}
}
2017-05-23 20:58:49 +02:00
function primeEmbed ( ) {
2017-04-26 09:30:36 +02:00
lock _login _fields ( ) ;
2017-04-13 02:42:32 +02:00
var guild = query _guild ( ) ;
2018-01-02 23:35:54 +01:00
guild . fail ( function ( data ) {
2017-04-26 09:30:36 +02:00
unlock _login _fields ( ) ;
2018-01-02 23:35:54 +01:00
if ( data . status == 403 && getParameterByName ( "create_authenticated_user" ) == "true" && getParameterByName ( "sametarget" ) == "true" ) {
wait _for _discord _login ( ) ;
2018-04-04 20:14:37 +02:00
} else if ( ! unauth _captcha _enabled && $ ( "#custom_username_field" ) . length !== 0 && $ ( "#custom_username_field" ) . val ( ) . trim ( ) !== "" ) {
2018-02-16 02:12:25 +01:00
$ ( "#custom_username_field" ) . trigger ( jQuery . Event ( "keyup" , { keyCode : 13 } ) ) ;
2018-01-02 23:35:54 +01:00
} else if ( visitors _enabled ) {
2017-06-09 06:22:33 +02:00
setVisitorMode ( true ) ;
var guild2 = query _guild ( ) ;
guild2 . done ( function ( data ) {
initialize _embed ( data ) ;
} ) ;
guild2 . fail ( function ( ) {
setVisitorMode ( false ) ;
} ) ;
}
2017-04-04 07:53:27 +02:00
} ) ;
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
guild . done ( function ( data ) {
initialize _embed ( data ) ;
2017-04-04 07:53:27 +02:00
} ) ;
2017-05-23 20:58:49 +02:00
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function lock _login _fields ( ) {
$ ( "#loginProgress" ) . show ( ) ;
$ ( "#discordlogin_btn" ) . attr ( "disabled" , true ) ;
2018-08-06 06:16:09 +02:00
$ ( "#guestlogin_btn" ) . attr ( "disabled" , true ) ;
2017-04-13 02:42:32 +02:00
$ ( "#custom_username_field" ) . prop ( "disabled" , true ) ;
logintimer = setTimeout ( function ( ) {
unlock _login _fields ( ) ;
} , 60000 ) ;
2017-04-05 20:43:59 +02:00
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function unlock _login _fields ( ) {
$ ( "#loginProgress" ) . hide ( ) ;
$ ( "#discordlogin_btn" ) . attr ( "disabled" , false ) ;
$ ( "#custom_username_field" ) . prop ( "disabled" , false ) ;
clearTimeout ( logintimer ) ;
2017-04-05 07:10:20 +02:00
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function initialize _embed ( guildobj ) {
2017-08-21 06:26:51 +02:00
if ( socket ) {
socket . disconnect ( ) ;
2017-09-02 06:06:15 +02:00
socket = null ;
2017-08-21 06:26:51 +02:00
}
2017-04-13 02:42:32 +02:00
if ( guildobj === undefined ) {
var guild = query _guild ( ) ;
guild . done ( function ( data ) {
2017-07-18 06:46:26 +02:00
switch _to _default _channel ( data . channels ) ;
2017-04-13 02:42:32 +02:00
prepare _guild ( data ) ;
2017-04-26 09:30:36 +02:00
$ ( '#loginmodal' ) . modal ( 'close' ) ;
unlock _login _fields ( ) ;
2018-02-22 12:43:35 +01:00
setTimeout ( displayDblAdvert , 1500 ) ;
2017-04-13 02:42:32 +02:00
} ) ;
} else {
2017-07-18 06:46:26 +02:00
switch _to _default _channel ( guildobj . channels ) ;
2017-04-13 02:42:32 +02:00
prepare _guild ( guildobj ) ;
2017-04-26 09:30:36 +02:00
$ ( '#loginmodal' ) . modal ( 'close' ) ;
unlock _login _fields ( ) ;
2018-02-22 12:43:35 +01:00
setTimeout ( displayDblAdvert , 1500 ) ;
2017-04-09 00:32:28 +02:00
}
2017-04-12 15:15:05 +02:00
}
2017-07-18 06:46:26 +02:00
2018-02-22 12:43:35 +01:00
function displayDblAdvert ( ) {
2018-08-06 04:51:18 +02:00
var hideDblUntil = "" ;
if ( localstorage _avaliable ) {
2018-08-08 04:35:55 +02:00
hideDblUntil = localStorage . getItem ( "hideDiscordBotsOrgVoteAdUntil" ) ;
2018-08-06 04:51:18 +02:00
}
2018-02-26 06:12:19 +01:00
var now = moment ( ) ;
var hideDblUntilMoment = null ;
if ( hideDblUntil ) {
hideDblUntilMoment = moment ( hideDblUntil ) ;
if ( hideDblUntilMoment . isValid ( ) && hideDblUntilMoment > now ) {
return ;
}
2018-02-22 12:43:35 +01:00
}
2018-02-27 08:22:58 +01:00
var dblAdContents = "<i class=\"material-icons right\">close</i></span><span id=\"dblBalloon\"><h6>Loving the Titan, the Discord server widget?</h6><br>Show your appreciation <em>by voting for Titan daily</em> on <a href=\"https://titanembeds.com/vote\" target=\"_blank\">Discord Bot List</a> and get a <span class=\"yellow-text\">golden</span> name and other rewards!" ;
2018-02-22 12:43:35 +01:00
$ ( ".brand-logo" ) . showBalloon ( {
html : true ,
position : "bottom" ,
contents : dblAdContents ,
classname : "dblballoon" ,
showComplete : function ( ) {
$ ( ".dblballoon" ) . css ( "top" , $ ( ".brand-logo" ) . outerHeight ( ) + "px" ) . css ( "position" , "fixed" ) ;
$ ( ".dblballoon" ) . find ( "i" ) . click ( function ( event ) {
event . preventDefault ( ) ;
$ ( ".brand-logo" ) . hideBalloon ( ) ;
2018-02-26 06:12:19 +01:00
localStorage . setItem ( "hideDiscordBotsOrgVoteAdUntil" , now . add ( 3 , "days" ) . toISOString ( ) ) ;
2018-02-22 12:43:35 +01:00
} ) . css ( "cursor" , "pointer" ) ;
}
} ) ;
}
2017-07-18 06:46:26 +02:00
function switch _to _default _channel ( guildchannels ) {
var defaultChannel = getParameterByName ( "defaultchannel" ) ;
if ( ! defaultChannel ) {
return ;
}
for ( var i = 0 ; i < guildchannels . length ; i ++ ) {
if ( guildchannels [ i ] . channel . id == defaultChannel ) {
2017-08-09 04:07:13 +02:00
if ( ! guildchannels [ i ] . read ) {
return ;
}
2017-07-18 06:46:26 +02:00
selected _channel = defaultChannel ;
return ;
}
}
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function prepare _guild ( guildobj ) {
2017-09-24 06:35:51 +02:00
global _guest _icon = guildobj . guest _icon ;
2017-06-09 10:22:22 +02:00
emoji _store = guildobj . emojis ;
2018-03-16 04:31:25 +01:00
update _emoji _picker ( ) ;
2018-03-04 07:29:16 +01:00
guild _roles _list = guildobj . roles ;
2017-04-13 02:42:32 +02:00
fill _channels ( guildobj . channels ) ;
run _fetch _routine ( ) ;
2017-08-21 06:26:51 +02:00
initiate _websockets ( ) ;
2017-04-05 05:46:48 +02:00
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function fill _channels ( channels ) {
2017-08-25 08:37:14 +02:00
guild _channels _list = channels ;
2017-04-13 02:42:32 +02:00
var template = $ ( '#mustache_channellistings' ) . html ( ) ;
Mustache . parse ( template ) ;
2017-09-09 23:46:00 +02:00
var template _category = $ ( '#mustache_channelcategory' ) . html ( ) ;
Mustache . parse ( template _category ) ;
2017-04-13 02:42:32 +02:00
$ ( "#channels-list" ) . empty ( ) ;
2017-08-09 03:26:11 +02:00
var curr _default _channel = selected _channel ;
2017-09-09 23:46:00 +02:00
var categories = [ {
"channel" : { id : null , name : "Uncategorized" } ,
"children" : [ ] ,
"read" : true ,
} ] ;
2017-04-13 02:42:32 +02:00
for ( var i = 0 ; i < channels . length ; i ++ ) {
var chan = channels [ i ] ;
2017-04-13 08:05:04 +02:00
guild _channels [ chan . channel . id ] = chan ;
2017-09-09 23:46:00 +02:00
if ( chan . channel . type == "category" ) {
chan . children = [ ] ;
categories . push ( chan ) ;
}
}
categories . sort ( function ( a , b ) {
return parseInt ( a . channel . position ) - parseInt ( b . channel . position ) ;
} ) ;
for ( var i = 0 ; i < channels . length ; i ++ ) {
var chan = channels [ i ] ;
if ( chan . channel . type == "text" ) {
var cate = chan . channel . parent _id ;
for ( var j = 0 ; j < categories . length ; j ++ ) {
var thiscategory = categories [ j ] ;
if ( thiscategory . channel . id == cate ) {
thiscategory . children . push ( chan ) ;
break ;
}
}
}
}
for ( var i = 0 ; i < categories . length ; i ++ ) {
var cate = categories [ i ] ;
cate . read = false ;
for ( var j = 0 ; j < cate . children . length ; j ++ ) {
var chan = cate . children [ j ] ;
if ( chan . channel . type == "text" && chan . read ) {
cate . read = true ;
break ;
}
}
}
for ( var i = 0 ; i < categories . length ; i ++ ) {
var cate = categories [ i ] ;
var children = cate . children ;
children . sort ( function ( a , b ) {
return parseInt ( a . channel . position ) - parseInt ( b . channel . position ) ;
} ) ;
if ( i != 0 ) {
if ( cate . read ) {
var rendered _category = Mustache . render ( template _category , { "name" : cate . channel . name } ) ;
$ ( "#channels-list" ) . append ( rendered _category ) ;
}
}
for ( var j = 0 ; j < children . length ; j ++ ) {
var chan = children [ j ] ;
if ( chan . read ) {
var rendered _channel = Mustache . render ( template , { "channelid" : chan . channel . id , "channelname" : chan . channel . name } ) ;
$ ( "#channels-list" ) . append ( rendered _channel ) ;
$ ( "#channel-" + chan . channel . id . toString ( ) ) . click ( { "channel_id" : chan . channel . id . toString ( ) } , function ( event ) {
select _channel ( event . data . channel _id ) ;
} ) ;
if ( ! selected _channel && ( ! curr _default _channel || chan . channel . position < curr _default _channel . channel . position ) ) {
curr _default _channel = chan ;
}
}
2017-04-13 02:42:32 +02:00
}
}
2017-08-09 03:26:11 +02:00
if ( typeof curr _default _channel == "object" ) {
2018-07-22 06:10:04 +02:00
if ( curr _default _channel == null ) {
$ ( "#messagebox" ) . prop ( 'disabled' , true ) ;
$ ( "#messagebox" ) . prop ( 'placeholder' , "NO TEXT CHANNELS" ) ;
2018-08-17 05:12:21 +02:00
$ ( "#upload-file-btn" ) . hide ( ) ;
2019-02-25 18:59:58 +01:00
$ ( "#send-msg-btn" ) . hide ( ) ;
2018-07-22 06:10:04 +02:00
Materialize . toast ( "You find yourself in a strange place. You don't have access to any text channels, or there are none in this server." , 20000 ) ;
return ;
}
2017-08-09 03:26:11 +02:00
selected _channel = curr _default _channel . channel . id ;
}
var this _channel = guild _channels [ selected _channel ] ;
if ( this _channel . write ) {
$ ( "#messagebox" ) . prop ( 'disabled' , false ) ;
$ ( "#messagebox" ) . prop ( 'placeholder' , "Enter message" ) ;
2018-08-17 05:12:21 +02:00
$ ( "#upload-file-btn" ) . show ( ) ;
2019-02-25 18:59:58 +01:00
$ ( "#send-msg-btn" ) . show ( ) ;
2018-08-17 05:12:21 +02:00
$ ( ".wdt-emoji-picker" ) . show ( ) ;
2017-08-09 03:26:11 +02:00
} else {
$ ( "#messagebox" ) . prop ( 'disabled' , true ) ;
2018-09-14 21:12:36 +02:00
$ ( "#messagebox" ) . prop ( 'placeholder' , "Messaging is disabled in this channel." ) ;
2018-08-17 05:12:21 +02:00
$ ( "#upload-file-btn" ) . hide ( ) ;
2019-02-25 18:59:58 +01:00
$ ( "#send-msg-btn" ) . hide ( ) ;
2018-08-17 05:12:21 +02:00
$ ( ".wdt-emoji-picker" ) . hide ( ) ;
}
if ( this _channel . attach _files ) {
$ ( "#upload-file-btn" ) . show ( ) ;
} else {
$ ( "#upload-file-btn" ) . hide ( ) ;
2017-08-09 03:26:11 +02:00
}
$ ( "#channeltopic" ) . text ( this _channel . channel . topic ) ;
2017-04-13 02:42:32 +02:00
$ ( "#channel-" + selected _channel ) . parent ( ) . addClass ( "active" ) ;
2017-04-05 05:46:48 +02:00
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function mention _member ( member _id ) {
if ( ! $ ( '#messagebox' ) . prop ( 'disabled' ) ) {
$ ( '#messagebox' ) . val ( $ ( '#messagebox' ) . val ( ) + "[@" + member _id + "] " ) ;
$ ( '.button-collapse' ) . sideNav ( 'hide' ) ;
$ ( "#messagebox" ) . focus ( ) ;
}
2017-04-05 05:46:48 +02:00
}
2017-08-13 12:14:03 +02:00
2018-03-16 04:31:25 +01:00
function update _emoji _picker ( ) {
var emojis = wdtEmojiBundle . listCustomEmojis ( ) ;
var short _names = [ ] ;
for ( var i = 0 ; i < emojis . length ; i ++ ) {
short _names . push ( emojis . short _name ) ;
2017-08-13 12:14:03 +02:00
}
2018-03-16 04:31:25 +01:00
for ( var i = 0 ; i < short _names . length ; i ++ ) {
wdtEmojiBundle . removeCustomEmoji ( short _names [ i ] ) ;
}
for ( var i = 0 ; i < emoji _store . length ; i ++ ) {
var emote = emoji _store [ i ] ;
var img _url = "https://cdn.discordapp.com/emojis/" + emote . id ;
if ( emote . animated ) {
img _url += ".gif" ;
} else {
img _url += ".png" ;
}
wdtEmojiBundle . addCustomEmoji ( emote . name , emote . name , img _url ) ;
2017-08-13 12:14:03 +02:00
}
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function fill _discord _members ( discordmembers ) {
2018-12-31 21:54:19 +01:00
if ( ! discord _users _list _enabled ) {
2018-12-31 22:05:14 +01:00
if ( discordmembers . length == 0 || discordmembers [ 0 ] . id != 0 ) {
return ;
}
2018-12-31 21:54:19 +01:00
}
2017-08-22 08:57:30 +02:00
discord _users _list = discordmembers ;
2017-04-13 02:42:32 +02:00
var template = $ ( '#mustache_authedusers' ) . html ( ) ;
Mustache . parse ( template ) ;
$ ( "#discord-members" ) . empty ( ) ;
2017-04-14 08:10:13 +02:00
var guild _members = { } ;
2017-04-13 02:42:32 +02:00
for ( var i = 0 ; i < discordmembers . length ; i ++ ) {
var member = discordmembers [ i ] ;
2017-04-14 08:10:13 +02:00
if ( member [ "hoist-role" ] ) {
if ( ! ( member [ "hoist-role" ] [ "id" ] in guild _members ) ) {
guild _members [ member [ "hoist-role" ] [ "id" ] ] = { } ;
guild _members [ member [ "hoist-role" ] [ "id" ] ] [ "name" ] = member [ "hoist-role" ] [ "name" ] ;
guild _members [ member [ "hoist-role" ] [ "id" ] ] [ "members" ] = [ ] ;
2017-05-24 05:20:23 +02:00
guild _members [ member [ "hoist-role" ] [ "id" ] ] [ "position" ] = member [ "hoist-role" ] [ "position" ] ;
2017-04-14 08:10:13 +02:00
}
guild _members [ member [ "hoist-role" ] [ "id" ] ] [ "members" ] . push ( member ) ;
} else {
if ( ! ( "0" in guild _members ) ) {
guild _members [ "0" ] = { } ;
guild _members [ "0" ] [ "name" ] = null ;
guild _members [ "0" ] [ "members" ] = [ ] ;
guild _members [ "0" ] [ "position" ] = 0 ;
}
guild _members [ "0" ] [ "members" ] . push ( member ) ;
}
}
var guild _members _arr = [ ] ;
2017-05-24 05:20:23 +02:00
for ( var key in guild _members ) {
2017-04-14 08:10:13 +02:00
guild _members _arr . push ( guild _members [ key ] ) ;
}
guild _members _arr . sort ( function ( a , b ) {
return parseInt ( b . position ) - parseInt ( a . position ) ;
2017-04-15 09:14:09 +02:00
} ) ;
2017-04-14 08:10:13 +02:00
var template _role = $ ( '#mustache_memberrole' ) . html ( ) ;
Mustache . parse ( template _role ) ;
var template _user = $ ( '#mustache_authedusers' ) . html ( ) ;
Mustache . parse ( template _user ) ;
$ ( "#discord-members" ) . empty ( ) ;
2017-04-22 08:35:30 +02:00
var discordmembercnt = 0 ;
2017-04-14 08:10:13 +02:00
for ( var i = 0 ; i < guild _members _arr . length ; i ++ ) {
var roleobj = guild _members _arr [ i ] ;
if ( ! roleobj [ "name" ] ) {
roleobj [ "name" ] = "Uncategorized" ;
}
2017-04-22 08:35:30 +02:00
var rendered _role = Mustache . render ( template _role , { "name" : roleobj [ "name" ] + " - " + roleobj [ "members" ] . length } ) ;
discordmembercnt += roleobj [ "members" ] . length ;
2017-04-14 08:10:13 +02:00
$ ( "#discord-members" ) . append ( rendered _role ) ;
2017-08-22 09:53:41 +02:00
roleobj . members . sort ( function ( a , b ) {
var name _a = a . username ;
var name _b = b . username ;
if ( a . nick ) {
name _a = a . nick ;
}
if ( b . nick ) {
name _b = b . nick ;
}
name _a = name _a . toUpperCase ( ) ;
name _b = name _b . toUpperCase ( ) ;
if ( name _a < name _b ) return - 1 ;
if ( name _a > name _b ) return 1 ;
return 0 ;
} ) ;
2017-04-14 08:10:13 +02:00
for ( var j = 0 ; j < roleobj . members . length ; j ++ ) {
var member = roleobj . members [ j ] ;
2017-08-07 05:08:26 +02:00
var member _name = member . nick ;
if ( ! member _name ) {
member _name = member . username ;
}
var rendered _user = Mustache . render ( template _user , { "id" : member . id . toString ( ) + "d" , "username" : member _name , "avatar" : member . avatar _url } ) ;
2017-04-14 08:10:13 +02:00
$ ( "#discord-members" ) . append ( rendered _user ) ;
2017-04-13 02:42:32 +02:00
$ ( "#discorduser-" + member . id . toString ( ) + "d" ) . click ( { "member_id" : member . id . toString ( ) } , function ( event ) {
2017-12-07 07:49:32 +01:00
openUserCard ( event . data . member _id ) ;
2017-04-13 02:42:32 +02:00
} ) ;
2017-04-14 08:10:13 +02:00
if ( member . color ) {
$ ( "#discorduser-" + member . id . toString ( ) + "d" ) . css ( "color" , "#" + member . color ) ;
}
}
2017-04-05 06:00:44 +02:00
}
2017-04-22 08:35:30 +02:00
$ ( "#discord-members-count" ) . html ( discordmembercnt ) ;
2017-04-13 02:42:32 +02:00
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function fill _authenticated _users ( users ) {
var template = $ ( '#mustache_authedusers' ) . html ( ) ;
Mustache . parse ( template ) ;
$ ( "#embed-discord-members" ) . empty ( ) ;
2017-04-22 08:35:30 +02:00
$ ( "#embed-discord-members-count" ) . html ( users . length ) ;
2017-04-13 02:42:32 +02:00
for ( var i = 0 ; i < users . length ; i ++ ) {
var member = users [ i ] ;
2017-08-10 04:05:05 +02:00
var username = member . username ;
if ( member . nickname ) {
username = member . nickname ;
}
var rendered = Mustache . render ( template , { "id" : member . id . toString ( ) + "a" , "username" : username , "avatar" : member . avatar _url } ) ;
2017-04-13 02:42:32 +02:00
$ ( "#embed-discord-members" ) . append ( rendered ) ;
$ ( "#discorduser-" + member . id . toString ( ) + "a" ) . click ( { "member_id" : member . id . toString ( ) } , function ( event ) {
2017-12-07 07:49:32 +01:00
openUserCard ( event . data . member _id ) ;
2017-04-13 02:42:32 +02:00
} ) ;
2017-04-05 05:46:48 +02:00
}
2017-08-22 08:57:30 +02:00
authenticated _users _list = users ;
2017-04-04 21:16:21 +02:00
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function fill _unauthenticated _users ( users ) {
var template = $ ( '#mustache_unauthedusers' ) . html ( ) ;
Mustache . parse ( template ) ;
$ ( "#embed-unauth-users" ) . empty ( ) ;
2017-04-22 08:35:30 +02:00
$ ( "#guest-members-count" ) . html ( users . length ) ;
2017-04-13 02:42:32 +02:00
for ( var i = 0 ; i < users . length ; i ++ ) {
var member = users [ i ] ;
2018-02-06 08:10:55 +01:00
var rendered = Mustache . render ( template , { "username" : member . username , "discriminator" : zeroPad ( member . discriminator ) } ) ;
2017-04-13 02:42:32 +02:00
$ ( "#embed-unauth-users" ) . append ( rendered ) ;
2017-04-08 23:53:58 +02:00
}
2017-08-22 08:57:30 +02:00
unauthenticated _users _list = users ;
2017-04-13 02:42:32 +02:00
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function wait _for _discord _login ( ) {
_wait _for _discord _login ( 0 ) ;
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function _wait _for _discord _login ( index ) {
setTimeout ( function ( ) {
var usr = create _authenticated _user ( ) ;
2017-04-08 23:53:58 +02:00
usr . done ( function ( data ) {
2017-06-09 06:22:33 +02:00
setVisitorMode ( false ) ;
2017-04-08 23:53:58 +02:00
initialize _embed ( ) ;
2017-04-13 02:42:32 +02:00
return ;
2017-04-08 23:53:58 +02:00
} ) ;
usr . fail ( function ( data ) {
2017-04-13 02:42:32 +02:00
if ( data . status == 403 ) {
2017-04-08 23:53:58 +02:00
Materialize . toast ( 'Authentication error! You have been banned.' , 10000 ) ;
2017-06-09 06:22:33 +02:00
setVisitorMode ( true ) ;
2017-09-21 23:47:00 +02:00
} else if ( data . status == 422 ) {
if ( data . responseJSON . code == 403 ) {
Materialize . toast ( "Attempting to add you into the server store has failed. The bot does not have permissions to create instant invite. Therefore, Discord Login has been disabled." , 10000 ) ;
} else {
Materialize . toast ( "Attempting to add you into the server has failed. Either you are banned, reached 100 servers in Discord, or something else bad has happened." , 10000 ) ;
}
2017-04-13 02:42:32 +02:00
} else if ( index < 10 ) {
_wait _for _discord _login ( index + 1 ) ;
2017-04-08 23:53:58 +02:00
}
2017-04-13 02:42:32 +02:00
} ) ;
} , 5000 ) ;
2017-04-05 20:43:59 +02:00
}
2017-11-01 07:31:44 +01:00
2017-12-07 07:49:32 +01:00
function openUserCard ( user _id ) {
2017-12-09 19:47:22 +01:00
var usr = api _user ( user _id ) ;
usr . done ( function ( data ) {
2017-12-07 07:49:32 +01:00
for ( var i = 0 ; i < badges _options . length ; i ++ ) {
var badge = badges _options [ i ] ;
2017-12-09 19:47:22 +01:00
if ( data . badges . indexOf ( badge ) != - 1 ) {
2017-12-14 06:50:59 +01:00
$ ( "#usercard .badges ." + badge ) . show ( ) ;
2017-12-07 07:49:32 +01:00
} else {
2017-12-14 06:50:59 +01:00
$ ( "#usercard .badges ." + badge ) . hide ( ) ;
2017-12-07 07:49:32 +01:00
}
}
2018-03-11 10:28:58 +01:00
$ ( "#usercard .avatar" ) . attr ( "src" , data . avatar _url + "?size=512" ) ;
2017-12-09 19:47:22 +01:00
$ ( "#usercard .identity .username" ) . text ( data . username ) ;
2018-02-06 08:10:55 +01:00
$ ( "#usercard .identity .discriminator" ) . text ( zeroPad ( data . discriminator ) ) ;
$ ( "#usercard .identity .discriminator" ) . text ( zeroPad ( data . discriminator ) ) ;
2017-12-09 19:47:22 +01:00
var template = $ ( '#mustache_rolebubble' ) . html ( ) ;
Mustache . parse ( template ) ;
data . roles . sort ( function ( a , b ) {
return parseFloat ( b . position ) - parseFloat ( a . position ) ;
} ) ;
$ ( "#usercard .role .roles" ) . empty ( ) ;
2018-03-04 08:45:36 +01:00
var rolecount = 0 ;
2017-12-09 19:47:22 +01:00
for ( var j = 0 ; j < data . roles . length ; j ++ ) {
var role = data . roles [ j ] ;
2018-03-01 08:09:09 +01:00
if ( role . id == guild _id ) {
continue ;
}
2018-03-04 08:45:36 +01:00
rolecount ++ ;
2017-12-09 19:47:22 +01:00
var color = null ;
if ( role . color ) {
color = "#" + role . color . toString ( 16 ) ;
}
var rol = Mustache . render ( template , { name : role . name , color : color } ) ;
$ ( "#usercard .role .roles" ) . append ( rol ) ;
}
2018-03-04 08:45:36 +01:00
if ( rolecount ) {
$ ( "#usercard .role" ) . show ( ) ;
} else {
$ ( "#usercard .role" ) . hide ( ) ;
}
2017-12-09 19:47:22 +01:00
$ ( "#usercard-mention-btn" ) . off ( "click" ) ;
$ ( "#usercard-mention-btn" ) . click ( function ( ) {
mention _member ( data . id ) ;
$ ( "#usercard" ) . modal ( 'close' ) ;
} ) ;
2017-12-07 07:49:32 +01:00
} ) ;
2017-12-09 19:47:22 +01:00
$ ( "#usercard .offline-text" ) . show ( ) ;
$ ( "#usercard .game" ) . hide ( ) ;
$ ( "#usercard .bottag" ) . hide ( ) ;
2017-12-07 07:49:32 +01:00
for ( var i = 0 ; i < discord _users _list . length ; i ++ ) {
var usr = discord _users _list [ i ] ;
if ( usr . id == user _id ) {
2017-12-09 19:47:22 +01:00
$ ( "#usercard .offline-text" ) . hide ( ) ;
2017-12-07 07:49:32 +01:00
if ( usr . bot ) {
$ ( "#usercard .bottag" ) . show ( ) ;
}
if ( usr . game ) {
$ ( "#usercard .game" ) . show ( ) ;
$ ( "#usercard .game .text" ) . text ( usr . game . name ) ;
}
2017-12-09 19:47:22 +01:00
break ;
2017-12-07 07:49:32 +01:00
}
}
$ ( "#usercard" ) . modal ( 'open' ) ;
}
2017-11-01 07:31:44 +01:00
function flashElement ( element ) {
var opacity = element . css ( "opacity" ) ;
for ( var i = 0 ; i < 3 ; i ++ ) {
element . animate ( { opacity : 0 } , "fast" ) ;
element . animate ( { opacity : 100 } , "fast" ) ;
}
element . css ( "opacity" , opacity ) ;
}
2018-01-28 01:43:06 +01:00
function select _channel ( channel _id , animate _it , acknowledge _nsfw ) {
2017-11-01 07:31:44 +01:00
if ( selected _channel != channel _id && guild _channels [ channel _id ] && guild _channels [ channel _id ] . read ) {
2018-01-28 01:43:06 +01:00
if ( guild _channels [ channel _id ] . channel . nsfw && ! acknowledge _nsfw ) {
$ ( "#proceed_nsfw_btn" ) . attr ( "channel_id" , channel _id ) ;
$ ( "#proceed_nsfw_btn" ) . attr ( "should_animate" , animate _it ? 1 : 0 ) ;
$ ( "#nsfwmodal" ) . modal ( "open" ) ;
return ;
}
2017-11-01 07:31:44 +01:00
if ( animate _it ) {
2018-05-08 01:07:48 +02:00
if ( $ ( "#guild-btn" ) . is ( ":visible" ) ) {
$ ( "#guild-btn" ) . sideNav ( "show" ) ;
}
2017-11-01 18:30:47 +01:00
$ ( "#channel-" + channel _id ) [ 0 ] . scrollIntoView ( { behavior : "smooth" } ) ;
2017-11-01 07:31:44 +01:00
flashElement ( $ ( "#channel-" + channel _id ) ) ;
2018-05-08 01:07:48 +02:00
var timeout = 400 ;
if ( $ ( "#guild-btn" ) . is ( ":visible" ) ) {
timeout = 1000 ;
}
2017-11-01 07:31:44 +01:00
setTimeout ( function ( ) {
2018-05-08 01:07:48 +02:00
if ( $ ( "#guild-btn" ) . is ( ":visible" ) ) {
$ ( "#guild-btn" ) . sideNav ( "hide" ) ;
}
2018-01-28 01:43:06 +01:00
select _channel ( channel _id , false , true ) ;
2018-05-08 01:07:48 +02:00
} , timeout ) ;
2017-11-01 07:31:44 +01:00
return ;
}
2017-04-13 02:42:32 +02:00
selected _channel = channel _id ;
last _message _id = null ;
$ ( "#channels-list > li.active" ) . removeClass ( "active" ) ;
$ ( "#channel-" + selected _channel ) . parent ( ) . addClass ( "active" ) ;
2017-04-05 08:25:07 +02:00
run _fetch _routine ( ) ;
2017-04-13 02:42:32 +02:00
}
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function replace _message _mentions ( message ) {
var mentions = message . mentions ;
2017-11-06 04:12:18 +01:00
var template = $ ( '#mustache_discordmention' ) . html ( ) ;
Mustache . parse ( template ) ;
2017-04-13 02:42:32 +02:00
for ( var i = 0 ; i < mentions . length ; i ++ ) {
var mention = mentions [ i ] ;
2017-08-10 04:56:45 +02:00
var username = mention . username ;
if ( mention . nickname ) {
username = mention . nickname ;
}
2018-02-06 08:10:55 +01:00
var rendered = Mustache . render ( template , { "username" : username , "discriminator" : zeroPad ( mention . discriminator ) } ) . trim ( ) ;
2017-11-06 04:12:18 +01:00
message . content = message . content . replace ( new RegExp ( "<@" + mention . id + ">" , 'g' ) , rendered ) ;
message . content = message . content . replace ( new RegExp ( "<@!" + mention . id + ">" , 'g' ) , rendered ) ;
2018-03-04 07:29:16 +01:00
}
var template = $ ( "#mustache_rolemention" ) . html ( ) ;
Mustache . parse ( template ) ;
for ( var i = 0 ; i < guild _roles _list . length ; i ++ ) {
var role = guild _roles _list [ i ] ;
var roleobj = { "rolename" : role . name } ;
if ( role . color ) {
roleobj . color = "#" + role . color . toString ( 16 ) ;
}
var rendered = Mustache . render ( template , roleobj ) . trim ( ) ;
message . content = message . content . replace ( "<@&" + role . id + ">" , rendered ) ;
2017-04-13 02:42:32 +02:00
}
return message ;
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function getPosition ( string , subString , index ) {
return string . split ( subString , index ) . join ( subString ) . length ;
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function format _bot _message ( message ) {
2019-02-01 18:28:56 +01:00
if ( message . author . id == bot _client _id && ( message . content . includes ( "**" ) && ( ( message . content . includes ( "<" ) && message . content . includes ( ">" ) && ! message . content . startsWith ( "<@" ) ) || ( message . content . includes ( "[" ) && message . content . includes ( "]" ) ) ) ) ) {
2017-04-13 02:42:32 +02:00
var usernamefield = message . content . substring ( getPosition ( message . content , "**" , 1 ) + 3 , getPosition ( message . content , "**" , 2 ) - 1 ) ;
2017-07-06 19:18:15 +02:00
if ( message . content . startsWith ( "(Titan Dev) " ) ) {
message . content = message . content . substring ( usernamefield . length + 18 ) ;
} else {
message . content = message . content . substring ( usernamefield . length + 7 ) ;
}
2017-04-13 02:42:32 +02:00
message . author . username = usernamefield . split ( "#" ) [ 0 ] ;
2017-12-10 22:32:32 +01:00
message . author . nickname = null ;
2017-04-13 02:42:32 +02:00
message . author . discriminator = usernamefield . split ( "#" ) [ 1 ] ;
2017-07-01 08:52:21 +02:00
} else if ( message . author . bot && message . author . discriminator == "0000" && message . author . username . substring ( message . author . username . length - 5 , message . author . username . length - 4 ) == "#" ) {
var namestr = message . author . username ;
2017-07-06 19:18:15 +02:00
if ( message . content . startsWith ( "(Titan Dev) " ) ) {
message . author . username = "(Titan Dev) " + namestr . substring ( 0 , namestr . length - 5 ) ;
message . content = message . content . substring ( 11 ) ;
} else {
message . author . username = namestr . substring ( 0 , namestr . length - 5 ) ;
}
2017-07-01 08:52:21 +02:00
message . author . discriminator = namestr . substring ( namestr . length - 4 ) ;
2017-04-13 02:42:32 +02:00
}
return message ;
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function parse _message _time ( message ) {
var mome = moment ( message . timestamp ) ;
message . formatted _timestamp = mome . toDate ( ) . toString ( ) ;
2017-06-04 08:31:06 +02:00
message . formatted _time = mome . calendar ( ) ;
/*message.formatted_time = mome.format("h:mm A");*/
2017-04-13 02:42:32 +02:00
return message ;
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function parse _message _attachments ( message ) {
for ( var i = 0 ; i < message . attachments . length ; i ++ ) {
var attach = "" ;
if ( message . content . length != 0 ) {
attach = " " ;
}
2017-11-05 07:09:05 +01:00
if ( message . attachments [ i ] . url . endsWith ( ".png" ) || message . attachments [ i ] . url . endsWith ( ".jpg" ) || message . attachments [ i ] . url . endsWith ( ".jpeg" ) || message . attachments [ i ] . url . endsWith ( ".gif" ) ) {
2018-02-18 21:53:32 +01:00
attach += "<img class=\"attachment materialboxed\" src=\"" + message . attachments [ i ] . url + "\">" ;
2018-06-30 09:30:54 +02:00
} else if ( message . attachments [ i ] . url . endsWith ( ".mp4" ) ) {
attach += "<video class=\"player\" src=\"" + message . attachments [ i ] . url + "\" frameborder=\"0\" allow=\"encrypted-media\" allowfullscreen controls preload poster=\"" + message . attachments [ i ] . proxy _url + "?format=png\"></video>" ;
2017-11-05 07:09:05 +01:00
} else {
attach += message . attachments [ i ] . url ;
}
2017-04-13 02:42:32 +02:00
message . content += attach ;
}
return message ;
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function handle _last _message _mention ( ) {
var lastmsg = $ ( "#chatcontent p:last-child" ) ;
var content = lastmsg . text ( ) . toLowerCase ( ) ;
2017-05-24 06:42:01 +02:00
var username _discrim = current _username _discrim . toLowerCase ( ) ;
2017-06-12 06:31:34 +02:00
if ( content . includes ( "@everyone" ) || content . includes ( "@here" ) || content . includes ( "@" + username _discrim ) ) {
lastmsg . addClass ( "mentioned" ) ;
2017-04-13 02:42:32 +02:00
}
}
2017-11-13 02:26:00 +01:00
function play _notification _sound ( type ) { // type can be mention or new
if ( notification _sound _setting == "nothing" ) {
return ;
} else if ( notification _sound _setting == "mentions" && type != "mention" ) {
return ;
}
if ( notification _sound . playState == 0 ) {
notification _sound . play ( ) ;
}
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function escapeHtml ( unsafe ) { /* http://stackoverflow.com/questions/6234773/can-i-escape-html-special-chars-in-javascript */
return unsafe
. replace ( /&/g , "&" )
. replace ( /</g , "<" )
. replace ( />/g , ">" )
. replace ( /"/g , """ )
. replace ( /'/g , "'" ) ;
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function nl2br ( str , is _xhtml ) { /* http://stackoverflow.com/questions/2919337/jquery-convert-line-breaks-to-br-nl2br-equivalent/ */
2017-04-14 08:10:13 +02:00
var breakTag = ( is _xhtml || typeof is _xhtml === 'undefined' ) ? '<br />' : '<br>' ;
2017-04-13 02:42:32 +02:00
return ( str + '' ) . replace ( /([^>\r\n]?)(\r\n|\n\r|\r|\n)/g , '$1' + breakTag + '$2' ) ;
}
2017-04-14 08:10:13 +02:00
2017-04-13 08:05:04 +02:00
function parse _channels _in _message ( message ) {
var channelids = Object . keys ( guild _channels ) ;
for ( var i = 0 ; i < channelids . length ; i ++ ) {
2017-11-01 07:31:44 +01:00
var pattern = "<#" + channelids [ i ] + ">" ;
var elem = "<span class=\"channellink\" channelid=\"" + channelids [ i ] + "\">#" + guild _channels [ channelids [ i ] ] . channel . name + "</span>" ;
message . content = message . content . replace ( new RegExp ( pattern , "g" ) , elem ) ;
2017-04-13 08:05:04 +02:00
}
return message ;
}
2017-06-09 10:22:22 +02:00
function parse _emoji _in _message ( message ) {
var template = $ ( '#mustache_message_emoji' ) . html ( ) ;
Mustache . parse ( template ) ;
for ( var i = 0 ; i < emoji _store . length ; i ++ ) {
var emoji = emoji _store [ i ] ;
2018-03-01 08:57:45 +01:00
var emoji _format = "" ;
if ( emoji . animated ) {
emoji _format = "<a:" + emoji . name + ":" + emoji . id + ">" ;
} else {
emoji _format = "<:" + emoji . name + ":" + emoji . id + ">" ;
}
var rendered = Mustache . render ( template , { "id" : emoji . id , "name" : emoji . name , "animated" : emoji . animated } ) . trim ( ) ;
2017-06-10 05:43:23 +02:00
message . content = message . content . replaceAll ( emoji _format , rendered ) ;
2017-06-09 10:22:22 +02:00
}
2017-09-06 08:42:17 +02:00
var rendered = Mustache . render ( template , { "id" : "$2" , "name" : "$1" } ) . trim ( ) ;
message . content = message . content . replace ( /<:(.*?):(.*?)>/g , rendered ) ;
2018-03-01 09:15:42 +01:00
rendered = Mustache . render ( template , { "id" : "$2" , "name" : "$1" , "animated" : true } ) . trim ( ) ;
message . content = message . content . replace ( /<a:(.*?):(.*?)>/g , rendered ) ;
2017-09-06 09:11:32 +02:00
message . content = twemoji . parse ( message . content , {
className : "message_emoji" ,
callback : function ( icon , options , variant ) { // exclude special characters
switch ( icon ) {
case 'a9' : // © copyright
case 'ae' : // ® registered trademark
case '2122' : // ™ trademark
return false ;
}
return '' . concat ( options . base , options . size , '/' , icon , options . ext ) ;
}
} ) ;
2017-06-09 10:22:22 +02:00
return message ;
}
2017-08-10 03:00:14 +02:00
function parse _message _markdown ( text ) {
2017-09-13 05:56:10 +02:00
var geturl _regex = /(\(.*?)?\b((?:https?|ftp|file):\/\/[-a-z0-9+&@#\/%?=~_()|!:,.;]*[-a-z0-9+&@#\/%=~_()|])/ig ;
var links = text . match ( geturl _regex ) ; // temporarily remove urls so markdown won't mark inside of the url
if ( links ) {
for ( var i = 0 ; i < links . length ; i ++ ) {
text = text . replace ( links [ i ] , "$LINK" + i + "$" ) ;
}
}
2017-08-10 03:00:14 +02:00
text = text . replace ( /\*\*(.*?)\*\*/g , "<b>$1</b>" ) ;
text = text . replace ( /\*(.*?)\*/g , "<i>$1</i>" ) ;
text = text . replace ( /__(.*?)__/g , "<u>$1</u>" ) ;
2017-08-10 03:11:18 +02:00
text = text . replace ( /_(.*?)_/g , "<i>$1</i>" ) ;
2017-08-10 03:00:14 +02:00
text = text . replace ( /~~(.*?)~~/g , "<del>$1</del>" ) ;
2017-09-23 19:59:06 +02:00
text = text . replace ( /\`\`\`([^]+?)\`\`\`/g , "<code class=\"blockcode\">$1</code>" ) ;
2017-08-10 03:00:14 +02:00
text = text . replace ( /\`(.*?)\`/g , "<code>$1</code>" ) ;
2017-09-13 05:56:10 +02:00
if ( links ) {
for ( var i = 0 ; i < links . length ; i ++ ) {
text = text . replace ( "$LINK" + i + "$" , links [ i ] ) ;
}
}
2017-08-10 03:00:14 +02:00
return text ;
}
2017-09-23 19:38:14 +02:00
function render _code _highlighting ( element ) {
2017-09-24 02:15:25 +02:00
for ( var i = 0 ; i < element . length ; i ++ ) {
var elem = $ ( element [ i ] ) ;
2017-09-23 19:38:14 +02:00
var codetext = elem . text ( ) ;
var splitted = codetext . split ( "\n" ) ;
if ( splitted . length > 1 ) {
var firstLine = splitted [ 0 ] ;
if ( ! ( /^\s/ . test ( firstLine ) ) ) { // make sure no whitespace at begining
var firstLineSplitted = firstLine . split ( /[ ]+/ ) ; // split at whitespace
if ( firstLineSplitted . length == 1 && firstLineSplitted [ 0 ] != "" ) { // only one token and the token is not empty
var language = firstLineSplitted [ 0 ] ; // assume token is lang
if ( hljs . getLanguage ( language ) ) {
splitted . splice ( 0 , 1 ) ; // delete first line
var restOfCode = splitted . join ( "\n" ) ;
var highlighted = hljs . highlight ( language , restOfCode , true ) ;
2017-09-24 02:15:25 +02:00
elem . html ( highlighted . value ) ;
2017-09-23 19:38:14 +02:00
}
}
}
}
2017-09-24 02:15:25 +02:00
}
2017-09-23 19:38:14 +02:00
}
2017-09-24 06:17:06 +02:00
2017-12-14 06:22:06 +01:00
function generate _avatar _url ( user _id , avatar _hash , message _contents ) {
if ( message _contents === undefined ) {
message _contents = null ;
}
2017-09-24 06:17:06 +02:00
if ( user _id == bot _client _id && ( message _contents . includes ( "**" ) && ( ( message _contents . includes ( "<" ) && message _contents . includes ( ">" ) ) || ( message _contents . includes ( "[" ) && message _contents . includes ( "]" ) ) ) ) ) {
return global _guest _icon ;
} else {
return "https://cdn.discordapp.com/avatars/" + user _id + "/" + avatar _hash + ".png" ;
}
}
2017-11-05 06:59:06 +01:00
function parse _message _embeds ( embeds ) {
var emb = [ ] ;
2018-01-17 22:54:17 +01:00
if ( display _richembeds ) {
for ( var i = 0 ; i < embeds . length ; i ++ ) {
var disembed = embeds [ i ] ;
// if ($.inArray(disembed.type, ["rich", "link", "video"]) == -1) {
// continue;
// }
2018-06-20 08:23:38 +02:00
2018-06-27 04:34:48 +02:00
if ( disembed . type == "image" ) {
var img = "<img class=\"image attachment materialboxed\" src=\"" + disembed . thumbnail . proxy _url + "\">" ;
emb . push ( img ) ;
continue ;
}
2018-06-20 08:23:38 +02:00
disembed . isVideo = false ;
if ( disembed . type == "video" ) {
disembed . isVideo = true ;
2019-03-16 23:18:31 +01:00
if ( disembed . video ) {
var url = new URL ( disembed . video . url ) ;
if ( url . hostname . endsWith ( "twitch.tv" ) ) {
if ( url . searchParams . has ( "autoplay" ) ) {
url . searchParams . set ( "autoplay" , "false" ) ;
disembed . video . url = url . toString ( ) ;
}
}
}
2018-06-20 08:23:38 +02:00
}
2018-01-17 22:54:17 +01:00
disembed . toRenderFooter = false ;
if ( disembed . footer ) {
disembed . toRenderFooter = true ;
} else if ( disembed . timestamp ) {
disembed . toRenderFooter = true ;
}
disembed . footerVerticalBar = disembed . footer && disembed . timestamp ;
if ( disembed . timestamp ) {
disembed . formatted _timestamp = moment ( disembed . timestamp ) . format ( 'ddd MMM Do, YYYY [at] h:mm A' ) ;
}
if ( disembed . color ) {
disembed . hexColor = "#" + disembed . color . toString ( 16 ) ;
}
var template = $ ( '#mustache_richembed' ) . html ( ) ;
Mustache . parse ( template ) ;
var rendered = Mustache . render ( template , disembed ) ;
emb . push ( rendered ) ;
2017-11-05 06:59:06 +01:00
}
}
return emb ;
}
2018-07-27 10:57:54 +02:00
function parse _message _reactions ( reactions ) {
var reacts = [ ]
var template = $ ( "#mustache_reactionchip" ) . html ( ) ;
Mustache . parse ( template ) ;
for ( var i = 0 ; i < reactions . length ; i ++ ) {
var disreact = reactions [ i ] ;
var emoji = disreact . emoji ;
if ( emoji . id ) {
disreact . img _url = "https://cdn.discordapp.com/emojis/" + emoji . id ;
if ( emoji . animated ) {
disreact . img _url += ".gif" ;
} else {
disreact . img _url += ".png" ;
}
} else {
disreact . img _url = $ ( twemoji . parse ( emoji . name ) ) . attr ( "src" ) ;
}
var rendered = Mustache . render ( template , disreact ) ;
reacts . push ( rendered ) ;
}
return reacts ;
}
2018-08-09 07:14:50 +02:00
function scroll _on _dom _update ( ) {
var scrollRegion = $ ( window ) . height ( ) / 2 ;
if ( ! getParameterByName ( "scrollbartheme" ) && $ ( "main" ) . prop ( "scrollHeight" ) - ( $ ( "main" ) . scrollTop ( ) + $ ( "main" ) . outerHeight ( ) ) < scrollRegion ) {
$ ( "main" ) . scrollTop ( $ ( "#chatcontent" ) . outerHeight ( ) ) ;
}
}
2018-08-19 04:55:31 +02:00
function format _new _member _message ( message ) {
var formats = [
"{0} just joined the server - glhf!" ,
"{0} just joined. Everyone, look busy!" ,
"{0} just joined. Can I get a heal?" ,
"{0} joined your party." ,
"{0} joined. You must construct additional pylons." ,
"Ermagherd. {0} is here." ,
"Welcome, {0}. Stay awhile and listen." ,
"Welcome, {0}. We were expecting you ( ͡° ͜ʖ ͡°)" ,
"Welcome, {0}. We hope you brought pizza." ,
"Welcome {0}. Leave your weapons by the door." ,
"A wild {0} appeared." ,
"Swoooosh. {0} just landed." ,
"Brace yourselves. {0} just joined the server." ,
"{0} just joined. Hide your bananas." ,
"{0} just arrived. Seems OP - please nerf." ,
"{0} just slid into the server." ,
"A {0} has spawned in the server." ,
"Big {0} showed up!" ,
"Where’ s {0}? In the server!" ,
"{0} hopped into the server. Kangaroo!!" ,
"{0} just showed up. Hold my beer." ,
"Challenger approaching - {0} has appeared!" ,
"It's a bird! It's a plane! Nevermind, it's just {0}." ,
"It's {0}! Praise the sun! [T]/" ,
"Never gonna give {0} up. Never gonna let {0} down." ,
"Ha! {0} has joined! You activated my trap card!" ,
"Cheers, love! {0}'s here!" ,
"Hey! Listen! {0} has joined!" ,
"We've been expecting you {0}" ,
"It's dangerous to go alone, take {0}!" ,
"{0} has joined the server! It's super effective!" ,
"Cheers, love! {0} is here!" ,
"{0} is here, as the prophecy foretold." ,
"{0} has arrived. Party's over." ,
"Ready player {0}" ,
"{0} is here to kick butt and chew bubblegum. And {0} is all out of gum." ,
"Hello. Is it {0} you're looking for?" ,
"{0} has joined. Stay a while and listen!" ,
"Roses are red, violets are blue, {0} joined this server with you" ,
] ;
var index = moment ( message . timestamp ) . unix ( ) % formats . length ;
var formatted = formats [ index ] . replace ( /\{0\}/g , message . author . username ) ;
return "<i class=\"material-icons new-member-arrow\">arrow_forward</i> " + formatted ;
}
2017-04-14 08:10:13 +02:00
2017-12-14 06:22:06 +01:00
function fill _discord _messages ( messages , jumpscroll , replace ) {
if ( replace === undefined ) {
replace = null ;
}
2017-04-13 02:42:32 +02:00
if ( messages . length == 0 ) {
return last _message _id ;
}
var last = 0 ;
var template = $ ( '#mustache_usermessage' ) . html ( ) ;
Mustache . parse ( template ) ;
for ( var i = messages . length - 1 ; i >= 0 ; i -- ) {
var message = messages [ i ] ;
2017-10-09 19:56:00 +02:00
if ( message . author . avatar ) {
var avatar = generate _avatar _url ( message . author . id , message . author . avatar , message . content ) ;
} else {
var avatar = global _guest _icon ;
}
2017-04-13 02:42:32 +02:00
message = format _bot _message ( message ) ;
message = parse _message _time ( message ) ;
2017-09-06 08:34:51 +02:00
message . content = message . content . replaceAll ( "\\<" , "<" ) ;
message . content = message . content . replaceAll ( "\\>" , ">" ) ;
2017-06-09 10:22:22 +02:00
message . content = escapeHtml ( message . content ) ;
2017-11-06 03:57:46 +01:00
message = replace _message _mentions ( message ) ;
2017-11-05 07:09:05 +01:00
message = parse _message _attachments ( message ) ;
2017-08-10 03:00:14 +02:00
message . content = parse _message _markdown ( message . content ) ;
2017-11-01 07:31:44 +01:00
message = parse _channels _in _message ( message ) ;
2017-06-09 10:22:22 +02:00
message = parse _emoji _in _message ( message ) ;
2018-03-02 02:51:29 +01:00
message . content = message . content . replace ( /<https:\/\/(.*?)>/g , "https://$1" ) ;
message . content = message . content . replace ( /<http:\/\/(.*?)>/g , "http://$1" ) ;
2018-08-19 04:55:31 +02:00
if ( message . type == 7 ) {
message . content = format _new _member _message ( message ) ;
}
2017-08-10 04:05:05 +02:00
var username = message . author . username ;
if ( message . author . nickname ) {
username = message . author . nickname ;
}
2018-02-06 08:10:55 +01:00
var rendered = Mustache . render ( template , { "id" : message . id , "full_timestamp" : message . formatted _timestamp , "time" : message . formatted _time , "username" : username , "discriminator" : zeroPad ( message . author . discriminator ) , "avatar" : avatar , "content" : nl2br ( message . content ) } ) ;
2017-08-22 08:57:30 +02:00
if ( replace == null ) {
$ ( "#chatcontent" ) . append ( rendered ) ;
handle _last _message _mention ( ) ;
2018-02-05 12:37:46 +01:00
$ ( "#chatcontent p:last-child" ) . attr ( "timestamp" , message . timestamp ) ;
2017-08-22 08:57:30 +02:00
$ ( "#chatcontent p:last-child" ) . find ( ".blockcode" ) . find ( "br" ) . remove ( ) ; // Remove excessive breaks in codeblocks
2017-09-23 19:38:14 +02:00
render _code _highlighting ( $ ( "#chatcontent p:last-child" ) . find ( ".blockcode" ) ) ;
2017-10-09 06:47:51 +02:00
$ ( "#chatcontent .chatusername" ) . last ( ) . click ( function ( ) {
var discordid = $ ( this ) . parent ( ) . attr ( "discord_userid" ) ;
if ( discordid ) {
2017-12-07 07:49:32 +01:00
openUserCard ( discordid ) ;
2017-10-09 06:47:51 +02:00
}
} ) ;
2017-11-01 07:31:44 +01:00
$ ( "#chatcontent p:last-child" ) . find ( ".channellink" ) . click ( function ( ) {
select _channel ( $ ( this ) . attr ( "channelid" ) , true ) ;
} ) ;
2018-08-19 04:55:31 +02:00
if ( message . type == 7 ) {
$ ( "#chatcontent p:last-child" ) . addClass ( "new-member" ) ;
}
2017-08-22 08:57:30 +02:00
} else {
replace . html ( $ ( rendered ) . html ( ) ) ;
replace . find ( ".blockcode" ) . find ( "br" ) . remove ( ) ;
2017-09-23 19:38:14 +02:00
render _code _highlighting ( replace . find ( ".blockcode" ) ) ;
2017-11-01 07:31:44 +01:00
replace . find ( ".channellink" ) . click ( function ( ) {
select _channel ( $ ( this ) . attr ( "channelid" ) , true ) ;
} ) ;
2017-08-22 08:57:30 +02:00
}
2017-11-05 06:59:06 +01:00
var embeds = parse _message _embeds ( message . embeds ) ;
$ ( "#discordmessage_" + message . id ) . parent ( ) . find ( "span.embeds" ) . text ( "" ) ;
for ( var j = 0 ; j < embeds . length ; j ++ ) {
$ ( "#discordmessage_" + message . id ) . parent ( ) . find ( "span.embeds" ) . append ( embeds [ j ] ) ;
}
2018-07-27 10:57:54 +02:00
var reactions = parse _message _reactions ( message . reactions ) ;
$ ( "#discordmessage_" + message . id ) . parent ( ) . find ( "span.reactions" ) . text ( "" ) ;
for ( var j = 0 ; j < reactions . length ; j ++ ) {
$ ( "#discordmessage_" + message . id ) . parent ( ) . find ( "span.reactions" ) . append ( reactions [ j ] ) ;
}
2017-09-15 08:25:03 +02:00
var usrcachekey = username + "#" + message . author . discriminator ;
2017-09-15 09:15:51 +02:00
if ( usrcachekey . startsWith ( "(Titan Dev) " ) ) {
usrcachekey = usrcachekey . substr ( 12 ) ;
}
2017-09-15 08:25:03 +02:00
if ( ! ( usrcachekey in message _users _cache ) ) {
message _users _cache [ usrcachekey ] = { "data" : { } , "msgs" : [ ] } ;
}
message _users _cache [ usrcachekey ] [ "msgs" ] . push ( message . id ) ;
2017-04-13 02:42:32 +02:00
last = message . id ;
}
2017-11-13 02:26:00 +01:00
if ( replace == null ) {
play _notification _sound ( "new" ) ;
2017-12-12 22:45:21 +01:00
}
if ( $ ( "#chatcontent p:last-child.mentioned" ) . length ) {
2017-11-13 02:26:00 +01:00
play _notification _sound ( "mention" ) ;
}
2018-08-08 04:05:06 +02:00
2017-10-07 17:20:27 +02:00
if ( replace == null && jumpscroll ) {
2017-10-29 03:00:21 +01:00
if ( ! has _handled _noscroll ) {
has _handled _noscroll = true ;
Materialize . toast ( 'Continue scrolling to read on...' , 5000 ) ;
} else {
2018-08-08 05:57:28 +02:00
if ( getParameterByName ( "scrollbartheme" ) ) {
if ( $ ( window ) . height ( ) < $ ( "main .mCSB_container" ) . height ( ) ) {
2019-01-02 01:10:22 +01:00
setIntervalX ( function ( ) {
$ ( "main .mCSB_container" ) . animate ( {
top : - 1 * ( $ ( "main .mCSB_container" ) . height ( ) - $ ( window ) . height ( ) )
} , "slow" , function ( ) {
$ ( "main" ) . mCustomScrollbar ( "update" ) ;
} ) ;
} , 1000 , 3 ) ;
2018-08-08 05:57:28 +02:00
}
} else {
2019-01-02 01:10:22 +01:00
setIntervalX ( function ( ) {
$ ( "main" ) . animate ( { scrollTop : $ ( "#chatcontent" ) . height ( ) } , "slow" ) ;
} , 1000 , 3 ) ;
2018-08-08 04:48:37 +02:00
}
2017-10-29 03:00:21 +01:00
}
2017-08-22 08:57:30 +02:00
}
2018-08-09 07:14:50 +02:00
$ ( "#chatcontent img" ) . on ( "load" , scroll _on _dom _update ) ;
2017-04-13 02:42:32 +02:00
$ ( '#chatcontent' ) . linkify ( {
target : "_blank"
2017-04-05 08:25:07 +02:00
} ) ;
2017-06-10 05:13:39 +02:00
$ ( '.tooltipped' ) . tooltip ( ) ;
2018-02-18 21:53:32 +01:00
$ ( '.materialboxed' ) . materialbox ( ) ;
2017-09-15 08:25:03 +02:00
process _message _users _cache ( ) ;
2017-04-13 02:42:32 +02:00
return last ;
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
function run _fetch _routine ( ) {
var channel _id = selected _channel ;
var fet ;
var jumpscroll ;
2018-07-22 06:10:04 +02:00
if ( channel _id == null ) {
return ;
}
2018-01-25 11:11:27 +01:00
$ ( "#message-spinner" ) . fadeIn ( ) ;
2017-04-13 02:42:32 +02:00
if ( last _message _id == null ) {
$ ( "#chatcontent" ) . empty ( ) ;
fet = fetch ( channel _id ) ;
jumpscroll = true ;
} else {
fet = fetch ( channel _id , last _message _id ) ;
2018-03-31 06:34:09 +02:00
jumpscroll = false ;
if ( last _message _id ) {
jumpscroll = element _in _view ( $ ( '#discordmessage_' + last _message _id ) . parent ( ) ) ;
}
2017-04-13 02:42:32 +02:00
}
fet . done ( function ( data ) {
2018-06-28 10:05:08 +02:00
socket _error _should _refetch = false ;
2017-04-13 02:42:32 +02:00
var status = data . status ;
2017-06-09 06:22:33 +02:00
if ( visitor _mode ) {
2017-08-10 04:05:05 +02:00
update _embed _userchip ( false , null , "Titan" , null , "0001" , null ) ;
2017-08-10 23:27:08 +02:00
update _change _username _modal ( ) ;
2017-06-09 06:22:33 +02:00
} else {
2017-08-10 04:05:05 +02:00
update _embed _userchip ( status . authenticated , status . avatar , status . username , status . nickname , status . user _id , status . discriminator ) ;
2017-08-10 23:27:08 +02:00
update _change _username _modal ( status . authenticated , status . username ) ;
2017-08-27 09:55:08 +02:00
current _user _discord _id = status . user _id ;
2017-06-09 06:22:33 +02:00
}
2017-04-13 02:42:32 +02:00
last _message _id = fill _discord _messages ( data . messages , jumpscroll ) ;
2017-06-09 06:22:33 +02:00
if ( ! visitor _mode && status . manage _embed ) {
2017-04-13 02:42:32 +02:00
$ ( "#administrate_link" ) . show ( ) ;
} else {
$ ( "#administrate_link" ) . hide ( ) ;
}
2017-08-20 21:56:54 +02:00
var guild = query _guild ( ) ;
guild . done ( function ( guildobj ) {
fill _channels ( guildobj . channels ) ;
fill _discord _members ( guildobj . discordmembers ) ;
fill _authenticated _users ( guildobj . embedmembers . authenticated ) ;
fill _unauthenticated _users ( guildobj . embedmembers . unauthenticated ) ;
} ) ;
2018-01-25 11:11:27 +01:00
$ ( "#message-spinner" ) . removeClass ( "error" ) ;
$ ( "#message-spinner" ) . fadeOut ( ) ;
2017-04-05 08:25:07 +02:00
} ) ;
2017-04-13 02:42:32 +02:00
fet . fail ( function ( data ) {
if ( data . status == 403 ) {
$ ( '#loginmodal' ) . modal ( 'open' ) ;
Materialize . toast ( 'Authentication error! You have been disconnected by the server.' , 10000 ) ;
} else if ( data . status == 401 ) {
$ ( '#loginmodal' ) . modal ( 'open' ) ;
Materialize . toast ( 'Session expired! You have been logged out.' , 10000 ) ;
2017-04-05 08:25:07 +02:00
}
2017-08-21 06:26:51 +02:00
setVisitorMode ( true ) ;
2018-01-25 11:11:27 +01:00
$ ( "#message-spinner" ) . addClass ( "error" ) ;
2017-04-13 02:42:32 +02:00
} ) ;
2017-04-05 08:25:07 +02:00
}
2017-09-15 08:25:03 +02:00
function process _message _users _cache ( ) {
var keys = Object . keys ( message _users _cache ) ;
for ( var i = 0 ; i < keys . length ; i ++ ) {
var key = keys [ i ] ;
var hashpos = key . lastIndexOf ( "#" ) ;
var name = key . substring ( 0 , hashpos ) ;
var discriminator = key . substring ( hashpos + 1 ) ;
if ( name . startsWith ( "(Titan Dev) " ) ) {
name = name . substring ( 12 ) ;
}
var key _helper = name + "#" + discriminator ;
if ( jQuery . isEmptyObject ( message _users _cache [ key _helper ] [ "data" ] ) ) {
if ( socket ) {
socket . emit ( "lookup_user_info" , { "guild_id" : guild _id , "name" : name , "discriminator" : discriminator } ) ;
}
} else {
process _message _users _cache _helper ( key _helper , message _users _cache [ key _helper ] [ "data" ] ) ;
}
}
}
function process _message _users _cache _helper ( key , usr ) {
var msgs = message _users _cache [ key ] [ "msgs" ] ;
while ( msgs . length > 0 ) {
var element = $ ( "#discordmessage_" + msgs . pop ( ) ) ;
var parent = element . parent ( ) ;
if ( usr . color ) {
parent . find ( ".chatusername" ) . css ( "color" , "#" + usr . color ) ;
} else {
parent . find ( ".chatusername" ) . css ( "color" , null ) ;
}
2018-02-18 23:50:24 +01:00
if ( usr . discordbotsorgvoted ) {
parent . find ( ".chatusername" ) . addClass ( "discordbotsorgvoted" ) ;
2017-12-08 02:43:01 +01:00
}
2017-09-24 06:17:06 +02:00
if ( usr . avatar _url ) {
parent . find ( ".authoravatar" ) . prop ( "src" , usr . avatar _url ) ;
}
2018-01-16 12:08:54 +01:00
if ( usr . roles ) {
parent . attr ( "discord_userroles" , usr . roles . join ( " " ) ) ;
}
2018-01-16 11:40:27 +01:00
parent . attr ( "discord_userid" , usr . id ) ;
2017-09-15 08:25:03 +02:00
}
2017-10-20 09:05:18 +02:00
collapse _messages ( ) ;
2017-09-15 08:25:03 +02:00
}
2017-10-20 08:50:48 +02:00
function collapse _messages ( ) {
var allMessages = $ ( '[id^="discordmessage_"]' ) . parent ( ) ;
for ( var i = 1 ; i < allMessages . length ; i ++ ) {
var last = $ ( allMessages [ i - 1 ] ) ;
var current = $ ( allMessages [ i ] ) ;
2018-08-19 04:55:31 +02:00
if ( ! last . hasClass ( "new-member" ) && last . attr ( "discord_userid" ) == current . attr ( "discord_userid" ) && current . attr ( "discord_userid" ) && moment ( current . attr ( "timestamp" ) ) . isSame ( moment ( last . attr ( "timestamp" ) ) , "hour" ) ) {
2017-10-20 08:50:48 +02:00
current . addClass ( "collapsed" ) ;
} else {
current . removeClass ( "collapsed" ) ;
}
}
}
2017-04-14 08:10:13 +02:00
2017-12-14 06:22:06 +01:00
function update _embed _userchip ( authenticated , avatar , username , nickname , userid , discrim ) {
if ( discrim === undefined ) {
discrim = null ;
}
2017-04-13 02:42:32 +02:00
if ( authenticated ) {
$ ( "#currentuserimage" ) . attr ( "src" , avatar ) ;
2017-05-24 06:42:01 +02:00
$ ( "#curuser_name" ) . text ( username ) ;
$ ( "#curuser_discrim" ) . text ( "#" + discrim ) ;
2017-08-10 04:05:05 +02:00
current _username _discrim = "#" + discrim ;
2017-04-13 02:42:32 +02:00
} else {
2018-08-12 07:45:03 +02:00
$ ( "#currentuserimage" ) . attr ( "src" , global _guest _icon ) ;
2017-05-24 06:42:01 +02:00
$ ( "#curuser_name" ) . text ( username ) ;
$ ( "#curuser_discrim" ) . text ( "#" + userid ) ;
2017-08-10 04:05:05 +02:00
current _username _discrim = "#" + userid ;
}
if ( nickname ) {
$ ( "#curuser_name" ) . text ( nickname ) ;
current _username _discrim = nickname + current _username _discrim ;
} else {
current _username _discrim = username + current _username _discrim ;
2017-04-13 02:42:32 +02:00
}
}
2017-08-10 23:27:08 +02:00
2017-12-14 06:22:06 +01:00
function update _change _username _modal ( authenticated , username ) {
if ( authenticated === undefined ) {
authenticated = null ;
}
if ( username === undefined ) {
username = null ;
}
2017-08-10 23:27:08 +02:00
if ( ! $ ( "#change_username_field" ) || $ ( "#change_username_field" ) . is ( ":focus" ) ) {
return ;
}
if ( authenticated || visitor _mode ) {
$ ( "#change_username_field" ) . attr ( "disabled" , true ) ;
$ ( "#change_username_field" ) . val ( "" ) ;
} else {
$ ( "#change_username_field" ) . attr ( "disabled" , false ) ;
$ ( "#change_username_field" ) . val ( username ) ;
}
}
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
$ ( "#discordlogin_btn" ) . click ( function ( ) {
lock _login _fields ( ) ;
wait _for _discord _login ( ) ;
} ) ;
2017-09-21 09:12:49 +02:00
2017-04-13 02:42:32 +02:00
$ ( "#custom_username_field" ) . keyup ( function ( event ) {
if ( event . keyCode == 13 ) {
2018-08-06 05:59:36 +02:00
do _guest _login ( ) ;
2017-04-13 02:42:32 +02:00
}
} ) ;
2018-08-06 05:59:36 +02:00
$ ( "#guestlogin_btn" ) . click ( function ( ) {
do _guest _login ( ) ;
} ) ;
function do _guest _login ( ) {
if ( ! ( new RegExp ( /^[a-z\d\-_\s]+$/i ) . test ( $ ( "#custom_username_field" ) . val ( ) ) ) ) {
Materialize . toast ( 'Illegal username provided! Only alphanumeric, spaces, dashes, and underscores allowed in usernames.' , 10000 ) ;
return ;
}
if ( $ ( "#custom_username_field" ) . val ( ) . length >= 2 && $ ( "#custom_username_field" ) . val ( ) . length <= 32 ) {
$ ( "#custom_username_field" ) . blur ( ) ;
if ( unauth _captcha _enabled ) {
$ ( '#recaptchamodal' ) . modal ( 'open' ) ;
} else {
submit _unauthenticated _captcha ( ) ;
}
}
}
2017-09-21 09:12:49 +02:00
$ ( "#submit-unauthenticated-captcha-btn" ) . click ( function ( ) {
lock _login _fields ( ) ;
2018-08-06 06:16:53 +02:00
var usr = create _unauthenticated _user ( $ ( "#custom_username_field" ) . val ( ) , grecaptcha . getResponse ( ) ) ;
2017-09-21 09:12:49 +02:00
usr . done ( function ( data ) {
grecaptcha . reset ( ) ;
setVisitorMode ( false ) ;
initialize _embed ( ) ;
} ) ;
usr . fail ( function ( data ) {
if ( data . status == 429 ) {
Materialize . toast ( 'Sorry! You are allowed to log in as a guest three times in a span of 30 minutes.' , 10000 ) ;
} else if ( data . status == 403 ) {
Materialize . toast ( 'Authentication error! You have been banned.' , 10000 ) ;
} else if ( data . status == 406 ) {
Materialize . toast ( 'Illegal username provided! Only alphanumeric, spaces, dashes, and underscores allowed in usernames.' , 10000 ) ;
} else if ( data . status == 412 ) {
Materialize . toast ( "reCAPTCHA reponse has failed. Try again?" , 10000 ) ;
}
unlock _login _fields ( ) ;
setVisitorMode ( true ) ;
} ) ;
} ) ;
2017-08-10 23:27:08 +02:00
$ ( "#change_username_field" ) . keyup ( function ( event ) {
if ( event . keyCode == 13 ) {
$ ( this ) . blur ( ) ;
if ( ! ( new RegExp ( /^[a-z\d\-_\s]+$/i ) . test ( $ ( this ) . val ( ) ) ) ) {
Materialize . toast ( 'Illegal username provided! Only alphanumeric, spaces, dashes, and underscores allowed in usernames.' , 10000 ) ;
return ;
}
if ( ( $ ( this ) . val ( ) . length >= 2 && $ ( this ) . val ( ) . length <= 32 ) && $ ( "#curuser_name" ) . text ( ) != $ ( this ) . val ( ) ) {
var usr = change _unauthenticated _username ( $ ( this ) . val ( ) ) ;
usr . done ( function ( data ) {
Materialize . toast ( 'Username changed successfully!' , 10000 ) ;
2017-08-25 09:45:59 +02:00
if ( socket ) {
run _fetch _routine ( ) ;
socket . disconnect ( ) ;
2017-09-02 06:06:15 +02:00
socket = null ;
2017-08-25 09:45:59 +02:00
}
2017-09-02 06:06:15 +02:00
initiate _websockets ( ) ;
2017-08-10 23:27:08 +02:00
} ) ;
usr . fail ( function ( data ) {
if ( data . status == 429 ) {
2017-09-20 09:07:55 +02:00
Materialize . toast ( 'Sorry! You are allowed to change your username once every 10 minutes.' , 10000 ) ;
2017-08-10 23:27:08 +02:00
} else if ( data . status == 403 ) {
Materialize . toast ( 'Authentication error! You have been banned.' , 10000 ) ;
} else if ( data . status == 406 ) {
Materialize . toast ( 'Illegal username provided! Only alphanumeric, spaces, dashes, and underscores allowed in usernames.' , 10000 ) ;
} else {
Materialize . toast ( 'Something unexpected happened! Error code of ' + data . status , 10000 ) ;
}
} ) ;
}
}
} ) ;
2017-09-01 09:28:44 +02:00
2018-03-19 20:41:24 +01:00
function stringToDefaultEmote ( input ) {
var map = {
"<3" : "\u2764\uFE0F" ,
"</3" : "\uD83D\uDC94" ,
":D" : "\uD83D\uDE00" ,
":)" : "\uD83D\uDE03" ,
";)" : "\uD83D\uDE09" ,
":(" : "\uD83D\uDE12" ,
":p" : "\uD83D\uDE1B" ,
";p" : "\uD83D\uDE1C" ,
":'(" : "\uD83D\uDE22"
} ;
for ( var i in map ) {
var escaped = i . replace ( /([()[{*+.$^\\|?])/g , '\\$1' ) ;
2019-03-30 21:55:49 +01:00
escaped = "(\\s|^)(" + escaped + ")(\\s|$)" ;
2018-03-19 20:41:24 +01:00
var regex = new RegExp ( escaped , 'gim' ) ;
2019-03-30 21:55:49 +01:00
input = input . replace ( regex , "$1" + map [ i ] + "$3" ) ;
2018-03-19 20:41:24 +01:00
}
return input ;
}
2018-03-19 07:09:58 +01:00
$ ( "#chatcontent" ) . bind ( "click" , function ( ) {
$ ( "#mention-picker" ) . hide ( ) ;
2018-03-21 18:10:53 +01:00
wdtEmojiBundle . close ( ) ;
} ) ;
$ ( "#messagebox" ) . bind ( "click" , function ( ) {
wdtEmojiBundle . close ( ) ;
2018-03-19 07:09:58 +01:00
} ) ;
$ ( '#messagebox' ) . bind ( 'input keydown click' , function ( event ) {
if ( event . type == "keydown" && ( event . which == 38 || event . which == 40 || event . which == 13 ) && $ ( "#mention-picker" ) . is ( ":visible" ) ) {
return ;
}
var cursorAt = $ ( this ) . caret ( ) ;
var input = $ ( this ) . val ( ) . substr ( 0 , cursorAt ) ;
var lastWord = input . match ( /@\w+$/ ) ;
if ( lastWord == null ) {
$ ( "#mention-picker" ) . hide ( ) ;
return ;
}
lastWord = lastWord [ 0 ] ;
if ( lastWord . charAt ( 0 ) != "@" ) {
$ ( "#mention-picker" ) . hide ( ) ;
return ;
}
lastWord = lastWord . substr ( 1 ) ;
2018-08-20 21:43:12 +02:00
if ( all _users . length == 0 ) {
var usrs = list _users ( ) ;
usrs . done ( function ( lst ) {
all _users = lst ;
} ) ;
}
2018-03-19 07:09:58 +01:00
var template = $ ( '#mustache_usermentionchoices' ) . html ( ) ;
Mustache . parse ( template ) ;
var users = [ ] ;
2018-03-19 20:04:51 +01:00
for ( var i = 0 ; i < all _users . length ; i ++ ) {
var usr = all _users [ i ] ;
if ( usr . username . toLowerCase ( ) . indexOf ( lastWord . toLowerCase ( ) ) > - 1 || ( usr . nickname && usr . nickname . toLowerCase ( ) . indexOf ( lastWord . toLowerCase ( ) ) > - 1 ) ) {
2018-03-19 07:09:58 +01:00
var displayname = usr . username ;
2018-03-19 20:21:48 +01:00
if ( usr . nickname ) {
2018-03-19 20:04:51 +01:00
displayname = usr . nickname ;
2018-03-19 07:09:58 +01:00
}
users . push ( {
id : usr . id ,
avatar : usr . avatar _url ,
username : usr . username ,
discriminator : usr . discriminator ,
displayname : displayname
} ) ;
}
}
if ( users . length == 0 ) {
$ ( "#mention-picker" ) . hide ( ) ;
return ;
}
$ ( "#mention-picker" ) . show ( ) ;
$ ( "#mention-picker-content" ) . html ( "" ) ;
for ( var i = 0 ; i < users . length ; i ++ ) {
var usr = users [ i ] ;
var rendered = $ ( Mustache . render ( template , usr ) ) ;
rendered . hover ( function ( ) {
$ ( "#mention-picker .mention-choice.selected" ) . removeClass ( "selected" ) ;
$ ( this ) . addClass ( "selected" ) ;
} ) ;
rendered . click ( function ( ) {
var usrid = $ ( this ) . attr ( "discorduserid" ) ;
var val = $ ( "#messagebox" ) . val ( ) . replace ( "@" + lastWord , "[@" + usrid + "] " ) ;
$ ( "#messagebox" ) . val ( val ) ;
$ ( "#mention-picker" ) . hide ( ) ;
$ ( "#messagebox" ) . focus ( ) ;
} ) ;
$ ( "#mention-picker-content" ) . append ( rendered ) ;
}
$ ( "#mention-picker .mention-choice.selected" ) . removeClass ( "selected" ) ;
$ ( "#mention-picker .mention-choice" ) . first ( ) . addClass ( "selected" ) ;
} ) ;
2017-09-01 09:28:44 +02:00
$ ( "#messagebox" ) . keyup ( function ( event ) {
if ( event . keyCode == 16 ) {
shift _pressed = false ;
}
} ) ;
2017-04-14 08:10:13 +02:00
2017-09-01 09:28:44 +02:00
$ ( "#messagebox" ) . keydown ( function ( event ) {
2018-03-19 07:09:58 +01:00
if ( $ ( "#mention-picker" ) . is ( ":visible" ) ) {
if ( ( event . which == 38 || event . which == 40 ) ) {
event . preventDefault ( ) ;
var choices = $ ( "#mention-picker .mention-choice" ) ;
var selected = $ ( "#mention-picker .mention-choice.selected" ) ;
var index = choices . index ( selected ) ;
selected . removeClass ( "selected" ) ;
if ( event . which == 40 ) {
if ( index == choices . length - 1 ) {
$ ( choices . get ( 0 ) ) . addClass ( "selected" ) ;
} else {
$ ( choices . get ( index + 1 ) ) . addClass ( "selected" ) ;
}
} else {
if ( index == 0 ) {
$ ( choices . get ( choices . length - 1 ) ) . addClass ( "selected" ) ;
} else {
$ ( choices . get ( index - 1 ) ) . addClass ( "selected" ) ;
}
}
2018-03-19 09:53:02 +01:00
$ ( "#mention-picker .mention-choice.selected" ) [ 0 ] . scrollIntoView ( { behavior : "instant" , block : "center" , inline : "center" } ) ;
2018-03-19 07:09:58 +01:00
return ;
}
if ( event . which == 13 ) {
event . preventDefault ( ) ;
$ ( "#mention-picker .mention-choice.selected" ) . click ( ) ;
return ;
}
if ( event . which == 27 ) {
$ ( "#mention-picker" ) . hide ( ) ;
}
}
2017-04-13 02:42:32 +02:00
if ( $ ( this ) . val ( ) . length == 1 ) {
$ ( this ) . val ( $ . trim ( $ ( this ) . val ( ) ) ) ;
}
2017-09-01 09:28:44 +02:00
if ( event . keyCode == 16 ) {
shift _pressed = true ;
}
2018-08-17 05:12:21 +02:00
if ( event . keyCode == 13 && ! shift _pressed && ( $ ( this ) . val ( ) . length >= 1 || $ ( "#fileinput" ) . val ( ) . length >= 1 ) ) {
2017-04-13 02:42:32 +02:00
$ ( this ) . val ( $ . trim ( $ ( this ) . val ( ) ) ) ;
$ ( this ) . blur ( ) ;
2018-08-17 05:12:21 +02:00
$ ( "#messagebox-filemodal" ) . attr ( 'readonly' , true ) ;
$ ( "#proceed_fileupload_btn" ) . attr ( "disabled" , true ) ;
2017-04-13 02:42:32 +02:00
$ ( "#messagebox" ) . attr ( 'readonly' , true ) ;
2019-02-25 18:59:58 +01:00
$ ( "#send-msg-btn" ) . attr ( "disabled" , true ) ;
2018-03-16 04:31:25 +01:00
var emojiConvertor = new EmojiConvertor ( ) ;
emojiConvertor . init _env ( ) ;
emojiConvertor . replace _mode = "unified" ;
emojiConvertor . allow _native = true ;
var messageInput = emojiConvertor . replace _colons ( $ ( this ) . val ( ) ) ;
2018-03-19 20:41:24 +01:00
messageInput = stringToDefaultEmote ( messageInput ) ;
2018-08-17 05:12:21 +02:00
var file = null ;
if ( $ ( "#fileinput" ) [ 0 ] . files . length > 0 ) {
file = $ ( "#fileinput" ) [ 0 ] . files [ 0 ] ;
}
$ ( "#filemodalprogress" ) . show ( ) ;
var funct = post ( selected _channel , messageInput , file ) ;
2017-04-13 02:42:32 +02:00
funct . done ( function ( data ) {
$ ( "#messagebox" ) . val ( "" ) ;
2018-08-17 05:12:21 +02:00
$ ( "#messagebox-filemodal" ) . val ( "" ) ;
$ ( "#fileinput" ) . val ( "" ) ;
$ ( "#filemodal" ) . modal ( "close" ) ;
2017-04-13 02:42:32 +02:00
} ) ;
funct . fail ( function ( data ) {
Materialize . toast ( 'Failed to send message.' , 10000 ) ;
2017-05-13 18:19:19 +02:00
if ( data . responseJSON ) {
for ( var i = 0 ; i < data . responseJSON . illegal _reasons . length ; i ++ ) {
Materialize . toast ( data . responseJSON . illegal _reasons [ i ] , 10000 ) ;
}
2017-05-09 03:39:22 +02:00
}
2017-04-13 02:42:32 +02:00
} ) ;
funct . catch ( function ( data ) {
if ( data . status == 429 ) {
2018-03-25 06:43:39 +02:00
Materialize . toast ( 'You are sending messages too fast! 1 message per ' + post _timeout + ' seconds' , 10000 ) ;
2018-08-17 05:58:08 +02:00
} else if ( data . status == 413 ) {
Materialize . toast ( 'Your file is too powerful! The maximum file size is 4 megabytes.' , 5000 ) ;
2017-04-13 02:42:32 +02:00
}
} ) ;
funct . always ( function ( ) {
$ ( "#messagebox" ) . attr ( 'readonly' , false ) ;
2018-08-17 05:12:21 +02:00
$ ( "#messagebox-filemodal" ) . attr ( 'readonly' , false ) ;
$ ( "#proceed_fileupload_btn" ) . attr ( "disabled" , false ) ;
2018-08-17 06:02:47 +02:00
$ ( "#filemodalprogress" ) . hide ( ) ;
2019-02-25 18:59:58 +01:00
$ ( "#send-msg-btn" ) . attr ( "disabled" , false ) ;
2018-08-17 05:12:21 +02:00
if ( $ ( "#filemodal" ) . is ( ":visible" ) ) {
$ ( "#messagebox-filemodal" ) . focus ( ) ;
} else {
$ ( "#messagebox" ) . focus ( ) ;
}
2017-04-13 02:42:32 +02:00
} ) ;
}
} ) ;
2018-08-17 05:12:21 +02:00
$ ( "#messagebox-filemodal" ) . keyup ( function ( event ) {
if ( event . keyCode == 16 ) {
shift _pressed = false ;
}
} ) ;
$ ( "#messagebox-filemodal" ) . keydown ( function ( event ) {
if ( $ ( this ) . val ( ) . length == 1 ) {
$ ( this ) . val ( $ . trim ( $ ( this ) . val ( ) ) ) ;
}
if ( event . keyCode == 16 ) {
shift _pressed = true ;
}
if ( event . keyCode == 13 && ! shift _pressed ) {
$ ( this ) . val ( $ . trim ( $ ( this ) . val ( ) ) ) ;
$ ( this ) . blur ( ) ;
$ ( "#messagebox" ) . val ( $ ( this ) . val ( ) ) ;
$ ( "#messagebox" ) . trigger ( jQuery . Event ( "keydown" , { keyCode : 13 } ) ) ;
}
} ) ;
2019-02-25 18:59:58 +01:00
$ ( "#send-msg-btn" ) . click ( function ( ) {
$ ( "#messagebox" ) . focus ( ) ;
$ ( "#messagebox" ) . trigger ( jQuery . Event ( "keydown" , { keyCode : 13 } ) ) ;
} ) ;
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
$ ( '#guild-btn' ) . sideNav ( {
menuWidth : 300 , // Default is 300
edge : 'left' , // Choose the horizontal origin
closeOnClick : true , // Closes side-nav on <a> clicks, useful for Angular/Meteor
draggable : true // Choose whether you can drag to open on touch screens
}
) ;
2017-04-14 08:10:13 +02:00
2017-04-13 02:42:32 +02:00
$ ( '#members-btn' ) . sideNav ( {
menuWidth : 300 , // Default is 300
edge : 'right' , // Choose the horizontal origin
draggable : true // Choose whether you can drag to open on touch screens
}
) ;
2017-06-15 21:58:15 +02:00
// enter konami code into the embed page for some ponies action!
cheet ( '↑ ↑ ↓ ↓ ← → ← → b a' , function ( ) {
// basically copied and pasted of browser ponies bookmarklet
( function ( srcs , cfg ) { var cbcount = 1 ; var callback = function ( ) { -- cbcount ; if ( cbcount === 0 ) { BrowserPonies . setBaseUrl ( cfg . baseurl ) ; if ( ! BrowserPoniesBaseConfig . loaded ) { BrowserPonies . loadConfig ( BrowserPoniesBaseConfig ) ; BrowserPoniesBaseConfig . loaded = true ; } BrowserPonies . loadConfig ( cfg ) ; if ( ! BrowserPonies . running ( ) ) BrowserPonies . start ( ) ; } } ; if ( typeof ( BrowserPoniesConfig ) === "undefined" ) { window . BrowserPoniesConfig = { } ; } if ( typeof ( BrowserPoniesBaseConfig ) === "undefined" ) { ++ cbcount ; BrowserPoniesConfig . onbasecfg = callback ; } if ( typeof ( BrowserPonies ) === "undefined" ) { ++ cbcount ; BrowserPoniesConfig . oninit = callback ; } var node = ( document . body || document . documentElement || document . getElementsByTagName ( 'head' ) [ 0 ] ) ; for ( var id in srcs ) { if ( document . getElementById ( id ) ) continue ; if ( node ) { var s = document . createElement ( 'script' ) ; s . type = 'text/javascript' ; s . id = id ; s . src = srcs [ id ] ; node . appendChild ( s ) ; } else { document . write ( '\u003cscript type="text/javscript" src="' + srcs [ id ] + '" id="' + id + '"\u003e\u003c/script\u003e' ) ; } } callback ( ) ; } ) ( { "browser-ponies-script" : "https://panzi.github.io/Browser-Ponies/browserponies.js" , "browser-ponies-config" : "https://panzi.github.io/Browser-Ponies/basecfg.js" } , { "baseurl" : "https://panzi.github.io/Browser-Ponies/" , "fadeDuration" : 500 , "volume" : 1 , "fps" : 25 , "speed" : 3 , "audioEnabled" : false , "showFps" : false , "showLoadProgress" : true , "speakProbability" : 0.1 , "spawn" : { "applejack" : 1 , "fluttershy" : 1 , "pinkie pie" : 1 , "rainbow dash" : 1 , "rarity" : 1 , "twilight sparkle" : 1 } } ) ;
} ) ;
2017-08-20 21:56:54 +02:00
function initiate _websockets ( ) {
2018-11-06 05:33:18 +01:00
if ( socket || ! shouldUtilizeGateway ) {
2017-08-21 06:26:51 +02:00
return ;
}
socket = io . connect ( location . protocol + '//' + document . domain + ':' + location . port + "/gateway" , { path : '/gateway' , transports : [ 'websocket' ] } ) ;
socket . on ( 'connect' , function ( ) {
2017-08-22 08:57:30 +02:00
socket . emit ( 'identify' , { "guild_id" : guild _id , "visitor_mode" : visitor _mode } ) ;
2017-09-15 08:25:03 +02:00
process _message _users _cache ( ) ;
2017-08-20 21:56:54 +02:00
} ) ;
2017-08-21 06:26:51 +02:00
socket . on ( "disconnect" , function ( ) {
2017-09-02 06:06:15 +02:00
2017-08-21 06:26:51 +02:00
} ) ;
socket . on ( "revoke" , function ( ) {
2017-09-02 06:06:15 +02:00
socket . disconnect ( ) ;
socket = null ;
2017-08-21 06:26:51 +02:00
$ ( '#loginmodal' ) . modal ( 'open' ) ;
primeEmbed ( ) ;
Materialize . toast ( 'Authentication error! You have been disconnected by the server.' , 10000 ) ;
} ) ;
2017-08-22 08:57:30 +02:00
socket . on ( "embed_user_connect" , function ( msg ) {
if ( msg . unauthenticated ) {
for ( var i = 0 ; i < unauthenticated _users _list . length ; i ++ ) {
var item = unauthenticated _users _list [ i ] ;
if ( item . username == msg . username && item . discriminator == msg . discriminator ) {
return ;
}
}
unauthenticated _users _list . push ( msg ) ;
fill _unauthenticated _users ( unauthenticated _users _list ) ;
} else {
for ( var i = 0 ; i < authenticated _users _list . length ; i ++ ) {
var item = authenticated _users _list [ i ] ;
if ( item . id == msg . id ) {
return ;
}
}
authenticated _users _list . push ( msg ) ;
fill _authenticated _users ( authenticated _users _list ) ;
}
} ) ;
socket . on ( "embed_user_disconnect" , function ( msg ) {
if ( msg . unauthenticated ) {
for ( var i = 0 ; i < unauthenticated _users _list . length ; i ++ ) {
var item = unauthenticated _users _list [ i ] ;
if ( item . username == msg . username && item . discriminator == msg . discriminator ) {
unauthenticated _users _list . splice ( i , 1 ) ;
fill _unauthenticated _users ( unauthenticated _users _list ) ;
return ;
}
}
} else {
for ( var i = 0 ; i < authenticated _users _list . length ; i ++ ) {
var item = authenticated _users _list [ i ] ;
if ( item . id == msg . id ) {
authenticated _users _list . splice ( i , 1 ) ;
fill _authenticated _users ( authenticated _users _list ) ;
return ;
}
}
}
} ) ;
2017-08-21 06:26:51 +02:00
socket . on ( "MESSAGE_CREATE" , function ( msg ) {
var thismsgchan = msg . channel _id ;
if ( selected _channel != thismsgchan ) {
return ;
}
2018-03-31 06:34:09 +02:00
var jumpscroll = false ;
if ( last _message _id ) {
jumpscroll = element _in _view ( $ ( '#discordmessage_' + last _message _id ) . parent ( ) ) ;
}
2017-08-21 06:26:51 +02:00
last _message _id = fill _discord _messages ( [ msg ] , jumpscroll ) ;
2017-08-20 21:56:54 +02:00
} ) ;
2017-08-22 08:57:30 +02:00
socket . on ( "MESSAGE_DELETE" , function ( msg ) {
var msgchan = msg . channel _id ;
if ( selected _channel != msgchan ) {
return ;
}
$ ( "#discordmessage_" + msg . id ) . parent ( ) . remove ( ) ;
2018-03-31 06:48:48 +02:00
var lastelem = $ ( "#chatcontent" ) . find ( "[id^=discordmessage_]" ) ;
if ( lastelem . length ) {
last _message _id = lastelem . last ( ) . attr ( 'id' ) . substring ( 15 ) ;
2018-03-31 06:34:09 +02:00
} else {
2018-03-31 06:48:48 +02:00
last _message _id = null ;
2018-03-31 06:34:09 +02:00
}
2017-08-22 08:57:30 +02:00
} ) ;
socket . on ( "MESSAGE_UPDATE" , function ( msg ) {
var msgelem = $ ( "#discordmessage_" + msg . id ) ;
if ( msgelem . length == 0 ) {
return ;
}
var msgelem _parent = msgelem . parent ( ) ;
fill _discord _messages ( [ msg ] , false , msgelem _parent ) ;
2018-07-27 10:57:54 +02:00
} ) ;
socket . on ( "MESSAGE_REACTION_ADD" , function ( msg ) {
var msgelem = $ ( "#discordmessage_" + msg . id ) ;
if ( msgelem . length == 0 ) {
return ;
}
var msgelem _parent = msgelem . parent ( ) ;
fill _discord _messages ( [ msg ] , false , msgelem _parent ) ;
} ) ;
socket . on ( "MESSAGE_REACTION_REMOVE" , function ( msg ) {
var msgelem = $ ( "#discordmessage_" + msg . id ) ;
if ( msgelem . length == 0 ) {
return ;
}
var msgelem _parent = msgelem . parent ( ) ;
fill _discord _messages ( [ msg ] , false , msgelem _parent ) ;
} ) ;
socket . on ( "MESSAGE_REACTION_REMOVE_ALL" , function ( msg ) {
var msgelem = $ ( "#discordmessage_" + msg . id ) ;
if ( msgelem . length == 0 ) {
return ;
}
var msgelem _parent = msgelem . parent ( ) ;
fill _discord _messages ( [ msg ] , false , msgelem _parent ) ;
2017-08-22 08:57:30 +02:00
} ) ;
socket . on ( "GUILD_MEMBER_ADD" , function ( usr ) {
if ( usr . status != "offline" ) {
discord _users _list . push ( usr ) ;
fill _discord _members ( discord _users _list ) ;
}
2018-08-20 21:43:12 +02:00
if ( all _users . length == 0 ) {
return ;
}
2018-03-19 20:04:51 +01:00
all _users . push ( {
"id" : usr . id ,
"avatar" : usr . avatar ,
2018-03-19 20:08:47 +01:00
"avatar_url" : generate _avatar _url ( usr . id , usr . avatar ) ,
2018-03-19 20:04:51 +01:00
"username" : usr . username ,
"nickname" : usr . nickname ,
"discriminator" : usr . discriminator
} ) ;
2017-08-22 08:57:30 +02:00
} ) ;
socket . on ( "GUILD_MEMBER_UPDATE" , function ( usr ) {
2017-08-27 09:55:08 +02:00
if ( usr . id == current _user _discord _id ) {
update _socket _channels ( ) ;
socket . emit ( "current_user_info" , { "guild_id" : guild _id } ) ;
}
2018-03-19 20:04:51 +01:00
var updatedUser = false ;
for ( var i = 0 ; i < all _users . length ; i ++ ) {
if ( usr . id == all _users [ i ] . id ) {
var u = all _users [ i ] ;
u . avatar = usr . avatar ;
2018-03-19 20:08:47 +01:00
u . avatar _url = generate _avatar _url ( usr . id , usr . avatar ) ;
2018-03-19 20:04:51 +01:00
u . username = usr . username ;
u . nickname = usr . nickname ;
u . discriminator = usr . discriminator ;
updatedUser = true ;
break ;
}
}
2017-08-22 08:57:30 +02:00
for ( var i = 0 ; i < discord _users _list . length ; i ++ ) {
if ( usr . id == discord _users _list [ i ] . id ) {
2017-08-22 09:53:41 +02:00
discord _users _list . splice ( i , 1 ) ;
if ( usr . status != "offline" ) {
discord _users _list . push ( usr ) ;
2017-08-22 08:57:30 +02:00
}
2017-08-22 09:53:41 +02:00
fill _discord _members ( discord _users _list ) ;
return ;
2017-08-22 08:57:30 +02:00
}
}
discord _users _list . push ( usr ) ;
fill _discord _members ( discord _users _list ) ;
2018-03-19 20:04:51 +01:00
if ( ! updatedUser ) {
all _users . push ( {
"id" : usr . id ,
"avatar" : usr . avatar ,
2018-03-19 20:08:47 +01:00
"avatar_url" : generate _avatar _url ( usr . id , usr . avatar ) ,
2018-03-19 20:04:51 +01:00
"username" : usr . username ,
"nickname" : usr . nickname ,
"discriminator" : usr . discriminator
} ) ;
}
2017-08-22 08:57:30 +02:00
} ) ;
socket . on ( "GUILD_MEMBER_REMOVE" , function ( usr ) {
2018-03-19 20:04:51 +01:00
for ( var i = 0 ; i < all _users . length ; i ++ ) {
if ( usr . id == all _users [ i ] . id ) {
all _users . splice ( i , 1 ) ;
break ;
}
}
2017-08-22 08:57:30 +02:00
for ( var i = 0 ; i < discord _users _list . length ; i ++ ) {
if ( usr . id == discord _users _list [ i ] . id ) {
discord _users _list . splice ( i , 1 ) ;
fill _discord _members ( discord _users _list ) ;
2018-03-19 20:04:51 +01:00
break ;
2017-08-22 08:57:30 +02:00
}
}
} ) ;
2017-08-22 09:53:41 +02:00
socket . on ( "GUILD_EMOJIS_UPDATE" , function ( emo ) {
emoji _store = emo ;
2018-03-16 04:31:25 +01:00
update _emoji _picker ( ) ;
2017-08-22 09:53:41 +02:00
} ) ;
2017-08-25 08:37:14 +02:00
2017-08-27 10:04:50 +02:00
socket . on ( "GUILD_UPDATE" , function ( guil ) {
$ ( "#guild_name" ) . text ( guil . name ) ;
if ( guil . icon ) {
$ ( "#guild_icon" ) . attr ( "src" , guil . icon _url ) ;
$ ( "#guild_icon" ) . show ( ) ;
} else {
$ ( "#guild_icon" ) . hide ( ) ;
}
} ) ;
2017-08-25 08:37:14 +02:00
socket . on ( "CHANNEL_DELETE" , function ( chan ) {
for ( var i = 0 ; i < guild _channels _list . length ; i ++ ) {
var thatchannel = guild _channels _list [ i ] ;
if ( thatchannel . channel . id == chan . id ) {
guild _channels _list . splice ( i , 1 ) ;
fill _channels ( guild _channels _list ) ;
return ;
}
}
} ) ;
socket . on ( "CHANNEL_UPDATE" , function ( chan ) {
update _socket _channels ( ) ;
} ) ;
socket . on ( "CHANNEL_CREATE" , function ( chan ) {
update _socket _channels ( ) ;
} ) ;
2018-03-04 07:29:16 +01:00
socket . on ( "GUILD_ROLE_CREATE" , function ( role ) {
2017-08-25 08:37:14 +02:00
update _socket _channels ( ) ;
2018-03-04 07:29:16 +01:00
guild _roles _list . push ( role ) ;
2017-08-25 08:37:14 +02:00
} ) ;
2018-03-04 07:29:16 +01:00
socket . on ( "GUILD_ROLE_UPDATE" , function ( role ) {
2017-08-25 08:37:14 +02:00
update _socket _channels ( ) ;
2018-03-04 07:29:16 +01:00
for ( var i = 0 ; i < guild _roles _list . length ; i ++ ) {
if ( guild _roles _list [ i ] . id == role . id ) {
guild _roles _list . splice ( i , 1 ) ;
guild _roles _list . push ( role ) ;
return ;
}
}
} ) ;
socket . on ( "GUILD_ROLE_DELETE" , function ( role ) {
update _socket _channels ( ) ;
for ( var i = 0 ; i < guild _roles _list . length ; i ++ ) {
if ( guild _roles _list [ i ] . id == role . id ) {
guild _roles _list . splice ( i , 1 ) ;
return ;
}
}
2017-08-25 08:37:14 +02:00
} ) ;
socket . on ( "channel_list" , function ( chans ) {
fill _channels ( chans ) ;
for ( var i = 0 ; i < chans . length ; i ++ ) {
var thischan = chans [ i ] ;
if ( thischan . channel . id == selected _channel ) {
$ ( "#channeltopic" ) . text ( thischan . channel . topic ) ;
}
}
} ) ;
2017-08-26 01:19:13 +02:00
socket . on ( "current_user_info" , function ( usr ) {
update _embed _userchip ( true , usr . avatar , usr . username , usr . nickname , usr . userid , usr . discriminator ) ;
} ) ;
2017-09-15 08:25:03 +02:00
socket . on ( "lookup_user_info" , function ( usr ) {
var key = usr . name + "#" + usr . discriminator ;
var cache = message _users _cache [ key ] ;
if ( ! cache ) {
return ;
}
cache [ "data" ] = usr ;
process _message _users _cache _helper ( key , usr ) ;
} ) ;
2017-09-24 06:17:06 +02:00
socket . on ( "guest_icon_change" , function ( icon ) {
global _guest _icon = icon . guest _icon ;
} ) ;
2018-06-28 10:05:08 +02:00
socket . on ( "ack" , function ( ) {
socket _last _ack = moment ( ) ;
if ( socket && socket _error _should _refetch ) {
run _fetch _routine ( ) ;
}
} ) ;
2017-08-20 21:56:54 +02:00
}
2017-08-21 06:26:51 +02:00
2017-08-25 08:37:14 +02:00
function update _socket _channels ( ) {
2017-08-21 06:26:51 +02:00
if ( ! socket ) {
return ;
}
2017-08-25 08:37:14 +02:00
socket . emit ( "channel_list" , { "guild_id" : guild _id , "visitor_mode" : visitor _mode } ) ;
}
function send _socket _heartbeat ( ) {
2018-06-28 10:05:08 +02:00
if ( socket _last _ack ) {
var now = moment ( ) ;
var duration = moment . duration ( now . diff ( socket _last _ack ) ) . minutes ( ) ;
if ( socket && duration >= 1 ) { // server must hanged, lets reconnect
socket _error _should _refetch = true ;
socket . disconnect ( ) ;
socket = null ;
initiate _websockets ( ) ;
}
}
2017-08-25 08:37:14 +02:00
if ( socket ) {
socket . emit ( "heartbeat" , { "guild_id" : guild _id , "visitor_mode" : visitor _mode } ) ;
}
2017-08-21 06:26:51 +02:00
}
2017-04-13 02:42:32 +02:00
} ) ( ) ;
2017-09-21 09:12:49 +02:00
function submit _unauthenticated _captcha ( ) { // To be invoked when recaptcha is completed
$ ( '#recaptchamodal' ) . modal ( 'close' ) ;
$ ( "#submit-unauthenticated-captcha-btn" ) . click ( ) ;
2018-03-11 10:28:58 +01:00
}
2019-01-28 04:03:25 +01:00
window . _3rd _party _test _step1 _loaded = function ( ) {
// At this point, a third-party domain has now attempted to set a cookie (if all went to plan!)
var step2El = document . createElement ( 'script' ) ;
// And load the second part of the test (reading the cookie)
step2El . setAttribute ( 'src' , cookie _test _s2 _URL ) ;
document . getElementById ( "third-party-cookies-notice" ) . appendChild ( step2El ) ;
} ;
window . _3rd _party _test _step2 _loaded = function ( cookieSuccess ) {
if ( ! cookieSuccess ) {
$ ( "#third-party-cookies-notice" ) . show ( ) . addClass ( "done" ) ;
$ ( "#login-greeting-msg, #loginmodal-maincontent" ) . hide ( ) ;
} else {
$ ( "#third-party-cookies-notice" ) . hide ( ) . addClass ( "done" ) ;
$ ( "#login-greeting-msg, #loginmodal-maincontent" ) . show ( ) ;
}
} ;
window . setTimeout ( function ( ) {
var noticeDiv = $ ( "#third-party-cookies-notice" ) ;
if ( ! noticeDiv . hasClass ( "done" ) ) {
window . _3rd _party _test _step2 _loaded ( false ) ;
}
} , 7 * 1000 ) ;
2019-02-18 02:00:21 +01:00
$ ( "#third-party-cookies-force-hide" ) . click ( function ( ) {
window . _3rd _party _test _step2 _loaded ( true ) ;
} ) ;
$ ( "#third-party-cookies-force-window" ) . click ( function ( ) {
window . open ( window . location . href ) ;
} ) ;