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 = "BOT-TOKEN" func main() { var err error urlExample := "DB-URL" 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 : shows currently airing events sportGPT guide : shows all upcoming events (24 hours) sportGPT upcoming : 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) }