aboutsummaryrefslogtreecommitdiff
path: root/telegram
diff options
context:
space:
mode:
Diffstat (limited to 'telegram')
-rw-r--r--telegram/commands.go5
-rw-r--r--telegram/handlers.go2
-rw-r--r--telegram/utils.go74
3 files changed, 77 insertions, 4 deletions
diff --git a/telegram/commands.go b/telegram/commands.go
index 160e486..368a461 100644
--- a/telegram/commands.go
+++ b/telegram/commands.go
@@ -193,6 +193,7 @@ func (c *Client) sendMessagesReverse(chatID int64, messages []*client.Message) {
strconv.FormatInt(message.Id, 10),
c.xmpp,
reply,
+ false,
)
}
}
@@ -361,6 +362,10 @@ func (c *Client) ProcessTransportCommand(cmdline string, resource string) string
}
case "config":
if len(args) > 1 {
+ if !gateway.MessageOutgoingPermission && args[0] == "carbons" && args[1] == "true" {
+ return "The server did not allow to enable carbons"
+ }
+
value, err := c.Session.Set(args[0], args[1])
if err != nil {
return err.Error()
diff --git a/telegram/handlers.go b/telegram/handlers.go
index 307562a..84e3748 100644
--- a/telegram/handlers.go
+++ b/telegram/handlers.go
@@ -242,7 +242,7 @@ func (c *Client) updateMessageContent(update *client.UpdateMessageContent) {
textContent.Text.Entities,
markupFunction,
))
- gateway.SendMessage(c.jid, strconv.FormatInt(update.ChatId, 10), text, "e" + strconv.FormatInt(update.MessageId, 10), c.xmpp, nil)
+ gateway.SendMessage(c.jid, strconv.FormatInt(update.ChatId, 10), text, "e" + strconv.FormatInt(update.MessageId, 10), c.xmpp, nil, false)
}
}
diff --git a/telegram/utils.go b/telegram/utils.go
index 68dd524..99492e1 100644
--- a/telegram/utils.go
+++ b/telegram/utils.go
@@ -109,6 +109,33 @@ func (c *Client) GetContactByID(id int64, chat *client.Chat) (*client.Chat, *cli
return chat, user, nil
}
+// IsPM checks if a chat is PM
+func (c *Client) IsPM(id int64) (bool, error) {
+ if !c.Online() || id == 0 {
+ return false, errOffline
+ }
+
+ var err error
+
+ chat, ok := c.cache.GetChat(id)
+ if !ok {
+ chat, err = c.client.GetChat(&client.GetChatRequest{
+ ChatId: id,
+ })
+ if err != nil {
+ return false, err
+ }
+
+ c.cache.SetChat(id, chat)
+ }
+
+ chatType := chat.Type.ChatTypeType()
+ if chatType == client.TypeChatTypePrivate || chatType == client.TypeChatTypeSecret {
+ return true, nil
+ }
+ return false, nil
+}
+
func (c *Client) userStatusToText(status client.UserStatus, chatID int64) (string, string, string) {
var show, textStatus, presenceType string
@@ -782,6 +809,7 @@ func (c *Client) ensureDownloadFile(file *client.File) *client.File {
// ProcessIncomingMessage transfers a message to XMPP side and marks it as read on Telegram side
func (c *Client) ProcessIncomingMessage(chatId int64, message *client.Message) {
var text, oob, auxText string
+ var err error
reply, replyMsg := c.getMessageReply(message)
@@ -847,12 +875,33 @@ func (c *Client) ProcessIncomingMessage(chatId int64, message *client.Message) {
MessageIds: []int64{message.Id},
ForceRead: true,
})
+
// forward message to XMPP
sId := strconv.FormatInt(message.Id, 10)
sChatId := strconv.FormatInt(chatId, 10)
- gateway.SendMessageWithOOB(c.jid, sChatId, text, sId, c.xmpp, reply, oob)
- if auxText != "" {
- gateway.SendMessage(c.jid, sChatId, auxText, sId, c.xmpp, reply)
+
+ var jids []string
+ var isPM bool
+ if gateway.MessageOutgoingPermission && c.Session.Carbons {
+ isPM, err = c.IsPM(chatId)
+ if err != nil {
+ log.Errorf("Could not determine if chat is PM: %v", err)
+ }
+ }
+ isOutgoing := isPM && message.IsOutgoing
+ if isOutgoing {
+ for resource := range c.resourcesRange() {
+ jids = append(jids, c.jid + "/" + resource)
+ }
+ } else {
+ jids = []string{c.jid}
+ }
+
+ for _, jid := range jids {
+ gateway.SendMessageWithOOB(jid, sChatId, text, sId, c.xmpp, reply, oob, isOutgoing)
+ if auxText != "" {
+ gateway.SendMessage(jid, sChatId, auxText, sId, c.xmpp, reply, isOutgoing)
+ }
}
}
@@ -1024,6 +1073,25 @@ func (c *Client) deleteResource(resource string) {
}
}
+func (c *Client) resourcesRange() chan string {
+ c.locks.resourcesLock.Lock()
+
+ resourceChan := make(chan string, 1)
+
+ go func() {
+ defer func() {
+ c.locks.resourcesLock.Unlock()
+ close(resourceChan)
+ }()
+
+ for resource := range c.resources {
+ resourceChan <- resource
+ }
+ }()
+
+ return resourceChan
+}
+
// resend statuses to (to another resource, for example)
func (c *Client) roster(resource string) {
if _, ok := c.resources[resource]; ok {