Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions group/group_chat_urls.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
* Group Chat URLs by Ruud
* =======================
*
* Makes URLs posted in group chat clickable.
* I recommend just taking the important lines and
* stuffing them into the existing chat callback
* because this is awful and probably breaks existing scripts.
*/
{
tagpro.group.socket._callbacks.chat[0] = e => {
e.message = e.message.replace(/[<>]/g, x => {
return x == '<' ? '&lt;' : '&gt;';
}).replace(/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/g, url => {
return '<a target="_blank" href="' + url + '">' + url + '</a>';
});

// took this from the minified gobal-group.js
var t = $(".js-chat-log");
if (e.from)
var n = $("<span></span>").addClass("player-name").text(e.from + ": ");
var r = $("<span></span>").html(e.message).addClass("chat-message");
$("<div></div>").addClass("chat-line").append(n).append(r).appendTo(t),
t.scrollTop(t.get(0).scrollHeight)
};
}
138 changes: 138 additions & 0 deletions group/group_presets.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
/*
* Group Presets by Ruud
* =====================
*
* Creates a select box on the private settings, allowing the
* group leader to select a predefined set of settings.
* Available presets are PUG (defined as halves in ELTP rules),
* OFM (5 mins OFM), Duel (5 mins, 3 caps, 1s player respawn duel)
* and Testing (20 mins, infinite caps, 1s respawn times).
*/
{
tagpro.group.settings = {
defaults: {
redTeamName: "Red",
blueTeamName: "Blue",
redTeamScore: "0",
blueTeamScore: "0",
map: "",
time: "12",
caps: "3",
accel: "1",
topspeed: "1",
bounce: "1",
playerRespawnTime: "3000",
speedPadRespawnTime: "10000",
dynamiteRespawnTime: "30000",
buffRespawnTime: "60000",
buffDelay: false,
potatoTime: "0"
},
set: (key, value) => {
tagpro.group.socket.emit('setting', {name: key, value: value});
},
get: key => {
switch(key) {
case 'buffDelay':
return $('input[name=buffDelay]').prop('checked');

case 'redTeamName':
case 'blueTeamName':
return $('input[name=' + key + ']').val();

case 'redTeamScore':
return $('#red-team .team-score-value').text();

case 'blueTeamScore':
return $('#blue-team .team-score-value').text();

default:
return $('select[name=' + key + ']').val();
}
},
apply: preset => {
console.log(preset);
for(let k in tagpro.group.settings.defaults)
tagpro.group.settings.set(
k, preset.hasOwnProperty(k) ?
preset[k] : tagpro.group.settings.defaults[k]);
},
presets: [
{
name: 'Default'
},
{
name: 'Pick-Up Game',
caps: 0,
time: 10,
buffDelay: true
},
{
name: 'Open Field Masters',
map: 'OFM',
time: 5
},
{
name: 'Duel',
map: 'Duel',
time: '5',
caps: '3',
playerRespawnTime: '1000'
},
{
name: 'Testing',
time: '20',
caps: '0',
speedPadRespawnTime: '1000',
dynamiteRespawnTime: '1000',
buffRespawnTime: '1000',
playerRespawnTime: '1000'
}
]
};

// DOM manipulation, you'll probably want to do this in a more convenient way if you implement this :)
let presetSelector = $('<select class="form-control">');
$('#private-settings > .settings-map > .row').prepend($('<div class="col-sm-12 js-leader-only">').append(presetSelector));
for(let i=0; i<tagpro.group.settings.presets.length; ++i) {
let preset = tagpro.group.settings.presets[i];
presetSelector.append($('<option>').prop('value', i).text('Preset: ' + preset.name));
}

presetSelector.change(() => {
let i = presetSelector.val();
if(i < 0)
return;
tagpro.group.settings.apply(tagpro.group.settings.presets[i]);
presetSelector.find('option[value=-1]').remove();
});

let detectPreset = () => {
let presetSelected = false;
for(let i=0; i<tagpro.group.settings.presets.length; ++i) {
let preset = tagpro.group.settings.presets[i], selected = true;
for(let k in tagpro.group.settings.defaults) {
if(tagpro.group.settings.get(k) != (preset.hasOwnProperty(k) ? preset[k] : tagpro.group.settings.defaults[k])) {
selected = false;
break;
}
}
if(selected) {
presetSelected = true;
presetSelector.val(i);
}
}
if(!presetSelected)
presetSelector.val(-1);
};

/*
* The setting packets sent when applying a preset cause an annoying stutter in the preset field.
* This is an ugly way of preventing that. I'm sorry.
*/
let detectTimeout = setTimeout(detectPreset, 0);
tagpro.group.socket.on('setting', () => {
clearTimeout(detectTimeout);
detectTimeout = setTimeout(detectPreset, 100);
});
}
157 changes: 157 additions & 0 deletions group/server_switcher.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
/*
* Group Server Switcher by Ruud
* =============================
*
* This script adds a select box to the group screen
* which allows the group leader to create a group on
* another server with the same settings.
* The URL of the new group is then sent to the old
* group as a chat message.
*
* Requires some methods from group_presets.js.
*/
{
let getCookie = (name, def) => {
var n = $.cookie(name);
$.removeCookie(name);
var r = $.cookie(name) === undefined;
if(n === undefined || r)
$.cookie(name, n || def, {
expires: 36500,
path: "/",
domain: tagpro.cookieHost
});
return n || def;
};

let setCookie = (name, value) => {
$.removeCookie(name);
$.cookie(name, value, {domain: tagpro.cookieHost, path: '/', expires: 36500});
};

let ping = (server, callback) => {
if(server.url.endsWith('.koalabeast.com'))
$.ajax({
url:'http://'+server.url+'/stats?callback=?',
timeout:1000,
success:function(response) {
server.players = response.players;
server.error = false;
callback(server);
},
error:function() {
server.error = true;
callback(server);
},
dataType:'json'
});
};

let servers = {
Regular: {
Chord: {name: 'Chord', url: 'tagpro-chord.koalabeast.com'},
Orbit: {name: 'Orbit', url: 'tagpro-orbit.koalabeast.com'},
Diameter: {name: 'Diameter', url: 'tagpro-diameter.koalabeast.com'},
Pi: {name: 'Pi', url: 'tagpro-pi.koalabeast.com'},
Radius: {name: 'Radius', url: 'tagpro-radius.koalabeast.com'},
Origin: {name: 'Origin', url: 'tagpro-origin.koalabeast.com'},
Sphere: {name: 'Sphere', url: 'tagpro-sphere.koalabeast.com'},
Centra: {name: 'Centra', url: 'tagpro-centra.koalabeast.com'}
},
Testing: {
Tangent: {name: 'Tangent', url: 'tangent.jukejuice.com'},
Maptest: {name: 'Maptest', url: 'tagpro-maptest.koalabeast.com'},
NC1: {name: 'NC Europe', url: 'maptest.newcompte.fr'},
NC2: {name: 'NC US East', url: 'maptest2.newcompte.fr'},
NC3: {name: 'NC US West', url: 'maptest3.newcompte.fr'},
NC4: {name: 'NC Oceanic', url: 'oceanic.newcompte.fr'}
}
};

// ugly DOM editing again, pls implement in a better fashion
let newGroupForm =
$('<form>')
.attr('method', 'POST')
.attr('target', '_blank')
.append($('<input>')
.attr('name','name'))
.append($('<input>')
.attr('type','checkbox')
.attr('name','public'));

$('.group-settings.pull-right')
.append($('<label>')
.prop('for', 'switchServerSelect')
.addClass('btn')
.addClass('btn-default')
.addClass('group-setting')
.css('padding', '0')
.append($('<select>')
.addClass('js-leader-only')
.attr('id', 'switchServerSelect')
.css({
'background-color': 'transparent',
'border': '0',
'cursor': 'pointer',
'height': '35px'
})
.append($('<option>')
.attr('value', '')
.text('Switch Server...'))));

for(let type in servers) {
let optgroup = $('<optgroup>')
.attr('label', type)
.css('color', 'black');

for(let server in servers[type]) if(servers[type][server].url !== tagpro.serverHost) {
let option = $('<option>')
.attr('value', servers[type][server].url)
.text(servers[type][server].name)
.css('color', 'black')
.appendTo(optgroup);

ping(servers[type][server], x => {
$('option[value="' + x.url + '"]')
.text(x.name + (x.error ? '' : ' (' + x.players + (x.players === 1 ? ' player' : ' players') + ')'));
});
}
optgroup.appendTo('#switchServerSelect');
}

$('#switchServerSelect').change(() => {
let transferredSettings = {
private: $('.group.container').hasClass('js-private-game')
};

for(let k in tagpro.group.settings.defaults) {
let v = tagpro.group.settings.get(k);
if(v != tagpro.group.settings.defaults[k])
transferredSettings[k] = v;
}

setCookie('transferredSettings', btoa(JSON.stringify(transferredSettings)));
setCookie('previousGroup', 'http://' + tagpro.socketHost + tagpro.group.socket.nsp);
newGroupForm.find('[name=name]').val($('[name=groupName]').val());
newGroupForm.attr('action', 'http://' + $('#switchServerSelect').val() + '/groups/create').submit();
$('#switchServerSelect').val('');
});

if(getCookie('transferredSettings', false)) {
let transferredSettings = JSON.parse(atob(getCookie('transferredSettings', {})));
setCookie('transferredSettings', '');

for(let key in transferredSettings)
tagpro.group.socket.emit('setting', {name: key, value: transferredSettings[key]});

if(transferredSettings.private)
$('.switch-to-pug').click();

let s = io.connect(getCookie('previousGroup', ''));
s.on('connect', () => {
s.emit('chat', document.location.href);
s.close();
});
setCookie('previousGroup', '');
}
}