feat(messages): счётчики упоминаний, квота приглашений и read state автора

- упоминания в сообщении увеличивают счётчик упоминаний комнаты у упомянутых
  (store.BumpMentionCount) и отправляют им READ_STATE_UPDATE на все устройства;
- отправка сообщения отмечает его прочитанным для автора;
- подтверждение прочтения сбрасывает упоминания;
- суточная квота 10 приглашений на пользователя (AGENT.md 8.6), администратор
  инстанса её обходит; httpx.NewRateLimiterWindow для произвольных окон;
- тест на рост и сброс счётчика упоминаний.
This commit is contained in:
2026-09-19 23:37:02 +03:00
parent 0e39b8e027
commit 8619f37cd5
15 changed files with 186 additions and 6 deletions
+16 -1
View File
@@ -33,9 +33,24 @@ func NewRateLimiter(perMinute, burst int) *RateLimiter {
if burst <= 0 {
burst = perMinute
}
return NewRateLimiterWindow(perMinute, time.Minute, burst)
}
// NewRateLimiterWindow создаёт лимитер на произвольное окно: нужно для
// суточных квот (например, 10 приглашений в день, AGENT.md 8.6).
func NewRateLimiterWindow(limit int, window time.Duration, burst int) *RateLimiter {
if limit <= 0 {
limit = 1
}
if window <= 0 {
window = time.Minute
}
if burst <= 0 {
burst = limit
}
return &RateLimiter{
buckets: map[string]*rateBucket{},
rate: float64(perMinute) / 60,
rate: float64(limit) / window.Seconds(),
burst: float64(burst),
now: time.Now,
}