Pixel Place Parallel Connections
目前為
此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.cn-greasyfork.org/scripts/443907/1043353/PPPC.js
// ==UserScript==
// @name PPPC
// @description Pixel Place Parallel Connections
// @version 1.1
// @author 0vC4
// @namespace https://greasyfork.org/users/670183
// @match https://pixelplace.io/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=pixelplace.io
// @license MIT
// @grant none
// @run-at document-start
// ==/UserScript==
const PPPC = (() => {
if (window.PPPC) return window.PPPC;
const PPPC = {
get settings() {
return JSON.parse(localStorage.settings || '')
},
set settings(json) {
localStorage.settings = JSON.stringify(json);
},
async show() {
return JSON.stringify([
await cookieStore.get('authId').value,
await cookieStore.get('authToken').value,
await cookieStore.get('authKey').value
]);
},
async add(username, scheme) {
const settings = this.settings;
settings.userlist[username] = scheme;
this.settings = settings;
return true;
},
async save() {
const settings = this.settings;
settings.current = {
authId: await cookieStore.get('authId').value,
authToken: await cookieStore.get('authToken').value,
authKey: await cookieStore.get('authKey').value
};
this.settings = settings;
},
async load(scheme = null) {
const settings = this.settings;
await cookieStore.set('authId', scheme ? scheme[0] : settings.current.authId);
await cookieStore.set('authToken', scheme ? scheme[1] : settings.current.authToken);
await cookieStore.set('authKey', scheme ? scheme[1] : settings.current.authKey);
delete settings.current;
this.settings = settings;
},
async join(username, server) {
const settings = this.settings;
if (!settings.userlist[username]) return false;
const [id, token, key] = settings.userlist[username];
await cookieStore.set('authId', id);
await cookieStore.set('authToken', token);
await cookieStore.set('authKey', key);
await fetch(`https://pixelplace.io/api/get-painting.php?id=${server}&connected=1`);
settings.userlist[username] = [
await cookieStore.get('authId').value,
await cookieStore.get('authToken').value,
await cookieStore.get('authKey').value
];
this.settings = settings;
return settings.userlist[username];
},
timer: window,
async connect(username, boardId) {
const [authId, authToken, authKey] = this.join(username, boardId);
const user = new WebSocket('wss://pixelplace.io/socket.io/?EIO=3&transport=websocket');
user.headless = true;
user.onmessage = ({data}) => {
const [code, msg] = data.split(/(?<=^\d+)(?=[^\d])/);
if (code == '40') user.send('42' + JSON.stringify(
["init", { authKey, authToken, authId, boardId }]
));
const message = JSON.parse(msg || '[]');
if (message.pingInterval) this.timer.setInterval(() => user.send('2'), message.pingInterval);
if (!message.length) return arguments;
const [event, json] = message;
};
return user;
}
};
if (!PPPC.settings) PPPC.settings = {
userlist: []
};
window.PPPC = PPPC;
return PPPC;
})();
// 0vC4#7152