ratelimiter

package module
v0.0.0-...-6cdb74f Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 6, 2021 License: MIT Imports: 9 Imported by: 0

README

Ratelimiter

A Discord ratelimiter intended to be used with net/http clients using time/x/rate.

Example

package main

import (
	"flag"
	"fmt"
	"net/http"
	"time"

	"github.com/Postcord/ratelimiter"
	"github.com/rs/zerolog"
	"github.com/rs/zerolog/log"
)

const GetMemberFmt = "https://discord.com/api/guilds/%s/members/%s"

func main() {
	guild := flag.String("guild", "", "Guild ID")
	member := flag.String("member", "", "Member ID")
	token := flag.String("token", "", "Discord API Token")
	flag.Parse()

	if *guild == "" || *member == "" || *token == "" {
		log.Fatal().Msg("Please provide a guild ID, member ID, and token")
	}

	client := http.Client{}
	rl := ratelimiter.NewRatelimiter()

	req, err := http.NewRequest("GET", fmt.Sprintf(GetMemberFmt, *guild, *member), nil)
	if err != nil {
		log.Fatal().Err(err).Msg("failed to create request")
	}

	zerolog.SetGlobalLevel(zerolog.InfoLevel)

	req.Header.Add("Authorization", "Bot "+*token)
	req.Header.Add("User-Agent", "KelwingTestClient/1.0 (Linux)")

	for i := 0; i < 10; i++ {
		err := rl.Limit(req)
		if err != nil {
			continue
		}
		start := time.Now()
		resp, err := client.Do(req)
		if err != nil {
			panic(err)
		}
		length := time.Since(start)
		log.Info().Int("status", resp.StatusCode).Dur("duration", length).Msg("Request successful")
		rl.Update(resp)
		resp.Body.Close()
	}
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Collector

type Collector struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

func NewCollector

func NewCollector(logger zerolog.Logger) *Collector

func (*Collector) BucketExists

func (c *Collector) BucketExists(name string) bool

func (*Collector) GetBucket

func (c *Collector) GetBucket(path string) (*rate.Limiter, string)

func (*Collector) UpdateFromResponse

func (c *Collector) UpdateFromResponse(r *http.Response)

type ErrUnavailable

type ErrUnavailable struct {
	// contains filtered or unexported fields
}

func NewErrUnavailable

func NewErrUnavailable(msg string) *ErrUnavailable

func (*ErrUnavailable) Error

func (e *ErrUnavailable) Error() string

type GlobalLimiter

type GlobalLimiter struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

func NewGlobalLimiter

func NewGlobalLimiter(logger zerolog.Logger) *GlobalLimiter

func (*GlobalLimiter) Reserve

func (g *GlobalLimiter) Reserve() *Reservation

func (*GlobalLimiter) UpdateResetAfter

func (g *GlobalLimiter) UpdateResetAfter(resetAfter float64)

type Ratelimiter

type Ratelimiter struct {
	// contains filtered or unexported fields
}

func NewRatelimiter

func NewRatelimiter(logger ...zerolog.Logger) *Ratelimiter

func (*Ratelimiter) Limit

func (r *Ratelimiter) Limit(req *http.Request) error

func (*Ratelimiter) Update

func (r *Ratelimiter) Update(resp *http.Response)

type Reservation

type Reservation struct {
	// contains filtered or unexported fields
}

func (*Reservation) Delay

func (r *Reservation) Delay() time.Duration

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL