diff --git a/CLAUDE.md b/CLAUDE.md
index 35fc410..2191848 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -10,6 +10,11 @@ When creating, modifying, or removing plugins:
- Brief description of functionality
- Usage instructions with examples
- Any configuration requirements
+3. **For plugins with configuration options:**
+ - Set `ConfigRequired: true` in the plugin's BasePlugin struct
+ - Add corresponding HTML form fields in `internal/admin/templates/channel_plugin_config.html`
+ - Use conditional template logic: `{{else if eq .ChannelPlugin.PluginID "plugin.id"}}`
+ - Include proper form labels, help text, and value binding
## Testing
diff --git a/docs/plugins.md b/docs/plugins.md
index d84aec5..3472a08 100644
--- a/docs/plugins.md
+++ b/docs/plugins.md
@@ -23,5 +23,5 @@
### Social Media
-- Twitter Link Expander: Automatically converts twitter.com and x.com links to fxtwitter.com links and removes tracking parameters. This allows for better media embedding in chat platforms.
-- Instagram Link Expander: Automatically converts instagram.com links to ddinstagram.com links and removes tracking parameters. This allows for better media embedding in chat platforms.
+- Twitter Link Expander: Automatically converts twitter.com and x.com links to alternative domain links and removes tracking parameters. This allows for better media embedding in chat platforms. Configure with `domain` option to set replacement domain (default: fxtwitter.com).
+- Instagram Link Expander: Automatically converts instagram.com links to alternative domain links and removes tracking parameters. This allows for better media embedding in chat platforms. Configure with `domain` option to set replacement domain (default: ddinstagram.com).
diff --git a/internal/admin/templates/channel_plugin_config.html b/internal/admin/templates/channel_plugin_config.html
index decf1a2..2719004 100644
--- a/internal/admin/templates/channel_plugin_config.html
+++ b/internal/admin/templates/channel_plugin_config.html
@@ -19,6 +19,26 @@
Messages containing links to these domains will be blocked.
+ {{else if eq .ChannelPlugin.PluginID "social.instagram"}}
+
+
+
+
+ Enter the domain to replace instagram.com links with. Default is ddinstagram.com if left empty.
+
+
+ {{else if eq .ChannelPlugin.PluginID "social.twitter"}}
+
+
+
+
+ Enter the domain to replace twitter.com and x.com links with. Default is fxtwitter.com if left empty.
+
+
{{else}}
This plugin doesn't have specific configuration fields implemented yet.
diff --git a/internal/plugin/social/instagram.go b/internal/plugin/social/instagram.go
index 6b7aa4c..b423b45 100644
--- a/internal/plugin/social/instagram.go
+++ b/internal/plugin/social/instagram.go
@@ -18,9 +18,10 @@ type InstagramExpander struct {
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",
+ ID: "social.instagram",
+ Name: "Instagram Link Expander",
+ Help: "Automatically converts instagram.com links to alternative domain links and removes tracking parameters. Configure 'domain' option to set replacement domain (default: ddinstagram.com)",
+ ConfigRequired: true,
},
}
}
@@ -32,6 +33,12 @@ func (p *InstagramExpander) OnMessage(msg *model.Message, config map[string]inte
return nil
}
+ // Get replacement domain from config, default to ddinstagram.com
+ replacementDomain := "ddinstagram.com"
+ if domain, ok := config["domain"].(string); ok && domain != "" {
+ replacementDomain = domain
+ }
+
// Regex to match instagram.com links
// Match both http://instagram.com and https://instagram.com formats
// Also match www.instagram.com
@@ -42,7 +49,7 @@ func (p *InstagramExpander) OnMessage(msg *model.Message, config map[string]inte
return nil
}
- // Replace instagram.com with ddinstagram.com in the message and clean query parameters
+ // Replace instagram.com with configured domain in the message and clean query parameters
transformed := instagramRegex.ReplaceAllStringFunc(msg.Text, func(link string) string {
// Parse the URL
parsedURL, err := url.Parse(link)
@@ -51,13 +58,13 @@ func (p *InstagramExpander) OnMessage(msg *model.Message, config map[string]inte
return link
}
- // Ensure we don't change links that already come from ddinstagram.com
+ // Ensure we don't change links that already come from the replacement domain
if parsedURL.Host != "instagram.com" && parsedURL.Host != "www.instagram.com" {
return link
}
- // Change the host
- parsedURL.Host = "d.ddinstagram.com"
+ // Change the host to the configured domain
+ parsedURL.Host = replacementDomain
// Remove query parameters
parsedURL.RawQuery = ""
diff --git a/internal/plugin/social/twitter.go b/internal/plugin/social/twitter.go
index 553bd07..d98eee6 100644
--- a/internal/plugin/social/twitter.go
+++ b/internal/plugin/social/twitter.go
@@ -18,9 +18,10 @@ type TwitterExpander struct {
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",
+ ID: "social.twitter",
+ Name: "Twitter Link Expander",
+ Help: "Automatically converts twitter.com and x.com links to alternative domain links and removes tracking parameters. Configure 'domain' option to set replacement domain (default: fxtwitter.com)",
+ ConfigRequired: true,
},
}
}
@@ -32,6 +33,12 @@ func (p *TwitterExpander) OnMessage(msg *model.Message, config map[string]interf
return nil
}
+ // Get replacement domain from config, default to fxtwitter.com
+ replacementDomain := "fxtwitter.com"
+ if domain, ok := config["domain"].(string); ok && domain != "" {
+ replacementDomain = domain
+ }
+
// Regex to match twitter.com links
// Match both http://twitter.com and https://twitter.com formats
// Also match www.twitter.com
@@ -42,22 +49,22 @@ func (p *TwitterExpander) OnMessage(msg *model.Message, config map[string]interf
return nil
}
- // Replace twitter.com with fxtwitter.com in the message and clean query parameters
+ // Replace twitter.com/x.com with configured domain 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)
+ link = strings.Replace(link, "twitter.com", replacementDomain, 1)
+ link = strings.Replace(link, "x.com", replacementDomain, 1)
return link
}
- // Change the host
+ // Change the host to the configured domain
if strings.Contains(parsedURL.Host, "twitter.com") {
- parsedURL.Host = strings.Replace(parsedURL.Host, "twitter.com", "fxtwitter.com", 1)
+ parsedURL.Host = strings.Replace(parsedURL.Host, "twitter.com", replacementDomain, 1)
} else if strings.Contains(parsedURL.Host, "x.com") {
- parsedURL.Host = strings.Replace(parsedURL.Host, "x.com", "fxtwitter.com", 1)
+ parsedURL.Host = strings.Replace(parsedURL.Host, "x.com", replacementDomain, 1)
}
// Remove query parameters