Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/mediv0/telegram-rate-limiter

dead simple rate limiter for telegram bots with typescript support.
https://github.com/mediv0/telegram-rate-limiter

rate-limiter telegram telegram-bot telegrambot

Last synced: 3 months ago
JSON representation

dead simple rate limiter for telegram bots with typescript support.

Awesome Lists containing this project

README

        

## Telegram Rate Limiter

dead simple rate limiter for telegram bots with typescript support.

can be used to limit the number of messages sent by a user, using a token bucket algorithm. works fine with both telegraf and Telegram-Bot-API packages.

Supported Drivers:

- Memory ( development only )
- Redis ( Production )

adding other drivers is not supported yet. ( will be soon )

## Install

```
yarn add @mediv0/rate-limit
```
or
```
npm install @mediv0/rate-limit
```

## usage example

```js
import { Limiter } from "@mediv0/rate-limit";

// init
const limiter = new Limiter("memory", {
interval: 10,
max: 5,
driverOptions: {},
});

// Telegram-Bot-API example
bot.on("message", async (msg) => {
try {
const userId = msg.chat.id;
await limiter.limit(userId);
bot.sendMessage(chatId, "Hello World!");
} catch (e) {
// catch rate limit errors
}
});
```

## Options

`Limiter`

#### class Limiter (driver: `K`, options: `ILimiterOptions`)

**driver** -> `memory` | `redis`

**ILimiterOptions** ->

```
{
max: number; // maximum number of messages allowed in the interval
interval: number; // interval in minutes e.g -> 2
driverOptions: T; // driver specific options
}
```

for example, in snipet below, a user can send maximum 100 messages in interval of 5 minutes. if the user sends more than 100 messages, the limiter will throw an error.

```js
const limiter = new Limiter("memory", {
interval: 5,
max: 100,
driverOptions: {},
});
```

### Redis Driver

driver used in this packages is from [npm redis](https://www.npmjs.com/package/redis)

you can pass options used in redis package to rate limiter.

**[list of redis options](https://github.com/redis/node-redis/blob/HEAD/docs/client-configuration.md)**

```js
limiter = new Limiter("redis", {
interval: 10,
max: 5,
driverOptions: {
url: "redis://localhost:6379",
name: "test",
password: "test",
legacyMode: false,
// other options
},
});
```