Skip to content

Commit 397dd79

Browse files
committed
rebrand as reviewGOOSE
1 parent eddfd52 commit 397dd79

45 files changed

Lines changed: 7801 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

cmd/reviewGOOSE/.DS_Store

6 KB
Binary file not shown.

cmd/reviewGOOSE/VERSION

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
v0.9.3
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
package main
2+
3+
import (
4+
"log/slog"
5+
"sync"
6+
"time"
7+
)
8+
9+
// BrowserRateLimiter manages rate limiting for automatically opening browser windows.
10+
type BrowserRateLimiter struct {
11+
openedPRs map[string]bool
12+
openedLastMinute []time.Time
13+
openedToday []time.Time
14+
startupDelay time.Duration
15+
maxPerMinute int
16+
maxPerDay int
17+
mu sync.Mutex
18+
}
19+
20+
// NewBrowserRateLimiter creates a new browser rate limiter.
21+
func NewBrowserRateLimiter(startupDelay time.Duration, maxPerMinute, maxPerDay int) *BrowserRateLimiter {
22+
slog.Info("[BROWSER] Initializing rate limiter",
23+
"startup_delay", startupDelay, "max_per_minute", maxPerMinute, "max_per_day", maxPerDay)
24+
return &BrowserRateLimiter{
25+
openedLastMinute: make([]time.Time, 0),
26+
openedToday: make([]time.Time, 0),
27+
startupDelay: startupDelay,
28+
maxPerMinute: maxPerMinute,
29+
maxPerDay: maxPerDay,
30+
openedPRs: make(map[string]bool),
31+
}
32+
}
33+
34+
// CanOpen checks if we can open a browser window according to rate limits.
35+
func (b *BrowserRateLimiter) CanOpen(startTime time.Time, prURL string) bool {
36+
b.mu.Lock()
37+
defer b.mu.Unlock()
38+
39+
slog.Info("[BROWSER] CanOpen check",
40+
"url", prURL,
41+
"time_since_start", time.Since(startTime).Round(time.Second),
42+
"startup_delay", b.startupDelay)
43+
44+
// Check if we've already opened this PR
45+
if b.openedPRs[prURL] {
46+
slog.Info("[BROWSER] Skipping auto-open: PR already opened", "url", prURL)
47+
return false
48+
}
49+
50+
// Check startup delay
51+
if time.Since(startTime) < b.startupDelay {
52+
slog.Info("[BROWSER] Skipping auto-open: within startup delay period",
53+
"remaining", b.startupDelay-time.Since(startTime))
54+
return false
55+
}
56+
57+
now := time.Now()
58+
59+
// Clean old entries
60+
b.cleanOldEntries(now)
61+
62+
// Check per-minute limit
63+
if len(b.openedLastMinute) >= b.maxPerMinute {
64+
slog.Info("[BROWSER] Rate limit: per-minute limit reached",
65+
"opened", len(b.openedLastMinute), "max", b.maxPerMinute)
66+
return false
67+
}
68+
69+
// Check per-day limit
70+
if len(b.openedToday) >= b.maxPerDay {
71+
slog.Info("[BROWSER] Rate limit: daily limit reached",
72+
"opened", len(b.openedToday), "max", b.maxPerDay)
73+
return false
74+
}
75+
76+
slog.Info("[BROWSER] CanOpen returning true", "url", prURL)
77+
return true
78+
}
79+
80+
// RecordOpen records that a browser window was opened.
81+
func (b *BrowserRateLimiter) RecordOpen(prURL string) {
82+
b.mu.Lock()
83+
defer b.mu.Unlock()
84+
85+
now := time.Now()
86+
b.openedLastMinute = append(b.openedLastMinute, now)
87+
b.openedToday = append(b.openedToday, now)
88+
b.openedPRs[prURL] = true
89+
90+
slog.Info("[BROWSER] Recorded browser open",
91+
"url", prURL, "minuteCount", len(b.openedLastMinute), "minuteMax", b.maxPerMinute,
92+
"todayCount", len(b.openedToday), "todayMax", b.maxPerDay)
93+
}
94+
95+
// cleanOldEntries removes entries outside the time windows.
96+
func (b *BrowserRateLimiter) cleanOldEntries(now time.Time) {
97+
// Clean entries older than 1 minute
98+
oneMinuteAgo := now.Add(-1 * time.Minute)
99+
newLastMinute := make([]time.Time, 0, len(b.openedLastMinute))
100+
for _, t := range b.openedLastMinute {
101+
if t.After(oneMinuteAgo) {
102+
newLastMinute = append(newLastMinute, t)
103+
}
104+
}
105+
b.openedLastMinute = newLastMinute
106+
107+
// Clean entries older than 24 hours (1 day)
108+
oneDayAgo := now.Add(-24 * time.Hour)
109+
newToday := make([]time.Time, 0, len(b.openedToday))
110+
for _, t := range b.openedToday {
111+
if t.After(oneDayAgo) {
112+
newToday = append(newToday, t)
113+
}
114+
}
115+
b.openedToday = newToday
116+
}
117+
118+
// Reset clears the opened PRs tracking - useful when toggling the feature.
119+
func (b *BrowserRateLimiter) Reset() {
120+
b.mu.Lock()
121+
defer b.mu.Unlock()
122+
previousCount := len(b.openedPRs)
123+
b.openedPRs = make(map[string]bool)
124+
slog.Info("[BROWSER] Rate limiter reset", "clearedPRs", previousCount)
125+
}

0 commit comments

Comments
 (0)