Add displayName template function

Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
Knut Ahlers 2021-05-24 21:42:55 +02:00
parent 5339e866e5
commit 487bce25d7
Signed by: luzifer
GPG key ID: 0066F03ED215AD7D
3 changed files with 47 additions and 0 deletions

View file

@ -5,6 +5,15 @@ import (
) )
func init() { func init() {
tplFuncs.Register("displayName", genericTemplateFunctionGetter(func(username string, v ...string) (string, error) {
displayName, err := twitch.GetDisplayNameForUser(strings.TrimLeft(username, "#"))
if err != nil && len(v) > 0 {
return v[0], nil
}
return displayName, err
}))
tplFuncs.Register("recentGame", genericTemplateFunctionGetter(func(username string, v ...string) (string, error) { tplFuncs.Register("recentGame", genericTemplateFunctionGetter(func(username string, v ...string) (string, error) {
game, _, err := twitch.GetRecentStreamInfo(strings.TrimLeft(username, "#")) game, _, err := twitch.GetRecentStreamInfo(strings.TrimLeft(username, "#"))
if err != nil && len(v) > 0 { if err != nil && len(v) > 0 {

View file

@ -48,6 +48,43 @@ func (t twitchClient) getAuthorizedUsername() (string, error) {
return payload.Data[0].Login, nil return payload.Data[0].Login, nil
} }
func (t twitchClient) GetDisplayNameForUser(username string) (string, error) {
cacheKey := []string{"displayNameForUsername", username}
if d := t.apiCache.Get(cacheKey); d != nil {
return d.(string), nil
}
ctx, cancel := context.WithTimeout(context.Background(), twitchRequestTimeout)
defer cancel()
var payload struct {
Data []struct {
ID string `json:"id"`
DisplayName string `json:"display_name"`
Login string `json:"login"`
} `json:"data"`
}
if err := t.request(
ctx,
http.MethodGet,
fmt.Sprintf("https://api.twitch.tv/helix/users?login=%s", username),
nil,
&payload,
); err != nil {
return "", errors.Wrap(err, "request channel info")
}
if l := len(payload.Data); l != 1 {
return "", errors.Errorf("unexpected number of users returned: %d", l)
}
// The DisplayName for an username will not change (often), cache for a decent time
t.apiCache.Set(cacheKey, time.Hour, payload.Data[0].DisplayName)
return payload.Data[0].DisplayName, nil
}
func (t twitchClient) GetFollowDate(from, to string) (time.Time, error) { func (t twitchClient) GetFollowDate(from, to string) (time.Time, error) {
cacheKey := []string{"followDate", from, to} cacheKey := []string{"followDate", from, to}
if d := t.apiCache.Get(cacheKey); d != nil { if d := t.apiCache.Get(cacheKey); d != nil {

View file

@ -106,6 +106,7 @@ Additionally there are some functions available in the templates:
- `arg <idx>` - Takes the message sent to the channel, splits by space and returns the Nth element - `arg <idx>` - Takes the message sent to the channel, splits by space and returns the Nth element
- `channelCounter <counter name>` - Wraps the counter name into a channel specific counter name including the channel name - `channelCounter <counter name>` - Wraps the counter name into a channel specific counter name including the channel name
- `counterValue <counter name>` - Returns the current value of the counter which identifier was supplied - `counterValue <counter name>` - Returns the current value of the counter which identifier was supplied
- `displayName <username> [fallback]` - Returns the display name the specified user set for themselves
- `fixUsername <username>` - Ensures the username no longer contains the `@` or `#` prefix - `fixUsername <username>` - Ensures the username no longer contains the `@` or `#` prefix
- `followDate <from> <to>` - Looks up when `from` followed `to` - `followDate <from> <to>` - Looks up when `from` followed `to`
- `group <idx>` - Gets matching group specified by index from `match_message` regular expression - `group <idx>` - Gets matching group specified by index from `match_message` regular expression