Core framework (Handler, Command, Default muxer) in core/ package. Command self-registration via init() with blank imports in cmds/. Context helpers (send, reply, download, upload) in context/ package. Permission system with GROUP_ONLY / PRIVATE_ONLY checks. WhatsApp client configured as Safari with history sync disabled.
86 lines
2.5 KiB
Go
86 lines
2.5 KiB
Go
package context
|
|
|
|
import (
|
|
"strings"
|
|
|
|
waE2E "go.mau.fi/whatsmeow/proto/waE2E"
|
|
waTypes "go.mau.fi/whatsmeow/types"
|
|
"go.mau.fi/whatsmeow/types/events"
|
|
"google.golang.org/protobuf/proto"
|
|
)
|
|
|
|
// 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,
|
|
}
|
|
}
|
|
|
|
// 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
|
|
}
|