ntfy/client/options.go

138 lines
4.7 KiB
Go
Raw Normal View History

2021-12-17 01:33:01 +00:00
package client
import (
"fmt"
2021-12-17 01:33:01 +00:00
"net/http"
"strings"
"time"
2021-12-17 01:33:01 +00:00
)
// RequestOption is a generic request option that can be added to Client calls
type RequestOption = func(r *http.Request) error
// PublishOption is an option that can be passed to the Client.Publish call
2021-12-17 14:32:59 +00:00
type PublishOption = RequestOption
// SubscribeOption is an option that can be passed to a Client.Subscribe or Client.Poll call
2021-12-17 14:32:59 +00:00
type SubscribeOption = RequestOption
2021-12-17 01:33:01 +00:00
// WithTitle adds a title to a message
2021-12-17 01:33:01 +00:00
func WithTitle(title string) PublishOption {
2021-12-17 14:32:59 +00:00
return WithHeader("X-Title", title)
2021-12-17 01:33:01 +00:00
}
// WithPriority adds a priority to a message. The priority can be either a number (1=min, 5=max),
// or the corresponding names (see util.ParsePriority).
2021-12-17 01:33:01 +00:00
func WithPriority(priority string) PublishOption {
2021-12-17 14:32:59 +00:00
return WithHeader("X-Priority", priority)
2021-12-17 01:33:01 +00:00
}
// WithTagsList adds a list of tags to a message. The tags parameter must be a comma-separated list
// of tags. To use a slice, use WithTags instead
func WithTagsList(tags string) PublishOption {
2021-12-17 14:32:59 +00:00
return WithHeader("X-Tags", tags)
2021-12-17 01:33:01 +00:00
}
// WithTags adds a list of a tags to a message
func WithTags(tags []string) PublishOption {
return WithTagsList(strings.Join(tags, ","))
}
// WithDelay instructs the server to send the message at a later date. The delay parameter can be a
// Unix timestamp, a duration string or a natural langage string. See https://ntfy.sh/docs/publish/#scheduled-delivery
// for details.
2021-12-17 01:33:01 +00:00
func WithDelay(delay string) PublishOption {
2021-12-17 14:32:59 +00:00
return WithHeader("X-Delay", delay)
2021-12-17 01:33:01 +00:00
}
// WithNoCache instructs the server not to cache the message server-side
2021-12-17 01:33:01 +00:00
func WithNoCache() PublishOption {
return WithHeader("X-Cache", "no")
}
// WithNoFirebase instructs the server not to forward the message to Firebase
2021-12-17 01:33:01 +00:00
func WithNoFirebase() PublishOption {
return WithHeader("X-Firebase", "no")
}
// WithSince limits the number of messages returned from the server. The parameter since can be a Unix
// timestamp (see WithSinceUnixTime), a duration (WithSinceDuration) the word "all" (see WithSinceAll).
2021-12-17 14:32:59 +00:00
func WithSince(since string) SubscribeOption {
return WithQueryParam("since", since)
}
// WithSinceAll instructs the server to return all messages for the given topic from the server
func WithSinceAll() SubscribeOption {
return WithSince("all")
}
// WithSinceDuration instructs the server to return all messages since the given duration ago
func WithSinceDuration(since time.Duration) SubscribeOption {
return WithSinceUnixTime(time.Now().Add(-1 * since).Unix())
}
// WithSinceUnixTime instructs the server to return only messages newer or equal to the given timestamp
func WithSinceUnixTime(since int64) SubscribeOption {
return WithSince(fmt.Sprintf("%d", since))
}
// WithPoll instructs the server to close the connection after messages have been returned. Don't use this option
// directly. Use Client.Poll instead.
2021-12-17 14:32:59 +00:00
func WithPoll() SubscribeOption {
return WithQueryParam("poll", "1")
}
// WithScheduled instructs the server to also return messages that have not been sent yet, i.e. delayed/scheduled
// messages (see WithDelay). The messages will have a future date.
2021-12-17 14:32:59 +00:00
func WithScheduled() SubscribeOption {
return WithQueryParam("scheduled", "1")
}
2021-12-21 20:22:27 +00:00
// WithFilter is a generic subscribe option meant to be used to filter for certain messages only
func WithFilter(param, value string) SubscribeOption {
return WithQueryParam(param, value)
}
// WithMessageFilter instructs the server to only return messages that match the exact message
func WithMessageFilter(message string) SubscribeOption {
return WithQueryParam("message", message)
}
// WithTitleFilter instructs the server to only return messages with a title that match the exact string
func WithTitleFilter(title string) SubscribeOption {
return WithQueryParam("title", title)
}
// WithPriorityFilter instructs the server to only return messages with the matching priority. Not that messages
// without priority also implicitly match priority 3.
func WithPriorityFilter(priority int) SubscribeOption {
return WithQueryParam("priority", fmt.Sprintf("%d", priority))
}
// WithTagsFilter instructs the server to only return messages that contain all of the given tags
func WithTagsFilter(tags []string) SubscribeOption {
return WithQueryParam("tags", strings.Join(tags, ","))
}
// WithHeader is a generic option to add headers to a request
2021-12-17 14:32:59 +00:00
func WithHeader(header, value string) RequestOption {
2021-12-17 01:33:01 +00:00
return func(r *http.Request) error {
2021-12-17 14:32:59 +00:00
if value != "" {
r.Header.Set(header, value)
}
2021-12-17 01:33:01 +00:00
return nil
}
}
// WithQueryParam is a generic option to add query parameters to a request
2021-12-17 14:32:59 +00:00
func WithQueryParam(param, value string) RequestOption {
2021-12-17 01:33:01 +00:00
return func(r *http.Request) error {
2021-12-17 14:32:59 +00:00
if value != "" {
2021-12-17 01:33:01 +00:00
q := r.URL.Query()
2021-12-17 14:32:59 +00:00
q.Add(param, value)
2021-12-17 01:33:01 +00:00
r.URL.RawQuery = q.Encode()
}
return nil
}
}