Only track approved users.
This commit is contained in:
parent
b0cf3e2f15
commit
febec72325
|
@ -22,14 +22,28 @@ type TwitchStreamer struct {
|
||||||
var twitchRegex = regexp.MustCompile(`twitch\.tv/(?P<login>[^/]+)$`)
|
var twitchRegex = regexp.MustCompile(`twitch\.tv/(?P<login>[^/]+)$`)
|
||||||
|
|
||||||
func FetchTwitchStreamers(ctx context.Context, dbConn db.ConnOrTx) ([]TwitchStreamer, error) {
|
func FetchTwitchStreamers(ctx context.Context, dbConn db.ConnOrTx) ([]TwitchStreamer, error) {
|
||||||
streamers, err := db.Query(ctx, dbConn, models.Link{},
|
type linkResult struct {
|
||||||
|
Link models.Link `db:"link"`
|
||||||
|
}
|
||||||
|
streamers, err := db.Query(ctx, dbConn, linkResult{},
|
||||||
`
|
`
|
||||||
SELECT $columns
|
SELECT $columns
|
||||||
FROM
|
FROM
|
||||||
handmade_links AS link
|
handmade_links AS link
|
||||||
|
LEFT JOIN auth_user AS link_owner ON link_owner.id = link.user_id
|
||||||
WHERE
|
WHERE
|
||||||
url ~* 'twitch\.tv/([^/]+)$'
|
url ~* 'twitch\.tv/([^/]+)$' AND
|
||||||
|
((link.user_id IS NOT NULL AND link_owner.status = $1) OR (link.project_id IS NOT NULL AND
|
||||||
|
(SELECT COUNT(*)
|
||||||
|
FROM
|
||||||
|
handmade_user_projects AS hup
|
||||||
|
JOIN auth_user AS project_owner ON project_owner.id = hup.user_id
|
||||||
|
WHERE
|
||||||
|
hup.project_id = link.project_id AND
|
||||||
|
project_owner.status != $1
|
||||||
|
) = 0))
|
||||||
`,
|
`,
|
||||||
|
models.UserStatusApproved,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, oops.New(err, "failed to fetch twitch links")
|
return nil, oops.New(err, "failed to fetch twitch links")
|
||||||
|
@ -37,7 +51,7 @@ func FetchTwitchStreamers(ctx context.Context, dbConn db.ConnOrTx) ([]TwitchStre
|
||||||
|
|
||||||
result := make([]TwitchStreamer, 0, len(streamers))
|
result := make([]TwitchStreamer, 0, len(streamers))
|
||||||
for _, s := range streamers {
|
for _, s := range streamers {
|
||||||
dbStreamer := s.(*models.Link)
|
dbStreamer := s.(*linkResult).Link
|
||||||
|
|
||||||
streamer := TwitchStreamer{
|
streamer := TwitchStreamer{
|
||||||
UserID: dbStreamer.UserID,
|
UserID: dbStreamer.UserID,
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"git.handmade.network/hmn/hmn/src/discord"
|
"git.handmade.network/hmn/hmn/src/discord"
|
||||||
"git.handmade.network/hmn/hmn/src/hmndata"
|
"git.handmade.network/hmn/hmn/src/hmndata"
|
||||||
"git.handmade.network/hmn/hmn/src/logging"
|
"git.handmade.network/hmn/hmn/src/logging"
|
||||||
|
"git.handmade.network/hmn/hmn/src/models"
|
||||||
"git.handmade.network/hmn/hmn/src/oops"
|
"git.handmade.network/hmn/hmn/src/oops"
|
||||||
"git.handmade.network/hmn/hmn/src/perf"
|
"git.handmade.network/hmn/hmn/src/perf"
|
||||||
"github.com/jackc/pgx/v4/pgxpool"
|
"github.com/jackc/pgx/v4/pgxpool"
|
||||||
|
@ -343,13 +344,13 @@ func syncWithTwitch(ctx context.Context, dbConn *pgxpool.Pool, updateAll bool) {
|
||||||
log.Info().Interface("Stats", stats).Msg("Twitch sync done")
|
log.Info().Interface("Stats", stats).Msg("Twitch sync done")
|
||||||
}
|
}
|
||||||
|
|
||||||
func notifyDiscordOfLiveStream(ctx context.Context, dbConn db.ConnOrTx, twitchLogin string) error {
|
func notifyDiscordOfLiveStream(ctx context.Context, dbConn db.ConnOrTx, twitchLogin string, title string) error {
|
||||||
var err error
|
var err error
|
||||||
if config.Config.Discord.StreamsChannelID != "" {
|
if config.Config.Discord.StreamsChannelID != "" {
|
||||||
err = discord.SendMessages(ctx, dbConn, discord.MessageToSend{
|
err = discord.SendMessages(ctx, dbConn, discord.MessageToSend{
|
||||||
ChannelID: config.Config.Discord.StreamsChannelID,
|
ChannelID: config.Config.Discord.StreamsChannelID,
|
||||||
Req: discord.CreateMessageRequest{
|
Req: discord.CreateMessageRequest{
|
||||||
Content: fmt.Sprintf("%s is live: https://twitch.tv/%s", twitchLogin, twitchLogin),
|
Content: fmt.Sprintf("%s is live: https://twitch.tv/%s\n%s", twitchLogin, twitchLogin, title),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -390,8 +391,8 @@ func processEventSubNotification(ctx context.Context, dbConn db.ConnOrTx, notifi
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Msg("failed to update twitch stream status")
|
log.Error().Err(err).Msg("failed to update twitch stream status")
|
||||||
}
|
}
|
||||||
if inserted && notification.Type == notificationTypeOnline {
|
if inserted {
|
||||||
err = notifyDiscordOfLiveStream(ctx, dbConn, status.TwitchLogin)
|
err = notifyDiscordOfLiveStream(ctx, dbConn, status.TwitchLogin, status.Title)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Msg("failed to notify discord")
|
log.Error().Err(err).Msg("failed to notify discord")
|
||||||
}
|
}
|
||||||
|
@ -401,7 +402,20 @@ func processEventSubNotification(ctx context.Context, dbConn db.ConnOrTx, notifi
|
||||||
func updateStreamStatusInDB(ctx context.Context, conn db.ConnOrTx, status *streamStatus) (bool, error) {
|
func updateStreamStatusInDB(ctx context.Context, conn db.ConnOrTx, status *streamStatus) (bool, error) {
|
||||||
inserted := false
|
inserted := false
|
||||||
if isStatusRelevant(status) {
|
if isStatusRelevant(status) {
|
||||||
_, err := conn.Exec(ctx,
|
_, err := db.QueryOne(ctx, conn, models.TwitchStream{},
|
||||||
|
`
|
||||||
|
SELECT $columns
|
||||||
|
FROM twitch_streams
|
||||||
|
WHERE twitch_id = $1
|
||||||
|
`,
|
||||||
|
status.TwitchID,
|
||||||
|
)
|
||||||
|
if err == db.NotFound {
|
||||||
|
inserted = true
|
||||||
|
} else if err != nil {
|
||||||
|
return false, oops.New(err, "failed to query existing stream")
|
||||||
|
}
|
||||||
|
_, err = conn.Exec(ctx,
|
||||||
`
|
`
|
||||||
INSERT INTO twitch_streams (twitch_id, twitch_login, title, started_at)
|
INSERT INTO twitch_streams (twitch_id, twitch_login, title, started_at)
|
||||||
VALUES ($1, $2, $3, $4)
|
VALUES ($1, $2, $3, $4)
|
||||||
|
@ -417,7 +431,6 @@ func updateStreamStatusInDB(ctx context.Context, conn db.ConnOrTx, status *strea
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, oops.New(err, "failed to insert twitch streamer into db")
|
return false, oops.New(err, "failed to insert twitch streamer into db")
|
||||||
}
|
}
|
||||||
inserted = true
|
|
||||||
} else {
|
} else {
|
||||||
_, err := conn.Exec(ctx,
|
_, err := conn.Exec(ctx,
|
||||||
`
|
`
|
||||||
|
|
Loading…
Reference in New Issue