add functional option WithLoginTimeout

use it to set the login timeout
This commit is contained in:
onyx-and-iris 2024-11-04 16:13:31 +00:00
parent 08af9d3388
commit a7702c8050
2 changed files with 23 additions and 4 deletions

View File

@ -52,6 +52,16 @@ func main() {
} }
``` ```
#### `WithLoginTimeout(timeout time.Duration)`
If the server was just started or is currently performing a long operation like map rotating then it's possible to receive empty rcon responses. In which case you'll want to retry login. Use this functional option to set the max timeout for logins, it defaults to 5 seconds. For example:
```go
rcon, err := q3rcon.New(
host, port, password,
q3rcon.WithLoginTimeout(2*time.Second))
```
#### `WithDefaultTimeout(timeout time.Duration)` #### `WithDefaultTimeout(timeout time.Duration)`
You may want to change the default timeout if some of your responses are getting mixed together (stability can depend on connection to the server). For example, on LAN I can leave the default at 20ms, when connecting remotely I normally increase this to 50ms. You may want to change the default timeout if some of your responses are getting mixed together (stability can depend on connection to the server). For example, on LAN I can leave the default at 20ms, when connecting remotely I normally increase this to 50ms.

View File

@ -12,13 +12,21 @@ import (
// Option is a functional option type that allows us to configure the VbanTxt. // Option is a functional option type that allows us to configure the VbanTxt.
type Option func(*Rcon) type Option func(*Rcon)
// WithLoginTimeout is a functional option to set the login timeout
func WithLoginTimeout(timeout time.Duration) Option {
return func(rcon *Rcon) {
rcon.loginTimeout = timeout
}
}
// WithDefaultTimeout is a functional option to set the default response timeout
func WithDefaultTimeout(timeout time.Duration) Option { func WithDefaultTimeout(timeout time.Duration) Option {
return func(rcon *Rcon) { return func(rcon *Rcon) {
rcon.defaultTimeout = timeout rcon.defaultTimeout = timeout
} }
} }
// WithTimeouts is a functional option to set the timeouts for responses // WithTimeouts is a functional option to set the timeouts for responses per command
func WithTimeouts(timeouts map[string]time.Duration) Option { func WithTimeouts(timeouts map[string]time.Duration) Option {
return func(rcon *Rcon) { return func(rcon *Rcon) {
rcon.timeouts = timeouts rcon.timeouts = timeouts
@ -30,6 +38,7 @@ type Rcon struct {
request packet.Request request packet.Request
response packet.Response response packet.Response
loginTimeout time.Duration
defaultTimeout time.Duration defaultTimeout time.Duration
timeouts map[string]time.Duration timeouts map[string]time.Duration
@ -50,6 +59,7 @@ func New(host string, port int, password string, options ...Option) (*Rcon, erro
conn: conn, conn: conn,
request: packet.NewRequest(password), request: packet.NewRequest(password),
resp: make(chan string), resp: make(chan string),
loginTimeout: 5 * time.Second,
defaultTimeout: 20 * time.Millisecond, defaultTimeout: 20 * time.Millisecond,
timeouts: make(map[string]time.Duration), timeouts: make(map[string]time.Duration),
} }
@ -58,8 +68,7 @@ func New(host string, port int, password string, options ...Option) (*Rcon, erro
o(r) o(r)
} }
err = r.Login() if err = r.Login(); err != nil {
if err != nil {
return nil, err return nil, err
} }
@ -67,7 +76,7 @@ func New(host string, port int, password string, options ...Option) (*Rcon, erro
} }
func (r Rcon) Login() error { func (r Rcon) Login() error {
timeout := time.After(2 * time.Second) timeout := time.After(r.loginTimeout)
for { for {
select { select {
case <-timeout: case <-timeout: