package xmpp import ( "strings" log "github.com/sirupsen/logrus" "gosrc.io/xmpp" "gosrc.io/xmpp/stanza" "dev.narayana.im/narayana/telegabber/telegram" "dev.narayana.im/narayana/telegabber/xmpp/extensions" "dev.narayana.im/narayana/telegabber/xmpp/gateway" ) // hasReactionsPayload reports whether msg carries a XEP-0444 // element - such stanzas are body-less by design, so HandleMessage's // body-gate (there to skip typing notifications etc.) needs this alongside // hasOMEMOPayload to let them through. func hasReactionsPayload(msg stanza.Message) bool { var reactions extensions.Reactions return msg.Get(&reactions) } // handleIncomingReaction applies an incoming XEP-0444 stanza // to Telegram, rejecting it (S3.3, type='error'/not-acceptable) if any // requested emoji isn't allowed. bare and toID are already resolved by // HandleMessage's caller. func handleIncomingReaction(component *xmpp.Component, msg stanza.Message, session *telegram.Client, bare string, toID int64, isGroupchat bool, reactions extensions.Reactions) { var msgId int64 chatId, foundMsgId, err := gateway.IdsDB.GetByXmppId(session.Session.Login, bare, reactions.Id) if err == nil { if chatId != toID { log.Warnf("Reaction chat mismatch: %v != %v", chatId, toID) return } msgId = foundMsgId } else { var ok bool msgId, ok = parseMessageId(reactions.Id) if !ok { return } } emojis := make([]string, 0, len(reactions.Reactions)) for _, r := range reactions.Reactions { if r.Text != "" { emojis = append(emojis, r.Text) } } _, rejected := session.SetOwnMessageReactions(toID, msgId, emojis) if len(rejected) == 0 { return } var from string if isGroupchat { from = gateway.MUCJID(toID) } else { from = gateway.CHATNODE(toID) } gateway.SendMessage(msg.From, from, component, gateway.SMErrorText("Reaction(s) not allowed: "+strings.Join(rejected, " ")), gateway.SMErrorCode(406), gateway.SMId(msg.Id), gateway.SMIsGroupchat(isGroupchat), ) }