fix: resolve mnd lint issues with named constants
This commit is contained in:
@@ -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))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user