Skip to main content

ErisPulse RateLimiter Module / ErisPulse RateLimiter 速率限制模块

English | 中文


English

ErisPulse message rate limiting module to prevent user spam.

Features

  • Dual Strategy: Fixed window and sliding window (recommended)
  • Multi-dimensional: By user / by group / by user+group combo
  • Whitelist Immunity: Admins and bot owners can be configured to bypass limits
  • Silent or Warn: Optional warning message when rate limit is triggered
  • Hot Reload: Runtime config changes take effect immediately
  • Full i18n: Config descriptions, option labels, placeholders, and group titles all support multiple languages
  • Zero Intrusion: Uses high-priority event interception — business modules don't need to be aware

How It Works

The module registers a high-priority message handler (priority=1000) that executes before all business modules. It checks the sender's message count within the time window. When the limit is exceeded, it calls event.mark_processed() to short-circuit subsequent lower-priority handlers, effectively "intercepting" the message.

Message event flow:
  [RateLimiter interceptor priority=1000]
        ↓ whitelist user → pass through
        ↓ under limit   → pass through
        ↓ over limit    → mark_processed() → business modules won't execute
  [Business modules priority=0~999]

Installation

pip install ErisPulse-RateLimiter

Or in development mode:

pip install -e .

Configuration

After installing and starting ErisPulse, a [RateLimiter] section will be automatically generated in config/config.toml:

[RateLimiter]
enabled = true                    # Enable/disable
max_messages = 10                 # Max messages allowed in the time window
window_seconds = 10               # Time window size (seconds)
scope = "user_group"              # Scope: user / group / user_group
strategy = "sliding"              # Strategy: fixed / sliding
warn_message = "⚠️ Your message frequency is too high, please try again later"  # Warning text (leave empty for silent)
private_limit = true              # Whether to also limit private messages
whitelist = []                    # Whitelist user IDs, these users are exempt

Scope Explanation

scope Meaning Use Case
user By user (cross-group aggregate count) Prevent a single user from spamming globally
group By group (everyone in the group aggregated) Limit overall group activity
user_group By user + group (independent count) Precise to "a user in a group", most common

Strategy Explanation

strategy Meaning Characteristics
fixed Fixed window Simple implementation, window boundaries may allow 2x traffic bursts
sliding Sliding window (recommended) Smoother, strictly ensures no window exceeds the limit

Example

Typical config: max 5 messages per user per group within 10 seconds, admins exempt.

[RateLimiter]
enabled = true
max_messages = 5
window_seconds = 10
scope = "user_group"
strategy = "sliding"
warn_message = "Please slow down, you're sending messages too quickly"
whitelist = ["admin_001", "admin_002"]

Development

This module demonstrates ErisPulse's event interception pattern (high priority + mark_processed() short-circuit). Refer to the ErisPulse Module Development Guide for more info.


中文

ErisPulse 的消息速率限制模块,防止用户刷屏。

功能特性

  • 双策略限流:固定窗口、滑动窗口(推荐)
  • 多维度限流:按用户 / 按群 / 按用户+群组合
  • 白名单免疫:管理员 / Bot 所有者可配置不受限流
  • 静默或提示:超限时可选回复警告文案
  • 热更新:运行时修改配置阈值立即生效
  • 全面 i18n:配置描述、选项标签、占位符、分组标题均支持多语言
  • 零侵入:通过高优先级事件拦截实现,业务模块无需感知

工作原理

模块注册一个 priority=1000 的高优先级消息处理器,先于所有业务模块执行。 检查发送者在时间窗口内的消息计数,超限时调用 event.mark_processed() 短路后续低优先级处理器,从而"拦截"消息。

消息事件流:
  [RateLimiter 拦截器 priority=1000]
        ↓ 白名单用户 → 直接放行
        ↓ 未超限   → 放行
        ↓ 超限     → mark_processed() → 业务模块不执行
  [业务模块 priority=0~999]

安装

pip install ErisPulse-RateLimiter

或开发模式:

pip install -e .

配置

安装并启动 ErisPulse 后,会自动在 config/config.toml 生成 [RateLimiter] 段:

[RateLimiter]
enabled = true                    # 是否启用
max_messages = 10                 # 时间窗口内允许的最大消息数
window_seconds = 10               # 时间窗口大小(秒)
scope = "user_group"              # 限流维度:user / group / user_group
strategy = "sliding"              # 限流策略:fixed / sliding
warn_message = "⚠️ 你的消息频率过高,请稍后再试"  # 触发限流时的提示(留空则静默拦截)
private_limit = true              # 是否对私聊消息也限流
whitelist = []                    # 白名单用户 ID,这些用户不受限流

限流维度说明

scope 含义 适用场景
user 按用户(跨群合并计数) 防止单个用户全局刷屏
group 按群(群内所有人合并) 限制群整体活跃度
user_group 按用户+群(独立计数) 精确到"某用户在某群",最常用

限流策略说明

strategy 含义 特点
fixed 固定窗口 实现简单,窗口边界可能瞬时通过 2 倍流量
sliding 滑动窗口(推荐) 更平滑,严格保证任意窗口内不超过上限

示例

典型配置:每用户每群 10 秒内最多 5 条消息,管理员免疫限流。

[RateLimiter]
enabled = true
max_messages = 5
window_seconds = 10
scope = "user_group"
strategy = "sliding"
warn_message = "请放慢速度哦,消息太频繁了"
whitelist = ["admin_001", "admin_002"]

开发

本模块演示了 ErisPulse 的 事件拦截模式(高优先级 + mark_processed() 短路)。 参考 ErisPulse 模块开发指南 了解更多。

Metadata

Release files for ErisPulse-RateLimiter 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ErisPulse-RateLimiter 1.0.0
File Size Uploaded
erispulse_ratelimiter-1.0.0.tar.gz 10.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for ErisPulse-RateLimiter 1.0.0
File Interpreter ABI Platform
erispulse_ratelimiter-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 23.0 kB

Release files / erispulse_ratelimiter-1.0.0.tar.gz

Download URL erispulse_ratelimiter-1.0.0.tar.gz
Size 10.9 kB
Tags Source
SHA-256 checksum
How to use checksums
82bfa66606e961b1e9b034bbae55b75f8f03c08edef881ca4304f3cbb2831279
BLAKE2b-256 checksum
How to use checksums
82a65ac3e0a32d41e53c8a29f994d48080858b758cafb903457d2c653dd62356
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 9, 2026.

Transparency log

Release files / erispulse_ratelimiter-1.0.0-py3-none-any.whl

Download URL erispulse_ratelimiter-1.0.0-py3-none-any.whl
Size 12.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
28ae9e7bb0dc9a3a3908b27da78efcb29ee357a571f9e14a6e89837ea22db8cb
BLAKE2b-256 checksum
How to use checksums
334a55ef7f4af8a89e00c9a17a8119494d398b1dff15662f30debdc5158baf69
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 9, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page