feat: added twitter and instagram link expanders
All checks were successful
ci/woodpecker/tag/release Pipeline was successful
All checks were successful
ci/woodpecker/tag/release Pipeline was successful
This commit is contained in:
parent
e0ae0c2a0b
commit
c920eb94a0
3 changed files with 158 additions and 0 deletions
|
@ -20,6 +20,7 @@ import (
|
||||||
"git.nakama.town/fmartingr/butterrobot/internal/plugin"
|
"git.nakama.town/fmartingr/butterrobot/internal/plugin"
|
||||||
"git.nakama.town/fmartingr/butterrobot/internal/plugin/fun"
|
"git.nakama.town/fmartingr/butterrobot/internal/plugin/fun"
|
||||||
"git.nakama.town/fmartingr/butterrobot/internal/plugin/ping"
|
"git.nakama.town/fmartingr/butterrobot/internal/plugin/ping"
|
||||||
|
"git.nakama.town/fmartingr/butterrobot/internal/plugin/social"
|
||||||
"git.nakama.town/fmartingr/butterrobot/internal/queue"
|
"git.nakama.town/fmartingr/butterrobot/internal/queue"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -72,6 +73,8 @@ func (a *App) Run() error {
|
||||||
plugin.Register(fun.NewCoin())
|
plugin.Register(fun.NewCoin())
|
||||||
plugin.Register(fun.NewDice())
|
plugin.Register(fun.NewDice())
|
||||||
plugin.Register(fun.NewLoquito())
|
plugin.Register(fun.NewLoquito())
|
||||||
|
plugin.Register(social.NewTwitterExpander())
|
||||||
|
plugin.Register(social.NewInstagramExpander())
|
||||||
|
|
||||||
// Initialize routes
|
// Initialize routes
|
||||||
a.initializeRoutes()
|
a.initializeRoutes()
|
||||||
|
|
76
internal/plugin/social/instagram.go
Normal file
76
internal/plugin/social/instagram.go
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
package social
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/url"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.nakama.town/fmartingr/butterrobot/internal/model"
|
||||||
|
"git.nakama.town/fmartingr/butterrobot/internal/plugin"
|
||||||
|
)
|
||||||
|
|
||||||
|
// InstagramExpander transforms instagram.com links to ddinstagram.com links
|
||||||
|
type InstagramExpander struct {
|
||||||
|
plugin.BasePlugin
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates a new InstagramExpander instance
|
||||||
|
func NewInstagramExpander() *InstagramExpander {
|
||||||
|
return &InstagramExpander{
|
||||||
|
BasePlugin: plugin.BasePlugin{
|
||||||
|
ID: "social.instagram",
|
||||||
|
Name: "Instagram Link Expander",
|
||||||
|
Help: "Automatically converts instagram.com links to ddinstagram.com links and removes tracking parameters",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OnMessage handles incoming messages
|
||||||
|
func (p *InstagramExpander) OnMessage(msg *model.Message, config map[string]interface{}) []*model.Message {
|
||||||
|
// Skip empty messages
|
||||||
|
if strings.TrimSpace(msg.Text) == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Regex to match instagram.com links
|
||||||
|
// Match both http://instagram.com and https://instagram.com formats
|
||||||
|
// Also match www.instagram.com
|
||||||
|
instagramRegex := regexp.MustCompile(`https?://(www\.)?(instagram\.com)/[^\s]+`)
|
||||||
|
|
||||||
|
// Check if the message contains an Instagram link
|
||||||
|
if !instagramRegex.MatchString(msg.Text) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace instagram.com with ddinstagram.com in the message and clean query parameters
|
||||||
|
transformed := instagramRegex.ReplaceAllStringFunc(msg.Text, func(link string) string {
|
||||||
|
// Parse the URL
|
||||||
|
parsedURL, err := url.Parse(link)
|
||||||
|
if err != nil {
|
||||||
|
// If parsing fails, just do the simple replacement
|
||||||
|
link = strings.Replace(link, "instagram.com", "ddinstagram.com", 1)
|
||||||
|
return link
|
||||||
|
}
|
||||||
|
|
||||||
|
// Change the host
|
||||||
|
if strings.Contains(parsedURL.Host, "instagram.com") {
|
||||||
|
parsedURL.Host = strings.Replace(parsedURL.Host, "instagram.com", "ddinstagram.com", 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove query parameters
|
||||||
|
parsedURL.RawQuery = ""
|
||||||
|
|
||||||
|
// Return the cleaned URL
|
||||||
|
return parsedURL.String()
|
||||||
|
})
|
||||||
|
|
||||||
|
// Create response message
|
||||||
|
response := &model.Message{
|
||||||
|
Text: transformed,
|
||||||
|
Chat: msg.Chat,
|
||||||
|
ReplyTo: msg.ID,
|
||||||
|
Channel: msg.Channel,
|
||||||
|
}
|
||||||
|
|
||||||
|
return []*model.Message{response}
|
||||||
|
}
|
79
internal/plugin/social/twitter.go
Normal file
79
internal/plugin/social/twitter.go
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
package social
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/url"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.nakama.town/fmartingr/butterrobot/internal/model"
|
||||||
|
"git.nakama.town/fmartingr/butterrobot/internal/plugin"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TwitterExpander transforms twitter.com links to fxtwitter.com links
|
||||||
|
type TwitterExpander struct {
|
||||||
|
plugin.BasePlugin
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates a new TwitterExpander instance
|
||||||
|
func NewTwitterExpander() *TwitterExpander {
|
||||||
|
return &TwitterExpander{
|
||||||
|
BasePlugin: plugin.BasePlugin{
|
||||||
|
ID: "social.twitter",
|
||||||
|
Name: "Twitter Link Expander",
|
||||||
|
Help: "Automatically converts twitter.com links to fxtwitter.com links and removes tracking parameters",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// OnMessage handles incoming messages
|
||||||
|
func (p *TwitterExpander) OnMessage(msg *model.Message, config map[string]interface{}) []*model.Message {
|
||||||
|
// Skip empty messages
|
||||||
|
if strings.TrimSpace(msg.Text) == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Regex to match twitter.com links
|
||||||
|
// Match both http://twitter.com and https://twitter.com formats
|
||||||
|
// Also match www.twitter.com
|
||||||
|
twitterRegex := regexp.MustCompile(`https?://(www\.)?(twitter\.com|x\.com)/[^\s]+`)
|
||||||
|
|
||||||
|
// Check if the message contains a Twitter link
|
||||||
|
if !twitterRegex.MatchString(msg.Text) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace twitter.com with fxtwitter.com in the message and clean query parameters
|
||||||
|
transformed := twitterRegex.ReplaceAllStringFunc(msg.Text, func(link string) string {
|
||||||
|
// Parse the URL
|
||||||
|
parsedURL, err := url.Parse(link)
|
||||||
|
if err != nil {
|
||||||
|
// If parsing fails, just do the simple replacement
|
||||||
|
link = strings.Replace(link, "twitter.com", "fxtwitter.com", 1)
|
||||||
|
link = strings.Replace(link, "x.com", "fxtwitter.com", 1)
|
||||||
|
return link
|
||||||
|
}
|
||||||
|
|
||||||
|
// Change the host
|
||||||
|
if strings.Contains(parsedURL.Host, "twitter.com") {
|
||||||
|
parsedURL.Host = strings.Replace(parsedURL.Host, "twitter.com", "fxtwitter.com", 1)
|
||||||
|
} else if strings.Contains(parsedURL.Host, "x.com") {
|
||||||
|
parsedURL.Host = strings.Replace(parsedURL.Host, "x.com", "fxtwitter.com", 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove query parameters
|
||||||
|
parsedURL.RawQuery = ""
|
||||||
|
|
||||||
|
// Return the cleaned URL
|
||||||
|
return parsedURL.String()
|
||||||
|
})
|
||||||
|
|
||||||
|
// Create response message
|
||||||
|
response := &model.Message{
|
||||||
|
Text: transformed,
|
||||||
|
Chat: msg.Chat,
|
||||||
|
ReplyTo: msg.ID,
|
||||||
|
Channel: msg.Channel,
|
||||||
|
}
|
||||||
|
|
||||||
|
return []*model.Message{response}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue