From 7344945a43defca9016bfd52a84d737b24da3054 Mon Sep 17 00:00:00 2001 From: HF Date: Sat, 15 Jan 2022 20:06:20 +0100 Subject: [PATCH] be able to send uid null --- avatars/flags.png | Bin 0 -> 73424 bytes ppfun-bridge/src/pixelplanet/Palette.js | 127 +++++++++++++++++++ ppfun-bridge/src/pixelplanet/constants.js | 5 + ppfun-bridge/src/pixelplanet/index.js | 73 +++++++++++ ppfun-bridge/src/pixelplanet/loadChunk.js | 62 +++++++++ ppfun-bridge/src/pixelplanet/renderCanvas.js | 93 ++++++++++++++ ppfun-bridge/src/ppfunMatrixBridge.js | 5 +- ppfun-bridge/src/ppfunsocket.js | 5 +- 8 files changed, 363 insertions(+), 7 deletions(-) create mode 100644 avatars/flags.png create mode 100644 ppfun-bridge/src/pixelplanet/Palette.js create mode 100644 ppfun-bridge/src/pixelplanet/constants.js create mode 100644 ppfun-bridge/src/pixelplanet/index.js create mode 100644 ppfun-bridge/src/pixelplanet/loadChunk.js create mode 100644 ppfun-bridge/src/pixelplanet/renderCanvas.js diff --git a/avatars/flags.png b/avatars/flags.png new file mode 100644 index 0000000000000000000000000000000000000000..18e958f6b53c9180f0e17bc88daa94732d9033c5 GIT binary patch literal 73424 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 mQU-+-CV>4D!xP6eq5gk6Fx*h*oe5L`0000 0) { + i -= 1; + const off = i * 3; + if (rgb[off] === r + && rgb[off + 1] === g + && rgb[off + 2] === b + ) { + return i; + } + } + return null; + } + + /* + * Take a buffer of indexed pixels and output it as ABGR Array + * @param chunkBuffer Buffer of indexed pixels + * @return ABRG Buffer + */ + buffer2ABGR(chunkBuffer) { + const { length } = chunkBuffer; + const colors = new Uint32Array(length); + let value; + const buffer = chunkBuffer; + + let pos = 0; + for (let i = 0; i < length; i++) { + value = (buffer[i] & 0x3F); + colors[pos++] = this.abgr[value]; + } + return colors; + } + + /* + * Take a buffer of indexed pixels and output it as RGB Array + * @param chunkBuffer Buffer of indexed pixels + * @return RGB Buffer + */ + buffer2RGB(chunkBuffer) { + const { length } = chunkBuffer; + const colors = new Uint8Array(length * 3); + let color; + let value; + const buffer = chunkBuffer; + + let c = 0; + for (let i = 0; i < length; i++) { + value = buffer[i]; + + color = (value & 0x3F) * 3; + colors[c++] = this.rgb[color++]; + colors[c++] = this.rgb[color++]; + colors[c++] = this.rgb[color]; + } + return colors; + } + + /* + * Create a RGB Buffer of a specific size with just one color + * @param color Color Index of color to use + * @param length Length of needed Buffer + * @return RGB Buffer of wanted size with just one color + */ + oneColorBuffer(color, length) { + const buffer = new Uint8Array(length * 3); + const r = this.rgb[color * 3]; + const g = this.rgb[color * 3 + 1]; + const b = this.rgb[color * 3 + 2]; + let pos = 0; + for (let i = 0; i < length; i++) { + buffer[pos++] = r; + buffer[pos++] = g; + buffer[pos++] = b; + } + + return buffer; + } +} + +export default Palette; diff --git a/ppfun-bridge/src/pixelplanet/constants.js b/ppfun-bridge/src/pixelplanet/constants.js new file mode 100644 index 0000000..4f2c787 --- /dev/null +++ b/ppfun-bridge/src/pixelplanet/constants.js @@ -0,0 +1,5 @@ +export const WIDTH = 1024; +export const HEIGHT = 768; +export const MAX_SCALE = 40; // 52 in log2 +export const TILE_SIZE = 256; +export const TILE_ZOOM_LEVEL = 4; diff --git a/ppfun-bridge/src/pixelplanet/index.js b/ppfun-bridge/src/pixelplanet/index.js new file mode 100644 index 0000000..93928a2 --- /dev/null +++ b/ppfun-bridge/src/pixelplanet/index.js @@ -0,0 +1,73 @@ +import fetch from 'node-fetch'; + +import renderCanvas from './renderCanvas'; +import Palette from './Palette'; +import { + TILE_SIZE, + TILE_ZOOM_LEVEL, +} from './constants'; + +const linkRegExp = /(#[a-z]*,-?[0-9]*,-?[0-9]*(,-?[0-9]+)?)/gi; +const linkRegExpFilter = (val, ind) => ((ind % 3) !== 2); + +let canvases = null; + +async function fetchCanvasData() { + try { + const response = await fetch('https://pixelplanet.fun/api/me'); + if (response.status >= 300) { + throw new Error('Can not connect to pixelplanet!'); + } + const data = await response.json(); + const canvasMap = new Map(); + + const ids = Object.keys(data.canvases); + for (let i = 0; i < ids.length; i += 1) { + const id = ids[i]; + const canvas = data.canvases[id]; + canvas.id = id; + canvas.palette = new Palette(canvas.colors); + canvas.maxTiledZoom = Math.log2(canvas.size / TILE_SIZE) / TILE_ZOOM_LEVEL * 2; + canvasMap.set(canvas.ident, canvas); + } + canvases = canvasMap; + console.log('Successfully fetched canvas data from pixelplanet'); + } catch (e) { + console.log('Couldn\'t connect to pixelplanet, trying to connect again in 60s'); + setTimeout(fetchCanvasData, 60000); + throw(e) + } +} +fetchCanvasData(); + +export async function parseCanvasLinks(msg) { + const { + text, + } = msg; + + if (!text || !canvases) { + return; + } + + const msgArray = text.split(linkRegExp).filter(linkRegExpFilter); + if (msgArray.length > 1) { + const coordsParts = msgArray[1].substr(1).split(','); + const [ canvasIdent, x, y, z ] = coordsParts; + + const canvas = canvases.get(canvasIdent); + if (!canvas) { + return; + } + console.log(`Fetch canvas ${canvas.title} on ${x}/${y} with zoom ${z}`); + + const image = await renderCanvas(canvas, x, y, z); + msg.reply({ + attachments: [ + { + image, + text: `${canvas.title} on ${x}/${y} with zoom ${z}`, + } + ], + }); + } +} diff --git a/ppfun-bridge/src/pixelplanet/loadChunk.js b/ppfun-bridge/src/pixelplanet/loadChunk.js new file mode 100644 index 0000000..ef5cce5 --- /dev/null +++ b/ppfun-bridge/src/pixelplanet/loadChunk.js @@ -0,0 +1,62 @@ +import fetch from 'node-fetch'; + +import { + createCanvas, + loadImage, + createImageData, +} from 'canvas'; + +import { + TILE_SIZE, +} from './constants'; + +export async function getChunk( + canvas, + zoom, + cx, + cy, +) { + const tile = createCanvas(TILE_SIZE, TILE_SIZE); + + const canvasId = canvas.id; + if (canvas.maxTiledZoom === zoom) { + await fetchBaseChunk(canvasId, canvas.palette, zoom, cx, cy, tile); + } else { + await fetchTile(canvasId, zoom, cx, cy, tile); + } + return tile; +} + +async function fetchBaseChunk( + canvasId, + palette, + zoom, + cx, cy, + tile, +) { + const url = `https://pixelplanet.fun/chunks/${canvasId}/${cx}/${cy}.bmp`; + console.log(`Fetching ${url}`); + const response = await fetch(url); + if (response.ok) { + const arrayBuffer = await response.arrayBuffer(); + if (arrayBuffer.byteLength) { + const chunkArray = new Uint8Array(arrayBuffer); + const abgr = palette.buffer2ABGR(chunkArray); + const imageData = createImageData( + new Uint8ClampedArray(abgr.buffer), + TILE_SIZE, + TILE_SIZE, + ); + const ctx = tile.getContext('2d'); + ctx.putImageData(imageData, 0, 0); + } + } +} + +async function fetchTile(canvasId, zoom, cx, cy, tile) { + const url = `https://pixelplanet.fun/tiles/${canvasId}/${zoom}/${cx}/${cy}.png`; + console.log(`Fetching ${url}`); + const image = await loadImage(url); + const ctx = tile.getContext('2d'); + ctx.drawImage(image, 0, 0); +} diff --git a/ppfun-bridge/src/pixelplanet/renderCanvas.js b/ppfun-bridge/src/pixelplanet/renderCanvas.js new file mode 100644 index 0000000..289f7d3 --- /dev/null +++ b/ppfun-bridge/src/pixelplanet/renderCanvas.js @@ -0,0 +1,93 @@ +import { createCanvas } from 'canvas'; + +import { getChunk } from './loadChunk'; + +import { + WIDTH, + HEIGHT, + MAX_SCALE, + TILE_SIZE, + TILE_ZOOM_LEVEL, +} from './constants'; + +function coordToChunk(z, canvasSize, tiledScale) { + return Math.floor((z + canvasSize / 2) / TILE_SIZE * tiledScale); +} + +function chunkToCoord(z, canvasSize, tiledScale) { + return Math.round(z * TILE_SIZE / tiledScale - canvasSize / 2); +} + +async function drawChunk( + ctx, xOff, yOff, + canvas, tiledZoom, xc, yc, +) { + try { + const chunk = await getChunk(canvas, tiledZoom, xc, yc); + ctx.drawImage(chunk, xOff,yOff); + } catch(e) { + console.log(`Chunk ${xc} / ${yc} - ${tiledZoom} is empty`); + } +} + +export default async function renderCanvas( + canvas, + x, + y, + z, +) { + const can = createCanvas(WIDTH, HEIGHT); + const ctx = can.getContext('2d'); + const canvasSize = canvas.size; + + let scale = 2 ** (z / 10); + scale = Math.max(scale, TILE_SIZE / canvas.size); + scale = Math.min(scale, MAX_SCALE); + + let tiledScale = (scale > 0.5) + ? 0 + : Math.round(Math.log2(scale) / 2); + tiledScale = TILE_ZOOM_LEVEL ** tiledScale; + const tiledZoom = canvas.maxTiledZoom + Math.log2(tiledScale) / 2; + + const relScale = scale / tiledScale; + ctx.scale(relScale, relScale); + ctx.fillStyle = canvas.palette.colors[0]; + ctx.imageSmoothingEnabled = false; + ctx.patternQuality = "nearest"; + ctx.antialias = 'none'; + ctx.fillRect(0, 0, WIDTH, HEIGHT); + + const tlX = Math.floor(x - WIDTH / 2 / scale); + const tlY = Math.floor(y - HEIGHT / 2 / scale); + const brX = Math.floor(x - 1 + WIDTH / 2 / scale); + const brY = Math.floor(y - 1 + HEIGHT / 2 / scale); + + const tlCX = coordToChunk(tlX, canvasSize, tiledScale); + const tlCY = coordToChunk(tlY, canvasSize, tiledScale); + const brCX = coordToChunk(brX, canvasSize, tiledScale); + const brCY = coordToChunk(brY, canvasSize, tiledScale); + + console.log(`Load chunks from ${tlCX} / ${tlCY} to ${brCX} / ${brCY}`); + const chunkMax = canvasSize / TILE_SIZE * tiledScale; + + const promises = []; + for (let xc = tlCX; xc <= brCX; xc += 1) { + for (let yc = tlCY; yc <= brCY; yc += 1) { + const xOff = Math.round((chunkToCoord(xc, canvasSize, tiledScale) - tlX) * tiledScale); + const yOff = Math.round((chunkToCoord(yc, canvasSize, tiledScale) - tlY) * tiledScale); + + if (xc < 0 || xc >= chunkMax || yc < 0 || yc >= chunkMax) { + ctx.clearRect(xOff, yOff, TILE_SIZE, TILE_SIZE); + continue; + } + + promises.push( + drawChunk(ctx, xOff, yOff, canvas, tiledZoom, xc, yc), + ); + } + } + await Promise.all(promises); + + return can.toBuffer('image/png'); +} diff --git a/ppfun-bridge/src/ppfunMatrixBridge.js b/ppfun-bridge/src/ppfunMatrixBridge.js index 18765a7..7908bac 100644 --- a/ppfun-bridge/src/ppfunMatrixBridge.js +++ b/ppfun-bridge/src/ppfunMatrixBridge.js @@ -9,7 +9,6 @@ class PPfunMatrixBridge { const { apiSocketKey, apiSocketUrl, - ppfunId, homeserverUrl, domain, registration, @@ -27,7 +26,6 @@ class PPfunMatrixBridge { this.ppfunSocket = new PPfunSocket( apiSocketUrl, apiSocketKey, - ppfunId, ); this.matrixBridge = new MatrixBridge({ homeserverUrl, @@ -39,7 +37,6 @@ class PPfunMatrixBridge { } }); this.port = port; - this.ppfunId = ppfunId; this.domain = domain; this.prefix = 'pp'; @@ -153,7 +150,7 @@ class PPfunMatrixBridge { this.ppfunSocket.emit( 'sendChatMessage', (uid) ? name : `[mx] ${name}`, - uid || this.ppfunId, + uid || null, msg, cid, ); diff --git a/ppfun-bridge/src/ppfunsocket.js b/ppfun-bridge/src/ppfunsocket.js index bf948c3..ff388e2 100644 --- a/ppfun-bridge/src/ppfunsocket.js +++ b/ppfun-bridge/src/ppfunsocket.js @@ -4,15 +4,14 @@ const EventEmitter = require('events'); const WebSocket = require('ws') class PPfunSocket extends EventEmitter { - constructor(url, apisocketkey, ppfunId) { + constructor(url, apisocketkey) { super(); this.url = url; this.apisocketkey = apisocketkey; - this.ppfunId = ppfunId; this.timeConnected = null; this.isConnected = false; this.flagMap = new Map(); - this.flagMap.set(ppfunId, 'yy'); + this.flagMap.set(null , 'yy'); this.ws; this.onWsClose = this.onWsClose.bind(this); console.log('PPfunSocket: Connecting to WebSocket')