diff --git a/bridge/slack/slack.go b/bridge/slack/slack.go index 08d100ed..a0b50c90 100644 --- a/bridge/slack/slack.go +++ b/bridge/slack/slack.go @@ -233,7 +233,7 @@ func (b *Bslack) Send(msg config.Message) (string, error) { // add translation attachment if msg.IsTranslation { // If source, then we're doing a translation - np.Attachments = append(np.Attachments, b.createTranslationAttach(msg)) + np.Attachments = append(np.Attachments, b.createTranslationAttach(msg)...) } // add slack attachments (from another slack bridge) if msg.Extra != nil { @@ -290,7 +290,13 @@ func (b *Bslack) createAttach(extra map[string][]interface{}) []slack.Attachment return attachements } -func (b *Bslack) createTranslationAttach(msg config.Message) slack.Attachment { +func (b *Bslack) createTranslationAttach(msg config.Message) []slack.Attachment { + var attachments []slack.Attachment + + if msg.IsTranslation == false { + return attachments + } + untranslatedTextPreview := msg.OrigMsg.Text previewCharCount := 100 if len(msg.OrigMsg.Text) > previewCharCount { @@ -316,7 +322,9 @@ func (b *Bslack) createTranslationAttach(msg config.Message) slack.Attachment { FooterIcon: "https://emoji.slack-edge.com/T02G2SXKM/g0v/541e38dfc833f04b.png", } - return attach + attachments = append(attachments, attach) + + return attachments } func extractStringField(data map[string]interface{}, field string) string { diff --git a/gateway/gateway.go b/gateway/gateway.go index ca9e50f6..5d54f541 100644 --- a/gateway/gateway.go +++ b/gateway/gateway.go @@ -277,6 +277,16 @@ func (*renderer) BlockCode(out *bytes.Buffer, text []byte, info string) { } func (gw *Gateway) handleTranslation(msg *config.Message, dest *bridge.Bridge, channel config.ChannelInfo) { + // Skip if channel locale not set + if channel.Options.Locale == "" { + return + } + + // Don't try to translate empty messages + if msg.OrigMsg.Text == "" { + return + } + msg.IsTranslation = true ctx := context.Background() @@ -357,88 +367,88 @@ func (gw *Gateway) handleTranslation(msg *config.Message, dest *bridge.Bridge, c text = resp[0].Text flog.Debugf("post-translate:"+text) - if resp[0].Source != channelLang { - // If the source language is the same as this channel, - // just use the original text and don't add attribution - - // Add space buffer after html before stripping, or characters after tags get merged into urls or usernames - text = regexp.MustCompile(`.+?`).ReplaceAllString(text, " $0 ") - - allowableTags := []string{ - "p", - "i", - "b", - "em", - "strong", - "br", - "del", - "blockquote", - "pre", - "code", - "li", - "ul", - "ol", - } - - stripped, _ := htmltags.Strip(text, allowableTags, false) - text = stripped.ToString() - flog.Debugf("post-strip:"+text) - html2md.AddRule("del", &html2md.Rule{ - Patterns: []string{"del"}, - Replacement: func(innerHTML string, attrs []string) string { - if len(attrs) > 1 { - // Extra spaces so that Slack will process, even though Chinese characters don't get spaces - return html2md.WrapInlineTag(attrs[1], " ~", "~ ") - } - return "" - }, - }) - // Custom override for slackdown - html2md.AddRule("b", &html2md.Rule{ - Patterns: []string{"b", "strong"}, - Replacement: func(innerHTML string, attrs []string) string { - if len(attrs) > 1 { - // trailing whitespace due to Mandarin issues - return html2md.WrapInlineTag(attrs[1], "*", "* ") - } - return "" - }, - }) - // Custom override of default code rule: - // This converts multiline code tags to codeblocks - html2md.AddRule("code", &html2md.Rule{ - Patterns: []string{"code", "tt", "pre"}, - Replacement: func(innerHTML string, attrs []string) string { - contents := attrs[1] - if strings.Contains(contents, "\n") { - r := regexp.MustCompile(`/^\t+`) - innerHTML = r.ReplaceAllString(contents, " ") - return "\n\n```\n" + innerHTML + "```\n" - } - if len(attrs) > 1 { - return "`" + attrs[1] + "`" - } - return "" - }, - }) - text := html2md.Convert(text) - - // colons: revert temp token - // See: previous comment on colons - text = regexp.MustCompile(`(ː)([ $])`).ReplaceAllString(text, ":$2") - - flog.Debugf("post-MDconvert:"+text) - text = html.UnescapeString(text) - flog.Debugf("post-unescaped:"+text) - - if dest.Protocol == "slack" { - // Attribution will be in attachment for Slack - } else { - text = text + gw.Router.General.TranslationAttribution - } - - msg.Text = text + if resp[0].Source == channelLang { + msg.IsTranslation = false + return } + + // Add space buffer after html before stripping, or characters after tags get merged into urls or usernames + text = regexp.MustCompile(`.+?`).ReplaceAllString(text, " $0 ") + + allowableTags := []string{ + "p", + "i", + "b", + "em", + "strong", + "br", + "del", + "blockquote", + "pre", + "code", + "li", + "ul", + "ol", + } + + stripped, _ := htmltags.Strip(text, allowableTags, false) + text = stripped.ToString() + flog.Debugf("post-strip:"+text) + html2md.AddRule("del", &html2md.Rule{ + Patterns: []string{"del"}, + Replacement: func(innerHTML string, attrs []string) string { + if len(attrs) > 1 { + // Extra spaces so that Slack will process, even though Chinese characters don't get spaces + return html2md.WrapInlineTag(attrs[1], " ~", "~ ") + } + return "" + }, + }) + // Custom override for slackdown + html2md.AddRule("b", &html2md.Rule{ + Patterns: []string{"b", "strong"}, + Replacement: func(innerHTML string, attrs []string) string { + if len(attrs) > 1 { + // trailing whitespace due to Mandarin issues + return html2md.WrapInlineTag(attrs[1], "*", "* ") + } + return "" + }, + }) + // Custom override of default code rule: + // This converts multiline code tags to codeblocks + html2md.AddRule("code", &html2md.Rule{ + Patterns: []string{"code", "tt", "pre"}, + Replacement: func(innerHTML string, attrs []string) string { + contents := attrs[1] + if strings.Contains(contents, "\n") { + r := regexp.MustCompile(`/^\t+`) + innerHTML = r.ReplaceAllString(contents, " ") + return "\n\n```\n" + innerHTML + "```\n" + } + if len(attrs) > 1 { + return "`" + attrs[1] + "`" + } + return "" + }, + }) + text = html2md.Convert(text) + + // colons: revert temp token + // See: previous comment on colons + text = regexp.MustCompile(`(ː)([ $])`).ReplaceAllString(text, ":$2") + + flog.Debugf("post-MDconvert:"+text) + text = html.UnescapeString(text) + flog.Debugf("post-unescaped:"+text) + + if dest.Protocol == "slack" { + // Attribution will be in attachment for Slack + } else { + text = text + gw.Router.General.TranslationAttribution + } + + msg.Text = text } func (gw *Gateway) handleMessage(msg config.Message, dest *bridge.Bridge) []*BrMsgID { @@ -503,7 +513,7 @@ func (gw *Gateway) handleMessage(msg config.Message, dest *bridge.Bridge) []*BrM msg.ID = "" // Translation - if (gw.Router.GTClient != nil) && (channel.Options.Locale != "") && (msg.Text != "") { + if (gw.Router.GTClient != nil) { gw.handleTranslation(&msg, dest, channel) }