mirror of
				https://github.com/KevinMidboe/zoff.git
				synced 2025-10-29 18:00:23 +00:00 
			
		
		
		
	Added settings for disabling chat in a channel
This commit is contained in:
		| @@ -85,7 +85,9 @@ function chat(msg, guid, offline, socket) { | ||||
|             msg.pass = userpass; | ||||
|         } | ||||
|         db.collection(coll + "_settings").find(function(err, docs){ | ||||
|             if(docs.length > 0 && (docs[0].userpass == undefined || docs[0].userpass == "" || (msg.hasOwnProperty('pass') && docs[0].userpass == crypto.createHash('sha256').update(Functions.decrypt_string(msg.pass)).digest("base64")))) { | ||||
|             if(docs.length > 0 && !docs[0].toggleChat) { | ||||
|                 socket.emit('chat', {from: "System", msg: ": Chat for this channel has been disabled.", icon: "https://zoff.me/assets/images/favicon-32x32.png"}); | ||||
|             } else if(docs.length > 0 && (docs[0].userpass == undefined || docs[0].userpass == "" || (msg.hasOwnProperty('pass') && docs[0].userpass == crypto.createHash('sha256').update(Functions.decrypt_string(msg.pass)).digest("base64")))) { | ||||
|                 var data = msg.data; | ||||
|  | ||||
|                 Functions.check_inlist(coll, guid, socket, offline, function() { | ||||
| @@ -162,127 +164,144 @@ function all_chat(msg, guid, offline, socket) { | ||||
|     }, "place 2"); | ||||
| } | ||||
|  | ||||
| function checkIfChatEnabled(channel, socket, callback) { | ||||
|     if(channel == "" || channel == undefined) callback(); | ||||
|     else { | ||||
|         db.collection(channel + "_settings").find(function(err, docs){ | ||||
|             if(docs.length > 0 && !docs[0].toggleChat) { | ||||
|                 socket.emit('chat', {from: "System", msg: ": Chat for this channel has been disabled.", icon: "https://zoff.me/assets/images/favicon-32x32.png"}); | ||||
|             } else { | ||||
|                 callback(); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
| } | ||||
|  | ||||
| function namechange(data, guid, socket, tried, callback) { | ||||
|     /*if(!data.hasOwnProperty("channel") || | ||||
|      typeof(data.channel) != "string") return;*/ | ||||
|     var pw = ""; | ||||
|     var new_password; | ||||
|     var first = false; | ||||
|     Functions.getSessionChatPass(Functions.getSession(socket), function(name, pass) { | ||||
|         if(data.hasOwnProperty("first") && data.first) { | ||||
|             pw = pass; | ||||
|             name = name; | ||||
|             data.name = name; | ||||
|             data.password = pass; | ||||
|             new_password = false; | ||||
|             if(name == "" || pass == "") { | ||||
|                 if(typeof(callback) == "function") callback(); | ||||
|                 return; | ||||
|             } | ||||
|         } else { | ||||
|             var name = data.name; | ||||
|             if(data.hasOwnProperty("first")) { | ||||
|                 first = data.first; | ||||
|             } | ||||
|             if(data.hasOwnProperty("password")) { | ||||
|                 pw = data.password; | ||||
|      checkIfChatEnabled(data.channel, socket, function() { | ||||
|         var pw = ""; | ||||
|         var new_password; | ||||
|         var first = false; | ||||
|         Functions.getSessionChatPass(Functions.getSession(socket), function(name, pass) { | ||||
|             if(data.hasOwnProperty("first") && data.first) { | ||||
|                 pw = pass; | ||||
|                 name = name; | ||||
|                 data.name = name; | ||||
|                 data.password = pass; | ||||
|                 new_password = false; | ||||
|             } else if(data.hasOwnProperty("new_password") && data.hasOwnProperty("old_password")) { | ||||
|                 pw = data.old_password; | ||||
|                 new_password = Functions.decrypt_string(data.new_password); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if(name == "") { | ||||
|             if(typeof(callback) == "function") callback(); | ||||
|             return; | ||||
|         } | ||||
|         var password = Functions.decrypt_string(pw); | ||||
|         db.collection("registered_users").find({"_id": name.toLowerCase()}, function(err, docs) { | ||||
|             var accepted_password = false; | ||||
|             var icon = false; | ||||
|             if(docs.length == 0) { | ||||
|                 if(new_password) { | ||||
|                 if(name == "" || pass == "") { | ||||
|                     if(typeof(callback) == "function") callback(); | ||||
|                     return; | ||||
|                 } | ||||
|                 accepted_password = true; | ||||
|                 Functions.setSessionChatPass(Functions.getSession(socket), name.toLowerCase(), data.password, function() { | ||||
|                     db.collection("registered_users").update({"_id": name.toLowerCase()}, {$set: {password: Functions.hash_pass(password)}}, {upsert: true}, function() { | ||||
|                     }); | ||||
|                 }); | ||||
|             } else if(docs[0].password == Functions.hash_pass(password)) { | ||||
|                 if(docs[0].icon) { | ||||
|                     icon = docs[0].icon; | ||||
|             } else { | ||||
|                 var name = data.name; | ||||
|                 if(data.hasOwnProperty("first")) { | ||||
|                     first = data.first; | ||||
|                 } | ||||
|                 accepted_password = true; | ||||
|                 if(new_password) { | ||||
|                     Functions.setSessionChatPass(Functions.getSession(socket), name.toLowerCase(), data.new_password, function() { | ||||
|                         db.collection("registered_users").update({"_id": name.toLowerCase(), password: Functions.hash_pass(password)}, {$set: {password: Functions.hash_pass(new_password)}}, function() { | ||||
|  | ||||
|                         }); | ||||
|                     }); | ||||
|                 } else { | ||||
|                     Functions.setSessionChatPass(Functions.getSession(socket), name.toLowerCase(), data.password, function() { | ||||
|                     }); | ||||
|                 if(data.hasOwnProperty("password")) { | ||||
|                     pw = data.password; | ||||
|                     new_password = false; | ||||
|                 } else if(data.hasOwnProperty("new_password") && data.hasOwnProperty("old_password")) { | ||||
|                     pw = data.old_password; | ||||
|                     new_password = Functions.decrypt_string(data.new_password); | ||||
|                 } | ||||
|             } | ||||
|             if(accepted_password) { | ||||
|                 db.collection("user_names").find({"guid": guid}, function(err, names) { | ||||
|                     if(names.length > 0 || (docs.length != 0 && docs[0].password == Functions.hash_pass(password))) { | ||||
|                         var no_name = false; | ||||
|                         if(names.length == 0) no_name = true; | ||||
|                         if(!no_name) { | ||||
|                             var old_name = names[0].name; | ||||
|                             db.collection("user_names").update({"_id": "all_names"}, {$pull: {names: old_name}}, function() {}); | ||||
|                         } | ||||
|                         var updateElement = {$set: {name: name, icon: icon}}; | ||||
|                         if(data.hasOwnProperty("channel") && data.channel != "") { | ||||
|                             updateElement["$addToSet"] = {channels: data.channel}; | ||||
|                         } | ||||
|                         db.collection("user_names").update({"guid": guid}, updateElement, {upsert: true}, function(err, docs) { | ||||
|                             db.collection("user_names").update({"_id": "all_names"}, {$addToSet: {names: name}}, function(err, docs) { | ||||
|                                 //socket.emit('name', {type: "name", accepted: true}); | ||||
|                                 if(old_name != name && !first && !no_name) { | ||||
|                                     if(data.hasOwnProperty("channel") && typeof(data.channel) == "string") { | ||||
|                                         io.to(data.channel).emit('chat', {from: old_name, msg: " changed name to " + name}); | ||||
|                                         io.sockets.emit('chat.all', {from: old_name , msg: " changed name to " + name, channel: data.channel}); | ||||
|                                     } | ||||
|                                 } | ||||
|                                 if(callback != undefined && typeof(callback) == "function") callback(); | ||||
|  | ||||
|             if(name == "") { | ||||
|                 if(typeof(callback) == "function") callback(); | ||||
|                 return; | ||||
|             } | ||||
|             var password = Functions.decrypt_string(pw); | ||||
|             db.collection("registered_users").find({"_id": name.toLowerCase()}, function(err, docs) { | ||||
|                 var accepted_password = false; | ||||
|                 var icon = false; | ||||
|                 if(docs.length == 0) { | ||||
|                     if(new_password) { | ||||
|                         if(typeof(callback) == "function") callback(); | ||||
|                         return; | ||||
|                     } | ||||
|                     accepted_password = true; | ||||
|                     Functions.setSessionChatPass(Functions.getSession(socket), name.toLowerCase(), data.password, function() { | ||||
|                         db.collection("registered_users").update({"_id": name.toLowerCase()}, {$set: {password: Functions.hash_pass(password)}}, {upsert: true}, function() { | ||||
|                         }); | ||||
|                     }); | ||||
|                 } else if(docs[0].password == Functions.hash_pass(password)) { | ||||
|                     if(docs[0].icon) { | ||||
|                         icon = docs[0].icon; | ||||
|                     } | ||||
|                     accepted_password = true; | ||||
|                     if(new_password) { | ||||
|                         Functions.setSessionChatPass(Functions.getSession(socket), name.toLowerCase(), data.new_password, function() { | ||||
|                             db.collection("registered_users").update({"_id": name.toLowerCase(), password: Functions.hash_pass(password)}, {$set: {password: Functions.hash_pass(new_password)}}, function() { | ||||
|  | ||||
|                             }); | ||||
|                         }); | ||||
|                     } else { | ||||
|                         if(tried < 3 || tried == undefined) { | ||||
|                             if(tried == undefined) { | ||||
|                                 tried = 1; | ||||
|                             } | ||||
|                             namechange(data, guid, socket, tried + 1); | ||||
|                         } | ||||
|                         Functions.setSessionChatPass(Functions.getSession(socket), name.toLowerCase(), data.password, function() { | ||||
|                         }); | ||||
|                     } | ||||
|                 }); | ||||
|             } else { | ||||
|                 Functions.removeSessionChatPass(Functions.getSession(socket), function() { | ||||
|                     socket.emit('name', {type: "name", accepted: false}); | ||||
|                 }); | ||||
|             } | ||||
|                 } | ||||
|                 if(accepted_password) { | ||||
|                     db.collection("user_names").find({"guid": guid}, function(err, names) { | ||||
|                         if(names.length > 0 || (docs.length != 0 && docs[0].password == Functions.hash_pass(password))) { | ||||
|                             var no_name = false; | ||||
|                             if(names.length == 0) no_name = true; | ||||
|                             if(!no_name) { | ||||
|                                 var old_name = names[0].name; | ||||
|                                 db.collection("user_names").update({"_id": "all_names"}, {$pull: {names: old_name}}, function() {}); | ||||
|                             } | ||||
|                             var updateElement = {$set: {name: name, icon: icon}}; | ||||
|                             if(data.hasOwnProperty("channel") && data.channel != "") { | ||||
|                                 updateElement["$addToSet"] = {channels: data.channel}; | ||||
|                             } | ||||
|                             db.collection("user_names").update({"guid": guid}, updateElement, {upsert: true}, function(err, docs) { | ||||
|                                 db.collection("user_names").update({"_id": "all_names"}, {$addToSet: {names: name}}, function(err, docs) { | ||||
|                                     //socket.emit('name', {type: "name", accepted: true}); | ||||
|                                     if(old_name != name && !first && !no_name) { | ||||
|                                         if(data.hasOwnProperty("channel") && typeof(data.channel) == "string") { | ||||
|                                             io.to(data.channel).emit('chat', {from: old_name, msg: " changed name to " + name}); | ||||
|                                             io.sockets.emit('chat.all', {from: old_name , msg: " changed name to " + name, channel: data.channel}); | ||||
|                                         } | ||||
|                                     } | ||||
|                                     if(callback != undefined && typeof(callback) == "function") callback(); | ||||
|                                 }); | ||||
|                             }); | ||||
|                         } else { | ||||
|                             if(tried < 3 || tried == undefined) { | ||||
|                                 if(tried == undefined) { | ||||
|                                     tried = 1; | ||||
|                                 } | ||||
|                                 namechange(data, guid, socket, tried + 1); | ||||
|                             } | ||||
|                         } | ||||
|                     }); | ||||
|                 } else { | ||||
|                     Functions.removeSessionChatPass(Functions.getSession(socket), function() { | ||||
|                         socket.emit('name', {type: "name", accepted: false}); | ||||
|                     }); | ||||
|                 } | ||||
|             }); | ||||
|         }); | ||||
|     }); | ||||
| } | ||||
|  | ||||
| function removename(guid, coll, socket) { | ||||
|     //coll = coll.replace(/ /g,''); | ||||
|     db.collection("user_names").find({"guid": guid}, function(err, docs) { | ||||
|         if(docs.length == 1) { | ||||
|             var old_name = docs[0].name; | ||||
|             Functions.removeSessionChatPass(Functions.getSession(socket), function() { | ||||
|                 db.collection("user_names").update({"_id": "all_names"}, {$pull: {names: old_name}}, function(err, updated) { | ||||
|                     db.collection("user_names").remove({"guid": guid}, function(err, removed) { | ||||
|                         get_name(guid, {announce: true, old_name: old_name, channel: coll}); | ||||
|     checkIfChatEnabled(coll, socket, function() { | ||||
|         db.collection("user_names").find({"guid": guid}, function(err, docs) { | ||||
|             if(docs.length == 1) { | ||||
|                 var old_name = docs[0].name; | ||||
|                 Functions.removeSessionChatPass(Functions.getSession(socket), function() { | ||||
|                     db.collection("user_names").update({"_id": "all_names"}, {$pull: {names: old_name}}, function(err, updated) { | ||||
|                         db.collection("user_names").remove({"guid": guid}, function(err, removed) { | ||||
|                             get_name(guid, {announce: true, old_name: old_name, channel: coll}); | ||||
|                         }); | ||||
|                     }); | ||||
|                 }); | ||||
|             }); | ||||
|         } | ||||
|             } | ||||
|         }); | ||||
|     }); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -180,9 +180,9 @@ function conf_function(params, coll, guid, offline, socket) { | ||||
|             var adminpass = params.adminpass; | ||||
|             var skipping = params.skipping; | ||||
|             var shuffling = params.shuffling; | ||||
|             var toggleChat = params.toggleChat; | ||||
|             var userpass = Functions.decrypt_string(params.userpass); | ||||
|  | ||||
|  | ||||
|             if((!params.userpass_changed && frontpage) || (params.userpass_changed && userpass == "")) { | ||||
|                 userpass = ""; | ||||
|             } else if(params.userpass_changed && userpass != "") { | ||||
| @@ -212,6 +212,7 @@ function conf_function(params, coll, guid, offline, socket) { | ||||
|                         longsongs:longsongs, | ||||
|                         adminpass:hash, | ||||
|                         desc: description, | ||||
|                         toggleChat: toggleChat | ||||
|                     }; | ||||
|                     if(params.userpass_changed) { | ||||
|                         obj["userpass"] = userpass; | ||||
| @@ -220,7 +221,7 @@ function conf_function(params, coll, guid, offline, socket) { | ||||
|                     } | ||||
|                     db.collection(coll + "_settings").update({ id: "config" }, { | ||||
|                         $set:obj | ||||
|                     }, function(err, docs){ | ||||
|                     }, {upsert: true}, function(err, docs){ | ||||
|                         Functions.setSessionUserPass(Functions.getSession(socket), params.userpass, coll, function() { | ||||
|                             db.collection(coll + "_settings").find(function(err, docs){ | ||||
|                                 if(docs[0].adminpass !== "") docs[0].adminpass = true; | ||||
|   | ||||
| @@ -22,7 +22,7 @@ var Admin = { | ||||
|         } | ||||
|         Helper.removeClass(".delete-context-menu", "context-menu-disabled"); | ||||
|         names     = ["vote","addsongs","longsongs","frontpage", "allvideos", | ||||
|         "removeplay", "skip", "shuffle", "userpass"]; | ||||
|         "removeplay", "skip", "shuffle", "userpass", "toggleChat"]; | ||||
|         //Crypt.set_pass(chan.toLowerCase(), Crypt.tmp_pass); | ||||
|  | ||||
|         for (var i = 0; i < names.length; i++) { | ||||
| @@ -105,7 +105,7 @@ var Admin = { | ||||
|         w_p       = true; | ||||
|         adminpass = ""; | ||||
|         names     = ["vote","addsongs","longsongs","frontpage", "allvideos", | ||||
|         "removeplay", "skip", "shuffle"]; | ||||
|         "removeplay", "skip", "shuffle", "toggleChat"]; | ||||
|         document.getElementById("password").value = ""; | ||||
|         Helper.css("#thumbnail_form", "display", "none"); | ||||
|         Helper.css("#description_form", "display", "none"); | ||||
| @@ -146,9 +146,9 @@ var Admin = { | ||||
|         music     = conf_array.allvideos; | ||||
|         longsongs = conf_array.longsongs; | ||||
|         names     = ["vote","addsongs","longsongs","frontpage", "allvideos", | ||||
|         "removeplay", "skip", "shuffle", "userpass"]; | ||||
|  | ||||
|  | ||||
|         "removeplay", "skip", "shuffle", "userpass", "toggleChat"]; | ||||
|         if(!conf.hasOwnProperty("toggleChat")) conf.toggleChat = true; | ||||
|         toggleChat = conf.toggleChat; | ||||
|         hasadmin = conf_array.adminpass != ""; | ||||
|         var show_disabled = true; | ||||
|         if(hasadmin && Admin.logged_in || !hasadmin) { | ||||
| @@ -197,6 +197,8 @@ var Admin = { | ||||
|         removeplay = form.removeplay.checked; | ||||
|         skipping   = form.skip.checked; | ||||
|         shuffling  = form.shuffle.checked; | ||||
|         toggleChat = form.toggleChat.checked; | ||||
|  | ||||
|         var pass_send = userpass_changed && !form.userpass.checked ? "" : userpass; | ||||
|         configs = { | ||||
|             channel: chan.toLowerCase(), | ||||
| @@ -209,6 +211,7 @@ var Admin = { | ||||
|             adminpass: adminpass == "" ? "" : Crypt.crypt_pass(adminpass), | ||||
|             skipping: skipping, | ||||
|             shuffling: shuffling, | ||||
|             toggleChat: toggleChat, | ||||
|             userpass: Crypt.crypt_pass(pass_send), | ||||
|             userpass_changed: userpass_changed | ||||
|         }; | ||||
|   | ||||
| @@ -137,7 +137,7 @@ var Chat = { | ||||
|     }, | ||||
|  | ||||
|     channelchat: function(data, time_sent, disable_blink) { | ||||
|         if(data.msg.substring(0,1) == ":" && !chat_active && !disable_blink) { | ||||
|         if(data.msg.substring(0,1) == ":" && !chat_active && !disable_blink && data.from.toLowerCase() != "system") { | ||||
|             document.querySelector("#favicon").setAttribute("href", "/assets/images/highlogo.png"); | ||||
|             unseen = true; | ||||
|             chat_unseen = true; | ||||
|   | ||||
| @@ -49,6 +49,7 @@ var frontpage = 1; | ||||
| var adminpass = ""; | ||||
| var showDiscovery = false; | ||||
| var player_ready = false; | ||||
| var toggleChat = true; | ||||
| var viewers = 1; | ||||
| var temp_user_pass = ""; | ||||
| var zoff_api_token = "DwpnKVkaMH2HdcpJT2YPy783SY33byF5/32rbs0+xdU="; | ||||
|   | ||||
| @@ -3,148 +3,7 @@ | ||||
|     <i class="material-icons auto-margin">close</i> | ||||
| </div> | ||||
| <ul class="collapsible collapsible-accordion settings-collapsible"> | ||||
|     <li class="no-padding"> | ||||
|         <div class="col s9 collapsible-header bold waves-effect admin-settings"> | ||||
|             Channel Settings | ||||
|             <i class="material-icons">tune</i> | ||||
|         </div> | ||||
|         <div class="collapsible-body"> | ||||
|             <ul> | ||||
|                 <form action="#" id="adminForm" onsubmit="return false;"> | ||||
|  | ||||
|                     <li class="white-bg"> | ||||
|                         <div class="input-field field-settings"> | ||||
|                             <i id="admin-lock" class="material-icons">lock</i> | ||||
|                             <input placeholder="Enter admin password" id="password" type="password" class="validate" /> | ||||
|                         </div> | ||||
|                     </li> | ||||
|                     <li> | ||||
|                         <span class="switch-text"> | ||||
|                             Add songs | ||||
|                         </span> | ||||
|                         <div class="switch"> | ||||
|                             <label> | ||||
|                                 <span class="left-span">Anyone</span> | ||||
|                                 <input name="addsongs" type="checkbox" class="conf" /><span class="lever"></span> | ||||
|                                 <span class="right-span">Admin</span> | ||||
|                             </label> | ||||
|                         </div> | ||||
|                     </li> | ||||
|  | ||||
|                     <li> | ||||
|                         <span class="switch-text"> | ||||
|                             Vote | ||||
|                         </span> | ||||
|                         <div class="switch"> | ||||
|                             <label> | ||||
|                                 <span class="left-span">Anyone</span> | ||||
|                                 <input name="vote" type="checkbox" class="conf" /><span class="lever"></span> | ||||
|                                 <span class="right-span">Admin</span> | ||||
|                             </label> | ||||
|                         </div> | ||||
|                     </li> | ||||
|  | ||||
|                     <li> | ||||
|                         <span class="switch-text"> | ||||
|                             Shuffle | ||||
|                         </span> | ||||
|                         <div class="switch"> | ||||
|                             <label> | ||||
|                                 <span class="left-span">Anyone</span> | ||||
|                                 <input name="shuffle" type="checkbox" class="conf" /><span class="lever"></span> | ||||
|                                 <span class="right-span">Admin</span> | ||||
|                             </label> | ||||
|                         </div> | ||||
|                     </li> | ||||
|  | ||||
|                     <li> | ||||
|                         <span class="switch-text"> | ||||
|                             Skip | ||||
|                         </span> | ||||
|                         <div class="switch"> | ||||
|                             <label> | ||||
|                                 <span class="left-span">Anyone</span> | ||||
|                                 <input name="skip" type="checkbox" class="conf" /><span class="lever"></span> | ||||
|                                 <span class="right-span">Admin</span> | ||||
|                             </label> | ||||
|                         </div> | ||||
|                     </li> | ||||
|  | ||||
|                     <li> | ||||
|                         <span class="switch-text"> | ||||
|                             Song length | ||||
|                         </span> | ||||
|                         <div class="switch"> | ||||
|                             <label> | ||||
|                                 <span class="left-span">Any</span> | ||||
|                                 <input name="longsongs" type="checkbox" class="conf" /><span class="lever"></span> | ||||
|                                 <span class="right-span">Short</span> | ||||
|                             </label> | ||||
|                         </div> | ||||
|                     </li> | ||||
|  | ||||
|                     <li> | ||||
|                         <span class="switch-text"> | ||||
|                             Type | ||||
|                         </span> | ||||
|                         <div class="switch"> | ||||
|                             <label> | ||||
|                                 <span class="left-span">Any</span> | ||||
|                                 <input name="allvideos" type="checkbox" class="conf" /><span class="lever"></span> | ||||
|                                 <span class="right-span">Song</span> | ||||
|                             </label> | ||||
|                         </div> | ||||
|                     </li> | ||||
|  | ||||
|  | ||||
|                     <li> | ||||
|                         <span class="switch-text"> | ||||
|                             Frontpage | ||||
|                         </span> | ||||
|                         <div class="switch"> | ||||
|                             <label> | ||||
|                                 <span class="left-span">Hide</span> | ||||
|                                 <input name="frontpage" type="checkbox" class="conf" /><span class="lever"></span> | ||||
|                                 <span class="right-span">Display</span> | ||||
|                             </label> | ||||
|                         </div> | ||||
|                     </li> | ||||
|  | ||||
|                     <li> | ||||
|                         <span class="switch-text"> | ||||
|                             After play | ||||
|                         </span> | ||||
|                         <div class="switch"> | ||||
|                             <label> | ||||
|                                 <span class="left-span">Keep</span> | ||||
|                                 <input name="removeplay" type="checkbox" class="conf" /><span class="lever"></span> | ||||
|                                 <span class="right-span">Remove</span> | ||||
|                             </label> | ||||
|                         </div> | ||||
|                     </li> | ||||
|                     <li class="user-password-li hide"> | ||||
|                         <span class="switch-text"> | ||||
|                             Channel password | ||||
|                         </span> | ||||
|                         <div class="switch"> | ||||
|                             <label> | ||||
|                                 <span class="left-span">No</span> | ||||
|                                 <input name="userpass" type="checkbox" class="conf password_protected" /><span class="lever"></span> | ||||
|                                 <span class="right-span">Yes</span> | ||||
|                             </label> | ||||
|                         </div> | ||||
|                     </li> | ||||
|                 </form> | ||||
|  | ||||
|                 <li class="change_user_pass hide"> | ||||
|                     <a href="#!" class="change_user_pass_btn btn waves-effect blue">Change password</a> | ||||
|                 </li> | ||||
|                 <li class="delete-all hide"> | ||||
|                     <a href="#" class="delete-all-songs btn red">Delete all songs</a> | ||||
|                 </li> | ||||
|             </ul> | ||||
|         </div> | ||||
|     </li> | ||||
|     {{> channel/settings}} | ||||
|     <li class="no-padding"> | ||||
|         <div class="collapsible-header bold waves-effect">Channel Info | ||||
|             <i class="material-icons">info_outline</i> | ||||
|   | ||||
		Reference in New Issue
	
	Block a user