Files
2026-07-20 21:15:49 +07:00

173 lines
5.3 KiB
Go

package context
import (
"strings"
stdctx "context"
waE2E "go.mau.fi/whatsmeow/proto/waE2E"
waTypes "go.mau.fi/whatsmeow/types"
"go.mau.fi/whatsmeow/types/events"
"google.golang.org/protobuf/proto"
"go.mau.fi/whatsmeow"
)
// ParseMessageText extracts text content from a message event.
func ParseMessageText(evt *events.Message) string {
var msg *waE2E.Message
if evt.IsViewOnce {
msg = evt.Message.GetViewOnceMessage().GetMessage()
} else if evt.IsEphemeral {
msg = evt.Message.GetEphemeralMessage().GetMessage()
} else {
msg = evt.Message
}
switch {
case msg.GetConversation() != "":
return msg.GetConversation()
case msg.GetExtendedTextMessage().GetText() != "":
return msg.GetExtendedTextMessage().GetText()
case msg.GetImageMessage().GetCaption() != "":
return msg.GetImageMessage().GetCaption()
case msg.GetVideoMessage().GetCaption() != "":
return msg.GetVideoMessage().GetCaption()
default:
return ""
}
}
// GetQuotedMessage extracts the quoted message from context info.
func GetQuotedMessage(m *waE2E.Message) *waE2E.Message {
if m == nil {
return nil
}
switch {
case m.GetExtendedTextMessage().GetContextInfo() != nil:
return m.GetExtendedTextMessage().GetContextInfo().GetQuotedMessage()
case m.GetImageMessage().GetContextInfo() != nil:
return m.GetImageMessage().GetContextInfo().GetQuotedMessage()
case m.GetVideoMessage().GetContextInfo() != nil:
return m.GetVideoMessage().GetContextInfo().GetQuotedMessage()
case m.GetDocumentMessage().GetContextInfo() != nil:
return m.GetDocumentMessage().GetContextInfo().GetQuotedMessage()
case m.GetAudioMessage().GetContextInfo() != nil:
return m.GetAudioMessage().GetContextInfo().GetQuotedMessage()
case m.GetStickerMessage().GetContextInfo() != nil:
return m.GetStickerMessage().GetContextInfo().GetQuotedMessage()
default:
return nil
}
}
// WithReply creates ContextInfo that quotes the original message.
func WithReply(evt *events.Message) *waE2E.ContextInfo {
return &waE2E.ContextInfo{
StanzaID: &evt.Info.ID,
Participant: proto.String(evt.Info.Sender.String()),
QuotedMessage: evt.Message,
}
}
// GetQuotedStanzaID returns the stanza ID of the message being replied to, if any.
func GetQuotedStanzaID(m *waE2E.Message) string {
if m == nil {
return ""
}
switch {
case m.GetExtendedTextMessage().GetContextInfo() != nil:
return m.GetExtendedTextMessage().GetContextInfo().GetStanzaID()
case m.GetImageMessage().GetContextInfo() != nil:
return m.GetImageMessage().GetContextInfo().GetStanzaID()
case m.GetVideoMessage().GetContextInfo() != nil:
return m.GetVideoMessage().GetContextInfo().GetStanzaID()
case m.GetDocumentMessage().GetContextInfo() != nil:
return m.GetDocumentMessage().GetContextInfo().GetStanzaID()
case m.GetAudioMessage().GetContextInfo() != nil:
return m.GetAudioMessage().GetContextInfo().GetStanzaID()
case m.GetStickerMessage().GetContextInfo() != nil:
return m.GetStickerMessage().GetContextInfo().GetStanzaID()
default:
return ""
}
}
// GetContextInfo extracts the ContextInfo from any message type.
func GetContextInfo(m *waE2E.Message) *waE2E.ContextInfo {
if m == nil {
return nil
}
switch {
case m.GetExtendedTextMessage().GetContextInfo() != nil:
return m.GetExtendedTextMessage().GetContextInfo()
case m.GetImageMessage().GetContextInfo() != nil:
return m.GetImageMessage().GetContextInfo()
case m.GetVideoMessage().GetContextInfo() != nil:
return m.GetVideoMessage().GetContextInfo()
case m.GetDocumentMessage().GetContextInfo() != nil:
return m.GetDocumentMessage().GetContextInfo()
case m.GetAudioMessage().GetContextInfo() != nil:
return m.GetAudioMessage().GetContextInfo()
case m.GetStickerMessage().GetContextInfo() != nil:
return m.GetStickerMessage().GetContextInfo()
default:
return nil
}
}
// GetQuotedText extracts text from a quoted message.
func GetQuotedText(m *waE2E.Message) string {
if m == nil {
return ""
}
switch {
case m.GetConversation() != "":
return m.GetConversation()
case m.GetExtendedTextMessage().GetText() != "":
return m.GetExtendedTextMessage().GetText()
case m.GetImageMessage().GetCaption() != "":
return m.GetImageMessage().GetCaption()
case m.GetVideoMessage().GetCaption() != "":
return m.GetVideoMessage().GetCaption()
default:
return ""
}
}
// GetContactName returns a display name for the given JID from the store.
func GetContactName(client *whatsmeow.Client, jid waTypes.JID) string {
if client == nil || client.Store == nil || client.Store.Contacts == nil {
return "+" + jid.User
}
contact, err := client.Store.Contacts.GetContact(stdctx.Background(), jid)
if err == nil && contact.Found {
if contact.PushName != "" {
return contact.PushName
}
if contact.FullName != "" {
return contact.FullName
}
if contact.BusinessName != "" {
return contact.BusinessName
}
}
return "+" + jid.User
}
// ParseJID parses a JID string, adding @s.whatsapp.net if no server is specified.
func ParseJID(arg string) (waTypes.JID, bool) {
if arg == "" {
return waTypes.JID{}, false
}
if arg[0] == '+' {
arg = arg[1:]
}
if !strings.ContainsRune(arg, '@') {
return waTypes.NewJID(arg, waTypes.DefaultUserServer), true
}
recipient, err := waTypes.ParseJID(arg)
if err != nil || recipient.User == "" {
return recipient, false
}
return recipient, true
}