aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBohdan Horbeshko <bodqhrohro@gmail.com>2023-03-08 15:51:19 +0300
committerBohdan Horbeshko <bodqhrohro@gmail.com>2023-03-08 15:51:19 +0300
commitb1135b070b751998cb98eded6d29bdd7b800ecb9 (patch)
tree7063960016850ca04587ac5a94e60f59f676de88
parent4a5b83dff5c568871d5624202e2ee27e5d0de242 (diff)
Cut fallback quotes out
-rw-r--r--telegram/utils.go37
-rw-r--r--xmpp/extensions/extensions.go47
-rw-r--r--xmpp/gateway/gateway.go5
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)