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
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) |
|
} |
|
|
|
|