[core] Fix: Replace deprecated follow API

- add `moderator:read:followers` scope to bot-defaults
- document requirement of bot to be mod to read followers
- adjust `GetFollowDate` method to use new channel followers endpoint

Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
Knut Ahlers 2023-09-29 14:54:24 +02:00
parent 4186e16451
commit fbc76761b4
Signed by: luzifer
GPG key ID: D91C3E91E4CAD6F5
4 changed files with 12 additions and 11 deletions

View file

@ -141,7 +141,7 @@ Example:
### `doesFollow` ### `doesFollow`
Returns whether `from` follows `to` Returns whether `from` follows `to` (the bot must be moderator of `to` to read this)
Syntax: `doesFollow <from> <to>` Syntax: `doesFollow <from> <to>`
@ -154,7 +154,7 @@ Example:
### `doesFollowLongerThan` ### `doesFollowLongerThan`
Returns whether `from` follows `to` for more than `duration` Returns whether `from` follows `to` for more than `duration` (the bot must be moderator of `to` to read this)
Syntax: `doesFollowLongerThan <from> <to> <duration>` Syntax: `doesFollowLongerThan <from> <to> <duration>`
@ -180,7 +180,7 @@ Example:
### `followAge` ### `followAge`
Looks up when `from` followed `to` and returns the duration between then and now Looks up when `from` followed `to` and returns the duration between then and now (the bot must be moderator of `to` to read this)
Syntax: `followAge <from> <to>` Syntax: `followAge <from> <to>`
@ -193,7 +193,7 @@ Example:
### `followDate` ### `followDate`
Looks up when `from` followed `to` Looks up when `from` followed `to` (the bot must be moderator of `to` to read this)
Syntax: `followDate <from> <to>` Syntax: `followDate <from> <to>`
@ -389,7 +389,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: 46% < Your int this hour: 11%
``` ```
### `streamUptime` ### `streamUptime`

View file

@ -50,7 +50,7 @@ func tplTwitchDoesFollowLongerThan(args plugins.RegistrationArguments) {
return false, errors.Wrap(err, "getting follow date") return false, errors.Wrap(err, "getting follow date")
} }
}), plugins.TemplateFuncDocumentation{ }), plugins.TemplateFuncDocumentation{
Description: "Returns whether `from` follows `to` for more than `duration`", Description: "Returns whether `from` follows `to` for more than `duration` (the bot must be moderator of `to` to read this)",
Syntax: "doesFollowLongerThan <from> <to> <duration>", Syntax: "doesFollowLongerThan <from> <to> <duration>",
Example: &plugins.TemplateFuncDocumentationExample{ Example: &plugins.TemplateFuncDocumentationExample{
Template: `{{ doesFollowLongerThan "tezrian" "luziferus" "168h" }}`, Template: `{{ doesFollowLongerThan "tezrian" "luziferus" "168h" }}`,
@ -73,7 +73,7 @@ func tplTwitchDoesFollow(args plugins.RegistrationArguments) {
return false, errors.Wrap(err, "getting follow date") return false, errors.Wrap(err, "getting follow date")
} }
}), plugins.TemplateFuncDocumentation{ }), plugins.TemplateFuncDocumentation{
Description: "Returns whether `from` follows `to`", Description: "Returns whether `from` follows `to` (the bot must be moderator of `to` to read this)",
Syntax: "doesFollow <from> <to>", Syntax: "doesFollow <from> <to>",
Example: &plugins.TemplateFuncDocumentationExample{ Example: &plugins.TemplateFuncDocumentationExample{
Template: `{{ doesFollow "tezrian" "luziferus" }}`, Template: `{{ doesFollow "tezrian" "luziferus" }}`,
@ -87,7 +87,7 @@ func tplTwitchFollowAge(args plugins.RegistrationArguments) {
since, err := args.GetTwitchClient().GetFollowDate(from, to) since, err := args.GetTwitchClient().GetFollowDate(from, to)
return time.Since(since), errors.Wrap(err, "getting follow date") return time.Since(since), errors.Wrap(err, "getting follow date")
}), plugins.TemplateFuncDocumentation{ }), plugins.TemplateFuncDocumentation{
Description: "Looks up when `from` followed `to` and returns the duration between then and now", Description: "Looks up when `from` followed `to` and returns the duration between then and now (the bot must be moderator of `to` to read this)",
Syntax: "followAge <from> <to>", Syntax: "followAge <from> <to>",
Example: &plugins.TemplateFuncDocumentationExample{ Example: &plugins.TemplateFuncDocumentationExample{
Template: `{{ followAge "tezrian" "luziferus" }}`, Template: `{{ followAge "tezrian" "luziferus" }}`,
@ -100,7 +100,7 @@ func tplTwitchFollowDate(args plugins.RegistrationArguments) {
args.RegisterTemplateFunction("followDate", plugins.GenericTemplateFunctionGetter(func(from, to string) (time.Time, error) { args.RegisterTemplateFunction("followDate", plugins.GenericTemplateFunctionGetter(func(from, to string) (time.Time, error) {
return args.GetTwitchClient().GetFollowDate(from, to) return args.GetTwitchClient().GetFollowDate(from, to)
}), plugins.TemplateFuncDocumentation{ }), plugins.TemplateFuncDocumentation{
Description: "Looks up when `from` followed `to`", Description: "Looks up when `from` followed `to` (the bot must be moderator of `to` to read this)",
Syntax: "followDate <from> <to>", Syntax: "followDate <from> <to>",
Example: &plugins.TemplateFuncDocumentationExample{ Example: &plugins.TemplateFuncDocumentationExample{
Template: `{{ followDate "tezrian" "luziferus" }}`, Template: `{{ followDate "tezrian" "luziferus" }}`,

View file

@ -104,7 +104,7 @@ func (c *Client) GetFollowDate(from, to string) (time.Time, error) {
Method: http.MethodGet, Method: http.MethodGet,
OKStatus: http.StatusOK, OKStatus: http.StatusOK,
Out: &payload, Out: &payload,
URL: fmt.Sprintf("https://api.twitch.tv/helix/users/follows?to_id=%s&from_id=%s", toID, fromID), URL: fmt.Sprintf("https://api.twitch.tv/helix/channels/followers?broadcaster_id=%s&user_id=%s", toID, fromID),
}); err != nil { }); err != nil {
return time.Time{}, errors.Wrap(err, "request follow info") return time.Time{}, errors.Wrap(err, "request follow info")
} }
@ -228,7 +228,7 @@ func (c *Client) GetUserInformation(user string) (*User, error) {
return nil, errors.Errorf("unexpected number of records returned: %d", l) return nil, errors.Errorf("unexpected number of records returned: %d", l)
} }
// Follow date will not change that often, cache for a long time // User info will not change that often, cache for a long time
c.apiCache.Set(cacheKey, timeDay, payload.Data[0]) c.apiCache.Set(cacheKey, timeDay, payload.Data[0])
out = payload.Data[0] out = payload.Data[0]

View file

@ -26,6 +26,7 @@ var (
twitch.ScopeModeratorManageChatSettings, twitch.ScopeModeratorManageChatSettings,
twitch.ScopeModeratorManageShieldMode, twitch.ScopeModeratorManageShieldMode,
twitch.ScopeModeratorManageShoutouts, twitch.ScopeModeratorManageShoutouts,
twitch.ScopeModeratorReadFollowers,
// Chat Scopes // Chat Scopes
twitch.ScopeChatEdit, twitch.ScopeChatEdit,