forked from ppfun/pixelplanet
clean up utils folder
This commit is contained in:
parent
0a5bb9aca7
commit
4e74912655
|
@ -23,20 +23,8 @@ Used to generate tiles based on a uv texture that can then be drawn on the canva
|
||||||
## country-locations
|
## country-locations
|
||||||
Generates a json list of country codes and their coordinates on the canvas based on lat and lon
|
Generates a json list of country codes and their coordinates on the canvas based on lat and lon
|
||||||
|
|
||||||
## redis-convert.js
|
## redisMoveCanvas.js
|
||||||
Script to convert redis canvas database to different color / different layout
|
Script to move canvas chunks, i.e. for resizing canvas
|
||||||
|
|
||||||
## redis-copy.js
|
|
||||||
Script to copy a canvas from one redis to another, with different keys if neccessary
|
|
||||||
|
|
||||||
## sql-commandtest.js
|
|
||||||
Script that connects to the mysql database and does some stuff, just for testing
|
|
||||||
|
|
||||||
## proxyConvert.sh
|
|
||||||
Converts a proxy list in specific txt format to a better readable list
|
|
||||||
|
|
||||||
## imageClean.py
|
|
||||||
python3 script that takes an input image and cleares spare pixels and bot remains
|
|
||||||
|
|
||||||
## areaDownload.py
|
## areaDownload.py
|
||||||
downloads an area of the canvas into a png file.
|
downloads an area of the canvas into a png file.
|
||||||
|
@ -48,18 +36,11 @@ downloads the history from an canvas area between two dates.
|
||||||
Useage: `historyDownload.py canvasId startX_startY endX_endY start_date end_date
|
Useage: `historyDownload.py canvasId startX_startY endX_endY start_date end_date
|
||||||
This is used for creating timelapses, see the cmd help to know how
|
This is used for creating timelapses, see the cmd help to know how
|
||||||
|
|
||||||
## liveLog.sh
|
|
||||||
shell script that watches the pixel.log file and outputs the stats of the current IPs placing there
|
|
||||||
Usage: `./liveLog.sh LOGFILE CANVASID STARTX_STARTY ENDX_ENDY`
|
|
||||||
|
|
||||||
## pp-center\*.png
|
## pp-center\*.png
|
||||||
center logo of pixelplanet
|
center logo of pixelplanet
|
||||||
|
|
||||||
## change-canvasbackup
|
## change-canvasbackup
|
||||||
just a script that got run once to add the missing tiles in historical view when increasing the size of the moon canvas.
|
just a script that got run once to add the missing tiles in historical view when increasing the size of the moon canvas.
|
||||||
|
|
||||||
## uploadImage.js
|
|
||||||
nodejs script to upload a Image to the canvas without checks and without caring about what was previously there, don't use it for anything other than initially loading a very large image to the canvas.
|
|
||||||
|
|
||||||
## testStore.js
|
## testStore.js
|
||||||
used to test our own [connect-redis](https://github.com/tj/connect-redis) fork in src/utils/connectRedis.js
|
used to test our own [connect-redis](https://github.com/tj/connect-redis) fork in src/utils/connectRedis.js
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
# this script filters out noise froma n indexed image
|
|
||||||
import PIL.Image
|
|
||||||
import sys
|
|
||||||
|
|
||||||
|
|
||||||
def check_pixel(pix, x, y):
|
|
||||||
# if pixel is sourrounded by just the same color
|
|
||||||
# and max one different one
|
|
||||||
cnt_clr1 = 0
|
|
||||||
cnt_clr2 = 0
|
|
||||||
clr1 = pix[x-1,y-1]
|
|
||||||
clr2 = None
|
|
||||||
for xrel in range(-1, 2):
|
|
||||||
for yrel in range(-1, 2):
|
|
||||||
if not xrel and not yrel:
|
|
||||||
continue
|
|
||||||
clr = pix[x + xrel,y + yrel]
|
|
||||||
if clr == clr1:
|
|
||||||
cnt_clr1 += 1
|
|
||||||
elif clr2 is None:
|
|
||||||
clr2 = clr
|
|
||||||
cnt_clr2 += 1
|
|
||||||
elif clr == clr2:
|
|
||||||
cnt_clr2 += 1
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
if cnt_clr1 > 1 and cnt_clr2 > 1:
|
|
||||||
return None
|
|
||||||
if cnt_clr1 > 1:
|
|
||||||
return clr1
|
|
||||||
return clr2
|
|
||||||
|
|
||||||
def clean_image(filename):
|
|
||||||
im = PIL.Image.open(filename).convert('RGBA')
|
|
||||||
width, height = im.size
|
|
||||||
pix = im.load()
|
|
||||||
im_new = PIL.Image.new('RGBA', (width, height), (255, 0, 0, 0))
|
|
||||||
pix_new = im_new.load()
|
|
||||||
for x in range(1, width - 1):
|
|
||||||
for y in range(1, height - 1):
|
|
||||||
target = check_pixel(pix, x, y)
|
|
||||||
if target is not None and target != pix[x, y]:
|
|
||||||
pix_new[x,y] = target
|
|
||||||
im.close()
|
|
||||||
im_new.save("%s-cleaned.png" % filename[:-4])
|
|
||||||
im_new.close()
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
filename = sys.argv[1]
|
|
||||||
clean_image(filename)
|
|
|
@ -1,75 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# this script parses the pixellogs live and shows which IPs are currently active in
|
|
||||||
# a given area and where they placed their last pixel
|
|
||||||
# Usage: ./liveLog.sh LOGFILE CANVASID STARTX_STARTY ENDX_ENDY
|
|
||||||
LOGFILE=$1
|
|
||||||
CANVAS=$2
|
|
||||||
STARTCOORDS=$3
|
|
||||||
ENDCOORDS=$4
|
|
||||||
STARTX=`echo ${STARTCOORDS} | sed 's/_.*$//'`
|
|
||||||
STARTY=`echo ${STARTCOORDS} | sed 's/^.*_//'`
|
|
||||||
ENDX=`echo ${ENDCOORDS} | sed 's/_.*$//'`
|
|
||||||
ENDY=`echo ${ENDCOORDS} | sed 's/^.*_//'`
|
|
||||||
|
|
||||||
if [ "$#" -ne 4 ]
|
|
||||||
then
|
|
||||||
echo " Usage: ./liveLog.sh LOGFILE CANVASID STARTX_STARTY ENDX_ENDY"
|
|
||||||
echo ""
|
|
||||||
echo "this script parses the pixellogs live and shows which IPs are currently active in "
|
|
||||||
echo "a given area and where they placed their last pixel"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
parse_log()
|
|
||||||
{
|
|
||||||
while read -r -a args
|
|
||||||
do
|
|
||||||
CAN=${args[2]}
|
|
||||||
X=${args[3]}
|
|
||||||
Y=${args[4]}
|
|
||||||
if [ "$CAN" -eq "$CANVAS" -a "$X" -ge "$STARTX" -a "$X" -le "$ENDX" -a "$Y" -ge "$STARTY" -a "$Y" -le "$ENDY" ]
|
|
||||||
then
|
|
||||||
IP=${args[0]}
|
|
||||||
CLR=${args[6]}
|
|
||||||
printf "%-40s | %-18s | %5s\n" "$IP" "$X,$Y" "$CLR"
|
|
||||||
fi
|
|
||||||
done <&0
|
|
||||||
}
|
|
||||||
|
|
||||||
declare -A ACTIVEIPS
|
|
||||||
parse_log_active_ips()
|
|
||||||
{
|
|
||||||
while read -r -a args
|
|
||||||
do
|
|
||||||
CAN=${args[2]}
|
|
||||||
X=${args[3]}
|
|
||||||
Y=${args[4]}
|
|
||||||
if [ "$CAN" -eq "$CANVAS" -a "$X" -ge "$STARTX" -a "$X" -le "$ENDX" -a "$Y" -ge "$STARTY" -a "$Y" -le "$ENDY" ]
|
|
||||||
then
|
|
||||||
IP=${args[0]}
|
|
||||||
if [ -z "${ACTIVEIPS[$IP]}" ]
|
|
||||||
then
|
|
||||||
CNT=0
|
|
||||||
else
|
|
||||||
CNT=`echo ${ACTIVEIPS[$IP]} | sed 's/ .*//'`
|
|
||||||
fi
|
|
||||||
CNT=$((${CNT} + 1))
|
|
||||||
CLR=${args[6]}
|
|
||||||
ACTIVEIPS[$IP]="$CNT $IP $X,$Y $CLR"
|
|
||||||
print_active_ips | sort -rV
|
|
||||||
fi
|
|
||||||
done <&0
|
|
||||||
}
|
|
||||||
|
|
||||||
print_active_ips()
|
|
||||||
{
|
|
||||||
clear
|
|
||||||
for IP in "${!ACTIVEIPS[@]}"
|
|
||||||
do
|
|
||||||
printf "%-7s | %-40s | %-18s | %5s\n" ${ACTIVEIPS[$IP]}
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
tail -f ${LOGFILE} | parse_log_active_ips
|
|
|
@ -1,13 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
#Basic shell script to convert text proxy list to readable list
|
|
||||||
|
|
||||||
echo "" > proxies.txt
|
|
||||||
for i in `cat ips-static.txt`; do
|
|
||||||
HOST=`echo $i | sed 's/\(.*\):.*:.*:.*/\1/'`
|
|
||||||
PORT=`echo $i | sed 's/.*:\(.*\):.*:.*/\1/'`
|
|
||||||
USER=`echo $i | sed 's/.*:.*:\(.*\):.*/\1/'`
|
|
||||||
IP=`echo $USER | sed 's/.*-\(.*\)/\1/'`
|
|
||||||
PASSWORD=`echo $i | sed 's/.*:.*:.*:\(.*\)/\1/'`
|
|
||||||
#COUNTRY=`geoiplookup $IP`
|
|
||||||
echo "http://$USER:$PASSWORD@$HOST:$PORT" >> proxies.txt
|
|
||||||
done
|
|
|
@ -1,165 +0,0 @@
|
||||||
// this scripts converts the old 64x64 chunks that were organiced relative to the center to 256x256 chunks with 0.0 being top-left corner
|
|
||||||
// it also goes from 2 pixel per byte to 1 pixel per byte
|
|
||||||
// old colors are converted to new order
|
|
||||||
|
|
||||||
import { TILE_SIZE, CANVAS_SIZE, CANVAS_MIN_XY, CANVAS_MAX_XY } from '../src/core/constants';
|
|
||||||
|
|
||||||
import redis from 'redis';
|
|
||||||
//ATTENTION Make suer to set the rdis URLs right!!!
|
|
||||||
const oldurl = "redis://localhost:6380";
|
|
||||||
const oldredis = redis.createClient({ url: oldurl, return_buffers: true });
|
|
||||||
const newurl = "redis://localhost:6379";
|
|
||||||
const newredis = redis.createClient({ url: newurl, return_buffers: true });
|
|
||||||
|
|
||||||
const CHUNK_SIZE = 64; //old chunk size
|
|
||||||
const CHUNKS_IN_BASETILE = TILE_SIZE / CHUNK_SIZE;
|
|
||||||
const CHUNK_MIN_XY = Math.floor(CANVAS_MIN_XY / CHUNK_SIZE);
|
|
||||||
const CHUNK_MAX_XY = Math.floor(CANVAS_MAX_XY / CHUNK_SIZE);
|
|
||||||
|
|
||||||
|
|
||||||
import { COLORS_ABGR } from '../src/core/Color';
|
|
||||||
|
|
||||||
//-----------------------------
|
|
||||||
// old colors
|
|
||||||
const OLD_COLORS_RGB: Uint8Array = new Uint8Array( [
|
|
||||||
202, 227, 255, //first color is unset pixel in ocean
|
|
||||||
255, 255, 255, //second color is unset pixel on land
|
|
||||||
255, 255, 255, //white
|
|
||||||
228, 228, 228, //light gray
|
|
||||||
136, 136, 136, //dark gray
|
|
||||||
78, 78, 78, //darker gray
|
|
||||||
0, 0, 0, //black
|
|
||||||
244, 179, 174, //light pink
|
|
||||||
255, 167, 209, //pink
|
|
||||||
255, 101, 101, //peach
|
|
||||||
229, 0, 0, //red
|
|
||||||
254, 164, 96, //light brown
|
|
||||||
229, 149, 0, //orange
|
|
||||||
160, 106, 66, //brown
|
|
||||||
245, 223, 176, //sand
|
|
||||||
229, 217, 0, //yellow
|
|
||||||
148, 224, 68, //light green
|
|
||||||
2, 190, 1, //green
|
|
||||||
0, 101, 19, //dark green
|
|
||||||
202, 227, 255, //sky blue
|
|
||||||
0, 211, 221, //light blue
|
|
||||||
0, 131, 199, //dark blue
|
|
||||||
0, 0, 234, //blue
|
|
||||||
25, 25, 115, //darker blue
|
|
||||||
207, 110, 228, //light violette
|
|
||||||
130, 0, 128, //violette
|
|
||||||
]
|
|
||||||
);
|
|
||||||
export const OLD_COLORS_ABGR: Uint32Array = new Uint32Array(OLD_COLORS_RGB.length / 3);
|
|
||||||
let cnt = 0;
|
|
||||||
for (let index = 0; index < OLD_COLORS_ABGR.length; index += 1) {
|
|
||||||
const r = OLD_COLORS_RGB[cnt++];
|
|
||||||
const g = OLD_COLORS_RGB[cnt++];
|
|
||||||
const b = OLD_COLORS_RGB[cnt++];
|
|
||||||
OLD_COLORS_ABGR[index] = (0xFF000000) | (b << 16) | (g << 8) | (r);
|
|
||||||
}
|
|
||||||
cnt = null;
|
|
||||||
//-----------------------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* convert new color to old color
|
|
||||||
* @param clr Color index of old color
|
|
||||||
* @return Color index of new, converted color
|
|
||||||
*/
|
|
||||||
function colorConvert(clr: number): number {
|
|
||||||
clr = clr & 0x1F; //this removes protections
|
|
||||||
if (clr == 2) return 2; //hardcoded exception for
|
|
||||||
if (clr == 19) return 25; //the valid white and ocean blue
|
|
||||||
const oldClr = OLD_COLORS_ABGR[clr];
|
|
||||||
const newClr = COLORS_ABGR.indexOf(oldClr);
|
|
||||||
return newClr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Creating new basechunk if new size is a multiple of the old size
|
|
||||||
* @param x x coordinates of chunk (in chunk coordinates, not pixel coordinates)
|
|
||||||
* @param y y coordinates of chunk (in chunk coordinates, not pixel coordinates)
|
|
||||||
*/
|
|
||||||
async function createBasechunkFromMultipleOldChunks(x: number, y: number): Uint8Array {
|
|
||||||
const chunkBuffer = new Uint8Array(TILE_SIZE * TILE_SIZE);
|
|
||||||
|
|
||||||
const xabs = x * CHUNKS_IN_BASETILE + CHUNK_MIN_XY;
|
|
||||||
const yabs = y * CHUNKS_IN_BASETILE + CHUNK_MIN_XY;
|
|
||||||
|
|
||||||
let na = 0;
|
|
||||||
for (let dy = 0; dy < CHUNKS_IN_BASETILE; dy += 1) {
|
|
||||||
for (let dx = 0; dx < CHUNKS_IN_BASETILE; dx += 1) {
|
|
||||||
const smallchunk = await oldredis.get(`chunk:${xabs + dx}:${yabs + dy}`);
|
|
||||||
if (!smallchunk) {
|
|
||||||
na++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const chunk = new Uint8Array(smallchunk);
|
|
||||||
const chunkOffset = (dx + dy * CHUNKS_IN_BASETILE * CHUNK_SIZE) * CHUNK_SIZE; //offset in pixels
|
|
||||||
let pos = 0;
|
|
||||||
for (let row = 0; row < CHUNK_SIZE; row += 1) {
|
|
||||||
let pixelOffset = (chunkOffset + row * CHUNK_SIZE * CHUNKS_IN_BASETILE);
|
|
||||||
const max = pixelOffset + CHUNK_SIZE;
|
|
||||||
while (pixelOffset < max) {
|
|
||||||
let color = chunk[pos++];
|
|
||||||
chunkBuffer[pixelOffset++] = colorConvert(color >> 4);
|
|
||||||
chunkBuffer[pixelOffset++] = colorConvert(color & 0x0F);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (na != CHUNKS_IN_BASETILE * CHUNKS_IN_BASETILE) {
|
|
||||||
const key = `chunk:${x}:${y}`;
|
|
||||||
const setNXArgs = [key, Buffer.from(chunkBuffer.buffer).toString('binary')]
|
|
||||||
await newredis.sendCommand('SETNX', setNXArgs);
|
|
||||||
console.log("Created Chunk ", key, "with", na, "empty chunks");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Creating new basechunk if the sizes are the same, just the colors chaned
|
|
||||||
* @param x x coordinates of chunk (in chunk coordinates, not pixel coordinates)
|
|
||||||
* @param y y coordinates of chunk (in chunk coordinates, not pixel coordinates)
|
|
||||||
*/
|
|
||||||
async function createBasechunk(x: number, y: number): Uint8Array {
|
|
||||||
const key = `chunk:${x}:${y}`;
|
|
||||||
const newChunk = new Uint8Array(TILE_SIZE * TILE_SIZE);
|
|
||||||
|
|
||||||
const smallchunk = await oldredis.get(key);
|
|
||||||
if (!smallchunk) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const oldChunk = new Uint8Array(smallchunk);
|
|
||||||
if (oldChunk.length != newChunk.length || oldChunk.length != TILE_SIZE * TILE_SIZE) {
|
|
||||||
console.log(`ERROR: Chunk length ${oldChunk.length} of chunk ${x},${y} not of correct size!`);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let px = 0; px < oldChunk.length; px += 1) {
|
|
||||||
newChunk[px] = colorConvert(oldChunk[px]);
|
|
||||||
}
|
|
||||||
|
|
||||||
const setNXArgs = [key, Buffer.from(newChunk.buffer).toString('binary')]
|
|
||||||
await newredis.sendCommand('SETNX', setNXArgs);
|
|
||||||
console.log("Created Chunk ", key);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert redis canvas
|
|
||||||
*/
|
|
||||||
async function convert() {
|
|
||||||
for (let x = 0; x < CANVAS_SIZE / TILE_SIZE; x++) {
|
|
||||||
console.log(x);
|
|
||||||
for (let y = 0; y < CANVAS_SIZE / TILE_SIZE; y++) {
|
|
||||||
await createBasechunk(x, y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
oldredis.connect()
|
|
||||||
.then(() => newredis.connect())
|
|
||||||
.then(() => convert());
|
|
|
@ -1,66 +0,0 @@
|
||||||
/* @flow */
|
|
||||||
//this script just copies chunks from one redis to another
|
|
||||||
|
|
||||||
import redis from 'redis';
|
|
||||||
|
|
||||||
import {
|
|
||||||
TILE_SIZE,
|
|
||||||
THREE_TILE_SIZE,
|
|
||||||
} from '../src/core/constants';
|
|
||||||
|
|
||||||
//ATTENTION Make suer to set the rdis URLs right!!!
|
|
||||||
const oldurl = "redis://localhost:6380";
|
|
||||||
const oldredis = redis.createClient({ url: oldurl });
|
|
||||||
const newurl = "redis://localhost:6379";
|
|
||||||
const newredis = redis.createClient({ url: newurl });
|
|
||||||
|
|
||||||
oldredis.connect();
|
|
||||||
newredis.connect();
|
|
||||||
|
|
||||||
const CANVAS_SIZE = 1024;
|
|
||||||
const OUR_TILE_SIZE = THREE_TILE_SIZE;
|
|
||||||
const CHUNKS_XY = CANVAS_SIZE / OUR_TILE_SIZE;
|
|
||||||
|
|
||||||
async function copyChunks() {
|
|
||||||
for (let x = 0; x < CHUNKS_XY; x++) {
|
|
||||||
for (let y = 0; y < CHUNKS_XY; y++) {
|
|
||||||
const oldkey = `ch:2:${x}:${y}`;
|
|
||||||
const newkey = `ch:2:${x}:${y}`;
|
|
||||||
const chunk = await oldredis.get(oldkey);
|
|
||||||
if (chunk) {
|
|
||||||
await newredis.set(newkey, chunk);
|
|
||||||
console.log("Created Chunk ", newkey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function chunkOfCord(cor) {
|
|
||||||
return Math.floor((cor + CANVAS_SIZE / 2) / OUR_TILE_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function copyChunksByCoords(xMin, xMax, yMin, yMax) {
|
|
||||||
const chunkXMin = chunkOfCord(xMin);
|
|
||||||
const chunkXMax = chunkOfCord(xMax);
|
|
||||||
const chunkYMin = chunkOfCord(yMin);
|
|
||||||
const chunkYMax = chunkOfCord(yMax);
|
|
||||||
for (let x = chunkXMin; x <= chunkXMax; x++) {
|
|
||||||
for (let y = chunkYMin; y <= chunkYMax; y++) {
|
|
||||||
const oldkey = `ch:2:${x}:${y}`;
|
|
||||||
const newkey = `ch:2:${x}:${y}`;
|
|
||||||
const chunk = await oldredis.get(oldkey);
|
|
||||||
if (chunk) {
|
|
||||||
await newredis.set(newkey, chunk);
|
|
||||||
console.log("Created Chunk ", newkey);
|
|
||||||
} else {
|
|
||||||
await newredis.del(newkey);
|
|
||||||
console.log("Deleted Chunk ", newkey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = copyChunksByCoords;
|
|
||||||
|
|
||||||
// copyChunksByCoords(-160, 60, -60, 160);
|
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
/* @flow */
|
|
||||||
//this script removes protection from all pixels on main canas
|
|
||||||
|
|
||||||
import redis from 'redis';
|
|
||||||
|
|
||||||
|
|
||||||
//ATTENTION Make suer to set the rdis URLs right!!!
|
|
||||||
const urlo = "redis://localhost:6379";
|
|
||||||
const url = "redis://localhost:6380";
|
|
||||||
const rediso = redis.createClient(urlo, { return_buffers: true });
|
|
||||||
const redisc = redis.createClient(url, { return_buffers: true });
|
|
||||||
|
|
||||||
const CANVAS_SIZE = 256 * 256;
|
|
||||||
const TILE_SIZE = 256;
|
|
||||||
const CHUNKS_XY = CANVAS_SIZE / TILE_SIZE;
|
|
||||||
|
|
||||||
async function moveProtection() {
|
|
||||||
for (let x = 0; x < CHUNKS_XY; x++) {
|
|
||||||
for (let y = 0; y < CHUNKS_XY; y++) {
|
|
||||||
const key = `ch:0:${x}:${y}`;
|
|
||||||
const chunk = await redisc.get(key);
|
|
||||||
if (chunk) {
|
|
||||||
const buffer = new Uint8Array(chunk);
|
|
||||||
let changed = false;
|
|
||||||
for (let u = 0; u < buffer.length; ++u) {
|
|
||||||
const bit = buffer[u];
|
|
||||||
if (bit & 0x80) {
|
|
||||||
buffer[u] = bit & 0x1F;
|
|
||||||
changed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (changed) {
|
|
||||||
await rediso.set(key, Buffer.from(buffer.buffer));
|
|
||||||
console.log("Changed Chunk ", key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.log("done");
|
|
||||||
}
|
|
||||||
|
|
||||||
moveProtection();
|
|
|
@ -1,202 +0,0 @@
|
||||||
/*
|
|
||||||
* Just a testscript for sequelize sql stuff,
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
import Sequelize from 'sequelize';
|
|
||||||
import DataType from 'sequelize';
|
|
||||||
import Model from 'sequelize';
|
|
||||||
import bcrypt from 'bcrypt';
|
|
||||||
|
|
||||||
const mysql_host = "localhost";
|
|
||||||
const mysql_user = "user";
|
|
||||||
const mysql_password = "password";
|
|
||||||
const mysql_db = "database";
|
|
||||||
|
|
||||||
const Op = Sequelize.Op;
|
|
||||||
const operatorsAliases = {
|
|
||||||
$eq: Op.eq,
|
|
||||||
$ne: Op.ne,
|
|
||||||
$gte: Op.gte,
|
|
||||||
$gt: Op.gt,
|
|
||||||
$lte: Op.lte,
|
|
||||||
$lt: Op.lt,
|
|
||||||
$not: Op.not,
|
|
||||||
$in: Op.in,
|
|
||||||
$notIn: Op.notIn,
|
|
||||||
$is: Op.is,
|
|
||||||
$like: Op.like,
|
|
||||||
$notLike: Op.notLike,
|
|
||||||
$iLike: Op.iLike,
|
|
||||||
$notILike: Op.notILike,
|
|
||||||
$regexp: Op.regexp,
|
|
||||||
$notRegexp: Op.notRegexp,
|
|
||||||
$iRegexp: Op.iRegexp,
|
|
||||||
$notIRegexp: Op.notIRegexp,
|
|
||||||
$between: Op.between,
|
|
||||||
$notBetween: Op.notBetween,
|
|
||||||
$overlap: Op.overlap,
|
|
||||||
$contains: Op.contains,
|
|
||||||
$contained: Op.contained,
|
|
||||||
$adjacent: Op.adjacent,
|
|
||||||
$strictLeft: Op.strictLeft,
|
|
||||||
$strictRight: Op.strictRight,
|
|
||||||
$noExtendRight: Op.noExtendRight,
|
|
||||||
$noExtendLeft: Op.noExtendLeft,
|
|
||||||
$and: Op.and,
|
|
||||||
$or: Op.or,
|
|
||||||
$any: Op.any,
|
|
||||||
$all: Op.all,
|
|
||||||
$values: Op.values,
|
|
||||||
$col: Op.col
|
|
||||||
};
|
|
||||||
|
|
||||||
const sequelize = new Sequelize(mysql_db, mysql_user, mysql_password, {
|
|
||||||
host: mysql_host,
|
|
||||||
dialect: 'mysql',
|
|
||||||
pool: {
|
|
||||||
min: 5,
|
|
||||||
max: 25,
|
|
||||||
idle: 10000,
|
|
||||||
acquire: 10000,
|
|
||||||
},
|
|
||||||
dialectOptions: {
|
|
||||||
connectTimeout: 10000,
|
|
||||||
multipleStatements: true,
|
|
||||||
},
|
|
||||||
operatorsAliases: operatorsAliases, // use Sequelize.Op
|
|
||||||
multipleStatements: true,
|
|
||||||
//operatorsAliases: false,
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
const RegUser = sequelize.define('User', {
|
|
||||||
id: {
|
|
||||||
type: DataType.INTEGER.UNSIGNED,
|
|
||||||
autoIncrement: true,
|
|
||||||
primaryKey: true,
|
|
||||||
},
|
|
||||||
|
|
||||||
email: {
|
|
||||||
type: DataType.CHAR(40),
|
|
||||||
allowNull: true,
|
|
||||||
},
|
|
||||||
|
|
||||||
name: {
|
|
||||||
type: DataType.CHAR(32),
|
|
||||||
allowNull: false,
|
|
||||||
},
|
|
||||||
|
|
||||||
//null if external oauth authentification
|
|
||||||
password: {
|
|
||||||
type: DataType.CHAR(60),
|
|
||||||
allowNull: true,
|
|
||||||
},
|
|
||||||
|
|
||||||
totalPixels: {
|
|
||||||
type: DataType.INTEGER.UNSIGNED,
|
|
||||||
allowNull: false,
|
|
||||||
defaultValue: 0,
|
|
||||||
},
|
|
||||||
|
|
||||||
dailyTotalPixels: {
|
|
||||||
type: DataType.INTEGER.UNSIGNED,
|
|
||||||
allowNull: false,
|
|
||||||
defaultValue: 0,
|
|
||||||
},
|
|
||||||
|
|
||||||
ranking: {
|
|
||||||
type: DataType.INTEGER.UNSIGNED,
|
|
||||||
allowNull: true,
|
|
||||||
},
|
|
||||||
|
|
||||||
dailyRanking: {
|
|
||||||
type: DataType.INTEGER.UNSIGNED,
|
|
||||||
allowNull: true,
|
|
||||||
},
|
|
||||||
|
|
||||||
//mail verified
|
|
||||||
verified: {
|
|
||||||
type: DataType.BOOLEAN,
|
|
||||||
allowNull: false,
|
|
||||||
defaultValue: false,
|
|
||||||
},
|
|
||||||
|
|
||||||
discordid: {
|
|
||||||
type: DataType.CHAR(18),
|
|
||||||
allowNull: true,
|
|
||||||
},
|
|
||||||
|
|
||||||
redditid: {
|
|
||||||
type: DataType.CHAR(10),
|
|
||||||
allowNull: true,
|
|
||||||
},
|
|
||||||
|
|
||||||
//when mail verification got requested,
|
|
||||||
//used for purging unverified accounts
|
|
||||||
verificationReqAt: {
|
|
||||||
type: DataType.DATE,
|
|
||||||
allowNull: true,
|
|
||||||
},
|
|
||||||
|
|
||||||
lastLogIn: {
|
|
||||||
type: DataType.DATE,
|
|
||||||
allowNull: true,
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
multipleStatements: true,
|
|
||||||
timestamps: true,
|
|
||||||
updatedAt: false,
|
|
||||||
|
|
||||||
setterMethods: {
|
|
||||||
password(value: string): string {
|
|
||||||
if(value) this.setDataValue('password', generateHash(value));
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
async function recalculate() {
|
|
||||||
//multiple sql statements at once,
|
|
||||||
//important here, because splitting them would cause different thread pools with different @r to get used
|
|
||||||
await sequelize.query("SET @r=0; UPDATE Users SET ranking= @r:= (@r + 1) ORDER BY totalPixels DESC;");
|
|
||||||
await sequelize.query("SET @r=0; UPDATE Users SET dailyRanking= @r:= (@r + 1) ORDER BY dailyTotalPixels DESC;");
|
|
||||||
|
|
||||||
//delete all rows with timestamp older than 4 days
|
|
||||||
RegUser.destroy({
|
|
||||||
where: {
|
|
||||||
verificationReqAt: {
|
|
||||||
$lt: Sequelize.literal('CURRENT_TIMESTAMP - INTERVAL 4 DAY')
|
|
||||||
},
|
|
||||||
verified: 0,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
//update whole column
|
|
||||||
RegUser.update({dailyTotalPixels: 0},{where:{}});
|
|
||||||
|
|
||||||
//select command that does also print datediff
|
|
||||||
RegUser.findAll({
|
|
||||||
attributes: [ 'name', 'totalPixels', 'ranking' , 'dailyRanking', 'dailyTotalPixels', 'createdAt', [Sequelize.fn('DATEDIFF', Sequelize.literal('CURRENT_TIMESTAMP'), Sequelize.col('createdAt')),'age']],
|
|
||||||
limit: 10,
|
|
||||||
order: ['ranking'],
|
|
||||||
}).then((users) =>{
|
|
||||||
console.log("All users:", JSON.stringify(users, null, 4));
|
|
||||||
return;
|
|
||||||
const ranking = [];
|
|
||||||
users.forEach((user) => {
|
|
||||||
const createdAt = new Date(user.createdAt);
|
|
||||||
const registeredSince = createdAt.getDate() + "." + (createdAt.getMonth()+1) + "." + createdAt.getFullYear();
|
|
||||||
ranking.push({
|
|
||||||
rank: user.ranking,
|
|
||||||
name: user.name,
|
|
||||||
totalPixels: user.totalPixels,
|
|
||||||
dailyRanking: user.dailyRanking,
|
|
||||||
dailyTotalPixels: user.dailyTotalPixels,
|
|
||||||
registeredSince,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
console.log(ranking);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
setTimeout(recalculate, 2000);
|
|
|
@ -1,106 +0,0 @@
|
||||||
/*
|
|
||||||
* upload image to canvs in console
|
|
||||||
* doesn't care about previous data
|
|
||||||
* no checks - don't use if you can use Admintools
|
|
||||||
*/
|
|
||||||
|
|
||||||
import redis from 'redis';
|
|
||||||
import sharp from 'sharp';
|
|
||||||
|
|
||||||
import canvases from '../src/canvases.json';
|
|
||||||
import Palette from '../src/core/Palette';
|
|
||||||
import {
|
|
||||||
getChunkOfPixel,
|
|
||||||
} from '../src/core/utils';
|
|
||||||
import {
|
|
||||||
TILE_SIZE,
|
|
||||||
} from '../src/core/constants';
|
|
||||||
|
|
||||||
//ATTENTION Make suer to set the rdis URLs right!!!
|
|
||||||
const redisurl = "redis://localhost:6379";
|
|
||||||
const redisCanvas = redis.createClient(redisurl, { return_buffers: true });
|
|
||||||
|
|
||||||
/*
|
|
||||||
* copied and modified from src/core/Image.js
|
|
||||||
*/
|
|
||||||
async function imageABGR2Canvas(
|
|
||||||
canvasId: number,
|
|
||||||
x: number,
|
|
||||||
y: number,
|
|
||||||
data: Buffer,
|
|
||||||
width: number,
|
|
||||||
height: number,
|
|
||||||
) {
|
|
||||||
console.log(
|
|
||||||
`Loading image with dim ${width}/${height} to ${x}/${y}/${canvasId}`,
|
|
||||||
);
|
|
||||||
const canvas = canvases[canvasId];
|
|
||||||
const { colors, cli, size } = canvas;
|
|
||||||
const palette = new Palette(colors);
|
|
||||||
const canvasMinXY = -(size / 2);
|
|
||||||
const imageData = new Uint32Array(data.buffer);
|
|
||||||
|
|
||||||
const [ucx, ucy] = getChunkOfPixel(size, x, y);
|
|
||||||
const [lcx, lcy] = getChunkOfPixel(size, x + width, y + height);
|
|
||||||
|
|
||||||
let totalPxlCnt = 0;
|
|
||||||
console.log(`Loading to chunks from ${ucx} / ${ucy} to ${lcx} / ${lcy} ...`);
|
|
||||||
let chunk;
|
|
||||||
for (let cx = ucx; cx <= lcx; cx += 1) {
|
|
||||||
for (let cy = ucy; cy <= lcy; cy += 1) {
|
|
||||||
chunk = new Uint8Array(TILE_SIZE * TILE_SIZE);
|
|
||||||
// offset of chunk in image
|
|
||||||
const cOffX = cx * TILE_SIZE + canvasMinXY - x;
|
|
||||||
const cOffY = cy * TILE_SIZE + canvasMinXY - y;
|
|
||||||
let cOff = 0;
|
|
||||||
let pxlCnt = 0;
|
|
||||||
for (let py = 0; py < TILE_SIZE; py += 1) {
|
|
||||||
for (let px = 0; px < TILE_SIZE; px += 1) {
|
|
||||||
const clrX = cOffX + px;
|
|
||||||
const clrY = cOffY + py;
|
|
||||||
if (clrX >= 0 && clrY >= 0 && clrX < width && clrY < height) {
|
|
||||||
const clr = imageData[clrX + clrY * width];
|
|
||||||
const clrIndex = palette.abgr.indexOf(clr);
|
|
||||||
if (clrIndex !== -1) {
|
|
||||||
chunk[cOff] = clrIndex;
|
|
||||||
pxlCnt += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cOff += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (pxlCnt) {
|
|
||||||
const key = `ch:${canvasId}:${cx}:${cy}`;
|
|
||||||
await redisCanvas.set(key, Buffer.from(chunk.buffer));
|
|
||||||
console.log(`Loaded ${pxlCnt} pixels into chunk ${cx}, ${cy}.`);
|
|
||||||
totalPxlCnt += pxlCnt;
|
|
||||||
}
|
|
||||||
chunk = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
console.log('Image loading done.');
|
|
||||||
return totalPxlCnt;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
async function uploadImage(
|
|
||||||
path,
|
|
||||||
canvasId,
|
|
||||||
x,
|
|
||||||
y,
|
|
||||||
) {
|
|
||||||
const { data, info } = await sharp(path)
|
|
||||||
.ensureAlpha()
|
|
||||||
.raw()
|
|
||||||
.toBuffer({ resolveWithObject: true });
|
|
||||||
|
|
||||||
const pxlCount = await imageABGR2Canvas(
|
|
||||||
canvasId,
|
|
||||||
x, y,
|
|
||||||
data,
|
|
||||||
info.width, info.height,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
uploadImage('PZ.png', '5', -4096, -4096);
|
|
||||||
//uploadImage('PC.png', '6', -7000, -7000)
|
|
Loading…
Reference in New Issue
Block a user