You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

231 lines
7.0 KiB

package main
import (
"bytes"
"context"
"fmt"
"os"
"strings"
"text/tabwriter"
"time"
"github.com/bwmarrin/discordgo"
"github.com/jackc/pgx/v5"
)
var conn *pgx.Conn
var token = "MTExOTA1MjA5ODk0NDkwNTI5Ng.G5fL5F.3kxQmTjPLG5fIHE5sduIRMvLNEvTm14gpsw4Sw"
func main() {
var err error
urlExample := "postgres://bot:3h0SXx6Ykx1D@toolbox.cfsystems.io:5432/iptvsportlist"
conn, err = pgx.Connect(context.Background(), urlExample)
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to connect to the database: %v\n", err)
os.Exit(1)
}
discord, err := discordgo.New("Bot " + token)
if err != nil {
fmt.Fprintf(os.Stderr, "Error creating Discord session: %v\n", err)
os.Exit(1)
}
discord.AddHandler(messageCreate)
err = discord.Open()
if err != nil {
fmt.Fprintf(os.Stderr, "Error opening connection to Discord: %v\n", err)
os.Exit(1)
}
defer discord.Close()
fmt.Println("Bot is now running. Press CTRL-C to exit.")
<-make(chan struct{})
}
func messageCreate(s *discordgo.Session, m *discordgo.MessageCreate) {
if m.Author.Bot {
return
}
args := strings.Fields(m.Content)
if len(args) < 2 {
return
}
switch args[1] {
case "tug":
printTug(s, m.ChannelID)
case "dev":
printDev(s, m.ChannelID)
case "help":
printHelp(s, m.ChannelID)
case "epg":
printEpg(s, m.ChannelID)
case "utc":
printCurrentTimeUTC(s, m.ChannelID)
case "guide":
userTerm := ""
if len(args) >= 3 {
userTerm = args[2]
}
err := guideTerm(s, m.ChannelID, userTerm)
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to list events: %v\n", err)
s.ChannelMessageSend(m.ChannelID, "An error occurred while retrieving data.")
}
case "whatson":
userTerm := ""
if len(args) >= 3 {
userTerm = args[2]
}
err := whatsonTerm(s, m.ChannelID, userTerm)
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to list events: %v\n", err)
s.ChannelMessageSend(m.ChannelID, "An error occurred while retrieving data.")
}
case "upcoming":
userTerm := ""
if len(args) >= 3 {
userTerm = args[2]
}
err := upcomingTerm(s, m.ChannelID, userTerm)
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to list events: %v\n", err)
s.ChannelMessageSend(m.ChannelID, "An error occurred while retrieving data.")
}
}
}
func printTug(s *discordgo.Session, channelID string) {
message := ":eggplant: chaturbate integration coming soon :eggplant:"
s.ChannelMessageSend(channelID, message)
}
func printDev(s *discordgo.Session, channelID string) {
message := "check out https://gc04.xyz"
s.ChannelMessageSend(channelID, message)
}
func printEpg(s *discordgo.Session, channelID string) {
message := "Web EPG: https://epg.gc04.xyz"
s.ChannelMessageSend(channelID, message)
}
func printCurrentTimeUTC(s *discordgo.Session, channelID string) {
currentTime := time.Now().UTC().Format(time.RFC3339)
message := "Current Time (UTC): " + currentTime
s.ChannelMessageSend(channelID, message)
}
func guideTerm(s *discordgo.Session, channelID string, userTerm string) error {
//rows, err := conn.Query(context.Background(), "SELECT sport, event, time_utc, string_agg(channel_name, ', ') AS channels FROM vw_gc04_epg_join_view vgejv WHERE (old_event = 'No') AND (sport = $1 OR event LIKE '%' || $1 || '%' OR league LIKE '%' || $1 || '%') GROUP BY 1, 2, 3 ORDER BY sport, time_utc ASC;", userTerm)
//rows, err := conn.Query(context.Background(), "SELECT distinct sport, league, event, time_utc FROM vw_gc04_epg_join_view vgejv WHERE (old_event = 'No') AND (sport = $1 OR event LIKE '%' || $1 || '%' OR league LIKE '%' || $1 || '%') ORDER BY sport, time_utc ASC;", userTerm)
rows, err := conn.Query(context.Background(), "SELECT distinct sport, substring(league, 1, 3) as league, event, time_utc FROM vw_gc04_epg_join_view vgejv WHERE (old_event = 'No' and guide = 'Yes') AND (sport = $1 OR event LIKE '%' || $1 || '%' OR league LIKE '%' || $1 || '%') ORDER BY sport, league, time_utc ASC;", userTerm)
if err != nil {
return err
}
defer rows.Close()
var buffer bytes.Buffer
writer := tabwriter.NewWriter(&buffer, 0, 0, 3, ' ', tabwriter.Debug)
fmt.Fprintln(writer, "sport league event Time (UTC)")
for rows.Next() {
var sport string
var event string
var timeUtc string
var league string
err := rows.Scan(&sport, &league, &event, &timeUtc)
if err != nil {
return err
}
fmt.Fprintf(writer, "%s %s %s %s\n", sport, league, event, timeUtc)
}
writer.Flush()
message := "```\n" + buffer.String() + "```"
s.ChannelMessageSend(channelID, message)
return rows.Err()
}
func whatsonTerm(s *discordgo.Session, channelID string, userTerm string) error {
rows, err := conn.Query(context.Background(), "SELECT sport, event, time_utc, string_agg(channel_name, ', ') AS channels FROM vw_gc04_epg_join_view vgejv WHERE (old_event = 'No' AND on_air = 'Yes') AND (sport = $1 OR event LIKE '%' || $1 || '%' OR league LIKE '%' || $1 || '%') GROUP BY 1, 2, 3 ORDER BY sport, time_utc ASC;", userTerm)
if err != nil {
return err
}
defer rows.Close()
var buffer bytes.Buffer
writer := tabwriter.NewWriter(&buffer, 0, 0, 3, ' ', tabwriter.Debug)
fmt.Fprintln(writer, "sport Event Time (UTC) Channels")
for rows.Next() {
var sport string
var event string
var timeUtc string
var channels string
err := rows.Scan(&sport, &event, &timeUtc, &channels)
if err != nil {
return err
}
fmt.Fprintf(writer, "%s %s %s \n%s\n\n", sport, event, timeUtc, channels)
}
writer.Flush()
message := "```\n" + buffer.String() + "```"
s.ChannelMessageSend(channelID, message)
return rows.Err()
}
func upcomingTerm(s *discordgo.Session, channelID string, userTerm string) error {
rows, err := conn.Query(context.Background(), "SELECT sport, event, time_utc, string_agg(channel_name, ', ') AS channels FROM vw_gc04_epg_join_view vgejv WHERE (old_event = 'No' AND upcoming = 'Yes') AND (sport = $1 OR event LIKE '%' || $1 || '%' OR league LIKE '%' || $1 || '%') GROUP BY 1, 2, 3 ORDER BY sport, time_utc ASC;", userTerm)
if err != nil {
return err
}
defer rows.Close()
var buffer bytes.Buffer
writer := tabwriter.NewWriter(&buffer, 0, 0, 3, ' ', tabwriter.Debug)
fmt.Fprintln(writer, "sport Event Time (UTC) Channels")
for rows.Next() {
var sport string
var event string
var timeUtc string
var channels string
err := rows.Scan(&sport, &event, &timeUtc, &channels)
if err != nil {
return err
}
fmt.Fprintf(writer, "%s %s %s \n%s\n\n", sport, event, timeUtc, channels)
}
writer.Flush()
message := "```\n" + buffer.String() + "```"
s.ChannelMessageSend(channelID, message)
return rows.Err()
}
func printHelp(s *discordgo.Session, channelID string) {
message := "```\n" + `
Usage:
sportGPT whatson <term> : shows currently airing events
sportGPT guide <term> : shows all upcoming events (24 hours)
sportGPT upcoming <term> : shows all upcoming events (4 hours)
sportGPT epg : link to web-based full epg. useful to find unlisted events.
sportGPT utc : shows current time UTC
sportGPT tug : td
sportGPT help : shows this help text
` + "```\n"
s.ChannelMessageSend(channelID, message)
}