mirror of
https://github.com/Luzifer/twitch-bot.git
synced 2025-01-10 13:21:49 +00:00
Compare commits
6 commits
19a30d342a
...
f1d4c1a283
Author | SHA1 | Date | |
---|---|---|---|
f1d4c1a283 | |||
0355713f7c | |||
c63793be2d | |||
2a64caec09 | |||
8e8895d32e | |||
0a37873241 |
33 changed files with 144 additions and 140 deletions
2
.github/workflows/generated_workflow.yml
vendored
2
.github/workflows/generated_workflow.yml
vendored
|
@ -172,7 +172,7 @@ jobs:
|
||||||
run: git config --global --add safe.directory /__w/twitch-bot/twitch-bot
|
run: git config --global --add safe.directory /__w/twitch-bot/twitch-bot
|
||||||
- name: Set up MySQL service
|
- name: Set up MySQL service
|
||||||
run: |
|
run: |
|
||||||
mariadb -h mysql -u root --password=root-pass <<EOF
|
mariadb --skip-ssl -h mysql -u root --password=root-pass <<EOF
|
||||||
CREATE DATABASE integration DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
|
CREATE DATABASE integration DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
|
||||||
GRANT ALL ON integration.* TO 'twitch-bot'@'%';
|
GRANT ALL ON integration.* TO 'twitch-bot'@'%';
|
||||||
EOF
|
EOF
|
||||||
|
|
|
@ -46,12 +46,12 @@ linters:
|
||||||
- gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification [fast: true, auto-fix: true]
|
- gofmt # Gofmt checks whether code was gofmt-ed. By default this tool runs with -s option to check for code simplification [fast: true, auto-fix: true]
|
||||||
- gofumpt # Gofumpt checks whether code was gofumpt-ed. [fast: true, auto-fix: true]
|
- gofumpt # Gofumpt checks whether code was gofumpt-ed. [fast: true, auto-fix: true]
|
||||||
- goimports # Goimports does everything that gofmt does. Additionally it checks unused imports [fast: true, auto-fix: true]
|
- goimports # Goimports does everything that gofmt does. Additionally it checks unused imports [fast: true, auto-fix: true]
|
||||||
- gomnd # An analyzer to detect magic numbers. [fast: true, auto-fix: false]
|
|
||||||
- gosec # Inspects source code for security problems [fast: true, auto-fix: false]
|
- gosec # Inspects source code for security problems [fast: true, auto-fix: false]
|
||||||
- gosimple # Linter for Go source code that specializes in simplifying a code [fast: true, auto-fix: false]
|
- gosimple # Linter for Go source code that specializes in simplifying a code [fast: true, auto-fix: false]
|
||||||
- govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string [fast: true, auto-fix: false]
|
- govet # Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string [fast: true, auto-fix: false]
|
||||||
- ineffassign # Detects when assignments to existing variables are not used [fast: true, auto-fix: false]
|
- ineffassign # Detects when assignments to existing variables are not used [fast: true, auto-fix: false]
|
||||||
- misspell # Finds commonly misspelled English words in comments [fast: true, auto-fix: true]
|
- misspell # Finds commonly misspelled English words in comments [fast: true, auto-fix: true]
|
||||||
|
- mnd # An analyzer to detect magic numbers. [fast: true, auto-fix: false]
|
||||||
- nakedret # Finds naked returns in functions greater than a specified function length [fast: true, auto-fix: false]
|
- nakedret # Finds naked returns in functions greater than a specified function length [fast: true, auto-fix: false]
|
||||||
- nilerr # Finds the code that returns nil even if it checks that the error is not nil. [fast: false, auto-fix: false]
|
- nilerr # Finds the code that returns nil even if it checks that the error is not nil. [fast: false, auto-fix: false]
|
||||||
- nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value. [fast: false, auto-fix: false]
|
- nilnil # Checks that there is no simultaneous return of `nil` error and an invalid value. [fast: false, auto-fix: false]
|
||||||
|
|
|
@ -1,3 +1,12 @@
|
||||||
|
# 3.32.0 / 2024-06-09
|
||||||
|
|
||||||
|
* New Features
|
||||||
|
* [templating] Add `streamIsLive` function
|
||||||
|
|
||||||
|
* Bugfixes
|
||||||
|
* [core] Fix: Accept proper token declaration in Authorization header
|
||||||
|
* [core] Fix: Include username and channel in ban errors
|
||||||
|
|
||||||
# 3.31.0 / 2024-05-13
|
# 3.31.0 / 2024-05-13
|
||||||
|
|
||||||
* Improvements
|
* Improvements
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/gofrs/uuid/v3"
|
"github.com/gofrs/uuid/v3"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
@ -51,7 +52,25 @@ func writeAuthMiddleware(h http.Handler, module string) http.Handler {
|
||||||
token = pass
|
token = pass
|
||||||
|
|
||||||
case r.Header.Get("Authorization") != "":
|
case r.Header.Get("Authorization") != "":
|
||||||
token = r.Header.Get("Authorization")
|
var (
|
||||||
|
tokenType string
|
||||||
|
hadPrefix bool
|
||||||
|
)
|
||||||
|
|
||||||
|
tokenType, token, hadPrefix = strings.Cut(r.Header.Get("Authorization"), " ")
|
||||||
|
switch {
|
||||||
|
case !hadPrefix:
|
||||||
|
// Legacy: Accept `Authorization: tokenhere`
|
||||||
|
token = tokenType
|
||||||
|
|
||||||
|
case strings.EqualFold(tokenType, "token"):
|
||||||
|
// This is perfect: `Authorization: Token tokenhere`
|
||||||
|
|
||||||
|
default:
|
||||||
|
// That was unexpected: `Authorization: Bearer tokenhere` or similar
|
||||||
|
http.Error(w, "invalid token type", http.StatusForbidden)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
http.Error(w, "auth not successful", http.StatusForbidden)
|
http.Error(w, "auth not successful", http.StatusForbidden)
|
||||||
|
|
|
@ -43,7 +43,7 @@ steps:
|
||||||
|
|
||||||
- name: Set up MySQL service
|
- name: Set up MySQL service
|
||||||
run: |
|
run: |
|
||||||
mariadb -h mysql -u root --password=root-pass <<EOF
|
mariadb --skip-ssl -h mysql -u root --password=root-pass <<EOF
|
||||||
CREATE DATABASE integration DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
|
CREATE DATABASE integration DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
|
||||||
GRANT ALL ON integration.* TO 'twitch-bot'@'%';
|
GRANT ALL ON integration.* TO 'twitch-bot'@'%';
|
||||||
EOF
|
EOF
|
||||||
|
|
82
cli.go
82
cli.go
|
@ -1,85 +1,7 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"github.com/Luzifer/go_helpers/v2/cli"
|
||||||
"os"
|
|
||||||
"sort"
|
|
||||||
"strings"
|
|
||||||
"sync"
|
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
var cliTool = cli.New()
|
||||||
cliRegistry struct {
|
|
||||||
cmds map[string]cliRegistryEntry
|
|
||||||
sync.Mutex
|
|
||||||
}
|
|
||||||
|
|
||||||
cliRegistryEntry struct {
|
|
||||||
Description string
|
|
||||||
Name string
|
|
||||||
Params []string
|
|
||||||
Run func([]string) error
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
cli = newCLIRegistry()
|
|
||||||
errHelpCalled = errors.New("help called")
|
|
||||||
)
|
|
||||||
|
|
||||||
func newCLIRegistry() *cliRegistry {
|
|
||||||
return &cliRegistry{
|
|
||||||
cmds: make(map[string]cliRegistryEntry),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *cliRegistry) Add(e cliRegistryEntry) {
|
|
||||||
c.Lock()
|
|
||||||
defer c.Unlock()
|
|
||||||
|
|
||||||
c.cmds[e.Name] = e
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *cliRegistry) Call(args []string) error {
|
|
||||||
c.Lock()
|
|
||||||
defer c.Unlock()
|
|
||||||
|
|
||||||
cmdEntry := c.cmds[args[0]]
|
|
||||||
if cmdEntry.Name != args[0] {
|
|
||||||
c.help()
|
|
||||||
return errHelpCalled
|
|
||||||
}
|
|
||||||
|
|
||||||
return cmdEntry.Run(args)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *cliRegistry) help() {
|
|
||||||
// Called from Call, does not need lock
|
|
||||||
|
|
||||||
var (
|
|
||||||
maxCmdLen int
|
|
||||||
cmds []cliRegistryEntry
|
|
||||||
)
|
|
||||||
|
|
||||||
for name := range c.cmds {
|
|
||||||
entry := c.cmds[name]
|
|
||||||
if l := len(entry.CommandDisplay()); l > maxCmdLen {
|
|
||||||
maxCmdLen = l
|
|
||||||
}
|
|
||||||
cmds = append(cmds, entry)
|
|
||||||
}
|
|
||||||
|
|
||||||
sort.Slice(cmds, func(i, j int) bool { return cmds[i].Name < cmds[j].Name })
|
|
||||||
|
|
||||||
tpl := fmt.Sprintf(" %%-%ds %%s\n", maxCmdLen)
|
|
||||||
fmt.Fprintln(os.Stdout, "Supported sub-commands are:")
|
|
||||||
for _, cmd := range cmds {
|
|
||||||
fmt.Fprintf(os.Stdout, tpl, cmd.CommandDisplay(), cmd.Description)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c cliRegistryEntry) CommandDisplay() string {
|
|
||||||
return strings.Join(append([]string{c.Name}, c.Params...), " ")
|
|
||||||
}
|
|
||||||
|
|
|
@ -4,11 +4,12 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"github.com/Luzifer/go_helpers/v2/cli"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
cli.Add(cliRegistryEntry{
|
cliTool.Add(cli.RegistryEntry{
|
||||||
Name: "actor-docs",
|
Name: "actor-docs",
|
||||||
Description: "Generate markdown documentation for available actors",
|
Description: "Generate markdown documentation for available actors",
|
||||||
Run: func([]string) error {
|
Run: func([]string) error {
|
||||||
|
|
|
@ -3,6 +3,7 @@ package main
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"github.com/Luzifer/go_helpers/v2/cli"
|
||||||
"github.com/gofrs/uuid/v3"
|
"github.com/gofrs/uuid/v3"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
@ -10,12 +11,12 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
cli.Add(cliRegistryEntry{
|
cliTool.Add(cli.RegistryEntry{
|
||||||
Name: "api-token",
|
Name: "api-token",
|
||||||
Description: "Generate an api-token to be entered into the config",
|
Description: "Generate an api-token to be entered into the config",
|
||||||
Params: []string{"<token-name>", "<scope>", "[...scope]"},
|
Params: []string{"<token-name>", "<scope>", "[...scope]"},
|
||||||
Run: func(args []string) error {
|
Run: func(args []string) error {
|
||||||
if len(args) < 3 { //nolint:gomnd // Just a count of parameters
|
if len(args) < 3 { //nolint:mnd // Just a count of parameters
|
||||||
return errors.New("Usage: twitch-bot api-token <token name> <scope> [...scope]")
|
return errors.New("Usage: twitch-bot api-token <token name> <scope> [...scope]")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ package main
|
||||||
import (
|
import (
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/Luzifer/go_helpers/v2/cli"
|
||||||
"github.com/Luzifer/twitch-bot/v3/pkg/database"
|
"github.com/Luzifer/twitch-bot/v3/pkg/database"
|
||||||
"github.com/Luzifer/twitch-bot/v3/plugins"
|
"github.com/Luzifer/twitch-bot/v3/plugins"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
@ -16,12 +17,12 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
cli.Add(cliRegistryEntry{
|
cliTool.Add(cli.RegistryEntry{
|
||||||
Name: "copy-database",
|
Name: "copy-database",
|
||||||
Description: "Copies database contents to a new storage DSN i.e. for migrating to a new DBMS",
|
Description: "Copies database contents to a new storage DSN i.e. for migrating to a new DBMS",
|
||||||
Params: []string{"<target storage-type>", "<target DSN>"},
|
Params: []string{"<target storage-type>", "<target DSN>"},
|
||||||
Run: func(args []string) error {
|
Run: func(args []string) error {
|
||||||
if len(args) < 3 { //nolint:gomnd // Just a count of parameters
|
if len(args) < 3 { //nolint:mnd // Just a count of parameters
|
||||||
return errors.New("Usage: twitch-bot copy-database <target storage-type> <target DSN>")
|
return errors.New("Usage: twitch-bot copy-database <target storage-type> <target DSN>")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/Luzifer/go_helpers/v2/cli"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
cli.Add(cliRegistryEntry{
|
cliTool.Add(cli.RegistryEntry{
|
||||||
Name: "reset-secrets",
|
Name: "reset-secrets",
|
||||||
Description: "Remove encrypted data to reset encryption passphrase",
|
Description: "Remove encrypted data to reset encryption passphrase",
|
||||||
Run: func([]string) error {
|
Run: func([]string) error {
|
||||||
|
|
|
@ -4,11 +4,12 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"github.com/Luzifer/go_helpers/v2/cli"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
cli.Add(cliRegistryEntry{
|
cliTool.Add(cli.RegistryEntry{
|
||||||
Name: "tpl-docs",
|
Name: "tpl-docs",
|
||||||
Description: "Generate markdown documentation for available template functions",
|
Description: "Generate markdown documentation for available template functions",
|
||||||
Run: func([]string) error {
|
Run: func([]string) error {
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "github.com/pkg/errors"
|
import (
|
||||||
|
"github.com/Luzifer/go_helpers/v2/cli"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
cli.Add(cliRegistryEntry{
|
cliTool.Add(cli.RegistryEntry{
|
||||||
Name: "validate-config",
|
Name: "validate-config",
|
||||||
Description: "Try to load configuration file and report errors if any",
|
Description: "Try to load configuration file and report errors if any",
|
||||||
Run: func([]string) error {
|
Run: func([]string) error {
|
||||||
|
|
|
@ -211,7 +211,9 @@ func writeConfigToYAML(filename, authorName, authorEmail, summary string, obj *c
|
||||||
}
|
}
|
||||||
tmpFileName := tmpFile.Name()
|
tmpFileName := tmpFile.Name()
|
||||||
|
|
||||||
fmt.Fprintf(tmpFile, "# Automatically updated by %s using Config-Editor frontend, last update: %s\n", authorName, time.Now().Format(time.RFC3339))
|
if _, err = fmt.Fprintf(tmpFile, "# Automatically updated by %s using Config-Editor frontend, last update: %s\n", authorName, time.Now().Format(time.RFC3339)); err != nil {
|
||||||
|
return fmt.Errorf("writing file header: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
if err = yaml.NewEncoder(tmpFile).Encode(obj); err != nil {
|
if err = yaml.NewEncoder(tmpFile).Encode(obj); err != nil {
|
||||||
tmpFile.Close() //nolint:errcheck,gosec,revive
|
tmpFile.Close() //nolint:errcheck,gosec,revive
|
||||||
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func updateConfigCron() string {
|
func updateConfigCron() string {
|
||||||
minute := rand.Intn(60) //nolint:gomnd,gosec // Only used to distribute load
|
minute := rand.Intn(60) //nolint:mnd,gosec // Only used to distribute load
|
||||||
return fmt.Sprintf("0 %d * * * *", minute)
|
return fmt.Sprintf("0 %d * * * *", minute)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -467,7 +467,7 @@ Example:
|
||||||
|
|
||||||
```
|
```
|
||||||
# Your int this hour: {{ printf "%.0f" (mulf (seededRandom (list "int" .username (now | date "2006-01-02 15") | join ":")) 100) }}%
|
# Your int this hour: {{ printf "%.0f" (mulf (seededRandom (list "int" .username (now | date "2006-01-02 15") | join ":")) 100) }}%
|
||||||
< Your int this hour: 82%
|
< Your int this hour: 41%
|
||||||
```
|
```
|
||||||
|
|
||||||
### `spotifyCurrentPlaying`
|
### `spotifyCurrentPlaying`
|
||||||
|
@ -500,6 +500,19 @@ Example:
|
||||||
* https://open.spotify.com/track/3HCzXf0lNpekSqsGBcGrCd
|
* https://open.spotify.com/track/3HCzXf0lNpekSqsGBcGrCd
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### `streamIsLive`
|
||||||
|
|
||||||
|
Check whether a given channel is currently live
|
||||||
|
|
||||||
|
Syntax: `streamIsLive <username>`
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```
|
||||||
|
# {{ streamIsLive "luziferus" }}
|
||||||
|
* true
|
||||||
|
```
|
||||||
|
|
||||||
### `streamUptime`
|
### `streamUptime`
|
||||||
|
|
||||||
Returns the duration the stream is online (causes an error if no current stream is found)
|
Returns the duration the stream is online (causes an error if no current stream is found)
|
||||||
|
|
22
go.mod
22
go.mod
|
@ -6,7 +6,7 @@ toolchain go1.22.1
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/Luzifer/go-openssl/v4 v4.2.2
|
github.com/Luzifer/go-openssl/v4 v4.2.2
|
||||||
github.com/Luzifer/go_helpers/v2 v2.24.0
|
github.com/Luzifer/go_helpers/v2 v2.25.0
|
||||||
github.com/Luzifer/korvike/functions v1.0.1
|
github.com/Luzifer/korvike/functions v1.0.1
|
||||||
github.com/Luzifer/rconfig/v2 v2.5.0
|
github.com/Luzifer/rconfig/v2 v2.5.0
|
||||||
github.com/getsentry/sentry-go v0.27.0
|
github.com/getsentry/sentry-go v0.27.0
|
||||||
|
@ -25,9 +25,9 @@ require (
|
||||||
github.com/sirupsen/logrus v1.9.3
|
github.com/sirupsen/logrus v1.9.3
|
||||||
github.com/stretchr/testify v1.9.0
|
github.com/stretchr/testify v1.9.0
|
||||||
github.com/wzshiming/openapi v0.0.0-20200703171632-c7220b3c9cfb
|
github.com/wzshiming/openapi v0.0.0-20200703171632-c7220b3c9cfb
|
||||||
golang.org/x/crypto v0.22.0
|
golang.org/x/crypto v0.23.0
|
||||||
golang.org/x/net v0.24.0
|
golang.org/x/net v0.25.0
|
||||||
golang.org/x/oauth2 v0.19.0
|
golang.org/x/oauth2 v0.20.0
|
||||||
gopkg.in/irc.v4 v4.0.0
|
gopkg.in/irc.v4 v4.0.0
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
gorm.io/driver/mysql v1.5.6
|
gorm.io/driver/mysql v1.5.6
|
||||||
|
@ -45,20 +45,20 @@ require (
|
||||||
github.com/ProtonMail/go-crypto v1.0.0 // indirect
|
github.com/ProtonMail/go-crypto v1.0.0 // indirect
|
||||||
github.com/cenkalti/backoff/v3 v3.2.2 // indirect
|
github.com/cenkalti/backoff/v3 v3.2.2 // indirect
|
||||||
github.com/cloudflare/circl v1.3.8 // indirect
|
github.com/cloudflare/circl v1.3.8 // indirect
|
||||||
github.com/cyphar/filepath-securejoin v0.2.4 // indirect
|
github.com/cyphar/filepath-securejoin v0.2.5 // indirect
|
||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||||
github.com/dustin/go-humanize v1.0.1 // indirect
|
github.com/dustin/go-humanize v1.0.1 // indirect
|
||||||
github.com/emirpasic/gods v1.18.1 // indirect
|
github.com/emirpasic/gods v1.18.1 // indirect
|
||||||
github.com/glebarez/go-sqlite v1.22.0 // indirect
|
github.com/glebarez/go-sqlite v1.22.0 // indirect
|
||||||
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
||||||
github.com/go-git/go-billy/v5 v5.5.0 // indirect
|
github.com/go-git/go-billy/v5 v5.5.0 // indirect
|
||||||
github.com/go-jose/go-jose/v4 v4.0.1 // indirect
|
github.com/go-jose/go-jose/v4 v4.0.2 // indirect
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
||||||
github.com/google/uuid v1.6.0 // indirect
|
github.com/google/uuid v1.6.0 // indirect
|
||||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||||
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
||||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||||
github.com/hashicorp/go-retryablehttp v0.7.5 // indirect
|
github.com/hashicorp/go-retryablehttp v0.7.6 // indirect
|
||||||
github.com/hashicorp/go-rootcerts v1.0.2 // indirect
|
github.com/hashicorp/go-rootcerts v1.0.2 // indirect
|
||||||
github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8 // indirect
|
github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8 // indirect
|
||||||
github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect
|
github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect
|
||||||
|
@ -95,14 +95,14 @@ require (
|
||||||
github.com/xanzy/ssh-agent v0.3.3 // indirect
|
github.com/xanzy/ssh-agent v0.3.3 // indirect
|
||||||
golang.org/x/mod v0.17.0 // indirect
|
golang.org/x/mod v0.17.0 // indirect
|
||||||
golang.org/x/sync v0.7.0 // indirect
|
golang.org/x/sync v0.7.0 // indirect
|
||||||
golang.org/x/sys v0.19.0 // indirect
|
golang.org/x/sys v0.20.0 // indirect
|
||||||
golang.org/x/text v0.14.0 // indirect
|
golang.org/x/text v0.15.0 // indirect
|
||||||
golang.org/x/time v0.5.0 // indirect
|
golang.org/x/time v0.5.0 // indirect
|
||||||
golang.org/x/tools v0.20.0 // indirect
|
golang.org/x/tools v0.20.0 // indirect
|
||||||
gopkg.in/validator.v2 v2.0.1 // indirect
|
gopkg.in/validator.v2 v2.0.1 // indirect
|
||||||
gopkg.in/warnings.v0 v0.1.2 // indirect
|
gopkg.in/warnings.v0 v0.1.2 // indirect
|
||||||
modernc.org/libc v1.50.3 // indirect
|
modernc.org/libc v1.50.5 // indirect
|
||||||
modernc.org/mathutil v1.6.0 // indirect
|
modernc.org/mathutil v1.6.0 // indirect
|
||||||
modernc.org/memory v1.8.0 // indirect
|
modernc.org/memory v1.8.0 // indirect
|
||||||
modernc.org/sqlite v1.29.8 // indirect
|
modernc.org/sqlite v1.29.9 // indirect
|
||||||
)
|
)
|
||||||
|
|
24
go.sum
24
go.sum
|
@ -6,6 +6,8 @@ github.com/Luzifer/go-openssl/v4 v4.2.2 h1:wKF/GhSKGJtHFQYTkN61wXig7mPvDj/oPpW6M
|
||||||
github.com/Luzifer/go-openssl/v4 v4.2.2/go.mod h1:+kAwI4NpyYXoWil85gKSCEJNoCQlMeFikEMn2f+5ffc=
|
github.com/Luzifer/go-openssl/v4 v4.2.2/go.mod h1:+kAwI4NpyYXoWil85gKSCEJNoCQlMeFikEMn2f+5ffc=
|
||||||
github.com/Luzifer/go_helpers/v2 v2.24.0 h1:abACOhsn6a6c6X22jq42mZM1wuOM0Ihfa6yzssrjrOg=
|
github.com/Luzifer/go_helpers/v2 v2.24.0 h1:abACOhsn6a6c6X22jq42mZM1wuOM0Ihfa6yzssrjrOg=
|
||||||
github.com/Luzifer/go_helpers/v2 v2.24.0/go.mod h1:KSVUdAJAav5cWGyB5oKGxmC27HrKULVTOxwPS/Kr+pc=
|
github.com/Luzifer/go_helpers/v2 v2.24.0/go.mod h1:KSVUdAJAav5cWGyB5oKGxmC27HrKULVTOxwPS/Kr+pc=
|
||||||
|
github.com/Luzifer/go_helpers/v2 v2.25.0 h1:k1J4gd1+BfuokTDoWgcgib9P5mdadjzKEgbtKSVe46k=
|
||||||
|
github.com/Luzifer/go_helpers/v2 v2.25.0/go.mod h1:KSVUdAJAav5cWGyB5oKGxmC27HrKULVTOxwPS/Kr+pc=
|
||||||
github.com/Luzifer/korvike/functions v1.0.1 h1:9O9PQL7O8J3nBwR4XLyx4COC430QbnvueM+itA2HEto=
|
github.com/Luzifer/korvike/functions v1.0.1 h1:9O9PQL7O8J3nBwR4XLyx4COC430QbnvueM+itA2HEto=
|
||||||
github.com/Luzifer/korvike/functions v1.0.1/go.mod h1:8U01t/IM4wmZcaEf7u/szQrbLvBGMPOTLzJI/l7baWI=
|
github.com/Luzifer/korvike/functions v1.0.1/go.mod h1:8U01t/IM4wmZcaEf7u/szQrbLvBGMPOTLzJI/l7baWI=
|
||||||
github.com/Luzifer/rconfig/v2 v2.5.0 h1:zx5lfQbNX3za4VegID97IeY+M+BmfgHxWJTYA94sxok=
|
github.com/Luzifer/rconfig/v2 v2.5.0 h1:zx5lfQbNX3za4VegID97IeY+M+BmfgHxWJTYA94sxok=
|
||||||
|
@ -34,6 +36,8 @@ github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqw
|
||||||
github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU=
|
github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU=
|
||||||
github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
|
github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg=
|
||||||
github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
|
github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
|
||||||
|
github.com/cyphar/filepath-securejoin v0.2.5 h1:6iR5tXJ/e6tJZzzdMc1km3Sa7RRIVBKAK32O2s7AYfo=
|
||||||
|
github.com/cyphar/filepath-securejoin v0.2.5/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
|
||||||
|
@ -68,6 +72,8 @@ github.com/go-git/go-git/v5 v5.12.0 h1:7Md+ndsjrzZxbddRDZjF14qK+NN56sy6wkqaVrjZt
|
||||||
github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY=
|
github.com/go-git/go-git/v5 v5.12.0/go.mod h1:FTM9VKtnI2m65hNI/TenDDDnUf2Q9FHnXYjuz9i5OEY=
|
||||||
github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U=
|
github.com/go-jose/go-jose/v4 v4.0.1 h1:QVEPDE3OluqXBQZDcnNvQrInro2h0e4eqNbnZSWqS6U=
|
||||||
github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY=
|
github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY=
|
||||||
|
github.com/go-jose/go-jose/v4 v4.0.2 h1:R3l3kkBds16bO7ZFAEEcofK0MkrAJt3jlJznWZG0nvk=
|
||||||
|
github.com/go-jose/go-jose/v4 v4.0.2/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY=
|
||||||
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
|
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
|
||||||
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
|
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
|
||||||
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
|
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
|
||||||
|
@ -102,6 +108,8 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l
|
||||||
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
|
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
|
||||||
github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M=
|
github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M=
|
||||||
github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8=
|
github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8=
|
||||||
|
github.com/hashicorp/go-retryablehttp v0.7.6 h1:TwRYfx2z2C4cLbXmT8I5PgP/xmuqASDyiVuGYfs9GZM=
|
||||||
|
github.com/hashicorp/go-retryablehttp v0.7.6/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk=
|
||||||
github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=
|
github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=
|
||||||
github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
|
github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
|
||||||
github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8 h1:iBt4Ew4XEGLfh6/bPk4rSYmuZJGizr6/x/AEizP0CQc=
|
github.com/hashicorp/go-secure-stdlib/parseutil v0.1.8 h1:iBt4Ew4XEGLfh6/bPk4rSYmuZJGizr6/x/AEizP0CQc=
|
||||||
|
@ -227,6 +235,8 @@ golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2Uz
|
||||||
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
|
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
|
||||||
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
|
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
|
||||||
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
|
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
|
||||||
|
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
|
||||||
|
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||||
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
|
golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA=
|
||||||
|
@ -240,8 +250,12 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
||||||
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
|
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
|
||||||
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
|
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
|
||||||
|
golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
|
||||||
|
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
|
||||||
golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg=
|
golang.org/x/oauth2 v0.19.0 h1:9+E/EZBCbTLNrbN35fHv/a/d/mOBatymz1zbtQrXpIg=
|
||||||
golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8=
|
golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8=
|
||||||
|
golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo=
|
||||||
|
golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
@ -262,6 +276,8 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
|
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
|
||||||
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
|
||||||
|
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
|
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
|
||||||
|
@ -269,6 +285,7 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||||
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
|
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
|
||||||
golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q=
|
golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q=
|
||||||
golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
|
golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
|
||||||
|
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
@ -278,6 +295,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||||
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||||
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
||||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
|
golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
|
||||||
|
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.0.0-20220722155302-e5dcc9cfc0b9/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
|
golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk=
|
||||||
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
|
||||||
|
@ -316,12 +335,15 @@ modernc.org/cc/v4 v4.21.0 h1:D/gLKtcztomvWbsbvBKo3leKQv+86f+DdqEZBBXhnag=
|
||||||
modernc.org/cc/v4 v4.21.0/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
|
modernc.org/cc/v4 v4.21.0/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
|
||||||
modernc.org/ccgo/v4 v4.17.2 h1:rg8qg9Rxq7AtL29N0Ar5LyNmH/fQGV0LhphfcTJ5zRQ=
|
modernc.org/ccgo/v4 v4.17.2 h1:rg8qg9Rxq7AtL29N0Ar5LyNmH/fQGV0LhphfcTJ5zRQ=
|
||||||
modernc.org/ccgo/v4 v4.17.2/go.mod h1:1FCbAtWYJoKuc+AviS+dH+vGNtYmFJqBeRWjmnDWsIg=
|
modernc.org/ccgo/v4 v4.17.2/go.mod h1:1FCbAtWYJoKuc+AviS+dH+vGNtYmFJqBeRWjmnDWsIg=
|
||||||
|
modernc.org/ccgo/v4 v4.17.3 h1:t2CQci84jnxKw3GGnHvjGKjiNZeZqyQx/023spkk4hU=
|
||||||
modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
|
modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
|
||||||
modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
|
modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
|
||||||
modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw=
|
modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw=
|
||||||
modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
|
modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
|
||||||
modernc.org/libc v1.50.3 h1:rxS4sOeGFzwiuDShZh0agxIRJnan/8vLsBomE50+OT4=
|
modernc.org/libc v1.50.3 h1:rxS4sOeGFzwiuDShZh0agxIRJnan/8vLsBomE50+OT4=
|
||||||
modernc.org/libc v1.50.3/go.mod h1:ZkNjeLQOsIbpUQhrp7H6dQVuxXPsCZKjTb0/nE/jQjU=
|
modernc.org/libc v1.50.3/go.mod h1:ZkNjeLQOsIbpUQhrp7H6dQVuxXPsCZKjTb0/nE/jQjU=
|
||||||
|
modernc.org/libc v1.50.5 h1:ZzeUd0dIc/sUtoPTCYIrgypkuzoGzNu6kbEWj2VuEmk=
|
||||||
|
modernc.org/libc v1.50.5/go.mod h1:rhzrUx5oePTSTIzBgM0mTftwWHK8tiT9aNFUt1mldl0=
|
||||||
modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
|
modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
|
||||||
modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
|
modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
|
||||||
modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
|
modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
|
||||||
|
@ -332,6 +354,8 @@ modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc=
|
||||||
modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss=
|
modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss=
|
||||||
modernc.org/sqlite v1.29.8 h1:nGKglNx9K5v0As+zF0/Gcl1kMkmaU1XynYyq92PbsC8=
|
modernc.org/sqlite v1.29.8 h1:nGKglNx9K5v0As+zF0/Gcl1kMkmaU1XynYyq92PbsC8=
|
||||||
modernc.org/sqlite v1.29.8/go.mod h1:lQPm27iqa4UNZpmr4Aor0MH0HkCLbt1huYDfWylLZFk=
|
modernc.org/sqlite v1.29.8/go.mod h1:lQPm27iqa4UNZpmr4Aor0MH0HkCLbt1huYDfWylLZFk=
|
||||||
|
modernc.org/sqlite v1.29.9 h1:9RhNMklxJs+1596GNuAX+O/6040bvOwacTxuFcRuQow=
|
||||||
|
modernc.org/sqlite v1.29.9/go.mod h1:ItX2a1OVGgNsFh6Dv60JQvGfJfTPHPVpV6DF59akYOA=
|
||||||
modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
|
modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
|
||||||
modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
|
modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
|
||||||
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
|
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
|
||||||
|
|
|
@ -336,7 +336,7 @@ func routeActorCounterGetValue(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
w.Header().Set("Content-Type", "text-plain")
|
w.Header().Set("Content-Type", "text-plain")
|
||||||
fmt.Fprintf(w, template, cv)
|
http.Error(w, fmt.Sprintf(template, cv), http.StatusOK)
|
||||||
}
|
}
|
||||||
|
|
||||||
func routeActorCounterSetValue(w http.ResponseWriter, r *http.Request) {
|
func routeActorCounterSetValue(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
|
@ -68,5 +68,5 @@ func handleStartAuth(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Fprintln(w, "Spotify is now authorized for this channel, you can close this page")
|
http.Error(w, "Spotify is now authorized for this channel, you can close this page", http.StatusOK)
|
||||||
}
|
}
|
||||||
|
|
|
@ -195,7 +195,7 @@ func routeActorSetVarGetValue(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
w.Header().Set("Content-Type", "text-plain")
|
w.Header().Set("Content-Type", "text-plain")
|
||||||
fmt.Fprint(w, vc)
|
http.Error(w, vc, http.StatusOK)
|
||||||
}
|
}
|
||||||
|
|
||||||
func routeActorSetVarSetValue(w http.ResponseWriter, r *http.Request) {
|
func routeActorSetVarSetValue(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
|
@ -188,7 +188,7 @@ func handleModVIP(m *irc.Message, modFn func(tc *twitch.Client, channel, user st
|
||||||
channel := strings.TrimLeft(plugins.DeriveChannel(m, nil), "#")
|
channel := strings.TrimLeft(plugins.DeriveChannel(m, nil), "#")
|
||||||
|
|
||||||
parts := strings.Split(m.Trailing(), " ")
|
parts := strings.Split(m.Trailing(), " ")
|
||||||
if len(parts) != 2 { //nolint:gomnd // Just a count, makes no sense as a constant
|
if len(parts) != 2 { //nolint:mnd // Just a count, makes no sense as a constant
|
||||||
return errors.Errorf("wrong command usage, must consist of 2 words")
|
return errors.Errorf("wrong command usage, must consist of 2 words")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,5 +54,5 @@ func handleFormattedMessage(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Fprint(w, msg)
|
http.Error(w, msg, http.StatusOK)
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,9 +72,7 @@ func (s Service) InCooldown(tt plugins.TimerType, limiter, ruleID string) (bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
func (Service) getCooldownTimerKey(tt plugins.TimerType, limiter, ruleID string) string {
|
func (Service) getCooldownTimerKey(tt plugins.TimerType, limiter, ruleID string) string {
|
||||||
h := sha256.New()
|
return fmt.Sprintf("sha256:%x", sha256.Sum256([]byte(fmt.Sprintf("%d:%s:%s", tt, limiter, ruleID))))
|
||||||
fmt.Fprintf(h, "%d:%s:%s", tt, limiter, ruleID)
|
|
||||||
return fmt.Sprintf("sha256:%x", h.Sum(nil))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Permit timer
|
// Permit timer
|
||||||
|
@ -90,9 +88,10 @@ func (s Service) HasPermit(channel, username string) (bool, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (Service) getPermitTimerKey(channel, username string) string {
|
func (Service) getPermitTimerKey(channel, username string) string {
|
||||||
h := sha256.New()
|
return fmt.Sprintf("sha256:%x", sha256.Sum256([]byte(fmt.Sprintf(
|
||||||
fmt.Fprintf(h, "%d:%s:%s", plugins.TimerTypePermit, channel, strings.ToLower(strings.TrimLeft(username, "@")))
|
"%d:%s:%s",
|
||||||
return fmt.Sprintf("sha256:%x", h.Sum(nil))
|
plugins.TimerTypePermit, channel, strings.ToLower(strings.TrimLeft(username, "@")),
|
||||||
|
))))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generic timer
|
// Generic timer
|
||||||
|
|
|
@ -40,15 +40,15 @@ func NewInterval(a, b time.Time) (i Interval) {
|
||||||
i.Seconds = u.Second() - l.Second()
|
i.Seconds = u.Second() - l.Second()
|
||||||
|
|
||||||
if i.Seconds < 0 {
|
if i.Seconds < 0 {
|
||||||
i.Minutes, i.Seconds = i.Minutes-1, i.Seconds+60 //nolint:gomnd
|
i.Minutes, i.Seconds = i.Minutes-1, i.Seconds+60 //nolint:mnd
|
||||||
}
|
}
|
||||||
|
|
||||||
if i.Minutes < 0 {
|
if i.Minutes < 0 {
|
||||||
i.Hours, i.Minutes = i.Hours-1, i.Minutes+60 //nolint:gomnd
|
i.Hours, i.Minutes = i.Hours-1, i.Minutes+60 //nolint:mnd
|
||||||
}
|
}
|
||||||
|
|
||||||
if i.Hours < 0 {
|
if i.Hours < 0 {
|
||||||
i.Days, i.Hours = i.Days-1, i.Hours+24 //nolint:gomnd
|
i.Days, i.Hours = i.Days-1, i.Hours+24 //nolint:mnd
|
||||||
}
|
}
|
||||||
|
|
||||||
if i.Days < 0 {
|
if i.Days < 0 {
|
||||||
|
@ -57,7 +57,7 @@ func NewInterval(a, b time.Time) (i Interval) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if i.Months < 0 {
|
if i.Months < 0 {
|
||||||
i.Years, i.Months = i.Years-1, i.Months+12 //nolint:gomnd
|
i.Years, i.Months = i.Years-1, i.Months+12 //nolint:mnd
|
||||||
}
|
}
|
||||||
|
|
||||||
return i
|
return i
|
||||||
|
|
|
@ -63,7 +63,7 @@ func stringToSeed(s string) (int64, error) {
|
||||||
)
|
)
|
||||||
|
|
||||||
for i := 0; i < len(hashSum); i++ {
|
for i := 0; i < len(hashSum); i++ {
|
||||||
sum += int64(float64(hashSum[len(hashSum)-1-i]%10) * math.Pow(10, float64(i))) //nolint:gomnd // No need to put the 10 of 10**i into a constant named "ten"
|
sum += int64(float64(hashSum[len(hashSum)-1-i]%10) * math.Pow(10, float64(i))) //nolint:mnd // No need to put the 10 of 10**i into a constant named "ten"
|
||||||
}
|
}
|
||||||
|
|
||||||
return sum, nil
|
return sum, nil
|
||||||
|
|
|
@ -15,6 +15,7 @@ func init() {
|
||||||
regFn,
|
regFn,
|
||||||
tplTwitchRecentGame,
|
tplTwitchRecentGame,
|
||||||
tplTwitchRecentTitle,
|
tplTwitchRecentTitle,
|
||||||
|
tplTwitchStreamIsLive,
|
||||||
tplTwitchStreamUptime,
|
tplTwitchStreamUptime,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -55,6 +56,20 @@ func tplTwitchRecentTitle(args plugins.RegistrationArguments) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func tplTwitchStreamIsLive(args plugins.RegistrationArguments) {
|
||||||
|
args.RegisterTemplateFunction("streamIsLive", plugins.GenericTemplateFunctionGetter(func(username string) bool {
|
||||||
|
_, err := args.GetTwitchClient().GetCurrentStreamInfo(context.Background(), strings.TrimLeft(username, "#"))
|
||||||
|
return err == nil
|
||||||
|
}), plugins.TemplateFuncDocumentation{
|
||||||
|
Description: "Check whether a given channel is currently live",
|
||||||
|
Syntax: "streamIsLive <username>",
|
||||||
|
Example: &plugins.TemplateFuncDocumentationExample{
|
||||||
|
Template: `{{ streamIsLive "luziferus" }}`,
|
||||||
|
FakedOutput: "true",
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func tplTwitchStreamUptime(args plugins.RegistrationArguments) {
|
func tplTwitchStreamUptime(args plugins.RegistrationArguments) {
|
||||||
args.RegisterTemplateFunction("streamUptime", plugins.GenericTemplateFunctionGetter(func(username string) (time.Duration, error) {
|
args.RegisterTemplateFunction("streamUptime", plugins.GenericTemplateFunctionGetter(func(username string) (time.Duration, error) {
|
||||||
si, err := args.GetTwitchClient().GetCurrentStreamInfo(context.Background(), strings.TrimLeft(username, "#"))
|
si, err := args.GetTwitchClient().GetCurrentStreamInfo(context.Background(), strings.TrimLeft(username, "#"))
|
||||||
|
|
2
irc.go
2
irc.go
|
@ -294,7 +294,7 @@ func (i ircHandler) handlePermit(m *irc.Message) {
|
||||||
}
|
}
|
||||||
|
|
||||||
msgParts := strings.Split(m.Trailing(), " ")
|
msgParts := strings.Split(m.Trailing(), " ")
|
||||||
if len(msgParts) != 2 { //nolint:gomnd // This is not a magic number but just an expected count
|
if len(msgParts) != 2 { //nolint:mnd // This is not a magic number but just an expected count
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
main.go
2
main.go
|
@ -193,7 +193,7 @@ func main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(rconfig.Args()) > 1 {
|
if len(rconfig.Args()) > 1 {
|
||||||
if err = cli.Call(rconfig.Args()[1:]); err != nil {
|
if err = cliTool.Call(rconfig.Args()[1:]); err != nil {
|
||||||
log.Fatalf("error in command: %s", err)
|
log.Fatalf("error in command: %s", err)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
|
|
@ -78,12 +78,9 @@ func (c connector) StoreEncryptedCoreMeta(key string, value any) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c connector) ValidateEncryption() error {
|
func (c connector) ValidateEncryption() error {
|
||||||
validationHasher := sha512.New()
|
|
||||||
fmt.Fprint(validationHasher, c.encryptionSecret)
|
|
||||||
|
|
||||||
var (
|
var (
|
||||||
storedHash string
|
storedHash string
|
||||||
validationHash = fmt.Sprintf("%x", validationHasher.Sum(nil))
|
validationHash = fmt.Sprintf("%x", sha512.Sum512([]byte(c.encryptionSecret)))
|
||||||
)
|
)
|
||||||
|
|
||||||
err := backoff.NewBackoff().
|
err := backoff.NewBackoff().
|
||||||
|
|
|
@ -21,10 +21,10 @@ func NewLogrusLogWriterWithLevel(logger *logrus.Logger, level logrus.Level, dbDr
|
||||||
|
|
||||||
// Print implements the gorm.Logger interface
|
// Print implements the gorm.Logger interface
|
||||||
func (l LogWriter) Print(a ...any) {
|
func (l LogWriter) Print(a ...any) {
|
||||||
fmt.Fprint(l.Writer, a...)
|
fmt.Fprint(l.Writer, a...) //nolint:errcheck // Interface ignores this error
|
||||||
}
|
}
|
||||||
|
|
||||||
// Printf implements the gorm.Logger interface
|
// Printf implements the gorm.Logger interface
|
||||||
func (l LogWriter) Printf(format string, a ...any) {
|
func (l LogWriter) Printf(format string, a ...any) {
|
||||||
fmt.Fprintf(l.Writer, format, a...)
|
fmt.Fprintf(l.Writer, format, a...) //nolint:errcheck // Interface ignores this error
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ func ParseBadgeLevels(m *irc.Message) BadgeCollection {
|
||||||
badges := strings.Split(badgeString, ",")
|
badges := strings.Split(badgeString, ",")
|
||||||
for _, b := range badges {
|
for _, b := range badges {
|
||||||
badgeParts := strings.Split(b, "/")
|
badgeParts := strings.Split(b, "/")
|
||||||
if len(badgeParts) != 2 { //nolint:gomnd // This is not a magic number but just an expected count
|
if len(badgeParts) != 2 { //nolint:mnd // This is not a magic number but just an expected count
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ func (c *Client) BanUser(ctx context.Context, channel, username string, duration
|
||||||
return errors.Wrap(err, "encoding payload")
|
return errors.Wrap(err, "encoding payload")
|
||||||
}
|
}
|
||||||
|
|
||||||
return errors.Wrap(
|
return errors.Wrapf(
|
||||||
c.Request(ctx, ClientRequestOpts{
|
c.Request(ctx, ClientRequestOpts{
|
||||||
AuthType: AuthTypeBearerToken,
|
AuthType: AuthTypeBearerToken,
|
||||||
Method: http.MethodPost,
|
Method: http.MethodPost,
|
||||||
|
@ -89,7 +89,7 @@ func (c *Client) BanUser(ctx context.Context, channel, username string, duration
|
||||||
return ValidateStatus(opts, resp)
|
return ValidateStatus(opts, resp)
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
"executing ban request",
|
"executing ban request for %q in %q", username, channel,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,9 +52,7 @@ func (t *testTimerStore) InCooldown(tt TimerType, limiter, ruleID string) (bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
func (testTimerStore) getCooldownTimerKey(tt TimerType, limiter, ruleID string) string {
|
func (testTimerStore) getCooldownTimerKey(tt TimerType, limiter, ruleID string) string {
|
||||||
h := sha256.New()
|
return fmt.Sprintf("sha256:%x", sha256.Sum256([]byte(fmt.Sprintf("%d:%s:%s", tt, limiter, ruleID))))
|
||||||
fmt.Fprintf(h, "%d:%s:%s", tt, limiter, ruleID)
|
|
||||||
return fmt.Sprintf("sha256:%x", h.Sum(nil))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Permit timer
|
// Permit timer
|
||||||
|
@ -69,7 +67,5 @@ func (t *testTimerStore) HasPermit(channel, username string) (bool, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (testTimerStore) getPermitTimerKey(channel, username string) string {
|
func (testTimerStore) getPermitTimerKey(channel, username string) string {
|
||||||
h := sha256.New()
|
return fmt.Sprintf("sha256:%x", sha256.Sum256([]byte(fmt.Sprintf("%d:%s:%s", TimerTypePermit, channel, strings.ToLower(strings.TrimLeft(username, "@"))))))
|
||||||
fmt.Fprintf(h, "%d:%s:%s", TimerTypePermit, channel, strings.ToLower(strings.TrimLeft(username, "@")))
|
|
||||||
return fmt.Sprintf("sha256:%x", h.Sum(nil))
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue