diff --git a/bot/index.js b/bot/index.js index 22fea6e..6542d34 100644 --- a/bot/index.js +++ b/bot/index.js @@ -8,9 +8,7 @@ const { config } = require('../utils/config'); /** @type { import('telegraf/typings').Telegraf } */ const bot = new Telegraf(config.token); -if (process.env.NODE_ENV === 'development') { - bot.polling.offset = -1; -} +bot.polling.offset = -1; module.exports = bot; diff --git a/handlers/middlewares/antiflood.ts b/handlers/middlewares/antiflood.ts new file mode 100644 index 0000000..849c9cb --- /dev/null +++ b/handlers/middlewares/antiflood.ts @@ -0,0 +1,19 @@ +import ms = require("millisecond"); +import rateLimit = require("telegraf-ratelimit"); +import type { ExtendedContext } from "../../typings/context"; + +function keyGenerator(ctx: ExtendedContext) { + if (ctx.updateType !== "message") return null; + if (ctx.from?.status !== "member") return null; + if (!ctx.chat?.type.endsWith("group")) return null; + return `${ctx.chat.id}:${ctx.from.id}`; +} + +const permissions = { can_send_messages: false }; + +async function onLimitExceeded(ctx: ExtendedContext) { + const until_date = (Date.now() + ms("2m")) / 1000; + await ctx.restrictChatMember(ctx.from!.id, { permissions, until_date }); +} + +export = rateLimit({ keyGenerator, onLimitExceeded }); diff --git a/handlers/middlewares/index.js b/handlers/middlewares/index.js index bd0480c..20804f3 100644 --- a/handlers/middlewares/index.js +++ b/handlers/middlewares/index.js @@ -14,6 +14,7 @@ const { deleteJoinsAfter = '2 minutes' } = require('../../utils/config').config; const addedToGroupHandler = require('./addedToGroup'); const antibotHandler = require('./antibot'); +const antifloodHandler = require('./antiflood'); const checkLinksHandler = require('./checkLinks'); const commandButtons = require('./commandButtons'); const kickBannedHandler = require('./kickBanned'); @@ -45,6 +46,7 @@ composer.on( deleteAfter(deleteJoinsAfter), presenceLogHandler, ); +composer.use(antifloodHandler); composer.action( /^\/del -chat_id=(-\d+) -msg_id=(\d+) Report handled/, reportHandled, diff --git a/package-lock.json b/package-lock.json index 9604283..6019f8f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1450,6 +1450,14 @@ } } }, + "telegraf-ratelimit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/telegraf-ratelimit/-/telegraf-ratelimit-2.0.0.tgz", + "integrity": "sha512-OUVJRz+pVDpkOfwvFuv4x5YxcPIl6puPN3HRdicN3NDnT+jQeMzKDwVAkvloUtyH1Ruo1wH4nfB5tZbtJAJ4pQ==", + "requires": { + "debug": "^3.1.0" + } + }, "telegram-typings": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/telegram-typings/-/telegram-typings-3.6.1.tgz", diff --git a/package.json b/package.json index 6374e9f..61d3835 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "spamwatch": "^0.2.0", "string-replace-async": "^1.2.1", "telegraf": "^3.38.0", + "telegraf-ratelimit": "^2.0.0", "ts-node": "^8.9.1", "typescript": "^3.8.3", "xregexp": "^4.2.0"