116 lines
2.9 KiB
Go
116 lines
2.9 KiB
Go
package twitchrepo
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
)
|
|
|
|
type Repo struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
func NewRepo(db *sql.DB) *Repo {
|
|
return &Repo{db: db}
|
|
}
|
|
|
|
func (r *Repo) ListGuilds(ctx context.Context) ([]int64, error) {
|
|
const q = `SELECT DISTINCT guild_id FROM twitch`
|
|
rows, err := r.db.QueryContext(ctx, q)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var ids []int64
|
|
for rows.Next() {
|
|
var gid int64
|
|
if err := rows.Scan(&gid); err != nil {
|
|
return nil, err
|
|
}
|
|
ids = append(ids, gid)
|
|
}
|
|
return ids, rows.Err()
|
|
}
|
|
|
|
func (r *Repo) ListUsersForGuild(ctx context.Context, guildID int64) ([]string, error) {
|
|
const q = `SELECT twitch_user FROM twitch WHERE guild_id = $1`
|
|
rows, err := r.db.QueryContext(ctx, q, guildID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
|
|
var users []string
|
|
for rows.Next() {
|
|
var u string
|
|
if err := rows.Scan(&u); err != nil {
|
|
return nil, err
|
|
}
|
|
users = append(users, u)
|
|
}
|
|
return users, rows.Err()
|
|
}
|
|
|
|
func (r *Repo) GetStatus(ctx context.Context, guildID int64, username string) (string, bool, error) {
|
|
const q = `SELECT status FROM twitch WHERE guild_id = $1 AND twitch_user = $2`
|
|
var status string
|
|
err := r.db.QueryRowContext(ctx, q, guildID, username).Scan(&status)
|
|
if err == sql.ErrNoRows {
|
|
return "", false, nil
|
|
}
|
|
if err != nil {
|
|
return "", false, err
|
|
}
|
|
return status, true, nil
|
|
}
|
|
|
|
func (r *Repo) UpsertStreamer(ctx context.Context, guildID int64, username string) error {
|
|
const q = `
|
|
INSERT INTO twitch (twitch_user, guild_id, status)
|
|
VALUES ($1, $2, 'not live')
|
|
ON CONFLICT (twitch_user, guild_id)
|
|
DO NOTHING
|
|
`
|
|
_, err := r.db.ExecContext(ctx, q, username, guildID)
|
|
return err
|
|
}
|
|
|
|
func (r *Repo) RemoveStreamer(ctx context.Context, guildID int64, username string) error {
|
|
const q = `DELETE FROM twitch WHERE guild_id = $1 AND twitch_user = $2`
|
|
_, err := r.db.ExecContext(ctx, q, guildID, username)
|
|
return err
|
|
}
|
|
|
|
func (r *Repo) UpdateStatus(ctx context.Context, guildID int64, username, status string) error {
|
|
const q = `UPDATE twitch SET status = $1 WHERE guild_id = $2 AND twitch_user = $3`
|
|
_, err := r.db.ExecContext(ctx, q, status, guildID, username)
|
|
return err
|
|
}
|
|
|
|
func (r *Repo) GetNotificationChannel(ctx context.Context, guildID int64) (int64, bool, error) {
|
|
const q = `SELECT twitch_channel_id FROM twitch_config WHERE guild_id = $1`
|
|
var chID sql.NullInt64
|
|
if err := r.db.QueryRowContext(ctx, q, guildID).Scan(&chID); err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return 0, false, nil
|
|
}
|
|
return 0, false, err
|
|
}
|
|
if !chID.Valid {
|
|
return 0, false, nil
|
|
}
|
|
return chID.Int64, true, nil
|
|
}
|
|
|
|
func (r *Repo) SetNotificationChannel(ctx context.Context, guildID, channelID int64) error {
|
|
const q = `
|
|
INSERT INTO twitch_config (guild_id, twitch_channel_id)
|
|
VALUES ($1, $2)
|
|
ON CONFLICT (guild_id)
|
|
DO UPDATE SET twitch_channel_id = EXCLUDED.twitch_channel_id
|
|
`
|
|
_, err := r.db.ExecContext(ctx, q, guildID, channelID)
|
|
return err
|
|
}
|
|
|