Holy shit this was hard

This commit is contained in:
phlux 2024-11-10 21:18:37 -05:00
parent 9eee8c7f9c
commit cd33fd2584
3 changed files with 119 additions and 66 deletions

View File

@ -1,48 +1,76 @@
package bot
import (
"discord-cfb-bot/config"
cfbClient "discord-cfb-bot/internal/clients/cfb"
cbbClient "discord-cfb-bot/internal/clients/cbb"
"github.com/bwmarrin/discordgo"
"fmt"
"strings"
"discord-cfb-bot/config"
cfbClient "discord-cfb-bot/internal/clients/cfb"
cbbClient "discord-cfb-bot/internal/clients/cbb"
"github.com/bwmarrin/discordgo"
"fmt"
"strings"
)
var Bot *discordgo.Session
func Start() error {
var err error
Bot, err = discordgo.New("Bot " + config.BotToken)
if err != nil {
return fmt.Errorf("error creating a Discord session: %w", err)
}
var err error
Bot, err = discordgo.New("Bot " + config.BotToken)
if err != nil {
return fmt.Errorf("error creating a Discord session: %w", err)
}
fmt.Println("Discord session created successfully")
fmt.Println("Discord session created successfully")
Bot.AddHandler(commandHandler)
err = Bot.Open()
if err != nil {
return fmt.Errorf("Error opening connection: %w", err)
}
fmt.Println("Bot is now running.")
return nil
Bot.AddHandler(commandHandler)
err = Bot.Open()
if err != nil {
return fmt.Errorf("error opening connection: %w", err)
}
fmt.Println("Bot is now running.")
return nil
}
func commandHandler(s *discordgo.Session, m *discordgo.MessageCreate) {
if m.Author.Bot {
return
if m.Author.Bot {
return
}
if strings.HasPrefix(m.Content, "!cfb ") {
teamName := strings.TrimSpace(strings.TrimPrefix(m.Content, "!cfb "))
response := cfbClient.GetGameInfo(teamName)
s.ChannelMessageSend(m.ChannelID, response)
}
if strings.HasPrefix(m.Content, "!cbb ") {
content := strings.TrimSpace(strings.TrimPrefix(m.Content, "!cbb "))
parts := strings.SplitN(content, " ", 2)
teamName := parts[0]
date := ""
if len(parts) > 1 {
if isDateFormat(parts[1]) {
date = parts[1]
} else {
teamName = content // Reset team name to include all parts if no valid date
}
}
if strings.HasPrefix(m.Content, "!cfb ") {
teamName := strings.TrimSpace(strings.TrimPrefix(m.Content, "!cfb "))
response := cfbClient.GetGameInfo(teamName)
s.ChannelMessageSend(m.ChannelID, response)
// Check if the team name is a custom name defined in config
if customTeam, exists := config.CustomTeamNames[strings.ToLower(teamName)]; exists {
response := cbbClient.GetGameInfo(customTeam, date) // Exact match for custom teams
s.ChannelMessageSend(m.ChannelID, response)
} else {
response := cbbClient.GetGameInfo(teamName, date) // General match for all teams
s.ChannelMessageSend(m.ChannelID, response)
}
if strings.HasPrefix(m.Content, "!cbb ") {
teamName := strings.TrimSpace(strings.TrimPrefix(m.Content, "!cbb "))
response := cbbClient.GetGameInfo(teamName)
s.ChannelMessageSend(m.ChannelID, response)
}
}
}
// isDateFormat checks if a string is in the MM/DD format
func isDateFormat(dateStr string) bool {
parts := strings.Split(dateStr, "/")
if len(parts) != 2 {
return false
}
return len(parts[0]) <= 2 && len(parts[1]) <= 2 // Simple check for MM/DD format
}

View File

@ -6,8 +6,8 @@ import (
"io/ioutil"
"net/http"
"strings"
"discord-cfb-bot/config"
"time"
"unicode"
)
type Game struct {
@ -32,19 +32,27 @@ type Team struct {
} `json:"names"`
}
func GetGameInfo(teamName string) string {
// Make the teamName input lowercase
teamNameLower := strings.ToLower(teamName)
// Check if the lowercase teamName matches a custom abbreviation
for key, value := range config.CustomTeamNames {
if strings.ToLower(key) == teamNameLower {
teamNameLower = strings.ToLower(value)
break
func GetGameInfo(teamName, date string) string {
// If no date is provided, use today's date
if date == "" {
date = time.Now().Format("2006/01/02") // Format as YYYY/MM/DD
} else {
// Check if the last 5 characters are in MM/DD format for date input
if len(date) == 5 && unicode.IsDigit(rune(date[0])) && unicode.IsDigit(rune(date[1])) && date[2] == '/' &&
unicode.IsDigit(rune(date[3])) && unicode.IsDigit(rune(date[4])) {
date = fmt.Sprintf("2024/%s", strings.ReplaceAll(date, "/", "/")) // Add the year and reformat
} else {
return "Invalid date format. Please use MM/DD."
}
}
apiURL := "https://ncaa.ewnix.net/scoreboard/basketball-men/d1"
apiURL := fmt.Sprintf("https://ncaa.ewnix.net/scoreboard/basketball-men/d1/%s", date)
return fetchAndParseGames(apiURL, teamName)
}
func fetchAndParseGames(apiURL, teamName string) string {
teamNameLower := strings.ToLower(teamName)
resp, err := http.Get(apiURL)
if err != nil {
return fmt.Sprintf("Failed to reach the scoreboard API: %v", err)
@ -67,17 +75,20 @@ func GetGameInfo(teamName string) string {
var results []string
for _, game := range apiResponse.Games {
// Filter games by team name (either home or away)
if strings.ToLower(game.Game.Home.Names.Short) == teamNameLower ||
strings.ToLower(game.Game.Away.Names.Short) == teamNameLower {
var gameInfo string
if game.Game.GameState == "in_progress" {
gameInfo = fmt.Sprintf("%s: **%s** %s: **%s** | Half: %s | Time Remaining: %s",
if game.Game.GameState == "live" {
currentPeriod := game.Game.CurrentPeriod
if currentPeriod == "" {
currentPeriod = "HALFTIME"
}
gameInfo = fmt.Sprintf("Live: %s: **%s** %s: **%s** | Half: %s | Time Remaining: %s",
game.Game.Away.Names.Short, game.Game.Away.Score,
game.Game.Home.Names.Short, game.Game.Home.Score,
game.Game.CurrentPeriod, game.Game.ContestClock)
} else if game.Game.GameState == "scheduled" {
currentPeriod, game.Game.ContestClock)
} else if game.Game.GameState == "pre" {
gameInfo = fmt.Sprintf("Upcoming: %s @ %s on %s at %s ET",
game.Game.Away.Names.Short, game.Game.Home.Names.Short, game.Game.StartDate, game.Game.StartTime)
} else if game.Game.GameState == "final" {
@ -96,3 +107,4 @@ func GetGameInfo(teamName string) string {
return "No game found for the specified team."
}

View File

@ -4,10 +4,10 @@ import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"strings"
"discord-cfb-bot/config"
"unicode"
)
type Game struct {
@ -33,18 +33,24 @@ type Team struct {
}
func GetGameInfo(teamName string) string {
// Make the teamName input lowercase
teamNameLower := strings.ToLower(teamName)
teamName = strings.TrimSpace(teamName)
week := ""
// Check if the lowercase teamName matches a custom abbreviation
for key, value := range config.CustomTeamNames {
if strings.ToLower(key) == teamNameLower {
teamNameLower = strings.ToLower(value)
break
}
// Check if the last two characters of the input are integers for the week
if len(teamName) >= 2 && unicode.IsDigit(rune(teamName[len(teamName)-1])) && unicode.IsDigit(rune(teamName[len(teamName)-2])) {
week = teamName[len(teamName)-2:]
teamName = strings.TrimSpace(teamName[:len(teamName)-2])
log.Printf("Week detected: %s", week)
}
apiURL := "https://ncaa.ewnix.net/scoreboard/football/fbs/2024/all-conf"
// Build the API URL based on whether a week is provided
apiURL := "https://ncaa.ewnix.net/scoreboard/football/fbs"
if week != "" {
apiURL = fmt.Sprintf("https://ncaa.ewnix.net/scoreboard/football/fbs/2024/%s/all-conf", week)
}
log.Printf("Fetching data from API: %s", apiURL)
resp, err := http.Get(apiURL)
if err != nil {
return fmt.Sprintf("Failed to reach the scoreboard API: %v", err)
@ -65,23 +71,29 @@ func GetGameInfo(teamName string) string {
}
var results []string
teamNameLower := strings.ToLower(teamName)
for _, game := range apiResponse.Games {
// Filter games by team name (either home or away)
if strings.ToLower(game.Game.Home.Names.Short) == teamNameLower ||
strings.ToLower(game.Game.Away.Names.Short) == teamNameLower {
homeTeamLowerShort := strings.ToLower(game.Game.Home.Names.Short)
awayTeamLowerShort := strings.ToLower(game.Game.Away.Names.Short)
// Check if the team matches the short name only
if homeTeamLowerShort == teamNameLower || awayTeamLowerShort == teamNameLower {
var gameInfo string
if game.Game.GameState == "in_progress" {
if game.Game.GameState == "live" {
period := game.Game.CurrentPeriod
if period == "" {
period = "HALFTIME"
}
gameInfo = fmt.Sprintf("%s: **%s** %s: **%s** | Quarter: %s | Time Remaining: %s",
game.Game.Away.Names.Short, game.Game.Away.Score,
game.Game.Home.Names.Short, game.Game.Home.Score,
game.Game.CurrentPeriod, game.Game.ContestClock)
} else if game.Game.GameState == "scheduled" {
period, game.Game.ContestClock)
} else if game.Game.GameState == "pre" {
gameInfo = fmt.Sprintf("Upcoming: %s @ %s on %s at %s ET",
game.Game.Away.Names.Short, game.Game.Home.Names.Short, game.Game.StartDate, game.Game.StartTime)
} else if game.Game.GameState == "final" {
gameInfo = fmt.Sprintf("Final: %s: %s %s: %s",
gameInfo = fmt.Sprintf("Final: %s: **%s** %s: **%s**",
game.Game.Away.Names.Short, game.Game.Away.Score,
game.Game.Home.Names.Short, game.Game.Home.Score)
}
@ -96,3 +108,4 @@ func GetGameInfo(teamName string) string {
return "No game found for the specified team."
}