From b1135b070b751998cb98eded6d29bdd7b800ecb9 Mon Sep 17 00:00:00 2001 From: Bohdan Horbeshko Date: Wed, 8 Mar 2023 07:51:19 -0500 Subject: [PATCH] Cut fallback quotes out --- telegram/utils.go | 37 ++++++++++++++++++++------- xmpp/extensions/extensions.go | 47 +++++++++++++++++++++++++++++++++++ xmpp/gateway/gateway.go | 5 ++++ 3 files changed, 80 insertions(+), 9 deletions(-) diff --git a/telegram/utils.go b/telegram/utils.go index f06abd7..fe6ca14 100644 --- a/telegram/utils.go +++ b/telegram/utils.go @@ -30,6 +30,7 @@ var spaceRegex = regexp.MustCompile(`\s+`) var replyRegex = regexp.MustCompile("\\A>>? ?([0-9]+)\\n") const newlineChar string = "\n" +const messageHeaderSeparator string = " | " // GetContactByUsername resolves username to user id retrieves user and chat information func (c *Client) GetContactByUsername(username string) (*client.Chat, *client.User, error) { @@ -710,7 +711,15 @@ func (c *Client) contentToFile(content client.MessageContent) (*client.File, *cl return nil, nil } -func (c *Client) messageToPrefix(message *client.Message, previewString string, fileString string, replyMsg *client.Message) string { +func (c *Client) countCharsInLines(lines *[]string) (count int) { + for _, line := range *lines { + count += len(line) + } + return +} + +func (c *Client) messageToPrefix(message *client.Message, previewString string, fileString string, replyMsg *client.Message) (string, int, int) { + var replyStart, replyEnd int prefix := []string{} // message direction var directionChar string @@ -734,7 +743,10 @@ func (c *Client) messageToPrefix(message *client.Message, previewString string, } // reply to if message.ReplyToMessageId != 0 { - prefix = append(prefix, "reply: "+c.formatMessage(message.ChatId, message.ReplyToMessageId, true, replyMsg)) + replyStart = c.countCharsInLines(&prefix) + (len(prefix) - 1) * len(messageHeaderSeparator) + replyLine := "reply: "+c.formatMessage(message.ChatId, message.ReplyToMessageId, true, replyMsg) + prefix = append(prefix, replyLine) + replyEnd = replyStart + len(replyLine) + len(messageHeaderSeparator) } if message.ForwardInfo != nil { prefix = append(prefix, "fwd: "+c.formatForward(message.ForwardInfo)) @@ -748,7 +760,7 @@ func (c *Client) messageToPrefix(message *client.Message, previewString string, prefix = append(prefix, "file: "+fileString) } - return strings.Join(prefix, " | ") + return strings.Join(prefix, messageHeaderSeparator), replyStart, replyEnd } func (c *Client) ensureDownloadFile(file *client.File) *client.File { @@ -805,19 +817,26 @@ func (c *Client) ProcessIncomingMessage(chatId int64, message *client.Message) { } text = oob } else if !c.Session.RawMessages { - var prefix strings.Builder - prefix.WriteString(c.messageToPrefix(message, previewName, fileName, replyMsg)) + var newText strings.Builder + + prefix, replyStart, replyEnd := c.messageToPrefix(message, previewName, fileName, replyMsg) + newText.WriteString(prefix) + if reply != nil { + reply.Start = uint64(replyStart) + reply.End = uint64(replyEnd) + } + if text != "" { // \n if it is groupchat and message is not empty if chatId < 0 { - prefix.WriteString("\n") + newText.WriteString("\n") } else if chatId > 0 { - prefix.WriteString(" | ") + newText.WriteString(" | ") } - prefix.WriteString(text) + newText.WriteString(text) } - text = prefix.String() + text = newText.String() } } } diff --git a/xmpp/extensions/extensions.go b/xmpp/extensions/extensions.go index ce27656..7e44bae 100644 --- a/xmpp/extensions/extensions.go +++ b/xmpp/extensions/extensions.go @@ -2,6 +2,7 @@ package extensions import ( "encoding/xml" + "strconv" "gosrc.io/xmpp/stanza" ) @@ -118,6 +119,28 @@ type Reply struct { Id string `xml:"id,attr"` } +// Fallback is from XEP-0428 +type Fallback struct { + XMLName xml.Name `xml:"urn:xmpp:fallback:0 fallback"` + For string `xml:"for,attr"` + Body []FallbackBody + Subject []FallbackSubject +} + +// FallbackBody is from XEP-0428 +type FallbackBody struct { + XMLName xml.Name `xml:"body"` + Start string `xml:"start,attr"` + End string `xml:"end,attr"` +} + +// FallbackSubject is from XEP-0428 +type FallbackSubject struct { + XMLName xml.Name `xml:"subject"` + Start string `xml:"start,attr"` + End string `xml:"end,attr"` +} + // Namespace is a namespace! func (c PresenceNickExtension) Namespace() string { return c.XMLName.Space @@ -143,6 +166,24 @@ func (c Reply) Namespace() string { return c.XMLName.Space } +// Namespace is a namespace! +func (c Fallback) Namespace() string { + return c.XMLName.Space +} + +// NewReplyFallback initializes a fallback range +func NewReplyFallback(start uint64, end uint64) Fallback { + return Fallback{ + For: "urn:xmpp:reply:0", + Body: []FallbackBody{ + FallbackBody{ + Start: strconv.FormatUint(start, 10), + End: strconv.FormatUint(end, 10), + }, + }, + } +} + func init() { // presence nick stanza.TypeRegistry.MapExtension(stanza.PKTPresence, xml.Name{ @@ -167,4 +208,10 @@ func init() { "urn:xmpp:reply:0", "reply", }, Reply{}) + + // fallback + stanza.TypeRegistry.MapExtension(stanza.PKTMessage, xml.Name{ + "urn:xmpp:fallback:0", + "fallback", + }, Fallback{}) } diff --git a/xmpp/gateway/gateway.go b/xmpp/gateway/gateway.go index d309ade..de8b495 100644 --- a/xmpp/gateway/gateway.go +++ b/xmpp/gateway/gateway.go @@ -16,6 +16,8 @@ import ( type Reply struct { Author string Id string + Start uint64 + End uint64 } const NSNick string = "http://jabber.org/protocol/nick" @@ -89,6 +91,9 @@ func sendMessageWrapper(to string, from string, body string, id string, componen To: reply.Author, Id: reply.Id, }) + if reply.End > 0 { + message.Extensions = append(message.Extensions, extensions.NewReplyFallback(reply.Start, reply.End)) + } } sendMessage(&message, component)