diff --git a/CLAUDE.md b/CLAUDE.md index 2191848..35fc410 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -10,11 +10,6 @@ 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 3472a08..d84aec5 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 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). +- 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. diff --git a/internal/admin/admin.go b/internal/admin/admin.go index cfa2595..2b41820 100644 --- a/internal/admin/admin.go +++ b/internal/admin/admin.go @@ -16,7 +16,7 @@ import ( "github.com/gorilla/sessions" ) -//go:embed templates/*.html templates/plugins/*.html +//go:embed templates/*.html var templateFS embed.FS const ( @@ -90,7 +90,7 @@ func New(cfg *config.Config, database *db.Database, version string) *Admin { } // Parse and register all templates - mainTemplateFiles := []string{ + templateFiles := []string{ "index.html", "login.html", "change_password.html", @@ -101,13 +101,7 @@ func New(cfg *config.Config, database *db.Database, version string) *Admin { "channel_plugin_config.html", } - pluginTemplateFiles := []string{ - "plugins/security.domainblock.html", - "plugins/social.instagram.html", - "plugins/social.twitter.html", - } - - for _, tf := range mainTemplateFiles { + for _, tf := range templateFiles { // Read template content from embedded filesystem content, err := templateFS.ReadFile("templates/" + tf) if err != nil { @@ -126,20 +120,6 @@ func New(cfg *config.Config, database *db.Database, version string) *Admin { panic(err) } - // If this is the channel_plugin_config template, also parse plugin templates - if tf == "channel_plugin_config.html" { - for _, pluginTf := range pluginTemplateFiles { - pluginContent, err := templateFS.ReadFile("templates/" + pluginTf) - if err != nil { - panic(err) - } - t, err = t.Parse(string(pluginContent)) - if err != nil { - panic(err) - } - } - } - templates[tf] = t } diff --git a/internal/admin/templates/channel_plugin_config.html b/internal/admin/templates/channel_plugin_config.html index 0f229f9..decf1a2 100644 --- a/internal/admin/templates/channel_plugin_config.html +++ b/internal/admin/templates/channel_plugin_config.html @@ -9,11 +9,16 @@
{{if eq .ChannelPlugin.PluginID "security.domainblock"}} - {{template "plugins/security.domainblock.html" .}} - {{else if eq .ChannelPlugin.PluginID "social.instagram"}} - {{template "plugins/social.instagram.html" .}} - {{else if eq .ChannelPlugin.PluginID "social.twitter"}} - {{template "plugins/social.twitter.html" .}} +
+ + +
+ Enter comma-separated list of domains to block (e.g., example.com, evil.org). + Messages containing links to these domains will be blocked. +
+
{{else}}
This plugin doesn't have specific configuration fields implemented yet. diff --git a/internal/admin/templates/plugins/security.domainblock.html b/internal/admin/templates/plugins/security.domainblock.html deleted file mode 100644 index 7ffcc48..0000000 --- a/internal/admin/templates/plugins/security.domainblock.html +++ /dev/null @@ -1,12 +0,0 @@ -{{define "plugins/security.domainblock.html"}} -
- - -
- Enter comma-separated list of domains to block (e.g., example.com, evil.org). - Messages containing links to these domains will be blocked. -
-
-{{end}} \ No newline at end of file diff --git a/internal/admin/templates/plugins/social.instagram.html b/internal/admin/templates/plugins/social.instagram.html deleted file mode 100644 index a83485d..0000000 --- a/internal/admin/templates/plugins/social.instagram.html +++ /dev/null @@ -1,11 +0,0 @@ -{{define "plugins/social.instagram.html"}} -
- - -
- Enter the domain to replace instagram.com links with. Default is ddinstagram.com if left empty. -
-
-{{end}} \ No newline at end of file diff --git a/internal/admin/templates/plugins/social.twitter.html b/internal/admin/templates/plugins/social.twitter.html deleted file mode 100644 index cb4885f..0000000 --- a/internal/admin/templates/plugins/social.twitter.html +++ /dev/null @@ -1,11 +0,0 @@ -{{define "plugins/social.twitter.html"}} -
- - -
- Enter the domain to replace twitter.com and x.com links with. Default is fxtwitter.com if left empty. -
-
-{{end}} \ No newline at end of file diff --git a/internal/plugin/social/instagram.go b/internal/plugin/social/instagram.go index b423b45..6b7aa4c 100644 --- a/internal/plugin/social/instagram.go +++ b/internal/plugin/social/instagram.go @@ -18,10 +18,9 @@ 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 alternative domain links and removes tracking parameters. Configure 'domain' option to set replacement domain (default: ddinstagram.com)", - ConfigRequired: true, + ID: "social.instagram", + Name: "Instagram Link Expander", + Help: "Automatically converts instagram.com links to ddinstagram.com links and removes tracking parameters", }, } } @@ -33,12 +32,6 @@ 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 @@ -49,7 +42,7 @@ func (p *InstagramExpander) OnMessage(msg *model.Message, config map[string]inte return nil } - // Replace instagram.com with configured domain in the message and clean query parameters + // 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) @@ -58,13 +51,13 @@ func (p *InstagramExpander) OnMessage(msg *model.Message, config map[string]inte return link } - // Ensure we don't change links that already come from the replacement domain + // Ensure we don't change links that already come from ddinstagram.com if parsedURL.Host != "instagram.com" && parsedURL.Host != "www.instagram.com" { return link } - // Change the host to the configured domain - parsedURL.Host = replacementDomain + // Change the host + parsedURL.Host = "d.ddinstagram.com" // Remove query parameters parsedURL.RawQuery = "" diff --git a/internal/plugin/social/twitter.go b/internal/plugin/social/twitter.go index d98eee6..553bd07 100644 --- a/internal/plugin/social/twitter.go +++ b/internal/plugin/social/twitter.go @@ -18,10 +18,9 @@ type TwitterExpander struct { func NewTwitterExpander() *TwitterExpander { return &TwitterExpander{ BasePlugin: plugin.BasePlugin{ - 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, + ID: "social.twitter", + Name: "Twitter Link Expander", + Help: "Automatically converts twitter.com links to fxtwitter.com links and removes tracking parameters", }, } } @@ -33,12 +32,6 @@ 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 @@ -49,22 +42,22 @@ func (p *TwitterExpander) OnMessage(msg *model.Message, config map[string]interf return nil } - // Replace twitter.com/x.com with configured domain in the message and clean query parameters + // 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", replacementDomain, 1) - link = strings.Replace(link, "x.com", replacementDomain, 1) + link = strings.Replace(link, "twitter.com", "fxtwitter.com", 1) + link = strings.Replace(link, "x.com", "fxtwitter.com", 1) return link } - // Change the host to the configured domain + // Change the host if strings.Contains(parsedURL.Host, "twitter.com") { - parsedURL.Host = strings.Replace(parsedURL.Host, "twitter.com", replacementDomain, 1) + 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", replacementDomain, 1) + parsedURL.Host = strings.Replace(parsedURL.Host, "x.com", "fxtwitter.com", 1) } // Remove query parameters