npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

better-owop-js

v1.1.4

Published

better owop-js

Downloads

18

Readme

better OWOP.js (BETA)

TO-DO

remove WeirdDataView from not needed places like setPixel move etc.

changelog

added canvasUtils added pasteImageData changed paste to pasteChunk

repaired unsafe

added isWorldConnected
added Client.destroyed
added Client.destroy()\

removed id event use join insted

OWOPUnlocked variable fix

wolfMove fix

now it will use webpack emitter on unlocked OWOPs
removed html check (now you will be able to see motd)

getPixel and requestChunk is now queued so you can just use await getPixel
EventEmitter for browser should be faster and node js uses normal EventEmitter
Fixed gae memory leak which causing 2 gb of memory while requesting 200x200x2 chunks I did 500x500x2 screenshot using this link

Added parseMessage
Added wolfMove to setPixel which checks if you must move or not
Added login using Captcha token
Added bot nick

Render captcha returns captcha token

Installing: npm i better-owop-js.
REQUIRES NODE.JS 12.0+!

You can use it in opm.

OPM Example

You can connect to my owop from opm using server selector

const BOJS = OPM.require("better-owop-js");
const Client = new BOJS.Client({
	ws: OWOP.options.serverAddress[0].url
});

Client.on("join", () => {
    console.log(Client.player.id);
});

Browser Example (just paste)

const BOJS = OPM.require("better-owop-js");
const Client = new BOJS.Client({
	protocol: 0 // if you want connecto to bop it's owop,
	ws: "ws://104.237.150.24:1337",
	world: "owop", // default world is owop on his owop
	unsafe: true // because pixel bucket is ignored in bop it's owop and then you will can use infinity setPixel
});

Client.on("join", () => {
    console.log(Client.player.id);
});

Node.js Example

const BOJS = require("better-owop-js");
const Client = new BOJS.Client({
    reconnect: true,
    controller: true
});

Client.on("join", () => {
    Client.chat.send("Hello, OWOP from BOJS!");
});

Events

open - WebSocket connecting got opened.
close - WebSocket connecting got closed [close reason].
join - Joined to world [world name, id].
rawMessage - Raw websocked message (ArrayBuffer or string) [data].
updatedPlayers - Players updates [players object].
updatedPixels - Pixels update [pixels object].
playersLeft - a player left [players id object].
newPlayers - a player connected [player id].
teleport - got 'teleport' opcode. Very rare. [x, y].
rank - Got new rank. [rank].
captcha - Captcha state. [gcaptcha id].
chunkProtect - Chunk (un)protected. [x, y, newState].
pquota - New PQuota. [rate, per].
chunk - New chunk. [x, y, chunk, protected, isNew].
message - New message in chat. [msg, parsedMessage].
destroy - Socket was destroyed and will not reconnect until you will call bot.makeSocket().
Emits when you gets ban.

Options

