Start merging cytube3 account management
This commit is contained in:
parent
8d2587cebd
commit
b889f7b4c8
34 changed files with 20908 additions and 1 deletions
1774
www/js/bootstrap.js
vendored
Normal file
1774
www/js/bootstrap.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
11
www/js/bootstrap.min.js
vendored
Normal file
11
www/js/bootstrap.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
39
www/js/callbacks.js
Normal file
39
www/js/callbacks.js
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
var Callbacks = {
|
||||
/* Connection failed */
|
||||
error: function (reason) {
|
||||
if (reason && reason.returnValue === true) {
|
||||
return;
|
||||
}
|
||||
|
||||
var fail = $('<div/>').addClass('alert alert-error')
|
||||
.appendTo($('#announcements'));
|
||||
|
||||
$('<h3/>').text('Uh-oh!').appendTo(fail);
|
||||
$('<p/>').html('The socket.io connection failed. Please check that '+
|
||||
'the connection was not blocked by a firewall or '+
|
||||
'antivirus software.');
|
||||
},
|
||||
|
||||
/* Connection succeeded */
|
||||
connect: function () {
|
||||
socket.emit('join', {
|
||||
channel: CHANNEL
|
||||
});
|
||||
|
||||
/* if rejoining after the connection failed, resend password */
|
||||
if (CHANNEL.opts.password) {
|
||||
socket.once('needPassword', function () {
|
||||
socket.emit('channelPassword', {
|
||||
password: CHANNEL.opts.password
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/* guest login */
|
||||
if (NAME && !LOGGEDIN) {
|
||||
socket.emit('login', {
|
||||
name: NAME
|
||||
});
|
||||
}
|
||||
},
|
||||
};
|
||||
184
www/js/functions.js
Normal file
184
www/js/functions.js
Normal file
|
|
@ -0,0 +1,184 @@
|
|||
|
||||
function addVideo(data, position) {
|
||||
var item = $('<li/>');
|
||||
item.data('id', data.id);
|
||||
item.data('temp', data.temp);
|
||||
var btnstrip = $('<div/>').addClass('btn-group video-buttons')
|
||||
.appendTo(item);
|
||||
var title = $('<a/>', {
|
||||
href: videoLink(data.id),
|
||||
target: '_blank',
|
||||
class: 'video-title'
|
||||
}).text(data.title).appendTo(item);
|
||||
var duration = $('<span/>').addClass('video-time')
|
||||
.text(formatTime(data.duration))
|
||||
.appendTo(item);
|
||||
|
||||
if (position === 'first') {
|
||||
item.prependTo($('#playlist'));
|
||||
} else if (position === 'last') {
|
||||
item.appendTo($('#playlist'));
|
||||
} else {
|
||||
var prev = findVideo(position);
|
||||
if (prev.length > 0) {
|
||||
item.insertAfter(prev);
|
||||
}
|
||||
}
|
||||
addVideoButtons(item);
|
||||
return item;
|
||||
}
|
||||
|
||||
function addVideoButtons(li) {
|
||||
var btns = li.find('.video-buttons');
|
||||
if (btns.length === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (can('playlistjump')) {
|
||||
$('<button/>').addClass('btn btn-xs btn-default')
|
||||
.html('<span class="glyphicon glyphicon-play"></span>')
|
||||
.click(function () {
|
||||
SOCKET.emit('playVideo', {
|
||||
id: li.data('id')
|
||||
});
|
||||
})
|
||||
.appendTo(btns);
|
||||
}
|
||||
|
||||
if (can('playlistmove')) {
|
||||
$('<button/>').addClass('btn btn-xs btn-default')
|
||||
.html('<span class="glyphicon glyphicon-share-alt"></span>')
|
||||
.click(function () {
|
||||
SOCKET.emit('moveVideo', {
|
||||
id: li.data('id'),
|
||||
after: CURRENT.id
|
||||
});
|
||||
})
|
||||
.appendTo(btns);
|
||||
}
|
||||
|
||||
if (can('playlistsettemp')) {
|
||||
$('<button/>').addClass('btn btn-xs btn-default')
|
||||
.html('<span class="glyphicon glyphicon-flag"></span>')
|
||||
.click(function () {
|
||||
SOCKET.emit('setTemp', {
|
||||
id: li.data('id'),
|
||||
temp: !li.data('temp')
|
||||
});
|
||||
})
|
||||
.appendTo(btns);
|
||||
}
|
||||
|
||||
if (can('playlistsettemp')) {
|
||||
$('<button/>').addClass('btn btn-xs btn-default')
|
||||
.html('<span class="glyphicon glyphicon-trash"></span>')
|
||||
.click(function () {
|
||||
SOCKET.emit('deleteVideo', {
|
||||
id: li.data('id'),
|
||||
temp: !li.data('temp')
|
||||
});
|
||||
})
|
||||
.appendTo(btns);
|
||||
}
|
||||
}
|
||||
|
||||
function videoLink(data) {
|
||||
data = data.split(':');
|
||||
var type = data[0];
|
||||
var id = data[1];
|
||||
if (type === void 0 || id === void 0) {
|
||||
return '#';
|
||||
}
|
||||
|
||||
switch(type) {
|
||||
case 'yt':
|
||||
return 'http://youtu.be/' + id;
|
||||
default:
|
||||
return '#';
|
||||
}
|
||||
}
|
||||
|
||||
function formatTime(seconds) {
|
||||
var h = parseInt(seconds / 3600);
|
||||
var m = parseInt((seconds % 3600) / 60);
|
||||
var s = seconds % 60;
|
||||
|
||||
var time = '';
|
||||
if (h !== 0) {
|
||||
h = '' + h;
|
||||
if (h.length < 2) {
|
||||
h = '0' + h;
|
||||
}
|
||||
time += h + ':';
|
||||
}
|
||||
|
||||
m = '' + m;
|
||||
if (m.length < 2) {
|
||||
m = '0' + m;
|
||||
}
|
||||
time += m + ':';
|
||||
|
||||
s = '' + s;
|
||||
if (s.lengts < 2) {
|
||||
s = '0' + s;
|
||||
}
|
||||
time += s;
|
||||
|
||||
return time;
|
||||
}
|
||||
|
||||
function addChatMessage(data, buffer) {
|
||||
var last = buffer.data('lastmessagename');
|
||||
var div = $('<div/>').addClass('chatmsg')
|
||||
.addClass('chatmsg-' + data.name);
|
||||
var timestamp = $('<span/>').addClass('chat-timestamp').appendTo(div)
|
||||
.text('[' + new Date(data.time).toTimeString().split(' ')[0] + '] ');
|
||||
var username = $('<span/>').addClass('chat-name').appendTo(div);
|
||||
var message = $('<span/>').appendTo(div).text(data.message);
|
||||
if (data.msgclass === 'action') {
|
||||
username.text(data.name + ' ');
|
||||
} else {
|
||||
username.text(data.name + ': ');
|
||||
}
|
||||
switch(data.msgclass) {
|
||||
case 'action':
|
||||
timestamp.addClass('action');
|
||||
username.addClass('action');
|
||||
message.addClass('action');
|
||||
break;
|
||||
case 'spoiler':
|
||||
message.addClass('spoiler');
|
||||
break;
|
||||
case 'greentext':
|
||||
message.addClass('greentext');
|
||||
break;
|
||||
case 'shout':
|
||||
timestamp.addClass('shout');
|
||||
username.addClass('shout');
|
||||
message.addClass('shout');
|
||||
break;
|
||||
case 'drink':
|
||||
div.addClass('drink');
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (!data.msgclass.match(/action|shout|drink/) &&
|
||||
data.name === last) {
|
||||
if (!data.message.match(/^\s*<strong>.+?\s*:/)) {
|
||||
username.remove();
|
||||
}
|
||||
}
|
||||
buffer.data('lastmessagename', data.name);
|
||||
|
||||
if (data.flair) {
|
||||
username.addClass(data.flair);
|
||||
}
|
||||
|
||||
div.appendTo(buffer);
|
||||
}
|
||||
|
||||
function can(what) {
|
||||
return true;
|
||||
}
|
||||
152
www/js/init.js
Normal file
152
www/js/init.js
Normal file
|
|
@ -0,0 +1,152 @@
|
|||
/* Local client data */
|
||||
var RANK = -1;
|
||||
var LEADER = false;
|
||||
var LEADTIMER = false;
|
||||
var PL_DRAGFROM = false;
|
||||
var PL_DRAGTO = false;
|
||||
var PL_CURRENT
|
||||
var NAME = false;
|
||||
var LOGGEDIN = false;
|
||||
var SUPERADMIN = false;
|
||||
/* Channel data */
|
||||
var CHANNEL = {
|
||||
opts: {},
|
||||
openqueue: false,
|
||||
perms: {},
|
||||
css: '',
|
||||
js: '',
|
||||
motd: '',
|
||||
motd_text: '',
|
||||
name: false,
|
||||
usercount: 0
|
||||
};
|
||||
|
||||
/* Video player data */
|
||||
var PLAYER = false;
|
||||
|
||||
/* Chat data */
|
||||
var IGNORED = [];
|
||||
var CHATHIST = [];
|
||||
var CHATTHROTTLE = false;
|
||||
var SCROLLCHAT = true;
|
||||
var LASTCHATNAME = false;
|
||||
var LASTCHATTIME = 0;
|
||||
var CHATSOUND = new Audio('/sounds/boop.wav');
|
||||
|
||||
/* Page data */
|
||||
var FOCUSED = true;
|
||||
var PAGETITLE = 'CyTube';
|
||||
var TITLE_BLINK = false;
|
||||
|
||||
/* Playlist data */
|
||||
var PLAYLIST = {
|
||||
from: false,
|
||||
to: false,
|
||||
current: false,
|
||||
waitScroll: false
|
||||
};
|
||||
|
||||
/* Check if localStorage is available */
|
||||
var NOSTORAGE = typeof localStorage === 'undefined' || localStorage === null;
|
||||
|
||||
/**
|
||||
* Retrieve an option from localStorage, or from a cookie
|
||||
* if localStorage is not available
|
||||
*/
|
||||
function getOpt(k) {
|
||||
return NOSTORAGE ? readCookie(k) : localStorage.getItem(k);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save an option to localStorage, or to a cookie
|
||||
* if localStorage is not available
|
||||
*/
|
||||
function setOpt(k, v) {
|
||||
if (NOSTORAGE) {
|
||||
setCookie(k, v, 1000)
|
||||
} else {
|
||||
localStorage.setItem(k, v);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a stored value, or return the default if the stored value
|
||||
* is null. Also handles parsing of values stored as strings.
|
||||
*/
|
||||
function getOrDefault(k, def) {
|
||||
var v = getOpt(k);
|
||||
if (v == null) {
|
||||
return def;
|
||||
} else if (v === 'true') {
|
||||
return true;
|
||||
} else if (v === 'false') {
|
||||
return false;
|
||||
} else if (v.match(/^\d+$/)) {
|
||||
return parseInt(v);
|
||||
} else if (v.match(/^[\d\.]+$/)) {
|
||||
return parseFloat(v);
|
||||
} else {
|
||||
return v;
|
||||
}
|
||||
}
|
||||
|
||||
/* User options */
|
||||
var USEROPTS = {
|
||||
theme : getOrDefault("theme", "default"),
|
||||
css : getOrDefault("css", ""),
|
||||
layout : getOrDefault("layout", "default"),
|
||||
synch : getOrDefault("synch", true),
|
||||
hidevid : getOrDefault("hidevid", false),
|
||||
show_timestamps : getOrDefault("show_timestamps", true),
|
||||
modhat : getOrDefault("modhat", false),
|
||||
blink_title : getOrDefault("blink_title", false),
|
||||
sync_accuracy : getOrDefault("sync_accuracy", 2),
|
||||
wmode_transparent : getOrDefault("wmode_transparent", true),
|
||||
chatbtn : getOrDefault("chatbtn", false),
|
||||
altsocket : getOrDefault("altsocket", false),
|
||||
joinmessage : getOrDefault("joinmessage", true),
|
||||
qbtn_hide : getOrDefault("qbtn_hide", false),
|
||||
qbtn_idontlikechange : getOrDefault("qbtn_idontlikechange", false),
|
||||
first_visit : getOrDefault("first_visit", true),
|
||||
ignore_channelcss : getOrDefault("ignore_channelcss", false),
|
||||
ignore_channeljs : getOrDefault("ignore_channeljs", false),
|
||||
sort_rank : getOrDefault("sort_rank", false),
|
||||
sort_afk : getOrDefault("sort_afk", false),
|
||||
default_quality : getOrDefault("default_quality", "#quality_auto"),
|
||||
boop : getOrDefault("boop", false),
|
||||
secure_connection : getOrDefault("secure_connection", false)
|
||||
};
|
||||
|
||||
/**
|
||||
* Set a cookie with the provided name, value, and expiration time
|
||||
*/
|
||||
function setCookie(name,value,days) {
|
||||
if (days) {
|
||||
var date = new Date();
|
||||
date.setTime(date.getTime()+(days*24*60*60*1000));
|
||||
var expires = "; expires="+date.toGMTString();
|
||||
}
|
||||
else var expires = "";
|
||||
document.cookie = name+"="+value+expires+"; path=/";
|
||||
}
|
||||
|
||||
/**
|
||||
* Read a cookie with the provided name
|
||||
*/
|
||||
function readCookie(name) {
|
||||
var nameEQ = name + "=";
|
||||
var ca = document.cookie.split(";");
|
||||
for(var i=0;i < ca.length;i++) {
|
||||
var c = ca[i];
|
||||
while (c.charAt(0)==" ") c = c.substring(1,c.length);
|
||||
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Erase a cookie
|
||||
*/
|
||||
function eraseCookie(name) {
|
||||
createCookie(name,"",-1);
|
||||
}
|
||||
9789
www/js/jquery.js
vendored
Normal file
9789
www/js/jquery.js
vendored
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue