tagging role, embedding message content
This commit is contained in:
parent
42d5fc9dbe
commit
075bdb2782
@ -4,5 +4,6 @@
|
||||
"Patch Notes": "556093419341086749",
|
||||
"Atomic Shop": "590581442392621067",
|
||||
"News": "558335339018846228"
|
||||
}
|
||||
},
|
||||
"url": "https://fallout.bethesda.net/en/news"
|
||||
}
|
||||
|
129
main.go
129
main.go
@ -17,10 +17,15 @@ import (
|
||||
type Config struct {
|
||||
DiscordBotToken string `json:"discord_bot_token"`
|
||||
ChannelMap map[string]string `json:"channel_map"` // Add the channel map to the config
|
||||
URL string `json:"url"` // Add URL field to the config
|
||||
}
|
||||
|
||||
func main() {
|
||||
|
||||
//Initialize Time
|
||||
date := "April 26, 2024"
|
||||
//date := time.Now().Format("January 2, 2006")
|
||||
|
||||
// At the beginning of the main function
|
||||
log.Println("Starting the bot...")
|
||||
|
||||
@ -53,6 +58,12 @@ func main() {
|
||||
// Access the channel map from the configuration
|
||||
tagChannelMap := config.ChannelMap
|
||||
|
||||
url := config.URL
|
||||
if url == "" {
|
||||
fmt.Println("URL is not set in config file")
|
||||
return
|
||||
}
|
||||
|
||||
// Create a new Discord session using the provided bot token
|
||||
dg, err := discordgo.New("Bot " + token)
|
||||
if err != nil {
|
||||
@ -75,8 +86,8 @@ func main() {
|
||||
// After opening the Discord connection
|
||||
log.Println("Opened Discord connection")
|
||||
|
||||
// Run the scraping and message sending function once at the specified time
|
||||
sendNotifications(dg, scrapeNews(), tagChannelMap)
|
||||
// Run the scraping and message sending function at start up
|
||||
sendNotifications(dg, fetchUrl(url), tagChannelMap, date)
|
||||
|
||||
// Schedule the scraping and message sending function to run once a day
|
||||
ticker := time.NewTicker(24 * time.Hour)
|
||||
@ -87,7 +98,7 @@ func main() {
|
||||
for {
|
||||
select {
|
||||
case <-ticker.C:
|
||||
sendNotifications(dg, scrapeNews(), tagChannelMap)
|
||||
sendNotifications(dg, fetchUrl(url), tagChannelMap, date)
|
||||
}
|
||||
}
|
||||
}()
|
||||
@ -97,7 +108,7 @@ func main() {
|
||||
<-make(chan struct{})
|
||||
}
|
||||
|
||||
func scrapeNews() string {
|
||||
func fetchUrl(url string) string {
|
||||
// Create a new context
|
||||
ctx := context.Background()
|
||||
ctx, cancel := chromedp.NewContext(
|
||||
@ -109,7 +120,7 @@ func scrapeNews() string {
|
||||
// Navigate to the Fallout news page
|
||||
var html string
|
||||
err := chromedp.Run(ctx, chromedp.Tasks{
|
||||
chromedp.Navigate("https://fallout.bethesda.net/en/news"),
|
||||
chromedp.Navigate(url),
|
||||
chromedp.OuterHTML("html", &html),
|
||||
})
|
||||
if err != nil {
|
||||
@ -121,46 +132,92 @@ func scrapeNews() string {
|
||||
}
|
||||
|
||||
// Add a function to extract relevant tags from the HTML content
|
||||
func extractTags(html string) []string {
|
||||
var tags []string
|
||||
func extractNewsArticles(html string) []map[string]string {
|
||||
var articles []map[string]string
|
||||
|
||||
doc, err := goquery.NewDocumentFromReader(strings.NewReader(html))
|
||||
if err != nil {
|
||||
fmt.Println("Error parsing HTML:", err)
|
||||
return tags
|
||||
return articles
|
||||
}
|
||||
// Find and extract tags with class name "news-module-feed-item-details-tag"
|
||||
doc.Find("span.news-module-feed-item-details-tag").Each(func(i int, s *goquery.Selection) {
|
||||
tag := strings.TrimSpace(s.Text())
|
||||
tags = append(tags, tag)
|
||||
|
||||
// Find and extract each article
|
||||
doc.Find("article.news-module-feed-item").Each(func(i int, s *goquery.Selection) {
|
||||
article := make(map[string]string)
|
||||
|
||||
// Extract link
|
||||
link, exists := s.Find("a.news-module-feed-item-image").Attr("href")
|
||||
if exists {
|
||||
article["link"] = "https://fallout.bethesda.net" + link
|
||||
}
|
||||
|
||||
// Extract title
|
||||
title := strings.TrimSpace(s.Find("h3.news-module-feed-item-title").Text())
|
||||
article["title"] = title
|
||||
|
||||
// Extract tag
|
||||
tag := strings.TrimSpace(s.Find("span.news-module-feed-item-details-tag").Text())
|
||||
article["tag"] = tag
|
||||
|
||||
// Extract date
|
||||
date := strings.TrimSpace(s.Find("span.news-module-feed-item-details-date").Text())
|
||||
article["date"] = date
|
||||
|
||||
// Extract game
|
||||
game := strings.TrimSpace(s.Find("span.news-module-feed-item-details-game").Text())
|
||||
article["game"] = game
|
||||
|
||||
// Extract blurb
|
||||
blurb := strings.TrimSpace(s.Find("p.news-module-feed-item-blurb").Text())
|
||||
article["blurb"] = blurb
|
||||
|
||||
// Extract image URL
|
||||
imageURL, exists := s.Find("img.news-module-feed-item-image-tag").Attr("src")
|
||||
if exists {
|
||||
article["imageURL"] = "https:" + imageURL
|
||||
}
|
||||
|
||||
articles = append(articles, article)
|
||||
})
|
||||
return tags
|
||||
|
||||
return articles
|
||||
}
|
||||
|
||||
func sendNotifications(session *discordgo.Session, html string, tagChannelMap map[string]string) {
|
||||
// Extract tags from the HTML content
|
||||
tags := extractTags(html)
|
||||
func sendNotifications(session *discordgo.Session, html string, tagChannelMap map[string]string, specifiedDate string) {
|
||||
// Extract articles from the HTML content
|
||||
articles := extractNewsArticles(html)
|
||||
|
||||
// Define today's date string
|
||||
today := time.Now().Format("January 2, 2006")
|
||||
// Iterate over extracted articles
|
||||
for _, article := range articles {
|
||||
tag := article["tag"]
|
||||
date := article["date"]
|
||||
link := article["link"]
|
||||
blurb := article["blurb"]
|
||||
title := article["title"]
|
||||
imageURL := article["imageURL"]
|
||||
|
||||
// Iterate over extracted tags
|
||||
for _, tag := range tags {
|
||||
// Check if the tag is in the desired tags list
|
||||
if tagChannelID, ok := tagChannelMap[tag]; ok {
|
||||
// Check if today's date matches the tag
|
||||
if tag == today {
|
||||
// Send a message to the corresponding Discord channel
|
||||
message := fmt.Sprintf("Today's date matches the tag '%s' on the Fallout news page!", tag)
|
||||
_, err := session.ChannelMessageSend(tagChannelID, message)
|
||||
if err != nil {
|
||||
fmt.Printf("Error sending message to Discord channel %s: %s\n", tagChannelID, err)
|
||||
continue
|
||||
// Check if the article's date matches the specified date
|
||||
if date == specifiedDate {
|
||||
// Create a rich embed
|
||||
embed := &discordgo.MessageEmbed{
|
||||
Title: title,
|
||||
Description: blurb,
|
||||
URL: link,
|
||||
Image: &discordgo.MessageEmbedImage{
|
||||
URL: imageURL,
|
||||
},
|
||||
Color: 0x00ff00, // Green color for the embed
|
||||
}
|
||||
fmt.Println("Message sent to Discord channel:", tagChannelID)
|
||||
} else {
|
||||
// Send a different message indicating the tag was found
|
||||
message := fmt.Sprintf("Tag '%s' found on the Fallout news page, but it's not today's date.", tag)
|
||||
_, err := session.ChannelMessageSend(tagChannelID, message)
|
||||
|
||||
// Send a message to the corresponding Discord channel
|
||||
message := "New <@&568064042086694913> have been released!"
|
||||
_, err := session.ChannelMessageSendComplex(tagChannelID, &discordgo.MessageSend{
|
||||
Content: message, // Replace 568064042086694913 with the ID of the role to mention
|
||||
Embed: embed,
|
||||
AllowedMentions: &discordgo.MessageAllowedMentions{Roles: []string{"568064042086694913"}}, // Replace ROLE_ID with the ID of the role to mention
|
||||
})
|
||||
if err != nil {
|
||||
fmt.Printf("Error sending message to Discord channel %s: %s\n", tagChannelID, err)
|
||||
continue
|
||||
@ -169,12 +226,6 @@ func sendNotifications(session *discordgo.Session, html string, tagChannelMap ma
|
||||
}
|
||||
}
|
||||
}
|
||||
// Inside the sendNotifications function, after extracting tags
|
||||
//log.Println("Extracted tags:", tags)
|
||||
|
||||
// Inside the sendNotifications function, after checking tag-channel mappings
|
||||
//log.Println("Tag-channel mappings:", tagChannelMap)
|
||||
|
||||
}
|
||||
|
||||
// This function will be called whenever a new message is created
|
||||
|
Loading…
Reference in New Issue
Block a user