Pings available servers and lets you pick the one you want. This is a good plugin for playing with friends.
当前为
// ==UserScript==
// @name Slither.io Server Picker
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Pings available servers and lets you pick the one you want. This is a good plugin for playing with friends.
// @author SystemDisc
// @match http://slither.io/
// @grant none
// @run-at document-start
// @require https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js
// ==/UserScript==
(function() {
'use strict';
let serverData = $.ajax({
type: 'GET',
url: 'http://slither.io/i33628.txt',
async: false
}).responseText;
let servers = loadSos(serverData);
$(function() {
let css = `
iframe[src="/social-box/"] {
display: none;
}
#sidebar {
padding: 15px;
position: fixed;
top: 0;
left: 0;
z-index: 10100;
background-color: #000;
height: 100vh;
width: auto;
overflow: auto;
}
#connectForm {
margin-bottom: 15px;
}
#serverList > .server-listing {
color: #fff;
margin-bottom: 5px;
cursor: pointer;
}
#serverList > .server-listing > .server-name, #serverList > .server-listing > .server-ping {
display: inline-block;
}
#serverList > .server-listing > .server-ping {
margin-left: 10px;
color: green;
}
#serverList > .server-listing > .server-ping.bad {
color: red;
}
`;
let styleSheet = $('<style type="text/css">');
styleSheet.html(css);
let sidebar = $('<div id="sidebar">');
let connectForm = $('<div id="connectForm">');
let serverInput = $('<input class="server-input" type="test" name="serverHostname" placeholder="ip:port">');
let serverConnect = $('<button class="connect-button" type="button">Connect</button>');
connectForm.append(serverInput);
connectForm.append(serverConnect);
let serverList = $('<div id="serverList">');
let promises = [];
servers.forEach(function(server) {
let serverElem = $('<div id="' + server.ip + '" class="server-listing">');
let serverNameElem = $('<div class="server-name">');
let serverPingElem = $('<div class="server-ping">');
serverNameElem.text(server.ip + ':' + server.po);
serverElem.append(serverNameElem);
serverElem.append(serverPingElem);
serverList.append(serverElem);
let promise = pingServer(server.ip).then(function(ping) {
let pingElem = $('[id="' + server.ip + '"]').find('.server-ping');
pingElem.text(ping);
if (ping > 75) {
pingElem.addClass('bad');
}
let serverList = $('#serverList');
let serverElems = serverList.children();
serverElems.sort(function(a, b) {
let an = +$(a).find('.server-ping').text();
let bn = +$(b).find('.server-ping').text();
if (an === 0) {
an = 1000;
}
if (bn === 0) {
bn = 1000;
}
return an > bn? 1:(an < bn? -1:0);
});
serverElems.detach().appendTo(serverList);
$('.server-input').val(serverElems.first().find('.server-name').text());
}).catch(function(err) {
$('[id="' + server.ip + '"]').remove();
return false;
});
promises.push(promise);
});
sidebar.append(connectForm);
sidebar.append(serverList);
$('body').append(sidebar);
$('head').append(styleSheet);
$(document).on('click', '#connectForm > .connect-button', function(e) {
selectServer($('.server-input').val());
});
$(document).on('click', '#serverList > .server-listing', function(e) {
selectServer($(e.currentTarget).find('.server-name').text());
});
$('.nsi').on('click', function(e) {
$('#sidebar').hide();
});
});
console.log(servers);
})();
function selectServer(servername) {
let ip;
let port;
[ip, port] = servername.split(':');
console.log(ip, +port);
window.forceServer(ip, +port);
let serverElem = $('[id="' + ip + '"]');
serverElem.addClass('selected');
serverElem.siblings().removeClass('selected');
$('.server-input').val(servername);
}
function loadSos(chars) {
/** @type {Array} */
sos = [];
/** @type {Array} */
clus = [];
chars.charAt(0);
/** @type {number} */
var i = 1;
var d = {};
/** @type {number} */
var index = 0;
/** @type {number} */
d = index = 0;
var c;
/** @type {number} */
var data = 0;
/** @type {number} */
var handle = 0;
/** @type {Array} */
var split = [];
/** @type {Array} */
var m = [];
/** @type {Array} */
var messages = [];
/** @type {Array} */
var received = [];
for (;i < chars.length;) {
if (c = (chars.charCodeAt(i++) - 97 - handle) % 26, 0 > c && (c += 26), data *= 16, data += c, handle += 7, 1 == d) {
if (0 == index) {
split.push(data);
if (4 == split.length) {
index++;
}
} else {
if (1 == index) {
m.push(data);
if (3 == m.length) {
index++;
}
} else {
if (2 == index) {
messages.push(data);
if (3 == messages.length) {
index++;
}
} else {
if (3 == index && (received.push(data), 1 == received.length)) {
d = {};
/** @type {number} */
index = c = 0;
for (;index < m.length;index++) {
c *= 256;
c += m[index];
}
/** @type {number} */
index = m = 0;
for (;index < messages.length;index++) {
m *= 256;
m += messages[index];
}
/** @type {string} */
d.ip = split.join(".");
d.po = c;
d.ac = m;
d.wg = m + 5;
d.clu = received[0];
/** @type {Array} */
sos.push(d);
/** @type {Array} */
split = [];
/** @type {Array} */
m = [];
/** @type {Array} */
messages = [];
/** @type {Array} */
received = [];
/** @type {number} */
index = 0;
}
}
}
}
/** @type {number} */
d = data = 0;
} else {
d++;
}
}
return sos;
}
function pingServer(ip) {
return new Promise(function(resolve, reject) {
let handle = null;
let ping = Date.now();
try {
handle = new WebSocket('ws://' + ip + ':80/ptc');
}
catch (e) {
handle = null;
reject(e);
}
if (handle) {
handle.binaryType = "arraybuffer";
handle.onerror = function(err) {
reject(err);
};
handle.onmessage = function(data) {
let pong = Date.now();
if (testing) {
console.log(ip, ping, pong, pong - ping, data);
}
resolve(pong - ping);
};
handle.onopen = function(body) {
console.log(body);
ping = Date.now();
let data = new Uint8Array(1);
data[0] = 112;
this.send(data);
};
}
});
}