feat(messages): счётчики упоминаний, квота приглашений и read state автора
- упоминания в сообщении увеличивают счётчик упоминаний комнаты у упомянутых (store.BumpMentionCount) и отправляют им READ_STATE_UPDATE на все устройства; - отправка сообщения отмечает его прочитанным для автора; - подтверждение прочтения сбрасывает упоминания; - суточная квота 10 приглашений на пользователя (AGENT.md 8.6), администратор инстанса её обходит; httpx.NewRateLimiterWindow для произвольных окон; - тест на рост и сброс счётчика упоминаний.
This commit is contained in:
@@ -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,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user