mirror of
				https://github.com/KevinMidboe/zoff.git
				synced 2025-10-29 18:00:23 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1303 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			1303 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var connection_options = {
 | |
|   "sync disconnect on unload": true,
 | |
|   secure: true,
 | |
|   "force new connection": true
 | |
| };
 | |
| var socket = io.connect(
 | |
|   window.location.protocol + "//" + window.location.hostname,
 | |
|   connection_options
 | |
| );
 | |
| var api_token_list;
 | |
| var dynamicListeners = {};
 | |
| 
 | |
| function toast(text, length, classes) {
 | |
|   M.toast({ html: text, displayLength: length, classes: classes });
 | |
| }
 | |
| 
 | |
| window.addEventListener("DOMContentLoaded", function() {
 | |
|   M.Tabs.init(document.querySelector(".tabs_admin"), {
 | |
|     onShow: function() {
 | |
|       if (this.index == 2) {
 | |
|         M.Tabs.getInstance(
 | |
|           document.querySelector(".tabs_admin_info")
 | |
|         ).updateTabIndicator();
 | |
|       }
 | |
|     }
 | |
|   });
 | |
|   M.Tabs.init(document.querySelector(".tabs_admin_info"));
 | |
|   api_token_list = document.querySelector("#api_token_list").cloneNode(true);
 | |
|   document.querySelector("#api_token_list").remove();
 | |
|   loaded();
 | |
| 
 | |
|   addClass(".channel_things", "hide");
 | |
|   removeClass(".preloader-wrapper", "hide");
 | |
| 
 | |
|   document.addEventListener(
 | |
|     "click",
 | |
|     function(event) {
 | |
|       handleEvent(event, event.target, false, "click");
 | |
|     },
 | |
|     true
 | |
|   );
 | |
| 
 | |
|   document.addEventListener(
 | |
|     "input",
 | |
|     function(event) {
 | |
|       handleEvent(event, event.target, false, "input");
 | |
|     },
 | |
|     true
 | |
|   );
 | |
| 
 | |
|   document.addEventListener(
 | |
|     "change",
 | |
|     function(event) {
 | |
|       handleEvent(event, event.target, false, "change");
 | |
|     },
 | |
|     true
 | |
|   );
 | |
| 
 | |
|   document.addEventListener(
 | |
|     "submit",
 | |
|     function(event) {
 | |
|       handleEvent(event, event.target, false, "submit");
 | |
|     },
 | |
|     true
 | |
|   );
 | |
| 
 | |
|   document
 | |
|     .getElementById("refresh_all")
 | |
|     .addEventListener("click", function(event) {
 | |
|       event.preventDefault();
 | |
|       document.getElementById("descriptions_cont").innerHTML = "";
 | |
|       document.getElementById("thumbnails_cont").innerHTML = "";
 | |
|       document.querySelector(".names-container").innerHTML = "";
 | |
|       var elements = document.querySelectorAll(".api_token_container");
 | |
|       for (var i = 0; i < elements.length; i++) {
 | |
|         elements[i].remove();
 | |
|       }
 | |
| 
 | |
|       addClass(".channel_things", "hide");
 | |
| 
 | |
|       removeClass(".preloader-wrapper", "hide");
 | |
|       loaded();
 | |
|       document.querySelector("#listeners").innerHTML = "";
 | |
|       socket.emit("get_spread");
 | |
|     });
 | |
| });
 | |
| 
 | |
| addListener("click", ".update_api_token", function(event) {
 | |
|   this.preventDefault();
 | |
|   var that = event;
 | |
|   var id = that.getAttribute("data-id");
 | |
|   var limit = document.querySelector("#limit-" + id).value;
 | |
| 
 | |
|   toggleClass(that, "disabled");
 | |
| 
 | |
|   toggleClass("#delete-" + id, "disabled");
 | |
|   ajax({
 | |
|     type: "PUT",
 | |
|     url: "api/api_token",
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     data: {
 | |
|       id: id,
 | |
|       limit: limit
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response == "OK") {
 | |
|         toast("Updated limit!", 2000, "green lighten");
 | |
|       } else {
 | |
|         toast("Something went wrong...", 2000, "red lighten");
 | |
|       }
 | |
|       toggleClass(that, "disabled");
 | |
|       toggleClass("#delete-" + id, "disabled");
 | |
|     }
 | |
|   });
 | |
| });
 | |
| 
 | |
