fix: resolve mnd lint issues with named constants

This commit is contained in:
user
2026-02-20 03:20:26 -08:00
parent c6c5aaf48e
commit f6ca154315
3 changed files with 30 additions and 10 deletions

View File

@@ -14,6 +14,15 @@ import (
"time" "time"
) )
const (
// httpClientTimeout is the default HTTP client timeout in seconds.
httpClientTimeout = 30
// httpStatusErrorThreshold is the minimum status code considered an error.
httpStatusErrorThreshold = 400
// pollTimeoutBuffer is extra seconds added to HTTP timeout beyond the poll timeout.
pollTimeoutBuffer = 5
)
var ( var (
// ErrHTTPStatus is returned when the server responds with an error status code. // ErrHTTPStatus is returned when the server responds with an error status code.
ErrHTTPStatus = errors.New("HTTP error") ErrHTTPStatus = errors.New("HTTP error")
@@ -33,7 +42,7 @@ func NewClient(baseURL string) *Client {
return &Client{ return &Client{
BaseURL: baseURL, BaseURL: baseURL,
HTTPClient: &http.Client{ HTTPClient: &http.Client{
Timeout: 30 * time.Second, Timeout: httpClientTimeout * time.Second,
}, },
} }
} }
@@ -72,7 +81,7 @@ func (c *Client) do(method, path string, body any) ([]byte, error) {
return nil, fmt.Errorf("read body: %w", err) return nil, fmt.Errorf("read body: %w", err)
} }
if resp.StatusCode >= 400 { if resp.StatusCode >= httpStatusErrorThreshold {
return data, fmt.Errorf("%w: %d: %s", ErrHTTPStatus, resp.StatusCode, string(data)) return data, fmt.Errorf("%w: %d: %s", ErrHTTPStatus, resp.StatusCode, string(data))
} }
@@ -125,7 +134,7 @@ func (c *Client) SendMessage(msg *Message) error {
// PollMessages long-polls for new messages. // PollMessages long-polls for new messages.
func (c *Client) PollMessages(afterID string, timeout int) ([]Message, error) { func (c *Client) PollMessages(afterID string, timeout int) ([]Message, error) {
// Use a longer HTTP timeout than the server long-poll timeout. // Use a longer HTTP timeout than the server long-poll timeout.
client := &http.Client{Timeout: time.Duration(timeout+5) * time.Second} client := &http.Client{Timeout: time.Duration(timeout+pollTimeoutBuffer) * time.Second}
params := url.Values{} params := url.Values{}
if afterID != "" { if afterID != "" {
@@ -158,7 +167,7 @@ func (c *Client) PollMessages(afterID string, timeout int) ([]Message, error) {
return nil, err return nil, err
} }
if resp.StatusCode >= 400 { if resp.StatusCode >= httpStatusErrorThreshold {
return nil, fmt.Errorf("%w: %d: %s", ErrHTTPStatus, resp.StatusCode, string(data)) return nil, fmt.Errorf("%w: %d: %s", ErrHTTPStatus, resp.StatusCode, string(data))
} }

View File

@@ -11,6 +11,15 @@ import (
"git.eeqj.de/sneak/chat/cmd/chat-cli/api" "git.eeqj.de/sneak/chat/cmd/chat-cli/api"
) )
const (
// splitParts is the number of parts to split a command into (command + args).
splitParts = 2
// pollTimeout is the long-poll timeout in seconds.
pollTimeout = 15
// pollRetryDelay is the delay before retrying a failed poll.
pollRetryDelay = 2 * time.Second
)
// App holds the application state. // App holds the application state.
type App struct { type App struct {
ui *UI ui *UI
@@ -89,7 +98,7 @@ func (a *App) handleInput(text string) {
} }
func (a *App) handleCommand(text string) { func (a *App) handleCommand(text string) {
parts := strings.SplitN(text, " ", 2) parts := strings.SplitN(text, " ", splitParts)
cmd := strings.ToLower(parts[0]) cmd := strings.ToLower(parts[0])
args := "" args := ""
@@ -285,8 +294,8 @@ func (a *App) cmdPart(channel string) {
} }
func (a *App) cmdMsg(args string) { func (a *App) cmdMsg(args string) {
parts := strings.SplitN(args, " ", 2) parts := strings.SplitN(args, " ", splitParts)
if len(parts) < 2 { if len(parts) < splitParts {
a.ui.AddStatus("[red]Usage: /msg <nick> <text>") a.ui.AddStatus("[red]Usage: /msg <nick> <text>")
return return
@@ -514,10 +523,10 @@ func (a *App) pollLoop() {
return return
} }
msgs, err := client.PollMessages(lastID, 15) msgs, err := client.PollMessages(lastID, pollTimeout)
if err != nil { if err != nil {
// Transient error — retry after delay. // Transient error — retry after delay.
time.Sleep(2 * time.Second) time.Sleep(pollRetryDelay)
continue continue
} }

View File

@@ -41,8 +41,10 @@ func (s *Handlers) requireAuth(w http.ResponseWriter, r *http.Request) (string,
return uid, nick, true return uid, nick, true
} }
const idBytes = 16
func generateID() string { func generateID() string {
b := make([]byte, 16) b := make([]byte, idBytes)
_, _ = rand.Read(b) _, _ = rand.Read(b)
return hex.EncodeToString(b) return hex.EncodeToString(b)