Kontrol Flood (transformer-throttler)

Plugin ini menjaga bot kamu agar terhindar dari rate limitopen in new window—lihat materi tingkat lanjut berikut—dengan cara membuat daftar antrian API request yang keluar menggunakan Bottleneckopen in new window.

Aturan Pembatasan API yang Tidak Didokumentasikan

Telegram juga memiliki beberapa aturan rate limit yang tidak didokumentasikan. Sayangnya, aturan-aturan tersebut tidak diperhitungkan oleh throttler. Oleh karena itu, kalau kamu mengalami error floodwait untuk beberapa pemanggilan API, misalnya api.sendContact, maka kami menyarankan untuk memasang plugin auto-retry dan plugin ini secara beriringan.

Penggunaan

Perlu diketahui, pengaturan opsi bawaan plugin ini menggunakan aturan rate limit asli yang diterapkan oleh Telegram. Semestinya, pengaturan bawaan tersebut sudah cukup sesuai untuk sebagian besar bot. Berikut contoh penggunaan plugin ini dengan menggunakan opsi bawaan:

import { Bot } from "grammy";
import { run } from "@grammyjs/runner";
import { apiThrottler } from "@grammyjs/transformer-throttler";

const botToken = process.env.BOT_TOKEN;
if (!botToken) {
  throw Error("BOT_TOKEN diperlukan!");
}
const bot = new Bot(botToken);

const throttler = apiThrottler();
bot.api.config.use(throttler);

bot.command("/example", (ctx) => ctx.reply("Aku di-throttler."));

// Kalau kamu menggunakan throttler, kemungkinan besar kamu juga ingin
// menggunakan runner untuk menangani update secara bersamaan.
run(bot);
const { Bot } = require("grammy");
const { run } = require("@grammyjs/runner");
const { apiThrottler } = require("@grammyjs/transformer-throttler");

const botToken = process.env.BOT_TOKEN;
if (!botToken) {
  throw Error("BOT_TOKEN diperlukan!");
}
const bot = new Bot(botToken);

const throttler = apiThrottler();
bot.api.config.use(throttler);

bot.command("/example", (ctx) => ctx.reply("Aku di-throttler."));

// Kalau kamu menggunakan throttler, kemungkinan besar kamu juga ingin
// menggunakan runner untuk menangani update secara bersamaan.
run(bot);
import { Bot } from "https://deno.land/x/grammy@v1.11.2/mod.ts";
import { run } from "https://deno.land/x/grammy_runner@v1.0.4/mod.ts";
import { apiThrottler } from "https://deno.land/x/grammy_transformer_throttler@v1.1.2/mod.ts";

const botToken = Deno.env.get("BOT_TOKEN");
if (!botToken) {
  throw Error("BOT_TOKEN diperlukan!");
}
const bot = new Bot(botToken);

const throttler = apiThrottler();
bot.api.config.use(throttler);

bot.command("/example", (ctx) => ctx.reply("Aku di-throttler."));

// Kalau kamu menggunakan throttler, kemungkinan besar kamu juga ingin
// menggunakan runner untuk menangani update secara bersamaan.
run(bot);

Konfigurasi

Throttler ini menerima sebuah argument opsional dalam bentuk berikut:

type ThrottlerOptions = {
  global?: Bottleneck.ConstructorOptions; // Untuk men-throttler semua pemanggilan api
  group?: Bottleneck.ConstructorOptions; // Untuk men-throttler pesan grup yang keluar
  out?: Bottleneck.ConstructorOptions; // Untuk men-throttler pesan pribadi yang keluar
};

Daftar lengkap object property apa saja yang tersedia untuk Bottleneck.ConstructorOptions bisa ditemukan di Bottleneckopen in new window.

Jika tidak ada argument yang disertakan, throttler akan menggunakan konfigurasi bawaan. Berikut konfigurasi bawaannya:

// Throttler Keluaran Secara Keseluruhan
const globalConfig = {
  reservoir: 30, // jumlah tugas baru yang throttler terima di awal
  reservoirRefreshAmount: 30, // jumlah tugas yang throttler terima setelah diperbarui
  reservoirRefreshInterval: 1000, // rentang waktu pembaruan reservoir dalam milidetik
};

// Throttler Keluaran Grup
const groupConfig = {
  maxConcurrent: 1, // hanya 1 tugas dalam satu waktu
  minTime: 1000, // tunggu sekian milidetik untuk satu tugas
  reservoir: 20, // jumlah tugas baru yang throttler terima di awal
  reservoirRefreshAmount: 20, // jumlah tugas yang throttler terima setelah diperbarui
  reservoirRefreshInterval: 60000, // rentang waktu pembaruan reservoir dalam milidetik
};

// Throttler Keluaran Pribadi
const outConfig = {
  maxConcurrent: 1, // hanya 1 tugas dalam satu waktu
  minTime: 1000, // tunggu sekian milidetik untuk satu tugas
};

Ringkasan Plugin