| addListener("click", ".delete_api_token", function(event) {
 | |
|   this.preventDefault();
 | |
|   var that = event;
 | |
|   var id = that.getAttribute("data-id");
 | |
|   toggleClass(that, "disabled");
 | |
|   toggleClass("#limit-" + id, "disabled");
 | |
|   ajax({
 | |
|     type: "DELETE",
 | |
|     url: "api/api_token",
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     data: {
 | |
|       id: id
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response == "success") {
 | |
|         toast("Removed token!", 2000, "green lighten");
 | |
|         document.querySelector("#element-" + id).remove();
 | |
|       } else {
 | |
|         toast("Something went wrong...", 2000, "red lighten");
 | |
|         toggleClass(that, "disabled");
 | |
|         toggleClass("#limit-" + id, "disabled");
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| });
 | |
| 
 | |
| addListener("click", ".approve_name", function(event) {
 | |
|   var that = event;
 | |
|   var name = that.getAttribute("data-name");
 | |
|   var value = that.parentElement.querySelector("input").value;
 | |
|   ajax({
 | |
|     type: "POST",
 | |
|     url: "/api/names",
 | |
|     data: {
 | |
|       icon: value,
 | |
|       name: name
 | |
|     },
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(resp) {
 | |
|       if (resp == true) {
 | |
|         toast("Approved image!", 2000, "green lighten");
 | |
|       } else {
 | |
|         toast("Something went wrong...", 2000, "red lighten");
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| });
 | |
| 
 | |
| addListener("click", ".remove_name", function(event) {
 | |
|   var that = event;
 | |
|   var name = that.getAttribute("data-name");
 | |
|   ajax({
 | |
|     type: "DELETE",
 | |
|     url: "/api/names",
 | |
|     data: {
 | |
|       name: name
 | |
|     },
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(resp) {
 | |
|       if (resp == true) {
 | |
|         toast("Removed username!", 2000, "green lighten");
 | |
|         that.parentElement.remove();
 | |
|       } else {
 | |
|         toast("Something went wrong...", 2000, "red lighten");
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| });
 | |
| 
 | |
| addListener("click", ".thumbnail_link", function(event) {
 | |
|   this.preventDefault();
 | |
|   window.open("https:" + event.value, "_blank");
 | |
| });
 | |
| 
 | |
| addListener("click", "#get_token", function(event) {
 | |
|   this.preventDefault();
 | |
|   ajax({
 | |
|     type: "GET",
 | |
|     url: "/api/token",
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response != false) {
 | |
|         document.querySelector("#new_token").value = response.token;
 | |
|         toggleClass("#get_token", "hide");
 | |
|         toggleClass("#remove_token", "hide");
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| });
 | |
| 
 | |
| addListener("click", ".approve_thumbnails", function(event) {
 | |
|   this.preventDefault();
 | |
|   var that = event;
 | |
|   var channel = that.getAttribute("data-channel");
 | |
|   if (!channel) {
 | |
|     toast("Something went wrong...", 2000, "red lighten");
 | |
|     return;
 | |
|   }
 | |
|   ajax({
 | |
|     type: "POST",
 | |
|     url: "/api/approve_thumbnail",
 | |
|     data: {
 | |
|       channel: channel
 | |
|     },
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response) {
 | |
|         that.parentElement.remove();
 | |
|         var length = parseInt(
 | |
|           document.querySelector(".thumbnails-badge").innerText
 | |
|         );
 | |
|         length = length - 1;
 | |
|         increaseInfo(-1);
 | |
|         document.querySelector(".thumbnails-badge").innerText = length;
 | |
|         if (length <= 0) {
 | |
|           addClass(".thumbnails-badge", "hide");
 | |
|         }
 | |
|         toast("Approved Thumbnail!", 2000, "green lighten");
 | |
|       } else {
 | |
|         toast("Something went wrong...", 2000, "red lighten");
 | |
|       }
 | |
|     },
 | |
|     error: function(err) {}
 | |
|   });
 | |
| });
 | |
| 
 | |
| addListener("click", ".deny_thumbnails", function(event) {
 | |
|   this.preventDefault();
 | |
|   var that = event;
 | |
|   var channel = that.getAttribute("data-channel");
 | |
|   if (!channel) {
 | |
|     toast("Something went wrong...", 2000, "red lighten");
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   ajax({
 | |
|     type: "POST",
 | |
|     url: "/api/deny_thumbnail",
 | |
|     data: {
 | |
|       channel: channel
 | |
|     },
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response) {
 | |
|         that.parentElement.remove();
 | |
|         var length = parseInt(
 | |
|           document.querySelector(".thumbnails-badge").innerText
 | |
|         );
 | |
|         length = length - 1;
 | |
|         increaseInfo(-1);
 | |
|         document.querySelector(".thumbnails-badge").innerText = length;
 | |
|         if (length <= 0) {
 | |
|           addClass(".thumbnails-badge", "hide");
 | |
|         }
 | |
|         toast("Denied thumbnail!", 2000, "green lighten");
 | |
|       } else {
 | |
|         toast("Something went wrong...", 2000, "red lighten");
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| });
 | |
| 
 | |
| addListener("click", ".approve_descriptions", function(event) {
 | |
|   this.preventDefault();
 | |
|   var that = event;
 | |
|   var channel = that.getAttribute("data-channel");
 | |
|   if (!channel) {
 | |
|     toast("Something went wrong...", 2000, "red lighten");
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   ajax({
 | |
|     type: "POST",
 | |
|     url: "/api/approve_description",
 | |
|     data: {
 | |
|       channel: channel
 | |
|     },
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response) {
 | |
|         that.parentElement.remove();
 | |
|         var length = parseInt(
 | |
|           document.querySelector(".descriptions-badge").innerText
 | |
|         );
 | |
|         length = length - 1;
 | |
|         increaseInfo(-1);
 | |
|         document.querySelector(".descriptions-badge").innerText = length;
 | |
|         if (length <= 0) {
 | |
|           addClass(".descriptions-badge", "hide");
 | |
|         }
 | |
|         toast("Approved description!", 2000, "green lighten");
 | |
|       } else {
 | |
|         toast("Something went wrong...", 2000, "red lighten");
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| });
 | |
| 
 | |
| addListener("click", ".deny_descriptions", function(event) {
 | |
|   this.preventDefault();
 | |
|   var that = event;
 | |
|   var channel = that.getAttribute("data-channel");
 | |
|   if (!channel) {
 | |
|     toast("Something went wrong...", 2000, "red lighten");
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   ajax({
 | |
|     type: "POST",
 | |
|     url: "/api/deny_description",
 | |
|     data: {
 | |
|       channel: channel
 | |
|     },
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response) {
 | |
|         that.parentElement.remove();
 | |
|         var length = parseInt(
 | |
|           document.querySelector(".descriptions-badge").innerText
 | |
|         );
 | |
|         length = length - 1;
 | |
|         increaseInfo(-1);
 | |
|         document.querySelector(".descriptions-badge").innerText = length;
 | |
|         if (length <= 0) {
 | |
|           addClass(".descriptions-badge", "hide");
 | |
|         }
 | |
|         toast("Denied description!", 2000, "green lighten");
 | |
|       } else {
 | |
|         toast("Something went wrong...", 2000, "red lighten");
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| });
 | |
| 
 | |
| addListener("click", ".approve_rules", function(event) {
 | |
|   this.preventDefault();
 | |
|   var that = event;
 | |
|   var channel = that.getAttribute("data-channel");
 | |
|   if (!channel) {
 | |
|     toast("Something went wrong...", 2000, "red lighten");
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   ajax({
 | |
|     type: "POST",
 | |
|     url: "/api/approve_rules",
 | |
|     data: {
 | |
|       channel: channel
 | |
|     },
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response) {
 | |
|         that.parentElement.remove();
 | |
|         var length = parseInt(document.querySelector(".rules-badge").innerText);
 | |
|         length = length - 1;
 | |
|         increaseInfo(-1);
 | |
|         document.querySelector(".rules-badge").innerText = length;
 | |
|         if (length <= 0) {
 | |
|           addClass(".rules-badge", "hide");
 | |
|         }
 | |
|         toast("Approved rules!", 2000, "green lighten");
 | |
|       } else {
 | |
|         toast("Something went wrong...", 2000, "red lighten");
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| });
 | |
| 
 | |
| addListener("click", ".deny_rules", function(event) {
 | |
|   this.preventDefault();
 | |
|   var that = event;
 | |
|   var channel = that.getAttribute("data-channel");
 | |
|   if (!channel) {
 | |
|     toast("Something went wrong...", 2000, "red lighten");
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   ajax({
 | |
|     type: "POST",
 | |
|     url: "/api/deny_rules",
 | |
|     data: {
 | |
|       channel: channel
 | |
|     },
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response) {
 | |
|         that.parentElement.remove();
 | |
|         var length = parseInt(document.querySelector(".rules-badge").innerText);
 | |
|         length = length - 1;
 | |
|         increaseInfo(-1);
 | |
|         document.querySelector(".rules-badge").innerText = length;
 | |
|         if (length <= 0) {
 | |
|           addClass(".rules-badge", "hide");
 | |
|         }
 | |
|         toast("Denied description!", 2000, "green lighten");
 | |
|       } else {
 | |
|         toast("Something went wrong...", 2000, "red lighten");
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| });
 | |
| 
 | |
| addListener("click", "#remove_description_button", function(event) {
 | |
|   this.preventDefault();
 | |
|   var that = event;
 | |
|   var channel = document.querySelector("#remove_description").value;
 | |
|   if (!channel) {
 | |
|     toast("Something went wrong...", 2000, "red lighten");
 | |
|     return;
 | |
|   }
 | |
|   ajax({
 | |
|     type: "POST",
 | |
|     url: "/api/remove_description",
 | |
|     data: {
 | |
|       channel: channel
 | |
|     },
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response) {
 | |
|         toast("Removed description!", 2000, "green lighten");
 | |
|       } else {
 | |
|         toast("Something went wrong...", 2000, "red lighten");
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| });
 | |
| 
 | |
| addListener("click", "#remove_rules_button", function(event) {
 | |
|   this.preventDefault();
 | |
|   var that = event;
 | |
|   var channel = document.querySelector("#remove_rules").value;
 | |
|   if (!channel) {
 | |
|     toast("Something went wrong...", 2000, "red lighten");
 | |
|     return;
 | |
|   }
 | |
|   ajax({
 | |
|     type: "POST",
 | |
|     url: "/api/remove_rules",
 | |
|     data: {
 | |
|       channel: channel
 | |
|     },
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response) {
 | |
|         toast("Removed rules!", 2000, "green lighten");
 | |
|       } else {
 | |
|         toast("Something went wrong...", 2000, "red lighten");
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| });
 | |
| 
 | |
| addListener("click", "#remove_thumbnail_button", function(event) {
 | |
|   this.preventDefault();
 | |
|   var that = event;
 | |
|   var channel = document.querySelector("#remove_thumbnail").value;
 | |
|   if (!channel) {
 | |
|     toast("Something went wrong...", 2000, "red lighten");
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   ajax({
 | |
|     type: "POST",
 | |
|     url: "/api/remove_thumbnail",
 | |
|     data: {
 | |
|       channel: channel
 | |
|     },
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response) {
 | |
|         toast("Removed thumbnail!", 2000, "green lighten");
 | |
|       } else {
 | |
|         toast("Something went wrong...", 2000, "red lighten");
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| });
 | |
| 
 | |
| function delete_channel(that) {
 | |
|   var to_delete = document.querySelector("#delete_channel_name").value;
 | |
|   if (!to_delete) {
 | |
|     toast("Something went wrong...", 2000, "red lighten");
 | |
|     return;
 | |
|   }
 | |
|   var r = confirm('Delete list "' + decodeChannelName(to_delete) + '"?');
 | |
|   if (r == true) {
 | |
|     ajax({
 | |
|       type: "POST",
 | |
|       url: "/api/delete",
 | |
|       data: {
 | |
|         _id: to_delete
 | |
|       },
 | |
|       headers: {
 | |
|         "Content-Type": "application/json"
 | |
|       },
 | |
|       success: function(response) {
 | |
|         if (response == true) {
 | |
|           loaded();
 | |
|           toast("Deleted channel!", 2000, "green lighten");
 | |
|         } else {
 | |
|           toast("Something went wrong...", 2000, "red lighten");
 | |
|         }
 | |
|       }
 | |
|     });
 | |
|   }
 | |
| }
 | |
| 
 | |
| addListener("submit", "#delete_channel", function(event) {
 | |
|   this.preventDefault();
 | |
|   delete_channel(event);
 | |
| });
 | |
| 
 | |
| addListener("click", "#delete_channel_button", function(event) {
 | |
|   this.preventDefault();
 | |
|   delete_channel(event);
 | |
| });
 | |
| 
 | |
| addListener("click", "#remove_token", function(event) {
 | |
|   this.preventDefault();
 | |
|   ajax({
 | |
|     type: "GET",
 | |
|     url: "/api/remove_token",
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response != false) {
 | |
|         document.querySelector("#new_token").value = "";
 | |
|         toggleClass("#get_token", "hide");
 | |
|         toggleClass("#remove_token", "hide");
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| });
 | |
| 
 | |
| addListener("submit", "#change_pinned", function(event) {
 | |
|   this.preventDefault();
 | |
|   change_pinned(event);
 | |
| });
 | |
| 
 | |
| addListener("click", "#change_pinned_button", function(event) {
 | |
|   this.preventDefault();
 | |
|   change_pinned(event);
 | |
| });
 | |
| 
 | |
| addListener("click", "#delete_admin_button", function(event) {
 | |
|   this.preventDefault();
 | |
|   delete_admin_list(event);
 | |
| });
 | |
| 
 | |
| function change_pinned(that) {
 | |
|   var to_pin = document.querySelector("#frontpage_pinned").value;
 | |
|   if (!to_pin) {
 | |
|     toast("Something went wrong...", 2000, "red lighten");
 | |
|     return;
 | |
|   }
 | |
|   ajax({
 | |
|     type: "POST",
 | |
|     url: "/api/pinned",
 | |
|     data: {
 | |
|       _id: to_pin
 | |
|     },
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response == true) {
 | |
|         toast("Pinned channel!", 2000, "green lighten");
 | |
|       } else {
 | |
|         toast("Something went wrong...", 2000, "red lighten");
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| }
 | |
| 
 | |
| function delete_admin_list(that) {
 | |
|   var to_remove_password = document.querySelector("#delete_list_name").value;
 | |
|   if (!to_remove_password) {
 | |
|     toast("Something went wrong...", 2000, "red lighten");
 | |
|     return;
 | |
|   }
 | |
|   ajax({
 | |
|     type: "POST",
 | |
|     url: "/api/admin",
 | |
|     data: {
 | |
|       _id: to_remove_password
 | |
|     },
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response == true) {
 | |
|         toast("Removed admin password!", 2000, "green lighten");
 | |
|       } else {
 | |
|         toast("Something went wrong...", 2000, "red lighten");
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| }
 | |
| 
 | |
| function delete_userpass(that) {
 | |
|   var to_remove_password = document.querySelector("#delete_userpass_name")
 | |
|     .value;
 | |
|   if (!to_remove_password) {
 | |
|     toast("Something went wrong...", 2000, "red lighten");
 | |
|     return;
 | |
|   }
 | |
|   ajax({
 | |
|     type: "POST",
 | |
|     url: "/api/userpass",
 | |
|     data: {
 | |
|       _id: to_remove_password
 | |
|     },
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response == true) {
 | |
|         toast("Removed userpass password!", 2000, "green lighten");
 | |
|       } else {
 | |
|         toast("Something went wrong...", 2000, "red lighten");
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| }
 | |
| 
 | |
| addListener("click", "#delete_userpass_button", function(event) {
 | |
|   this.preventDefault();
 | |
|   delete_userpass(event);
 | |
| });
 | |
| 
 | |
| addListener("submit", "#delete_list", function(event) {
 | |
|   this.preventDefault();
 | |
|   delete_admin_list(event);
 | |
| });
 | |
| 
 | |
| addListener("submit", "#delete_userpass", function(event) {
 | |
|   this.preventDefault();
 | |
|   delete_userpass(event);
 | |
| });
 | |
| 
 | |
| socket.on("spread_listeners", function(obj) {
 | |
|   document
 | |
|     .querySelector("#listeners")
 | |
|     .insertAdjacentHTML(
 | |
|       "beforeend",
 | |
|       "<p>Private listeners: " + obj.offline + "</p>"
 | |
|     );
 | |
|   document
 | |
|     .querySelector("#listeners")
 | |
|     .insertAdjacentHTML(
 | |
|       "beforeend",
 | |
|       "<p>Total listeners: " + obj.total + "</p>"
 | |
|     );
 | |
|   document.querySelector("#listeners").insertAdjacentHTML("beforeend", "<hr>");
 | |
|   for (var x in obj.online_users) {
 | |
|     if (
 | |
|       obj.online_users[x]._id != "total_users" &&
 | |
|       obj.online_users[x].hasOwnProperty("users") &&
 | |
|       obj.online_users[x].users.length > 0
 | |
|     ) {
 | |
|       document
 | |
|         .querySelector("#listeners")
 | |
|         .insertAdjacentHTML(
 | |
|           "beforeend",
 | |
|           "<p>" +
 | |
|             decodeChannelName(obj.online_users[x]._id) +
 | |
|             ": " +
 | |
|             obj.online_users[x].users.length +
 | |
|             "</p>"
 | |
|         );
 | |
|     }
 | |
|   }
 | |
| });
 | |
| 
 | |
| function add_to_tab(dest, resp) {
 | |
|   for (var x = 0; x < resp.length; x++) {
 | |
|     if (dest == "thumbnails") {
 | |
|       document
 | |
|         .querySelector("#" + dest + "_cont")
 | |
|         .insertAdjacentHTML(
 | |
|           "beforeend",
 | |
|           "<div><div class='col s4 m3'>" +
 | |
|             decodeChannelName(resp[x].channel) +
 | |
|             "</div><input type='text' readonly class='col s4 m6 thumbnail_link' value='" +
 | |
|             resp[x].thumbnail +
 | |
|             "'><a class='btn green waves-effect col s2 m1 approve_" +
 | |
|             dest +
 | |
|             "' href='#' data-channel='" +
 | |
|             resp[x].channel +
 | |
|             "'><i class='material-icons'>check</i></a><a class='btn red waves-effect col s2 m1 deny_" +
 | |
|             dest +
 | |
|             "' href='#' data-channel='" +
 | |
|             resp[x].channel +
 | |
|             "'>X</a></div>"
 | |
|         );
 | |
|     } else if (dest == "descriptions") {
 | |
|       document
 | |
|         .querySelector("#" + dest + "_cont")
 | |
|         .insertAdjacentHTML(
 | |
|           "beforeend",
 | |
|           "<div><div class='col s4 m3'>" +
 | |
|             decodeChannelName(resp[x].channel) +
 | |
|             "</div><input type='text' readonly class='col s4 m6' value='" +
 | |
|             resp[x].description +
 | |
|             "'><a class='btn green waves-effect col s2 m1 approve_" +
 | |
|             dest +
 | |
|             "' href='#' data-channel='" +
 | |
|             resp[x].channel +
 | |
|             "'><i class='material-icons'>check</i></a><a class='btn red waves-effect col s2 m1 deny_" +
 | |
|             dest +
 | |
|             "' href='#' data-channel='" +
 | |
|             resp[x].channel +
 | |
|             "'>X</a></div>"
 | |
|         );
 | |
|     } else {
 | |
|       resp[x].rules = resp[x].rules.replace(/\n/g, " /n\\ ");
 | |
|       document
 | |
|         .querySelector("#" + dest + "_cont")
 | |
|         .insertAdjacentHTML(
 | |
|           "beforeend",
 | |
|           "<div><div class='col s4 m3'>" +
 | |
|             decodeChannelName(resp[x].channel) +
 | |
|             "</div><input type='text' readonly class='col s4 m6' value='" +
 | |
|             resp[x].rules +
 | |
|             "'><a class='btn green waves-effect col s2 m1 approve_" +
 | |
|             dest +
 | |
|             "' href='#' data-channel='" +
 | |
|             resp[x].channel +
 | |
|             "'><i class='material-icons'>check</i></a><a class='btn red waves-effect col s2 m1 deny_" +
 | |
|             dest +
 | |
|             "' href='#' data-channel='" +
 | |
|             resp[x].channel +
 | |
|             "'>X</a></div>"
 | |
|         );
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| function escapeHtml(text) {
 | |
|   var map = {
 | |
|     "&": "&",
 | |
|     "<": "<",
 | |
|     ">": ">",
 | |
|     '"': """,
 | |
|     "'": "'"
 | |
|   };
 | |
| 
 | |
|   return text.replace(/[&<>"']/g, function(m) {
 | |
|     return map[m];
 | |
|   });
 | |
| }
 | |
| 
 | |
| function increaseInfo(num) {
 | |
|   removeClass(".info-badge", "hide");
 | |
|   try {
 | |
|     var currentNumber = parseInt(
 | |
|       document.querySelector(".info-badge").innerText
 | |
|     );
 | |
|     if (isNaN(currentNumber)) currentNumber = 0;
 | |
|     document.querySelector(".info-badge").innerText = currentNumber + num;
 | |
|     currentNumber += num;
 | |
|     if (currentNumber <= 0) {
 | |
|       addClass(".info-badge", "hide");
 | |
|     }
 | |
|   } catch (e) {
 | |
|     document.querySelector(".info-badge").innerText = 1;
 | |
|   }
 | |
| }
 | |
| 
 | |
| function loaded() {
 | |
|   ajax({
 | |
|     type: "GET",
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     url: "/api/api_token",
 | |
|     success: function(response) {
 | |
|       if (response.length == 0) {
 | |
|         addClass(".header-api-fields", "hide");
 | |
|         return;
 | |
|       }
 | |
|       removeClass(".header-api-fields", "hide");
 | |
|       for (var i = 0; i < response.length; i++) {
 | |
|         var to_add = api_token_list.cloneNode(true);
 | |
|         to_add.setAttribute("id", "element-" + response[i]._id);
 | |
|         to_add.querySelector(".api_token_name").innerText = response[i].name;
 | |
|         to_add.querySelector(".api_token_usage").innerText = response[i].usage;
 | |
|         to_add.querySelector(".api_token_origin").innerText =
 | |
|           response[i].origin;
 | |
|         to_add
 | |
|           .querySelector(".update_api_token")
 | |
|           .setAttribute("id", "update-" + response[i]._id);
 | |
|         to_add
 | |
|           .querySelector(".api_token_limit")
 | |
|           .setAttribute("id", "limit-" + response[i]._id);
 | |
|         to_add.querySelector("#limit-" + response[i]._id).value = parseInt(
 | |
|           response[i].limit
 | |
|         );
 | |
|         to_add
 | |
|           .querySelector(".delete_api_token")
 | |
|           .setAttribute("id", "delete-" + response[i]._id);
 | |
|         to_add
 | |
|           .querySelector(".delete_api_token")
 | |
|           .setAttribute("data-id", response[i]._id);
 | |
|         to_add
 | |
|           .querySelector(".update_api_token")
 | |
|           .setAttribute("data-id", response[i]._id);
 | |
|         if (response[i].active) {
 | |
|           removeClass(to_add.querySelector(".check"), "hide");
 | |
|         } else {
 | |
|           removeClass(to_add.querySelector(".uncheck"), "hide");
 | |
|         }
 | |
|         document
 | |
|           .querySelector("#api_keys")
 | |
|           .insertAdjacentHTML(
 | |
|             "beforeend",
 | |
|             '<div class="row api_token_container" id="element-' +
 | |
|               response[i]._id +
 | |
|               '">' +
 | |
|               to_add.innerHTML +
 | |
|               "</div>"
 | |
|           );
 | |
|         document.querySelector("#limit-" + response[i]._id).value = parseInt(
 | |
|           response[i].limit
 | |
|         );
 | |
|       }
 | |
|     },
 | |
|     error: function(err) {}
 | |
|   });
 | |
| 
 | |
|   ajax({
 | |
|     type: "GET",
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     url: "/api/lists",
 | |
|     success: function(response) {
 | |
|       response = response.sort(
 | |
|         predicate({
 | |
|           name: "_id",
 | |
|           reverse: false
 | |
|         })
 | |
|       );
 | |
|       var output_pinned =
 | |
|         '<option value="" disabled selected>Channels</option>';
 | |
|       var output_delete =
 | |
|         '<option value="" disabled selected>Channels</option>';
 | |
|       for (var x = 0; x < response.length; x++) {
 | |
|         if (response[x].count > 2) {
 | |
|           output_pinned +=
 | |
|             "<option class='" +
 | |
|             response[x]._id +
 | |
|             "' value='" +
 | |
|             response[x]._id +
 | |
|             "'>" +
 | |
|             decodeChannelName(response[x]._id) +
 | |
|             "</option>";
 | |
|         }
 | |
|         output_delete +=
 | |
|           "<option class='" +
 | |
|           response[x]._id +
 | |
|           "' value='" +
 | |
|           response[x]._id +
 | |
|           "'>" +
 | |
|           decodeChannelName(response[x]._id) +
 | |
|           "</option>";
 | |
|       }
 | |
| 
 | |
|       document.querySelector("#frontpage_pinned").innerHTML = output_pinned;
 | |
|       document.querySelector(
 | |
|         "#remove_thumbnail"
 | |
|       ).innerHTML = document
 | |
|         .querySelector("#frontpage_pinned")
 | |
|         .cloneNode(true).innerHTML;
 | |
|       document.querySelector(
 | |
|         "#remove_description"
 | |
|       ).innerHTML = document
 | |
|         .querySelector("#frontpage_pinned")
 | |
|         .cloneNode(true).innerHTML;
 | |
|       document.querySelector(
 | |
|         "#remove_rules"
 | |
|       ).innerHTML = document
 | |
|         .querySelector("#frontpage_pinned")
 | |
|         .cloneNode(true).innerHTML;
 | |
|       document.querySelector(
 | |
|         "#delete_list_name"
 | |
|       ).innerHTML = document
 | |
|         .querySelector("#frontpage_pinned")
 | |
|         .cloneNode(true).innerHTML;
 | |
|       document.querySelector(
 | |
|         "#delete_userpass_name"
 | |
|       ).innerHTML = document
 | |
|         .querySelector("#frontpage_pinned")
 | |
|         .cloneNode(true).innerHTML;
 | |
|       document.querySelector(
 | |
|         "#delete_channel_name"
 | |
|       ).innerHTML = document
 | |
|         .querySelector("#frontpage_pinned")
 | |
|         .cloneNode(true).innerHTML;
 | |
|       var selects = document.querySelectorAll("select");
 | |
|       for (var i = 0; i < selects.length; i++) {
 | |
|         M.FormSelect.init(selects[i]);
 | |
|       }
 | |
| 
 | |
|       addClass(".preloader-wrapper", "hide");
 | |
|       removeClass(".channel_things", "hide");
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   ajax({
 | |
|     type: "GET",
 | |
|     url: "/api/names",
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       for (var i = 0; i < response.length; i++) {
 | |
|         var icon = "";
 | |
|         if (response[i].icon && response[i].icon != "") {
 | |
|           icon =
 | |
|             "<img class='chat-icon' src='" +
 | |
|             response[i].icon +
 | |
|             "' alt='" +
 | |
|             escapeHtml(response[i]._id) +
 | |
|             "'>";
 | |
|         }
 | |
| 
 | |
|         document
 | |
|           .querySelector(".names-container")
 | |
|           .insertAdjacentHTML(
 | |
|             "beforeend",
 | |
|             "<div class='col s12'><div class='name-chat col s3'>" +
 | |
|               icon +
 | |
|               escapeHtml(response[i]._id) +
 | |
|               "</div><input type='text' class='" +
 | |
|               escapeHtml(response[i]._id) +
 | |
|               "_input col s5'><a class='btn green waves-effect col s2 m1 approve_name' href='#' data-name='" +
 | |
|               escapeHtml(response[i]._id) +
 | |
|               "'><i class='material-icons'>check</i></a><a class='btn red waves-effect col s2 m1 remove_name' href='#' data-name='" +
 | |
|               escapeHtml(response[i]._id) +
 | |
|               "'><i class='material-icons'>close</i></a></div>"
 | |
|           );
 | |
|       }
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   ajax({
 | |
|     type: "GET",
 | |
|     url: "/api/thumbnails",
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response.length > 0) {
 | |
|         removeClass(".thumbnails-badge", "hide");
 | |
|         document.querySelector(".thumbnails-badge").innerText = response.length;
 | |
|         increaseInfo(response.length);
 | |
|       }
 | |
|       add_to_tab("thumbnails", response);
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   ajax({
 | |
|     type: "GET",
 | |
|     url: "/api/descriptions",
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response.length > 0) {
 | |
|         removeClass(".descriptions-badge", "hide");
 | |
|         document.querySelector(".descriptions-badge").innerText =
 | |
|           response.length;
 | |
|         increaseInfo(response.length);
 | |
|       }
 | |
|       add_to_tab("descriptions", response);
 | |
|     }
 | |
|   });
 | |
| 
 | |
|   ajax({
 | |
|     type: "GET",
 | |
|     url: "/api/rules",
 | |
|     headers: {
 | |
|       "Content-Type": "application/json"
 | |
|     },
 | |
|     success: function(response) {
 | |
|       if (response.length > 0) {
 | |
|         removeClass(".rules-badge", "hide");
 | |
|         document.querySelector(".rules-badge").innerText = response.length;
 | |
|         increaseInfo(response.length);
 | |
|       }
 | |
|       add_to_tab("rules", response);
 | |
|     }
 | |
|   });
 | |
| }
 | |
| 
 | |
| function predicate() {
 | |
|   var fields = [],
 | |
|     n_fields = arguments.length,
 | |
|     field,
 | |
|     name,
 | |
|     cmp;
 | |
| 
 | |
|   var default_cmp = function(a, b) {
 | |
|       if (a == undefined) a = 0;
 | |
|       if (b == undefined) b = 0;
 | |
|       if (a === b) return 0;
 | |
|       return a < b ? -1 : 1;
 | |
|     },
 | |
|     getCmpFunc = function(primer, reverse) {
 | |
|       var dfc = default_cmp,
 | |
|         // closer in scope
 | |
|         cmp = default_cmp;
 | |
|       if (primer) {
 | |
|         cmp = function(a, b) {
 | |
|           return dfc(primer(a), primer(b));
 | |
|         };
 | |
|       }
 | |
|       if (reverse) {
 | |
|         return function(a, b) {
 | |
|           return -1 * cmp(a, b);
 | |
|         };
 | |
|       }
 | |
|       return cmp;
 | |
|     };
 | |
| 
 | |
|   // preprocess sorting options
 | |
|   for (var i = 0; i < n_fields; i++) {
 | |
|     field = arguments[i];
 | |
|     if (typeof field === "string") {
 | |
|       name = field;
 | |
|       cmp = default_cmp;
 | |
|     } else {
 | |
|       name = field.name;
 | |
|       cmp = getCmpFunc(field.primer, field.reverse);
 | |
|     }
 | |
|     fields.push({
 | |
|       name: name,
 | |
|       cmp: cmp
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   // final comparison function
 | |
|   return function(A, B) {
 | |
|     var name, result;
 | |
|     for (var i = 0; i < n_fields; i++) {
 | |
|       result = 0;
 | |
|       field = fields[i];
 | |
|       name = field.name;
 | |
| 
 | |
|       result = field.cmp(A[name], B[name]);
 | |
|       if (result !== 0) break;
 | |
|     }
 | |
|     return result;
 | |
|   };
 | |
| }
 | |
| 
 | |
| function removeClass(element, className) {
 | |
|   try {
 | |
|     if (typeof element == "object") {
 | |
|       element.classList.remove(className);
 | |
|     } else if (element.substring(0, 1) == "#") {
 | |
|       document.getElementById(element.substring(1)).classList.remove(className);
 | |
|     } else {
 | |
|       var elements = document.getElementsByClassName(element.substring(1));
 | |
|       for (var i = 0; i < elements.length; i++) {
 | |
|         elements[i].classList.remove(className);
 | |
|       }
 | |
|     }
 | |
|   } catch (e) {
 | |
|     //console.log(e);
 | |
|   }
 | |
| }
 | |
| 
 | |
| function addClass(element, className) {
 | |
|   try {
 | |
|     if (typeof element == "object") {
 | |
|       try {
 | |
|         if (element.length > 0) {
 | |
|           for (var i = 0; i < element.length; i++) {
 | |
|             if (element[i].className.indexOf(className) == -1) {
 | |
|               element[i].className += " " + className;
 | |
|             }
 | |
|           }
 | |
|         } else {
 | |
|           if (element.className.indexOf(className) == -1) {
 | |
|             element.className += " " + className;
 | |
|           }
 | |
|         }
 | |
|       } catch (e) {
 | |
|         if (element.className.indexOf(className) == -1) {
 | |
|           element.className += " " + className;
 | |
|         }
 | |
|       }
 | |
|     } else if (element.substring(0, 1) == "#") {
 | |
|       var elem = document.getElementById(element.substring(1));
 | |
|       if (elem.className.indexOf(className) == -1) {
 | |
|         elem.className += " " + className;
 | |
|       }
 | |
|     } else {
 | |
|       var elements;
 | |
|       if (element.substring(0, 1) == ".") {
 | |
|         elements = document.getElementsByClassName(element.substring(1));
 | |
|       } else {
 | |
|         elements = document.getElementsByTagName(element);
 | |
|       }
 | |
|       for (var i = 0; i < elements.length; i++) {
 | |
|         if (elements[i].className.indexOf(className) == -1) {
 | |
|           elements[i].className += " " + className;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   } catch (e) {}
 | |
| }
 | |
| 
 | |
| function decodeChannelName(str) {
 | |
|   var _fn = decodeURIComponent;
 | |
|   str = str.toUpperCase();
 | |
|   try {
 | |
|     var toReturn = _fn(str.replace(/%5F/g, "_").replace(/%27/g, "'"));
 | |
|     return toReturn.toLowerCase();
 | |
|   } catch (e) {
 | |
|     return str.toLowerCase();
 | |
|   }
 | |
| }
 | |
| 
 | |
| function toggleClass(element, className) {
 | |
|   try {
 | |
|     if (typeof element == "object") {
 | |
|       if (element.className.indexOf(className) == -1) {
 | |
|         addClass(element, className);
 | |
|       } else {
 | |
|         removeClass(element, className);
 | |
|       }
 | |
|     } else if (element.substring(0, 1) == "#") {
 | |
|       var elem = document.getElementById(element.substring(1));
 | |
|       if (elem.className.indexOf(className) == -1) {
 | |
|         addClass(elem, className);
 | |
|       } else {
 | |
|         removeClass(elem, className);
 | |
|       }
 | |
|     } else {
 | |
|       var elements;
 | |
|       if (element.substring(0, 1) == ".") {
 | |
|         var testSplit = element.substring(1).split(" ");
 | |
|         if (testSplit.length > 1) {
 | |
|           var insideElement = document.getElementsByClassName(testSplit[0]);
 | |
|           elements = [];
 | |
|           for (var i = 0; i < insideElement.length; i++) {
 | |
|             var innards = insideElement[i].querySelectorAll(testSplit[1]);
 | |
|             for (var y = 0; y < innards.length; y++) {
 | |
|               elements.push(innards[y]);
 | |
|             }
 | |
|           }
 | |
|         } else {
 | |
|           elements = document.getElementsByClassName(element.substring(1));
 | |
|         }
 | |
|       } else {
 | |
|         elements = document.getElementsByTagName(element);
 | |
|       }
 | |
|       for (var i = 0; i < elements.length; i++) {
 | |
|         if (elements[i].className.indexOf(className) == -1) {
 | |
|           addClass(elements[i], className);
 | |
|         } else {
 | |
|           removeClass(element, className);
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   } catch (e) {
 | |
|     //console.log(e);
 | |
|   }
 | |
| }
 | |
| 
 | |
| function ajax(obj) {
 | |
|   var _async = true;
 | |
|   if (obj.async) _async = obj.async;
 | |
|   if (obj.method == undefined && obj.type != undefined) obj.method = obj.type;
 | |
|   if (obj.method == undefined) obj.method = "GET";
 | |
|   var xmlhttp = new XMLHttpRequest();
 | |
|   xmlhttp.onreadystatechange = function() {
 | |
|     if (xmlhttp.readyState == XMLHttpRequest.DONE) {
 | |
|       // XMLHttpRequest.DONE == 4
 | |
|       if (
 | |
|         xmlhttp.status == 200 ||
 | |
|         xmlhttp.status == 201 ||
 | |
|         xmlhttp.status == 202
 | |
|       ) {
 | |
|         try {
 | |
|           obj.success(JSON.parse(xmlhttp.responseText), xmlhttp);
 | |
|         } catch (e) {
 | |
|           obj.success(xmlhttp.responseText, xmlhttp);
 | |
|         }
 | |
|       } else if (obj.hasOwnProperty("error")) {
 | |
|         obj.error(xmlhttp);
 | |
|       }
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   xmlhttp.open(obj.method, obj.url, _async);
 | |
|   if (obj.headers) {
 | |
|     for (header in obj.headers) {
 | |
|       xmlhttp.setRequestHeader(header, obj.headers[header]);
 | |
|     }
 | |
|   }
 | |
|   if (obj.data) {
 | |
|     if (typeof obj.data == "object") obj.data = JSON.stringify(obj.data);
 | |
|     //xmlhttp.send(sendRequest);
 | |
|     xmlhttp.send(obj.data);
 | |
|   } else xmlhttp.send();
 | |
| }
 | |
| 
 | |
| function handleEvent(e, target, tried, type) {
 | |
|   var path = e.path || (e.composedPath && e.composedPath());
 | |
|   if (!path) {
 | |
|     var path = [target];
 | |
|     var parent = target.parentElement;
 | |
|     while (parent != null) {
 | |
|       path.push(parent);
 | |
|       try {
 | |
|         parent = parent.parentElement;
 | |
|       } catch (e) {
 | |
|         break;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   if (path) {
 | |
|     for (var y = 0; y < path.length; y++) {
 | |
|       var target = path[y];
 | |
|       if (dynamicListeners[type] && dynamicListeners[type]["#" + target.id]) {
 | |
|         dynamicListeners[type]["#" + target.id].call(e, target);
 | |
|         return;
 | |
|       } else {
 | |
|         if (target.classList == undefined) return;
 | |
|         for (var i = 0; i < target.classList.length; i++) {
 | |
|           if (
 | |
|             dynamicListeners[type] &&
 | |
|             dynamicListeners[type]["." + target.classList[i]]
 | |
|           ) {
 | |
|             dynamicListeners[type]["." + target.classList[i]].call(e, target);
 | |
|             return;
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| function addListener(type, element, callback) {
 | |
|   if (dynamicListeners[type] == undefined) dynamicListeners[type] = {};
 | |
|   dynamicListeners[type][element] = callback;
 | |
| }
 | |
| 
 | |
| function removeListener(type, element) {
 | |
|   delete dynamicListeners[type][element];
 | |
| }
 | |
| 
 | |
| socket.emit("get_spread");
 |