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

ddbot.js-0374

v4.3.1

Published

ddbot.js — это Node.js проект для автоматизации и управления ботами.

Readme

ddbot.js

Библиотека которая оборачивает teeworlds(npm i teeworlds) в более удобный (Для меня лично как минимум.) формат.

0374flop MIT


начало

установка

npm i ddbot.js-0374

експорт

import * as ddbot from 'ddbot.js-0374';
const ddbot = require('ddbot.js-0374');

простейший пример

import * as ddbot from '../lib/index.js';

    const bot = new ddbot.Bot(/* identity, options, custom teeworlds */);
    // if no identity is provided, it will be default 'nameless tee' with default skin

    bot.on('connect', () => {
        console.log('Connected to server!');
    });

    bot.on('disconnect', () => {
        console.log('Disconnected from server!');
    });

    (async () => {
        await bot.connect('45.141.57.22', 8303, 20000); // IP, port, timeout (IP is of ddnet server)
        bot.bot_client?.game.Say('DDNet!'); // from teeworlds
        setTimeout(async () => {
            await bot.disconnect();
            process.exit(0);
        }, 5000); // 5 sec

        process.on('SIGINT', async () => { // on Ctrl+C
            await bot.disconnect();
            process.exit(0);
        });
})();

Документация

Bot

const bot = new ddbot.Bot(identity?, options?, customTeeworlds?);

методы

bot.connect(addr, port?, timeout?) - подключится к серверу. возвращает Promise<ConnectionInfo>.

bot.disconnect() - отключится от сервера. возвращает Promise<ConnectionInfo | null>.

bot.send_input(input) - отправить инпут (движение, прицел, и тд).

bot.change_identity(identity) - сменить скин/имя/клан и тд.

bot.destroy() - полностью уничтожить бота, очищает все listeners.

геттеры

bot.bot_client - оригинальный клиент teeworlds. может быть null если не подключен. (Proxie)

bot.bot_identity - текущий identity бота.

bot.OwnID - clientId бота на сервере. undefined если не подключен.

события

connect - подключился. (info: ConnectionInfo)

disconnect - отключился. (reason: string | null, info: ConnectionInfo)

error - когда у бота ошибка (...args: any[]), (Почти не изпользуеться)

...остальные события проксируються из teeworlds


Модули

Модули это отдельные куски функционала которые можно подключить к боту.

const chat = new ddbot.StandardModules.Chat(bot); // bot уже должен быть инициализирован! (не обязательно подключен)
chat.start();

Chat

Слушает message, и дедублирует сообщения. (из-за udp, они дублируються чтобы оно дошло, ведь там нет гарантии доставки.)

const chat = new ddbot.StandardModules.Chat(bot);
chat.start(interval?, cooldown?);

interval - как часто чиститься кеш дубликатов (ms, default: 1000) cooldown - минимальная задержка между исходящими сообщениями (ms, default: 1000)

chat.send(text, team?, priority?) - добавить сообщение в очередь на отправку.

события:

anychat - любое сообщение (msg, author, text, team, client_id)

chat - сообщение от игрока (msg, author, text, team, client_id)

systemchat - системное сообщение (msg, text)

queued - сообщение добавлено в очередь ({ text, team, queueSize })

sent - сообщение отправлено ({ text, team, queueSize })


PlayerList

Просто сканирует всех игроков от client_id = 0, до 64. (Зделано чтобы быстро получить весь список игроков и для отслеживания заходов/выходов игроков.)

const playerlist = new ddbot.StandardModules.PlayerList(bot);
playerlist.start(maxclients?);
interface PlayerData {
	client_id: number;
	clientInfo: Types.SnapshotItemTypes.ClientInfo;
	playerInfo: Types.SnapshotItemTypes.PlayerInfo;
	character: Types.SnapshotItemTypes.Character | null;
	DDNetCharacter: Types.SnapshotItemTypes.DDNetCharacter | null;
}

maxclients - максимальное количество игроков (default: 64)

playerlist.list - список всех игроков [client_id, PlayerData][]

playerlist.getPlayer(client_id) - получить игрока по id. PlayerData | null

playerlist.getPlayerCount() - количество игроков онлайн

события:

player_joined - игрок зашел ({ client_id, name, playerData })

player_left - игрок вышел ({ client_id, name, playerData })


Reconnect

Автоматически переподключает бота при дисконнекте. Умно считает задержку в зависимости от причины. (причины добыты експерементально с оф севреров)

const reconnect = new ddbot.StandardModules.Reconnect(bot);
reconnect.start(maxAttempts?, randomDelay?);

maxAttempts - максимальное количество попыток реконнекта (-1 для бесконечного, default: -1) randomDelay - добавлять рандомную задержку к базовой (default: true)

события:

reconnecting - начинает переподключаться ({ attempt, delay, reason, ConnectionInfo })

reconnected - успешно переподключился ({ addr, port })

reconnect_failed - не смог переподключиться (reason)


Snap

Слушает snapshot события и даёт удобные события поверх них. (зделаны не все)

const snap = new ddbot.StandardModules.Snap(bot);
snap.start();

snap.isFrozen - заморожен ли бот прямо сейчас

Snap.angleshot(character) - статичный метод, возвращает вектор прицела персонажа { x, y } | null

события:

hammerhitme - кто-то ударил молотком по боту (или просто рядом, и пощитало не правильно) (hit, client_id)

fire - кто-то выстрелил рядом (sound, client_id)

frozen - бот заморозился

unfrozen - бот разморозился


BaseModule

Базовый класс для своих модулей.

import { BaseModule } from 'ddbot.js-0374';

class MyModule extends BaseModule {
    constructor(bot) {
        super(bot, { moduleName: 'MyModule' });
    }

    _start() {
        this.bot.on('connect', () => {
            console.log('connected!');
        });
    }

    _stop() {
        // cleanup
    }
}

const myModule = new MyModule(bot);
myModule.start();

moduleName - имя модуля (для ошибок) offonDisconnect - автоматически вызывать destroy() при дисконнекте (default: true)

module.start(...args) - запустить модуль, вызывает _start(...args)

module.stop() - остановить модуль, вызывает _stop()

module.destroy() - полностью уничтожить модуль, очищает все listeners

module.isRunning - запущен ли модуль


DDUtils

DDUtils.DefaultIdentity(name?) - возвращает дефолтный identity Identity, если имени нет, то 'nameless tee'

DDUtils.connectionInfo() - возвращает дефолтный ConnectionInfo, 'ConnectionInfo = { addr: 'string', port: 8303 }'

DDUtils.reconstructPlayerInput(char, ddnetChar?, tick?) - реконструирует инпут игрока из snapshot. NOT FULL. Types.SnapshotItemTypes.PlayerInput