此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/443907/1043365/PPPC.js
您需要先安装一款用户样式管理器扩展(如 Stylus)后才能安装此样式。
您需要先安装一款用户样式管理器扩展(如 Stylus)后才能安装此样式。
您需要先安装一款用户样式管理器扩展(如 Stylus)后才能安装此样式。
您需要先安装一款用户样式管理器扩展后才能安装此样式。
您需要先安装一款用户样式管理器扩展后才能安装此样式。
您需要先安装一款用户样式管理器扩展后才能安装此样式。
(我已经安装了用户样式管理器,让我安装!)
// ==UserScript==
// @name PPPC
// @description Pixel Place Parallel Connections
// @version 1.6
// @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}]`);
return user;
}
};
if (!PPPC.settings) PPPC.settings = {
userlist: {}
};
window.PPPC = PPPC;
return PPPC;
})();
// 0vC4#7152