mirror of https://github.com/calzoneman/sync.git
Add editors for CSS and JS
This commit is contained in:
parent
b3cb87aab6
commit
a8d8f346d4
43
channel.js
43
channel.js
|
@ -75,6 +75,9 @@ var Channel = function(name) {
|
||||||
time: "00:00"
|
time: "00:00"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.css = "";
|
||||||
|
this.js = "";
|
||||||
|
|
||||||
Database.loadChannel(this);
|
Database.loadChannel(this);
|
||||||
if(this.registered) {
|
if(this.registered) {
|
||||||
this.loadDump();
|
this.loadDump();
|
||||||
|
@ -152,6 +155,9 @@ Channel.prototype.loadDump = function() {
|
||||||
for(var i = 0; i < this.chatbuffer.length; i++) {
|
for(var i = 0; i < this.chatbuffer.length; i++) {
|
||||||
this.sendAll("chatMsg", this.chatbuffer[i]);
|
this.sendAll("chatMsg", this.chatbuffer[i]);
|
||||||
}
|
}
|
||||||
|
this.css = data.css || "";
|
||||||
|
this.js = data.js || "";
|
||||||
|
this.sendAll("channelCSSJS", {css: this.css, js: this.js});
|
||||||
setTimeout(function() { incrementalDump(this); }, 300000);
|
setTimeout(function() { incrementalDump(this); }, 300000);
|
||||||
}
|
}
|
||||||
catch(e) {
|
catch(e) {
|
||||||
|
@ -175,7 +181,9 @@ Channel.prototype.saveDump = function() {
|
||||||
motd: this.motd,
|
motd: this.motd,
|
||||||
logins: this.logins,
|
logins: this.logins,
|
||||||
openqueue: this.openqueue,
|
openqueue: this.openqueue,
|
||||||
chatbuffer: this.chatbuffer
|
chatbuffer: this.chatbuffer,
|
||||||
|
css: this.css,
|
||||||
|
js: this.js
|
||||||
};
|
};
|
||||||
var text = JSON.stringify(dump);
|
var text = JSON.stringify(dump);
|
||||||
fs.writeFileSync("chandump/" + this.name, text);
|
fs.writeFileSync("chandump/" + this.name, text);
|
||||||
|
@ -378,6 +386,7 @@ Channel.prototype.userJoin = function(user) {
|
||||||
user.socket.emit("queueLock", {locked: !this.openqueue});
|
user.socket.emit("queueLock", {locked: !this.openqueue});
|
||||||
this.sendUserlist(user);
|
this.sendUserlist(user);
|
||||||
this.sendRecentChat(user);
|
this.sendRecentChat(user);
|
||||||
|
user.socket.emit("channelCSSJS", {css: this.css, js: this.js});
|
||||||
if(this.poll) {
|
if(this.poll) {
|
||||||
user.socket.emit("newPoll", this.poll.packUpdate());
|
user.socket.emit("newPoll", this.poll.packUpdate());
|
||||||
}
|
}
|
||||||
|
@ -1225,6 +1234,38 @@ Channel.prototype.tryUpdateOptions = function(user, data) {
|
||||||
this.broadcastOpts();
|
this.broadcastOpts();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Channel.prototype.trySetCSS = function(user, data) {
|
||||||
|
if(!Rank.hasPermission(user, "setcss")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var css = data.css || "";
|
||||||
|
if(css.length > 20000) {
|
||||||
|
css = css.substring(0, 20000);
|
||||||
|
}
|
||||||
|
this.css = css;
|
||||||
|
this.sendAll("channelCSSJS", {
|
||||||
|
css: this.css,
|
||||||
|
js: this.js
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Channel.prototype.trySetJS = function(user, data) {
|
||||||
|
if(!Rank.hasPermission(user, "setjs")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var js = data.js || "";
|
||||||
|
if(js.length > 20000) {
|
||||||
|
js = js.substring(0, 20000);
|
||||||
|
}
|
||||||
|
this.js = js;
|
||||||
|
this.sendAll("channelCSSJS", {
|
||||||
|
css: this.css,
|
||||||
|
js: this.js
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
Channel.prototype.updateMotd = function(motd) {
|
Channel.prototype.updateMotd = function(motd) {
|
||||||
var html = motd.replace(/\n/g, "<br>");
|
var html = motd.replace(/\n/g, "<br>");
|
||||||
//html = this.filterMessage(html);
|
//html = this.filterMessage(html);
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
"author": "Calvin Montgomery",
|
"author": "Calvin Montgomery",
|
||||||
"name": "CyTube",
|
"name": "CyTube",
|
||||||
"description": "Online media synchronizer and chat",
|
"description": "Online media synchronizer and chat",
|
||||||
"version": "1.7.4",
|
"version": "1.7.5",
|
||||||
"repository": {
|
"repository": {
|
||||||
"url": "http://github.com/calzoneman/sync"
|
"url": "http://github.com/calzoneman/sync"
|
||||||
},
|
},
|
||||||
|
|
2
rank.js
2
rank.js
|
@ -21,6 +21,8 @@ var permissions = {
|
||||||
registerChannel : exports.Owner,
|
registerChannel : exports.Owner,
|
||||||
acl : exports.Owner,
|
acl : exports.Owner,
|
||||||
chatFilter : exports.Owner,
|
chatFilter : exports.Owner,
|
||||||
|
setcss : exports.Owner,
|
||||||
|
setjs : exports.Owner,
|
||||||
queue : exports.Moderator,
|
queue : exports.Moderator,
|
||||||
assignLeader : exports.Moderator,
|
assignLeader : exports.Moderator,
|
||||||
kick : exports.Moderator,
|
kick : exports.Moderator,
|
||||||
|
|
|
@ -9,7 +9,7 @@ The above copyright notice and this permission notice shall be included in all c
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const VERSION = "1.7.4";
|
const VERSION = "1.7.5";
|
||||||
|
|
||||||
var fs = require("fs");
|
var fs = require("fs");
|
||||||
var Logger = require("./logger.js");
|
var Logger = require("./logger.js");
|
||||||
|
|
12
user.js
12
user.js
|
@ -323,6 +323,18 @@ User.prototype.initCallbacks = function() {
|
||||||
}
|
}
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
|
|
||||||
|
this.socket.on("setChannelCSS", function(data) {
|
||||||
|
if(this.channel != null) {
|
||||||
|
this.channel.trySetCSS(this, data);
|
||||||
|
}
|
||||||
|
}.bind(this));
|
||||||
|
|
||||||
|
this.socket.on("setChannelJS", function(data) {
|
||||||
|
if(this.channel != null) {
|
||||||
|
this.channel.trySetJS(this, data);
|
||||||
|
}
|
||||||
|
}.bind(this));
|
||||||
|
|
||||||
this.socket.on("chatFilter", function(data) {
|
this.socket.on("chatFilter", function(data) {
|
||||||
if(this.channel != null) {
|
if(this.channel != null) {
|
||||||
this.channel.tryChangeFilter(this, data);
|
this.channel.tryChangeFilter(this, data);
|
||||||
|
|
|
@ -202,10 +202,14 @@ html, body {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
#motdtext {
|
#motdtext, #csstext, #jstext {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#csstext, #jstext {
|
||||||
|
font-family: Monospace;
|
||||||
|
}
|
||||||
|
|
||||||
#queue_next, #queue_end, #library_search, #youtube_search {
|
#queue_next, #queue_end, #library_search, #youtube_search {
|
||||||
width: 50%;
|
width: 50%;
|
||||||
}
|
}
|
||||||
|
|
|
@ -227,6 +227,29 @@ Callbacks = {
|
||||||
rebuildPlaylist();
|
rebuildPlaylist();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
channelCSSJS: function(data) {
|
||||||
|
console.log("recv cssjs", data);
|
||||||
|
$("#chancss").remove();
|
||||||
|
$("#chanjs").remove();
|
||||||
|
|
||||||
|
$("#csstext").val(data.css);
|
||||||
|
$("#jstext").val(data.js);
|
||||||
|
|
||||||
|
if(data.css) {
|
||||||
|
$("<style/>").attr("type", "text/css")
|
||||||
|
.attr("id", "chancss")
|
||||||
|
.text(data.css)
|
||||||
|
.appendTo($("head"));
|
||||||
|
}
|
||||||
|
|
||||||
|
if(data.js) {
|
||||||
|
$("<script/>").attr("type", "text/javascript")
|
||||||
|
.attr("id", "chanjs")
|
||||||
|
.text(data.js)
|
||||||
|
.appendTo($("body"));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
banlist: function(data) {
|
banlist: function(data) {
|
||||||
var entries = data.entries;
|
var entries = data.entries;
|
||||||
var tbl = $("#banlist table");
|
var tbl = $("#banlist table");
|
||||||
|
|
|
@ -413,6 +413,36 @@ $("#show_motdeditor").click(function() {
|
||||||
$("#motdeditor").show();
|
$("#motdeditor").show();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$("#show_csseditor").click(function() {
|
||||||
|
$("#modnav li").each(function() {
|
||||||
|
$(this).removeClass("active");
|
||||||
|
});
|
||||||
|
$(".modonly").hide();
|
||||||
|
$("#show_csseditor").parent().addClass("active");
|
||||||
|
$("#csseditor").show();
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#updatecss").click(function() {
|
||||||
|
socket.emit("setChannelCSS", {
|
||||||
|
css: $("#csstext").val()
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#show_jseditor").click(function() {
|
||||||
|
$("#modnav li").each(function() {
|
||||||
|
$(this).removeClass("active");
|
||||||
|
});
|
||||||
|
$(".modonly").hide();
|
||||||
|
$("#show_jseditor").parent().addClass("active");
|
||||||
|
$("#jseditor").show();
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#updatejs").click(function() {
|
||||||
|
socket.emit("setChannelJS", {
|
||||||
|
js: $("#jstext").val()
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
$("#show_filtereditor").click(function() {
|
$("#show_filtereditor").click(function() {
|
||||||
if(RANK >= Rank.Owner) {
|
if(RANK >= Rank.Owner) {
|
||||||
$("#modnav li").each(function() {
|
$("#modnav li").each(function() {
|
||||||
|
|
|
@ -654,6 +654,14 @@ function handleRankChange() {
|
||||||
$("#clearplaylist").css("display", "none");
|
$("#clearplaylist").css("display", "none");
|
||||||
$("#shuffleplaylist").css("display", "none");
|
$("#shuffleplaylist").css("display", "none");
|
||||||
}
|
}
|
||||||
|
if(RANK >= Rank.Owner) {
|
||||||
|
$("#show_jseditor").parent().css("display", "");
|
||||||
|
$("#show_csseditor").parent().css("display", "");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$("#show_jseditor").parent().css("display", "none");
|
||||||
|
$("#show_csseditor").parent().css("display", "none");
|
||||||
|
}
|
||||||
if(RANK >= 10) {
|
if(RANK >= 10) {
|
||||||
$("#drop_channel").parent().css("display", "");
|
$("#drop_channel").parent().css("display", "");
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,7 +54,6 @@ Media.prototype.nullPlayer = function() {
|
||||||
|
|
||||||
Media.prototype.initYouTube = function() {
|
Media.prototype.initYouTube = function() {
|
||||||
this.removeOld();
|
this.removeOld();
|
||||||
console.log("init YouTube");
|
|
||||||
this.player = new YT.Player("ytapiplayer", {
|
this.player = new YT.Player("ytapiplayer", {
|
||||||
height: VHEIGHT,
|
height: VHEIGHT,
|
||||||
width: VWIDTH,
|
width: VWIDTH,
|
||||||
|
|
|
@ -134,6 +134,12 @@
|
||||||
<li>
|
<li>
|
||||||
<a href="javascript:void(0)" id="show_motdeditor">MOTD</a>
|
<a href="javascript:void(0)" id="show_motdeditor">MOTD</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li style="display: none">
|
||||||
|
<a href="javascript:void(0)" id="show_csseditor">CSS Editor</a>
|
||||||
|
</li>
|
||||||
|
<li style="display: none">
|
||||||
|
<a href="javascript:void(0)" id="show_jseditor">JS Editor</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="javascript:void(0)" id="show_filtereditor">Chat Filters</a>
|
<a href="javascript:void(0)" id="show_filtereditor">Chat Filters</a>
|
||||||
</li>
|
</li>
|
||||||
|
@ -242,6 +248,20 @@
|
||||||
<button class="btn btn-primary" id="updatemotd">Update</button>
|
<button class="btn btn-primary" id="updatemotd">Update</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row modonly" id="csseditor" style="display: none;">
|
||||||
|
<div class="span12">
|
||||||
|
<p>Max 20KB. If you need more CSS, host the file somewhere and use the External CSS channel option</p>
|
||||||
|
<textarea rows="10" id="csstext"></textarea>
|
||||||
|
<button class="btn btn-primary" id="updatecss">Update</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row modonly" id="jseditor" style="display: none;">
|
||||||
|
<div class="span12">
|
||||||
|
<p>Max 20KB. If you need more JS, host the file somewhere and use the External JS channel option</p>
|
||||||
|
<textarea rows="10" id="jstext"></textarea>
|
||||||
|
<button class="btn btn-primary" id="updatejs">Update</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="row modonly" id="filtereditor" style="display: none;">
|
<div class="row modonly" id="filtereditor" style="display: none;">
|
||||||
<div class="span12">
|
<div class="span12">
|
||||||
<p><strong>Note:</strong> if you just want simple word replacement, like emoticons, put the word in the Regex field, use <code>ig</code> for the flags, and put the replacement in the Replacement field.</p>
|
<p><strong>Note:</strong> if you just want simple word replacement, like emoticons, put the word in the Regex field, use <code>ig</code> for the flags, and put the replacement in the Replacement field.</p>
|
||||||
|
|
Loading…
Reference in New Issue