mirror of
https://dev.narayana.im/narayana/telegabber.git
synced 2026-08-05 04:07:07 +00:00
Map MUC subject changes to new pinned messages in Telegram
This commit is contained in:
parent
29a76e342e
commit
2c8c7f029d
4 changed files with 83 additions and 0 deletions
|
|
@ -69,6 +69,7 @@ type Client struct {
|
||||||
|
|
||||||
outbox map[string]string
|
outbox map[string]string
|
||||||
editOutbox map[string]string
|
editOutbox map[string]string
|
||||||
|
pinOutbox map[int64]chan int64
|
||||||
|
|
||||||
DelayedStatuses map[int64]*DelayedStatus
|
DelayedStatuses map[int64]*DelayedStatus
|
||||||
DelayedStatusesLock sync.Mutex
|
DelayedStatusesLock sync.Mutex
|
||||||
|
|
@ -98,6 +99,7 @@ type clientLocks struct {
|
||||||
outboxLock sync.Mutex
|
outboxLock sync.Mutex
|
||||||
mucCacheLock sync.Mutex
|
mucCacheLock sync.Mutex
|
||||||
editOutboxLock sync.Mutex
|
editOutboxLock sync.Mutex
|
||||||
|
pinOutboxLock sync.Mutex
|
||||||
lastMsgHashesLock sync.Mutex
|
lastMsgHashesLock sync.Mutex
|
||||||
lastMsgIdsLock sync.RWMutex
|
lastMsgIdsLock sync.RWMutex
|
||||||
|
|
||||||
|
|
@ -167,6 +169,7 @@ func NewClient(conf config.TelegramConfig, jid string, component *xmpp.Component
|
||||||
cache: cache.NewCache(),
|
cache: cache.NewCache(),
|
||||||
outbox: make(map[string]string),
|
outbox: make(map[string]string),
|
||||||
editOutbox: make(map[string]string),
|
editOutbox: make(map[string]string),
|
||||||
|
pinOutbox: make(map[int64]chan int64),
|
||||||
mucCache: make(map[int64]*MUCState),
|
mucCache: make(map[int64]*MUCState),
|
||||||
options: options,
|
options: options,
|
||||||
DelayedStatuses: make(map[int64]*DelayedStatus),
|
DelayedStatuses: make(map[int64]*DelayedStatus),
|
||||||
|
|
|
||||||
|
|
@ -452,6 +452,13 @@ func (c *Client) updateAuthorizationState(update *client.UpdateAuthorizationStat
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Client) updateMessageSendSucceeded(update *client.UpdateMessageSendSucceeded) {
|
func (c *Client) updateMessageSendSucceeded(update *client.UpdateMessageSendSucceeded) {
|
||||||
|
c.locks.pinOutboxLock.Lock()
|
||||||
|
ch, chOk := c.pinOutbox[update.OldMessageId]
|
||||||
|
if chOk {
|
||||||
|
ch <-update.Message.Id
|
||||||
|
}
|
||||||
|
c.locks.pinOutboxLock.Unlock()
|
||||||
|
|
||||||
// replace message ID in local database
|
// replace message ID in local database
|
||||||
log.Debugf("replace message %v with %v", update.OldMessageId, update.Message.Id)
|
log.Debugf("replace message %v with %v", update.OldMessageId, update.Message.Id)
|
||||||
if err := gateway.IdsDB.ReplaceTgId(c.Session.Login, c.jid, update.Message.ChatId, update.OldMessageId, update.Message.Id); err != nil {
|
if err := gateway.IdsDB.ReplaceTgId(c.Session.Login, c.jid, update.Message.ChatId, update.OldMessageId, update.Message.Id); err != nil {
|
||||||
|
|
@ -469,6 +476,13 @@ func (c *Client) updateMessageSendSucceeded(update *client.UpdateMessageSendSucc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func (c *Client) updateMessageSendFailed(update *client.UpdateMessageSendFailed) {
|
func (c *Client) updateMessageSendFailed(update *client.UpdateMessageSendFailed) {
|
||||||
|
c.locks.pinOutboxLock.Lock()
|
||||||
|
ch, chOk := c.pinOutbox[update.OldMessageId]
|
||||||
|
if chOk {
|
||||||
|
ch <-0
|
||||||
|
}
|
||||||
|
c.locks.pinOutboxLock.Unlock()
|
||||||
|
|
||||||
// clean uploaded files
|
// clean uploaded files
|
||||||
file, _ := c.contentToFile(update.Message.Content)
|
file, _ := c.contentToFile(update.Message.Content)
|
||||||
if file != nil && file.Local != nil {
|
if file != nil && file.Local != nil {
|
||||||
|
|
|
||||||
|
|
@ -808,6 +808,44 @@ func (c *Client) GetMyMUCNickname(chatID int64) (string, bool) {
|
||||||
return member.Nickname, true
|
return member.Nickname, true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewPinnedMessage sends a text message and pins it right away
|
||||||
|
func (c *Client) NewPinnedMessage(chatID int64, text, returnJid string) bool {
|
||||||
|
c.locks.pinOutboxLock.Lock()
|
||||||
|
msg := c.ProcessOutgoingMessage(chatID, text, returnJid, 0, 0, true, true)
|
||||||
|
if msg == nil {
|
||||||
|
c.locks.pinOutboxLock.Unlock()
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
ch := make(chan int64)
|
||||||
|
c.pinOutbox[msg.Id] = ch
|
||||||
|
c.locks.pinOutboxLock.Unlock()
|
||||||
|
|
||||||
|
newId := <-ch
|
||||||
|
|
||||||
|
c.locks.pinOutboxLock.Lock()
|
||||||
|
delete(c.pinOutbox, msg.Id)
|
||||||
|
c.locks.pinOutboxLock.Unlock()
|
||||||
|
|
||||||
|
if newId == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
ok, err := c.client.PinChatMessage(&client.PinChatMessageRequest{
|
||||||
|
ChatId: chatID,
|
||||||
|
MessageId: newId,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("failed to pin message: %v", err.Error())
|
||||||
|
c.client.DeleteMessages(&client.DeleteMessagesRequest{
|
||||||
|
ChatId: chatID,
|
||||||
|
MessageIds: []int64{msg.Id},
|
||||||
|
Revoke: true,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return ok != nil
|
||||||
|
}
|
||||||
|
|
||||||
// FormatContact retrieves a complete "full name (@usernames)" string for display
|
// FormatContact retrieves a complete "full name (@usernames)" string for display
|
||||||
func (c *Client) FormatContact(chatID int64) string {
|
func (c *Client) FormatContact(chatID int64) string {
|
||||||
if chatID == 0 {
|
if chatID == 0 {
|
||||||
|
|
|
||||||
|
|
@ -342,6 +342,34 @@ func HandleMessage(s xmpp.Sender, p stanza.Packet) {
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if msg.Thread == "" && msg.Subject != "" && msg.Type == "groupchat" {
|
||||||
|
log.Debugf("MUC subject change: %#v", msg)
|
||||||
|
|
||||||
|
bare, _, ok := gateway.SplitJID(msg.From)
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
session, ok := sessions[bare]
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
toID, ok, isGroup := toToID(msg.To)
|
||||||
|
if !ok || !isGroup {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, resource, ok := gateway.SplitJID(msg.To)
|
||||||
|
if ok && resource != "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
pinOk := session.NewPinnedMessage(toID, msg.Subject, msg.From)
|
||||||
|
if !pinOk {
|
||||||
|
gateway.SendErrorMessage(msg.From, gateway.MUCJID(toID), "", 406, true, component)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if msg.Type == "error" {
|
if msg.Type == "error" {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue