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 🙏

© 2026 – Pkg Stats / Ryan Hefner

owot-js

v1.1.0

Published

OWOT Client. Tile management, chat and world editing capabilities.

Downloads

33

Readme

owot-js - OWOT Bot Library

Note: This library is now actively maintained to support the latest features of OWOT (Our World Of Text).

Installing

npm install owot-js

Requires Node.js 12.0+!

Nodejs

Example

const OWOTjs = require("owot-js");

const bot = new OWOTjs.Client({
    world: 'myworld',
    token: 'your-uvias-token', // Optional
    log: true
});

bot.on("join", () => {
    bot.chat.send("Hello World!");
});

bot.on("open", () => {
    bot.world.writeString("Welcome!", "#FF0000", 0, 0, 0, 0);
});

Events

| Event | Parameters | Description | |-------|------------|-------------| | open | none | WebSocket opened | | close | none | WebSocket closed | | chat | data | New message in chat | | chatdelete | data | Chat message deleted | | tileUpdate | tiles | New tile updates | | fetch | tiles | Fetched tiles received | | join | id, channel | Joined and got id | | user_count | count | User count changed | | stats | data | Stats response received | | cmd | data | Command broadcast received | | cursor | data | Cursor position update | | chathistory | data | Chat history received | | writeResponse | data | Write response (accepted/rejected) |

Options

| Option | Type | Default | Description | |--------|------|---------|-------------| | origin | string | 'https://ourworldoftext.com/' | Origin URL | | ws | string | auto-generated | WebSocket URL | | world | string | '' (main) | World name | | token | string | undefined | Uvias authentication token | | color | string | '0' | Default color | | log | boolean | true | Enable logging | | hide | boolean | false | Hide from online counter |

Module Exports

Requiring the library returns an object with:

| Export | Type | Description | |--------|------|-------------| | Client | Class | Main client class | | CharQuota | Class | Rate quota management | | Tiles | TileSystem | Default TileSystem instance | | TileSystem | Class | Tile management class |


API Reference

Client

Client.player

Player information object:

| Property | Type | Description | |----------|------|-------------| | nickname | string | Player nickname | | chatColor | number | Chat color | | color | number | Default tile color | | id | number | Player ID | | channel | string | Current channel | | tileX | number | Current tile X | | tileY | number | Current tile Y | | charX | number | Current character X within tile | | charY | number | Current character Y within tile | | quota | CharQuota | Rate quota manager |

Client.net

Network configuration:

WebSocket Client.net.ws

WebSocket connection instance.

Client.net.sendWrite(array edits, object options)

Send write requests.

| Parameter | Type | Description | |-----------|------|-------------| | edits | Array | Array of edit items | | options.public_only | boolean | Only write to public tiles | | options.preserve_links | boolean | Preserve existing links |

Array Client.net.writeBuffer

Buffer for pending write operations.

Number Client.net.writeSize

Maximum edits per write request (default: 512).

Client.net.flushWrites()

Force flush pending writes.

Client.net.setFlushInterval(Number newInterval)

Set the flush interval in milliseconds.


Client.chat

Client.chat.send(String message, Boolean global = false)

Sends a chat message.

| Parameter | Type | Default | Description | |-----------|------|---------|-------------| | message | string | required | Message content | | global | boolean | false | Send to global chat |


Client.world

Promise Client.world.getTile(Number tileX, Number tileY, Object options)

Request the content of a tile. Returns cached tile if available.

| Parameter | Type | Description | |-----------|------|-------------| | tileX | number | Tile X coordinate | | tileY | number | Tile Y coordinate | | options.utf16 | boolean | Strip surrogates/combining chars | | options.array | boolean | Split content into array | | options.content_only | boolean | Return contents only | | options.concat | boolean | Return joined contents |

Promise Client.world.getChar(Number tileX, Number tileY, Number charX, Number charY)

Retrieves a character at specified coordinates.

Returns: { char: ' ', color: 0 }

Promise Client.world.requestRectangle(Number minX, Number minY, Number maxX, Number maxY, Object options)

Request content within a rectangular region.

| Parameter | Type | Description | |-----------|------|-------------| | minX | number | Minimum X coordinate | | minY | number | Minimum Y coordinate | | maxX | number | Maximum X coordinate | | maxY | number | Maximum Y coordinate | | options | object | Same options as getTile() |

Boolean Client.world.move(Number tileX, Number tileY, Number charX, Number charY, Boolean hidden)

Update cursor position and move player.

| Parameter | Type | Default | Description | |-----------|------|---------|-------------| | tileX | number | 0 | Target tile X | | tileY | number | 0 | Target tile Y | | charX | number | 0 | Character X within tile | | charY | number | 0 | Character Y within tile | | hidden | boolean | false | Hide cursor |

Boolean Client.world.writeChar(String char, String color, String bgColor, Number tileX, Number tileY, Number charX, Number charY)

Write a single character.

| Parameter | Type | Default | Description | |-----------|------|---------|-------------| | char | string | ' ' | Character to write | | color | string/number | undefined | Text color | | bgColor | string/number | undefined | Background color (-1 for none) | | tileX | number | required | Tile X coordinate | | tileY | number | required | Tile Y coordinate | | charX | number | required | Character X within tile | | charY | number | required | Character Y within tile |

Promise Client.world.writeString(String str, String color, String bgColor, Number tileX, Number tileY, Number charX, Number charY)

Write a string (automatically handles quota limits).

| Parameter | Type | Default | Description | |-----------|------|---------|-------------| | str | string | ' ' | String to write | | color | string/number | undefined | Text color | | bgColor | string/number | undefined | Background color | | tileX | number | required | Starting tile X | | tileY | number | required | Starting tile Y | | charX | number | required | Starting character X | | charY | number | required | Starting character Y |

Client.world.protectTile(Number tileX, Number tileY, Object options)

Protect or unprotect a tile area. Requires owner/member permissions.

| Parameter | Type | Description | |-----------|------|-------------| | tileX | number | Tile X coordinate | | tileY | number | Tile Y coordinate | | options.action | string | 'protect' or 'unprotect' | | options.type | string | 'public', 'member-only', 'owner-only' | | options.charX | number | Character X (default: 0) | | options.charY | number | Character Y (default: 0) | | options.charWidth | number | Width in chars (default: 16) | | options.charHeight | number | Height in chars (default: 8) | | options.precise | boolean | Precise protection mode |

Client.world.clearTile(Number tileX, Number tileY, Number charX, Number charY, Number charWidth, Number charHeight)

Clear a rectangular area of tiles.

| Parameter | Type | Default | Description | |-----------|------|---------|-------------| | tileX | number | required | Tile X coordinate | | tileY | number | required | Tile Y coordinate | | charX | number | 0 | Starting character X | | charY | number | 0 | Starting character Y | | charWidth | number | 16 | Width to clear | | charHeight | number | 8 | Height to clear |

Client.world.createLinkURL(String url, Number tileX, Number tileY, Number charX, Number charY)

Create a URL link at specified coordinates.

| Parameter | Type | Description | |-----------|------|-------------| | url | string | URL to link to | | tileX | number | Tile X coordinate | | tileY | number | Tile Y coordinate | | charX | number | Character X within tile | | charY | number | Character Y within tile |

Client.world.createLinkCoordinates(String url, Number linkTileX, Number linkTileY, Number tileX, Number tileY, Number charX, Number charY)

Create a coordinate link.

| Parameter | Type | Description | |-----------|------|-------------| | url | string | URL (can be relative) | | linkTileX | number | Linked tile X | | linkTileY | number | Linked tile Y | | tileX | number | Source tile X | | tileY | number | Source tile Y | | charX | number | Source character X | | charY | number | Source character Y |

Client.world.requestChatHistory()

Request chat history from the server. Emits chathistory event.

Client.world.requestStats(Number id)

Request world statistics. Emits stats event.

| Parameter | Type | Description | |-----------|------|-------------| | id | number | Optional stats request ID |

Client.world.setConfig(Object options)

Configure content update subscriptions.

| Option | Type | Description | |--------|------|-------------| | updates | boolean | Enable/disable content updates | | localFilter | boolean | Enable/disable local filtering | | directAdminUpdates | boolean | Direct admin updates (superuser only) | | descriptiveCmd | boolean | Descriptive commands (superuser only) |

Client.world.setBoundary(Object options)

Set view boundary and/or center.

| Option | Type | Description | |--------|------|-------------| | centerX | number | Center X coordinate | | centerY | number | Center Y coordinate | | minX | number | Minimum X boundary | | minY | number | Minimum Y boundary | | maxX | number | Maximum X boundary | | maxY | number | Maximum Y boundary |

Client.world.broadcastCmd(String data, Boolean includeUsername, Array coords)

Broadcast a command to other clients. Emits cmd event.

| Parameter | Type | Description | |-----------|------|-------------| | data | string | Command data | | includeUsername | boolean | Include username (requires auth) | | coords | array | Optional coordinates [tileX, tileY, charX, charY] |

Client.world.leave()

Leave the current world (closes WebSocket).

Number Client.world.userCount

Current number of users in the world.


Client.util

Utility methods:

Array Client.util.chunkifyString(String message, Number quota)

Split a string into chunks respecting quota limits.

Number Client.util.rgbToInt(Number r, Number g, Number b)

Convert RGB values to integer.

Array Client.util.convertXY(Number x, Number y)

Convert screen coordinates to [tileX, tileY, charX, charY].

Array Client.util.convertPosition(Number tileX, Number tileY, Number charX, Number charY)

Convert tile/char coordinates to flat [positionX, positionY].

Array Client.util.getCursorPosition()

Get current cursor position (browser only).

Client.util.log(String msg)

Log a message (if logging enabled).


CharQuota

Rate quota management class:

const { CharQuota } = require("owot-js");

const quota = new CharQuota(rate, time, infinite);

Constructor Parameters

| Parameter | Type | Description | |-----------|------|-------------| | rate | number | Characters allowed per period | | time | number | Time period in milliseconds | | infinite | boolean | Unlimited quota |

Methods

Boolean quota.canSpend(Number count)

Check if quota allows spending count characters.

Promise quota.waitUntilRestore()

Wait asynchronously until quota is fully restored.

Number quota.getTimeToRestore()

Get milliseconds until quota is fully restored.

quota.update()

Manually update quota based on elapsed time.


TileSystem

Tile management class:

const { TileSystem, Tiles } = require("owot-js");

// Use default instance
const tile = Tiles.getTile(0, 0);

// Or create new instance
const myTiles = new TileSystem();

Methods

Array TileSystem.wrapStringTo16x16(String inputString, Array color)

Wrap a string into a 16x16 grid (tile format).

Object TileSystem.getChar(Number x, Number y, Array tile)

Get character at position within a tile.

Returns: { char: ' ', color: 0 }

Array TileSystem.getTile(Number tileX, Number tileY)

Get a cached tile.

TileSystem.saveTile(String key, String content, Array color)

Save a tile to cache.

| Parameter | Type | Description | |-----------|------|-------------| | key | string | Tile key (e.g., "0,0") | | content | string | Tile content | | color | array | Color array |

Properties

Object TileSystem.tiles

Object containing all cached tiles.


License

MIT License - See LICENSE for details.

Links