ws - Websocket server address. (default - wss://ourworldofpixels.com)
origin - Origin header (default - https://ourworldofpixels.com).
autoMakeSocket - should make socket automatically (default - true)
autoConnectWorld - should join world automatically (default - true)
protocol - protocol id so if you set to 0 you will be able to connect bop it owop (default - 1)
captchaSiteKey - captcha key used only on browser to render captcha (default - 6LcgvScUAAAAAARUXtwrM8MP0A0N70z4DHNJh-KI)
id - ID for logging. If not set, OWOP ID will be used.
agent - Proxy Agent.
world - World name. (default - main).
log - default true.
reconnect - Reconnect if disconnected.
adminlogin - Admin login.
modlogin - Mod login.
pass - Pass for world.
nick - Nick of bot.
captchaPass - Captcha pass.
captchaToken - Automatically sends to server captcha token if provided.
teleport - Teleport on 'teleport' opcode.
controller - Enable controller for this bot. (Use only once!).
reconnectTime - Reconnect time (ms) after disconnect (default - 5000).
worldVerification - world verification code (default - 25565) unsafe - Use methods that are supposed to be only for admin or moderator or checking bucket.

Module

When you require lib, you get object with:

Client - main OJS Client class (requires options object).
Bucket - Bucket class for quota.
ChunkSystem - Class for chunks, pixels management.
EventEmitter - opcionally if you use browser version
WeirdDataView - Normal dataView which automatically adds offset

let dv = new BOJS.WeirdDataView(new ArrayBuffer(1));
//dv.setUint8(value, offset = this.offset, addToOffset = true)
dv.setUint8(1, null, false);
dv.getUint8(); // 1

API

Client

Client API is similar to OWOP, and some methods have same 'path'.

<\static> Client.options

Object with OWOP options. Check code to see them.

Client.clientOptions

Options that you passed in options argument.

Client.chat

Client.chat.parseMessage

Parses message to [userInfo, messageContent, isTell, rawMessage]

Client.chat.send(msg)

Send message in chat.

Client.chat.sendModifier

Function for modifying and getting messages that you gonna send.

Client.chat.recvModifier

Function for modifying and getting messages that you're getting from server.

Client.chat.messages

All messages that you got. Keep in mind that it can only hold maximum of Client.options.maxChatBuffer messages in it (default - 256).

Client.world

Client.world.pasteChunk(chunkX, chunkY, chunkData)

Pastes chunk

async Client.world.pasteImageData(pixelX, pixelY, imageData, isCanvasOrImage)

Pastes imageData/image/canvas

let imageData = canvasUtils.createImageData(10, 10);
let i = canvasUtils.getIbyXY(1, 3);

imageData.data[i] = 123;
imageData.data[i + 1] = 32;
imageData.data[i + 2] = 123;
imageData.data[i + 3] = 255; // then it will not be transparent

await bot.world.pasteImageData(12, 12, imageData); // pastes one pixel
bot.on("chunk", (x, y) => {
	if(x === Math.floor(12 / 16) && y === Math.floor(12 / 16)) bot.world.pasteImageData(12, 13, canvasUtils.imageDataToCtx(imageData).canvas, true); // pastes pixel under pixel
});

Client.world.join(name)

Function to join world. Should not be used, only for internal use! For connections to new worlds you should use new Client with world option in it.

Client.world.leave()

Leave world. If there's reconnect option enabled, client will try to reconnect after options.reconnectTime (default - 5000ms) seconds.

Client.world.move(x = 0, y = 0)

Move bot to X, Y.

Client.world.setPixel(x = player.x, y = player.y, color = player.color, wolfMove, sneaky, move = isAdmin)

Move and set pixel. If sneaky option is set to true, bot will return to old location.
wolf move checks if it must move when it is more than 3 chunks from x and y

Client.world.setTool(id = 0)

Set tool that bot has eqquiped.

Client.world.setColor(color = [0, 0, 0])

Set color of bot.

Client.world.protectChunk(x = player.x, y = player.y, newState = 1)

Protect chunk. You need to be admin to use this but you can ignore this if you'll use unsafe option.

Client.world.clearChunk(x = player.x, y = player.y, rgb = player.color)

Clear chunk. You need to be admin to use this but you can ignore this if you'll use unsafe option.

await Client.world.requestChunk(x = player.x, y = player.y, innacurate)

Request chunk, it'll be loaded to ChunkSystem. If inaccurate argument is passed, it'll transform x and y to chunkX and chunkY, so you can use normal coords to request chunks. Returns raw chunk.

if(inaccurate) {
	x = Math.floor(x/Client.options.chunkSize);
	y = Math.floor(y/Client.options.chunkSize);
};

await Client.world.getPixel(x = player.x, y = player.y)

Request chunk and get pixel.

Client.destroy()

makes that it will not reconnect until you will call bot.makeSocket()

Client.makeSocket()

makes socket of bot

Client.player

  • Client.player.x
  • Client.player.y
  • Client.player.tool
  • Client.player.rank
  • Client.player.nick
  • Client.player.id
  • Client.player.color
  • Client.player.pixelBucket - instance of Bucket for pixelQuota.
  • Client.player.chatBucket - instance of Bucket for chatQuota.

Client.players

List of players. Every player is object with properties:

  • x
  • y
  • id
  • color
  • tool
  • rank
  • nick

Example: Client.players[15035].

Client.captcha

  • renderCaptcha(uniquename = true) - renders captcha. If used on browser renders captcha otherwise throws error
  • login(token) - tries to login using captcha token

<\static> Client.utils

  • Client.utils.Player (id) - class of player
  • Client.utils.createChunkFromRGB (color) - used for older protocol which is on bop it's owop
  • Client.utils.decompress (compressedChunk) - Chunk decompressor. Vars :(
  • Client.utils.shouldMove (x1, y1, x2, y2) - used for wolf move (go to setPixel)
  • Client.utils.removeAlphaFromImageData (imagedata) - removes alpha channel - renamed and moved to canvasUtils
  • Client.utils.isArraysSame (...arrays) - Checks if arrays are same

Client.chunkSystem

Instance of ChunkSystem

ChunkSystem

This class is created just for Client.chunkSystem.

Chunks

All chunks and pixels stuff goes here.

  • Chunks.chunks - array with chunks. In this array chunks are saved like this: Chunks.chunks[x][y].
  • Chunks.chunkProtected - same thing as chunks but only for protected chunks.

Keep in mind, that you'll usually only need Chunks.getPixel from all this stuff here.

ChunkSystem.setChunk(x, y, data)

Set chunk data.

ChunkSystem.getChunk(x, y)

Get chunk data.

ChunkSystem.removeChunk(x, y)

Remove chunk.

ChunkSystem.setPixel(x, y, rgb)

Set pixel in chunk.

ChunkSystem.getPixel(x, y)

Get pixel from chunk.

ChunkSystem.setChunkProtect(x, y, newState)

(un)Protect chunk.

ChunkSystem.getIbyXY(x, y, width)

so chunk is saved like that
Uint8ClampedArray(768) [
123, 123, 213, 123, 123, 213, ... to 16 * 3 (because pixel is 3 places)
123, 123, 213, 123, 123, 213, ... to 16 * 3
... to 16
]
1 pixel is 3 places in this array\

so to get one pixel you need multiply y * width and add x and multiply it by 3 (y*width+x)*3
if you have alpha channel (ex. in image) it doesn't exists in normal chunks because it is always 255 it will be multiplied by 4\

if you want get x and y from i you will need do\

i = i/3; // or 4 read before

let pos = {
	x: i % width,
	y: Math.floor(i/width)
};

ChunkSystem.isProtected(x, y)

Is chunk protected.

canvasUtils

canvasUtils._lerp(color1, color2, factor = 0.5)

lerps color

canvasUtils._lerp(255, 123, 0.1); // 242

canvasUtils.lerp(color1, color2, factor = 0.5)

lerps RGB array

canvasUtils.lerp([255, 255, 255], [123, 123, 123], 0.1); // Uint8ClampedArray(3) [242, 242, 242]

canvasUtils.imageDataToCtx(imageData)

converts imageData to ctx
ps. canvas = ctx.canvas

canvasUtils.createCanvas(width, height)

Creates canvas.
Remeber that if you know on what engine(browser, nodejs) you are working faster will be creating canvas normal way

canvasUtils.createImageData(...arguments)

Creates imageData

canvasUtils.createImageData(width, height);
canvasUtils.createImageData(imageData);

canvasUtils.dataToImageData(data, width, height, hasAlpha = true, alpha = 255)

Creates imageData

let chunkImageData = canvasUtils.dataToImageData(bot.chunkSystem.getChunk(0, 0), BOJS.Client.options.chunkSize, BOJS.Client.options.chunkSize, false); // default alpha is 255

let imageDataCopy = canvasUtils.dataToImageData(imageData.data, imageData.width, imageData.height);

canvasUtils.removeAlphaFromImageData(data (imageData.data))

Removes alpha channel from imageData

canvasUtils.removeAlphaFromImageData([255, 252, 123, 32,   255, 252, 123, 32, ...]); // Uint8ClampedArray(data.length - data.length / 4) [255, 252, 123,   255, 252, 123, ...]

canvasUtils.addAlphaToData(data, alpha = 255)

Adds alpha channel to data

canvasUtils.addAlphaToData(new Uint8Array([123,54,32, 145,23,43]), 123) // Uint8ClampedArray(data.length + data.length/4) [123,54,32,123, 145,23,43,123]

Author

License - Mit
Originally created by dimden.
Edited by mathias377#3326