diff --git a/titanembeds/static/js/embed.js b/titanembeds/static/js/embed.js
index 5389daf..d645f97 100644
--- a/titanembeds/static/js/embed.js
+++ b/titanembeds/static/js/embed.js
@@ -5,455 +5,460 @@
/* global bot_client_id */
/* global moment */
-var logintimer; // timer to keep track of user inactivity after hitting login
-var fetchtimeout; // fetch routine timer
-var last_message_id; // last message tracked
-var selected_channel = guild_id; // user selected channel, defaults to #general channel
-
-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();
-
- if (fullyInView === true) {
- return ((pageTop < elementTop) && (pageBottom > elementBottom));
- } else {
- return ((elementTop <= pageBottom) && (elementBottom >= pageTop));
- }
-}
-
-function query_guild() {
- var funct = $.ajax({
- dataType: "json",
- url: "/api/query_guild",
- data: {"guild_id": guild_id}
- });
- return funct.promise();
-}
-
-function create_authenticated_user() {
- var funct = $.ajax({
- method: "POST",
- dataType: "json",
- url: "/api/create_authenticated_user",
- data: {"guild_id": guild_id}
- });
- return funct.promise();
-}
-
-function create_unauthenticated_user(username) {
- var funct = $.ajax({
- method: "POST",
- dataType: "json",
- url: "/api/create_unauthenticated_user",
- data: {"username": username, "guild_id": guild_id}
- });
- return funct.promise();
-}
-
-function fetch(channel_id, after=null) {
- var funct = $.ajax({
- method: "GET",
- dataType: "json",
- url: "/api/fetch",
- data: {"guild_id": guild_id,"channel_id": channel_id, "after": after}
- });
- return funct.promise();
-}
-
-function post(channel_id, content) {
- var funct = $.ajax({
- method: "POST",
- dataType: "json",
- url: "/api/post",
- data: {"guild_id": guild_id, "channel_id": channel_id, "content": content}
- });
- return funct.promise();
-}
-
-$(function(){
- $("#loginmodal").modal({
- dismissible: false, // 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
- }
- );
-
- var guild = query_guild();
- guild.fail(function() {
- $('#loginmodal').modal('open');
- });
-
- guild.done(function(data) {
- initialize_embed(data);
- //$('#loginmodal').modal('open');
- });
-});
-
-function lock_login_fields() {
- $("#loginProgress").show();
- $("#discordlogin_btn").attr("disabled",true);
- $("#custom_username_field").prop("disabled",true);
- logintimer = setTimeout(function() {
- unlock_login_fields();
- }, 60000);
-}
-
-function unlock_login_fields() {
- $("#loginProgress").hide();
- $("#discordlogin_btn").attr("disabled",false);
- $("#custom_username_field").prop("disabled",false);
- clearTimeout(logintimer);
-}
-
-function initialize_embed(guildobj) {
- $('#loginmodal').modal('close');
- unlock_login_fields();
- if (guildobj === undefined) {
- var guild = query_guild();
- guild.done(function(data) {
- prepare_guild(data);
- });
- } else {
- prepare_guild(guildobj);
- }
-}
-
-function prepare_guild(guildobj) {
- fill_channels(guildobj.channels);
- fill_discord_members(guildobj.discordmembers);
- fill_authenticated_users(guildobj.embedmembers.authenticated);
- fill_unauthenticated_users(guildobj.embedmembers.unauthenticated);
- run_fetch_routine();
-}
-
-function fill_channels(channels) {
- var template = $('#mustache_channellistings').html();
- Mustache.parse(template);
- $("#channels-list").empty();
- for (var i = 0; i < channels.length; i++) {
- var chan = channels[i];
- if (chan.read) {
- var rendered = Mustache.render(template, {"channelid": chan.channel.id, "channelname": chan.channel.name});
- $("#channels-list").append(rendered);
- if (chan.channel.id == selected_channel) {
- if (chan.write) {
- $("#messagebox").prop('disabled', false);
- $("#messagebox").prop('placeholder', "Enter message");
- } else {
- $("#messagebox").prop('disabled', true);
- $("#messagebox").prop('placeholder', "Messages is disabled in this channel.");
- }
- $("#channeltopic").text(chan.channel.topic);
- }
+(function () {
+ var logintimer; // timer to keep track of user inactivity after hitting login
+ var fetchtimeout; // fetch routine timer
+ var last_message_id; // last message tracked
+ var selected_channel = guild_id; // user selected channel, defaults to #general channel
+
+ 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();
+
+ if (fullyInView === true) {
+ return ((pageTop < elementTop) && (pageBottom > elementBottom));
+ } else {
+ return ((elementTop <= pageBottom) && (elementBottom >= pageTop));
}
}
- $("#channel-"+selected_channel).parent().addClass("active");
-}
-
-function mention_member(member_id) {
- if (!$('#messagebox').prop('disabled')) {
- $('#messagebox').val( $('#messagebox').val() + "[@" + member_id + "] " );
- $('.button-collapse').sideNav('hide');
- $("#messagebox").focus();
- }
-}
-
-function fill_discord_members(discordmembers) {
- var template = $('#mustache_authedusers').html();
- Mustache.parse(template);
- $("#discord-members").empty();
- for (var i = 0; i < discordmembers.length; i++) {
- var member = discordmembers[i];
- var rendered = Mustache.render(template, {"id": member.id.toString() + "d", "username": member.username, "avatar": member.avatar_url});
- $("#discord-members").append(rendered);
- $( "#discorduser-" + member.id.toString() + "d").click({"member_id": member.id.toString()}, function(event) {
- mention_member(event.data.member_id);
+
+ function query_guild() {
+ var funct = $.ajax({
+ dataType: "json",
+ url: "/api/query_guild",
+ data: {"guild_id": guild_id}
});
+ return funct.promise();
}
-}
-
-function fill_authenticated_users(users) {
- var template = $('#mustache_authedusers').html();
- Mustache.parse(template);
- $("#embed-discord-members").empty();
- for (var i = 0; i < users.length; i++) {
- var member = users[i];
- var rendered = Mustache.render(template, {"id": member.id.toString() + "a", "username": member.username, "avatar": member.avatar_url});
- $("#embed-discord-members").append(rendered);
- $( "#discorduser-" + member.id.toString() + "a").click({"member_id": member.id.toString()}, function(event) {
- mention_member(event.data.member_id);
+
+ function create_authenticated_user() {
+ var funct = $.ajax({
+ method: "POST",
+ dataType: "json",
+ url: "/api/create_authenticated_user",
+ data: {"guild_id": guild_id}
});
+ return funct.promise();
}
-}
-
-function fill_unauthenticated_users(users) {
- var template = $('#mustache_unauthedusers').html();
- Mustache.parse(template);
- $("#embed-unauth-users").empty();
- for (var i = 0; i < users.length; i++) {
- var member = users[i];
- var rendered = Mustache.render(template, {"username": member.username, "discriminator": member.discriminator});
- $("#embed-unauth-users").append(rendered);
+
+ function create_unauthenticated_user(username) {
+ var funct = $.ajax({
+ method: "POST",
+ dataType: "json",
+ url: "/api/create_unauthenticated_user",
+ data: {"username": username, "guild_id": guild_id}
+ });
+ return funct.promise();
}
-}
-
-function wait_for_discord_login() {
- _wait_for_discord_login(0);
-}
-
-function _wait_for_discord_login(index) {
- setTimeout(function() {
- var usr = create_authenticated_user();
- usr.done(function(data) {
- initialize_embed();
- return;
+
+ function fetch(channel_id, after=null) {
+ var funct = $.ajax({
+ method: "GET",
+ dataType: "json",
+ url: "/api/fetch",
+ data: {"guild_id": guild_id,"channel_id": channel_id, "after": after}
});
- usr.fail(function(data) {
- if (data.status == 403) {
- Materialize.toast('Authentication error! You have been banned.', 10000);
- } else if (index < 10) {
- _wait_for_discord_login(index + 1);
- }
+ return funct.promise();
+ }
+
+ function post(channel_id, content) {
+ var funct = $.ajax({
+ method: "POST",
+ dataType: "json",
+ url: "/api/post",
+ data: {"guild_id": guild_id, "channel_id": channel_id, "content": content}
});
- }, 5000);
-}
-
-function select_channel(channel_id) {
- if (selected_channel != channel_id) {
- selected_channel = channel_id;
- last_message_id = null;
- $("#channels-list > li.active").removeClass("active");
- $("#channel-"+selected_channel).parent().addClass("active");
- clearTimeout(fetchtimeout);
+ return funct.promise();
+ }
+
+ $(function(){
+ $("#loginmodal").modal({
+ dismissible: false, // 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
+ }
+ );
+
+ var guild = query_guild();
+ guild.fail(function() {
+ $('#loginmodal').modal('open');
+ });
+
+ guild.done(function(data) {
+ initialize_embed(data);
+ //$('#loginmodal').modal('open');
+ });
+ });
+
+ function lock_login_fields() {
+ $("#loginProgress").show();
+ $("#discordlogin_btn").attr("disabled",true);
+ $("#custom_username_field").prop("disabled",true);
+ logintimer = setTimeout(function() {
+ unlock_login_fields();
+ }, 60000);
+ }
+
+ function unlock_login_fields() {
+ $("#loginProgress").hide();
+ $("#discordlogin_btn").attr("disabled",false);
+ $("#custom_username_field").prop("disabled",false);
+ clearTimeout(logintimer);
+ }
+
+ function initialize_embed(guildobj) {
+ $('#loginmodal').modal('close');
+ unlock_login_fields();
+ if (guildobj === undefined) {
+ var guild = query_guild();
+ guild.done(function(data) {
+ prepare_guild(data);
+ });
+ } else {
+ prepare_guild(guildobj);
+ }
+ }
+
+ function prepare_guild(guildobj) {
+ fill_channels(guildobj.channels);
+ fill_discord_members(guildobj.discordmembers);
+ fill_authenticated_users(guildobj.embedmembers.authenticated);
+ fill_unauthenticated_users(guildobj.embedmembers.unauthenticated);
run_fetch_routine();
}
-}
-
-function replace_message_mentions(message) {
- var mentions = message.mentions;
- for (var i = 0; i < mentions.length; i++) {
- var mention = mentions[i];
- message.content = message.content.replace(new RegExp("<@" + mention.id + ">", 'g'), "@" + mention.username + "#" + mention.discriminator);
- message.content = message.content.replace(new RegExp("<@!" + mention.id + ">", 'g'), "@" + mention.username + "#" + mention.discriminator);
- message.content = message.content.replace("<@&" + guild_id + ">", "@everyone");
- }
- return message;
-}
-
-function getPosition(string, subString, index) {
- return string.split(subString, index).join(subString).length;
-}
-
-function format_bot_message(message) {
- if (message.author.id == bot_client_id && (message.content.includes("**") && ( (message.content.includes("<")&&message.content.includes(">")) || (message.content.includes("[") && message.content.includes("]")) ))) {
- var usernamefield = message.content.substring(getPosition(message.content, "**", 1)+3, getPosition(message.content, "**", 2)-1);
- message.content = message.content.substring(usernamefield.length+7);
- message.author.username = usernamefield.split("#")[0];
- message.author.discriminator = usernamefield.split("#")[1];
- }
- return message;
-}
-
-function parse_message_time(message) {
- var mome = moment(message.timestamp);
- message.formatted_timestamp = mome.toDate().toString();
- message.formatted_time = mome.format("h:mm A");
- return message;
-}
-
-function parse_message_attachments(message) {
- for (var i = 0; i < message.attachments.length; i++) {
- var attach = "";
- if (message.content.length != 0) {
- attach = " ";
+
+ function fill_channels(channels) {
+ var template = $('#mustache_channellistings').html();
+ Mustache.parse(template);
+ $("#channels-list").empty();
+ for (var i = 0; i < channels.length; i++) {
+ var chan = channels[i];
+ if (chan.read) {
+ var rendered = Mustache.render(template, {"channelid": chan.channel.id, "channelname": chan.channel.name});
+ $("#channels-list").append(rendered);
+ $("#channel-" + chan.channel.id.toString()).click({"channel_id": chan.channel.id.toString()}, function(event) {
+ select_channel(event.data.channel_id);
+ });
+ if (chan.channel.id == selected_channel) {
+ if (chan.write) {
+ $("#messagebox").prop('disabled', false);
+ $("#messagebox").prop('placeholder', "Enter message");
+ } else {
+ $("#messagebox").prop('disabled', true);
+ $("#messagebox").prop('placeholder', "Messages is disabled in this channel.");
+ }
+ $("#channeltopic").text(chan.channel.topic);
+ }
+ }
}
- attach += message.attachments[i].url;
- message.content += attach;
+ $("#channel-"+selected_channel).parent().addClass("active");
}
- return message;
-}
-
-function handle_last_message_mention() {
- var lastmsg = $("#chatcontent p:last-child");
- var content = lastmsg.text().toLowerCase();
- var username_discrim = $("#currentusername").text().toLowerCase();
- if (content.includes("@everyone") || content.includes("@" + username_discrim)) {
- lastmsg.css( "color", "#ff5252" );
- lastmsg.css( "font-weight", "bold" );
- }
-}
-
-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, "'");
- }
-
-function nl2br (str, is_xhtml) { /* http://stackoverflow.com/questions/2919337/jquery-convert-line-breaks-to-br-nl2br-equivalent/ */
- var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '
' : '
';
- return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1'+ breakTag +'$2');
-}
-
-function fill_discord_messages(messages, jumpscroll) {
- 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];
- message = replace_message_mentions(message);
- message = format_bot_message(message);
- message = parse_message_time(message);
- message = parse_message_attachments(message);
- var rendered = Mustache.render(template, {"id": message.id, "full_timestamp": message.formatted_timestamp, "time": message.formatted_time, "username": message.author.username, "discriminator": message.author.discriminator, "content": nl2br(escapeHtml(message.content))});
- $("#chatcontent").append(rendered);
- last = message.id;
- handle_last_message_mention();
- }
- $("html, body").animate({ scrollTop: $(document).height() }, "slow");
- $('#chatcontent').linkify({
- target: "_blank"
- });
- return last;
-}
-
-function run_fetch_routine() {
- var channel_id = selected_channel;
- var fet;
- var jumpscroll;
- if (last_message_id == null) {
- $("#chatcontent").empty();
- fet = fetch(channel_id);
- jumpscroll = true;
- } else {
- fet = fetch(channel_id, last_message_id);
- jumpscroll = element_in_view($('#discordmessage_'+last_message_id), true);
- }
- fet.done(function(data) {
- var status = data.status;
- update_embed_userchip(status.authenticated, status.avatar, status.username, status.user_id, status.discriminator);
- last_message_id = fill_discord_messages(data.messages, jumpscroll);
- if (status.manage_embed) {
- $("#administrate_link").show();
- } else {
- $("#administrate_link").hide();
- }
- 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);
- fetchtimeout = setTimeout(run_fetch_routine, 5000);
- });
- });
- 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);
- }
- });
- fet.catch(function(data) {
- if (!(data.status != 403 || data.status != 401)) {
- fetchtimeout = setTimeout(run_fetch_routine, 10000);
+
+ function mention_member(member_id) {
+ if (!$('#messagebox').prop('disabled')) {
+ $('#messagebox').val( $('#messagebox').val() + "[@" + member_id + "] " );
+ $('.button-collapse').sideNav('hide');
+ $("#messagebox").focus();
}
- });
-}
-
-function update_embed_userchip(authenticated, avatar, username, userid, discrim=null) {
- if (authenticated) {
- $("#currentuserimage").show();
- $("#currentuserimage").attr("src", avatar);
- $("#currentusername").text(username + "#" + discrim);
- } else {
- $("#currentuserimage").hide();
- $("#currentusername").text(username + "#" + userid);
}
-}
-
-$("#discordlogin_btn").click(function() {
- lock_login_fields();
- wait_for_discord_login();
-});
-
-$("#custom_username_field").keyup(function(event){
- if (event.keyCode == 13) {
- 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;
+
+ function fill_discord_members(discordmembers) {
+ var template = $('#mustache_authedusers').html();
+ Mustache.parse(template);
+ $("#discord-members").empty();
+ for (var i = 0; i < discordmembers.length; i++) {
+ var member = discordmembers[i];
+ var rendered = Mustache.render(template, {"id": member.id.toString() + "d", "username": member.username, "avatar": member.avatar_url});
+ $("#discord-members").append(rendered);
+ $( "#discorduser-" + member.id.toString() + "d").click({"member_id": member.id.toString()}, function(event) {
+ mention_member(event.data.member_id);
+ });
}
- if($(this).val().length >= 2 && $(this).val().length <= 32) {
- lock_login_fields();
- var usr = create_unauthenticated_user($(this).val());
+ }
+
+ function fill_authenticated_users(users) {
+ var template = $('#mustache_authedusers').html();
+ Mustache.parse(template);
+ $("#embed-discord-members").empty();
+ for (var i = 0; i < users.length; i++) {
+ var member = users[i];
+ var rendered = Mustache.render(template, {"id": member.id.toString() + "a", "username": member.username, "avatar": member.avatar_url});
+ $("#embed-discord-members").append(rendered);
+ $( "#discorduser-" + member.id.toString() + "a").click({"member_id": member.id.toString()}, function(event) {
+ mention_member(event.data.member_id);
+ });
+ }
+ }
+
+ function fill_unauthenticated_users(users) {
+ var template = $('#mustache_unauthedusers').html();
+ Mustache.parse(template);
+ $("#embed-unauth-users").empty();
+ for (var i = 0; i < users.length; i++) {
+ var member = users[i];
+ var rendered = Mustache.render(template, {"username": member.username, "discriminator": member.discriminator});
+ $("#embed-unauth-users").append(rendered);
+ }
+ }
+
+ function wait_for_discord_login() {
+ _wait_for_discord_login(0);
+ }
+
+ function _wait_for_discord_login(index) {
+ setTimeout(function() {
+ var usr = create_authenticated_user();
usr.done(function(data) {
initialize_embed();
+ return;
});
usr.fail(function(data) {
- if (data.status == 429) {
- Materialize.toast('Sorry! You are allowed to log in as a guest once every 15 minutes.', 10000);
- } else if (data.status == 403) {
+ 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 (index < 10) {
+ _wait_for_discord_login(index + 1);
}
- unlock_login_fields();
- })
- }
+ });
+ }, 5000);
}
-});
-
-$("#messagebox").keyup(function(event){
- if ($(this).val().length == 1) {
- $(this).val($.trim($(this).val()));
- }
- if(event.keyCode == 13 && $(this).val().length >= 1 && $(this).val().length <= 350) {
- $(this).val($.trim($(this).val()));
- $(this).blur();
- $("#messagebox").attr('readonly', true);
- var funct = post(selected_channel, $(this).val());
- funct.done(function(data) {
- $("#messagebox").val("");
+
+ function select_channel(channel_id) {
+ if (selected_channel != channel_id) {
+ selected_channel = channel_id;
+ last_message_id = null;
+ $("#channels-list > li.active").removeClass("active");
+ $("#channel-"+selected_channel).parent().addClass("active");
clearTimeout(fetchtimeout);
run_fetch_routine();
+ }
+ }
+
+ function replace_message_mentions(message) {
+ var mentions = message.mentions;
+ for (var i = 0; i < mentions.length; i++) {
+ var mention = mentions[i];
+ message.content = message.content.replace(new RegExp("<@" + mention.id + ">", 'g'), "@" + mention.username + "#" + mention.discriminator);
+ message.content = message.content.replace(new RegExp("<@!" + mention.id + ">", 'g'), "@" + mention.username + "#" + mention.discriminator);
+ message.content = message.content.replace("<@&" + guild_id + ">", "@everyone");
+ }
+ return message;
+ }
+
+ function getPosition(string, subString, index) {
+ return string.split(subString, index).join(subString).length;
+ }
+
+ function format_bot_message(message) {
+ if (message.author.id == bot_client_id && (message.content.includes("**") && ( (message.content.includes("<")&&message.content.includes(">")) || (message.content.includes("[") && message.content.includes("]")) ))) {
+ var usernamefield = message.content.substring(getPosition(message.content, "**", 1)+3, getPosition(message.content, "**", 2)-1);
+ message.content = message.content.substring(usernamefield.length+7);
+ message.author.username = usernamefield.split("#")[0];
+ message.author.discriminator = usernamefield.split("#")[1];
+ }
+ return message;
+ }
+
+ function parse_message_time(message) {
+ var mome = moment(message.timestamp);
+ message.formatted_timestamp = mome.toDate().toString();
+ message.formatted_time = mome.format("h:mm A");
+ return message;
+ }
+
+ function parse_message_attachments(message) {
+ for (var i = 0; i < message.attachments.length; i++) {
+ var attach = "";
+ if (message.content.length != 0) {
+ attach = " ";
+ }
+ attach += message.attachments[i].url;
+ message.content += attach;
+ }
+ return message;
+ }
+
+ function handle_last_message_mention() {
+ var lastmsg = $("#chatcontent p:last-child");
+ var content = lastmsg.text().toLowerCase();
+ var username_discrim = $("#currentusername").text().toLowerCase();
+ if (content.includes("@everyone") || content.includes("@" + username_discrim)) {
+ lastmsg.css( "color", "#ff5252" );
+ lastmsg.css( "font-weight", "bold" );
+ }
+ }
+
+ 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, "'");
+ }
+
+ function nl2br (str, is_xhtml) { /* http://stackoverflow.com/questions/2919337/jquery-convert-line-breaks-to-br-nl2br-equivalent/ */
+ var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '
' : '
';
+ return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1'+ breakTag +'$2');
+ }
+
+ function fill_discord_messages(messages, jumpscroll) {
+ 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];
+ message = replace_message_mentions(message);
+ message = format_bot_message(message);
+ message = parse_message_time(message);
+ message = parse_message_attachments(message);
+ var rendered = Mustache.render(template, {"id": message.id, "full_timestamp": message.formatted_timestamp, "time": message.formatted_time, "username": message.author.username, "discriminator": message.author.discriminator, "content": nl2br(escapeHtml(message.content))});
+ $("#chatcontent").append(rendered);
+ last = message.id;
+ handle_last_message_mention();
+ }
+ $("html, body").animate({ scrollTop: $(document).height() }, "slow");
+ $('#chatcontent').linkify({
+ target: "_blank"
});
- funct.fail(function(data) {
- Materialize.toast('Failed to send message.', 10000);
+ return last;
+ }
+
+ function run_fetch_routine() {
+ var channel_id = selected_channel;
+ var fet;
+ var jumpscroll;
+ if (last_message_id == null) {
+ $("#chatcontent").empty();
+ fet = fetch(channel_id);
+ jumpscroll = true;
+ } else {
+ fet = fetch(channel_id, last_message_id);
+ jumpscroll = element_in_view($('#discordmessage_'+last_message_id), true);
+ }
+ fet.done(function(data) {
+ var status = data.status;
+ update_embed_userchip(status.authenticated, status.avatar, status.username, status.user_id, status.discriminator);
+ last_message_id = fill_discord_messages(data.messages, jumpscroll);
+ if (status.manage_embed) {
+ $("#administrate_link").show();
+ } else {
+ $("#administrate_link").hide();
+ }
+ 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);
+ fetchtimeout = setTimeout(run_fetch_routine, 5000);
+ });
});
- funct.catch(function(data) {
- if (data.status == 429) {
- Materialize.toast('You are sending messages too fast! 1 message per 10 seconds', 10000);
+ 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);
}
});
- funct.always(function() {
- $("#messagebox").attr('readonly', false);
- })
+ fet.catch(function(data) {
+ if (!(data.status != 403 || data.status != 401)) {
+ fetchtimeout = setTimeout(run_fetch_routine, 10000);
+ }
+ });
}
-});
-
-$('#guild-btn').sideNav({
- menuWidth: 300, // Default is 300
- edge: 'left', // Choose the horizontal origin
- closeOnClick: true, // Closes side-nav on clicks, useful for Angular/Meteor
- draggable: true // Choose whether you can drag to open on touch screens
-}
-);
-
-$('#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
-}
-);
+
+ function update_embed_userchip(authenticated, avatar, username, userid, discrim=null) {
+ if (authenticated) {
+ $("#currentuserimage").show();
+ $("#currentuserimage").attr("src", avatar);
+ $("#currentusername").text(username + "#" + discrim);
+ } else {
+ $("#currentuserimage").hide();
+ $("#currentusername").text(username + "#" + userid);
+ }
+ }
+
+ $("#discordlogin_btn").click(function() {
+ lock_login_fields();
+ wait_for_discord_login();
+ });
+
+ $("#custom_username_field").keyup(function(event){
+ if (event.keyCode == 13) {
+ 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) {
+ lock_login_fields();
+ var usr = create_unauthenticated_user($(this).val());
+ usr.done(function(data) {
+ initialize_embed();
+ });
+ usr.fail(function(data) {
+ if (data.status == 429) {
+ Materialize.toast('Sorry! You are allowed to log in as a guest once every 15 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);
+ }
+ unlock_login_fields();
+ });
+ }
+ }
+ });
+
+ $("#messagebox").keyup(function(event){
+ if ($(this).val().length == 1) {
+ $(this).val($.trim($(this).val()));
+ }
+ if(event.keyCode == 13 && $(this).val().length >= 1 && $(this).val().length <= 350) {
+ $(this).val($.trim($(this).val()));
+ $(this).blur();
+ $("#messagebox").attr('readonly', true);
+ var funct = post(selected_channel, $(this).val());
+ funct.done(function(data) {
+ $("#messagebox").val("");
+ clearTimeout(fetchtimeout);
+ run_fetch_routine();
+ });
+ funct.fail(function(data) {
+ Materialize.toast('Failed to send message.', 10000);
+ });
+ funct.catch(function(data) {
+ if (data.status == 429) {
+ Materialize.toast('You are sending messages too fast! 1 message per 10 seconds', 10000);
+ }
+ });
+ funct.always(function() {
+ $("#messagebox").attr('readonly', false);
+ });
+ }
+ });
+
+ $('#guild-btn').sideNav({
+ menuWidth: 300, // Default is 300
+ edge: 'left', // Choose the horizontal origin
+ closeOnClick: true, // Closes side-nav on clicks, useful for Angular/Meteor
+ draggable: true // Choose whether you can drag to open on touch screens
+ }
+ );
+
+ $('#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
+ }
+ );
+})();
diff --git a/titanembeds/templates/embed.html.j2 b/titanembeds/templates/embed.html.j2
index c8cc983..b5ca2fe 100644
--- a/titanembeds/templates/embed.html.j2
+++ b/titanembeds/templates/embed.html.j2
@@ -109,7 +109,7 @@
{% raw %}