all repos — paprika @ 4f5ac048596e44147f9d9db0731b987a3e92d1bf

go rewrite of taigabot

plugins/lastfm/nowplaying.go (view raw)

 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
package lastfm

import (
	"encoding/json"
	"fmt"
	"net/http"
	"strconv"
	"time"

	"git.icyphox.sh/paprika/config"
	"github.com/dustin/go-humanize"
)

type ListenInfo struct {
	RecentTracks struct {
		Track []struct {
			Artist struct {
				Text string `json:"#text"`
			} `json:"artist"`
			Album struct {
				Text string `json:"#text"`
			} `json:"album"`
			Name string `json:"name"`
			Date struct {
				UnixTimestamp string `json:"uts"`
			} `json:"date"`
			Attr struct {
				NowPlaying string `json:"nowplaying"`
			} `json:"@attr"`
		} `json:"track"`
	} `json:"recenttracks"`
}

func getRecentTracks(url string) (*ListenInfo, error) {
	li := ListenInfo{}
	r, err := http.Get(url)
	if err != nil {
		return nil, err
	} else if r.StatusCode != 200 {
		return nil, fmt.Errorf("non-200 response from Last.fm")
	}

	json.NewDecoder(r.Body).Decode(&li)
	defer r.Body.Close()

	return &li, err
}

func NowPlaying(user string) (string, error) {
	key := config.C.ApiKeys["lastfm-key"]
	url := fmt.Sprintf(
		"https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=%s&api_key=%s&format=json",
		user,
		key,
	)

	rt, err := getRecentTracks(url)
	if err != nil {
		return "", err
	}

	track := rt.RecentTracks.Track[0]
	if rt.RecentTracks.Track[0].Attr.NowPlaying == "true" {
		return fmt.Sprintf(
			"%s is currently listening to \"%s\" by \x02%s\x02, from the album \x02%s\x02",
			user,
			track.Name,
			track.Artist.Text,
			track.Album.Text,
		), nil
	} else {
		strT := track.Date.UnixTimestamp
		ts, _ := strconv.Atoi(strT)
		t := time.Unix(int64(ts), 0)
		return fmt.Sprintf(
			"%s listened to \"%s\" by \x02%s\x02, from the album \x02%s\x02, %s",
			user,
			track.Name,
			track.Artist.Text,
			track.Album.Text,
			humanize.Time(t),
		), nil
	}
}