此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.gf.qytechs.cn/scripts/443907/1043368/PPPC.js
你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式
你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式
你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式
你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式
你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式
你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式
(我已經安裝了使用者樣式管理器,讓我安裝!)
// ==UserScript==
// @name PPPC
// @description Pixel Place Parallel Connections
// @version 1.8
// @author 0vC4
// @namespace https://gf.qytechs.cn/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 remove(username) {
const settings = this.settings;
delete settings.userlist[username];
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[2] : settings.current.authKey);
delete settings.current;
this.settings = settings;
},
async join(username, server) {
const settings = this.settings;
if (!settings.userlist[username]) return null;
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 result = await this.join(username, boardId);
if (!result) return null;
const [authId, authToken, authKey] = result;
const timer = this.timer;
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) user.ping = timer.setInterval(() => user.send('2'), message.pingInterval);
if (!message.length) return arguments;
const [event, json] = message;
};
user.onclose = () => timer.setInterval(user.ping);
user.set = (x,y,p) => user.send(`42["p",[${x},${y},${p},1]]`);
return user;
}
};
if (!PPPC.settings) PPPC.settings = {
userlist: {}
};
window.PPPC = PPPC;
return PPPC;
})();
// 0vC4#7152