PPPC

Pixel Place Parallel Connections

目前为 2022-04-24 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/scripts/443907/1043365/PPPC.js

// ==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

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址