internals: add automatic generation

Closes #754
Closes #755
This commit is contained in:
Tulir Asokan committed 2025-02-21 18:06:35 +02:00
1 parent 3cd3caa79c
commit 6028fa6e8f
4 files changed
+802 -26

No files matched your search

+2 -2
View File
@@ -37,7 +37,7 @@ import (
)
// EventHandler is a function that can handle events from WhatsApp.
type EventHandler func(evt interface{})
type EventHandler func(evt any)
type nodeHandler func(node *waBinary.Node)
var nextHandlerID uint32
@@ -778,7 +778,7 @@ func (cli *Client) sendNode(node waBinary.Node) error {
return err
}
func (cli *Client) dispatchEvent(evt interface{}) {
func (cli *Client) dispatchEvent(evt any) {
cli.eventHandlersLock.RLock()
defer func() {
cli.eventHandlersLock.RUnlock()
+1 -1
View File
@@ -863,7 +863,7 @@ Outer:
cli.groupParticipantsCache[evt.JID] = cached
}
func (cli *Client) parseGroupNotification(node *waBinary.Node) (interface{}, error) {
func (cli *Client) parseGroupNotification(node *waBinary.Node) (any, error) {
children := node.GetChildren()
if len(children) == 1 && children[0].Tag == "create" {
return cli.parseGroupCreate(&children[0])
+597 -23
View File
@@ -1,18 +1,32 @@
// Copyright (c) 2022 Tulir Asokan
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// GENERATED BY internals_generate.go; DO NOT EDIT
//go:generate go run internals_generate.go
//go:generate goimports -local go.mau.fi/whatsmeow -w internals.go
package whatsmeow
import (
"context"
"encoding/json"
"io"
"net/http"
"time"
"go.mau.fi/libsignal/keys/prekey"
"go.mau.fi/whatsmeow/appstate"
waBinary "go.mau.fi/whatsmeow/binary"
"go.mau.fi/whatsmeow/proto/waCommon"
"go.mau.fi/whatsmeow/proto/waE2E"
"go.mau.fi/whatsmeow/proto/waHistorySync"
"go.mau.fi/whatsmeow/proto/waMsgApplication"
"go.mau.fi/whatsmeow/proto/waMsgTransport"
"go.mau.fi/whatsmeow/proto/waServerSync"
"go.mau.fi/whatsmeow/socket"
"go.mau.fi/whatsmeow/store"
"go.mau.fi/whatsmeow/types"
"go.mau.fi/whatsmeow/types/events"
"go.mau.fi/whatsmeow/util/keys"
)
type DangerousInternalClient struct {
@@ -29,18 +43,462 @@ func (cli *Client) DangerousInternals() *DangerousInternalClient {
type DangerousInfoQuery = infoQuery
type DangerousInfoQueryType = infoQueryType
func (int *DangerousInternalClient) SendIQ(query DangerousInfoQuery) (*waBinary.Node, error) {
return int.c.sendIQ(query)
func (int *DangerousInternalClient) FilterContacts(mutations []appstate.Mutation) ([]appstate.Mutation, []store.ContactEntry) {
return int.c.filterContacts(mutations)
}
func (int *DangerousInternalClient) SendIQAsync(query DangerousInfoQuery) (<-chan *waBinary.Node, error) {
return int.c.sendIQAsync(query)
func (int *DangerousInternalClient) DispatchAppState(mutation appstate.Mutation, fullSync bool, emitOnFullSync bool) {
int.c.dispatchAppState(mutation, fullSync, emitOnFullSync)
}
func (int *DangerousInternalClient) DownloadExternalAppStateBlob(ref *waServerSync.ExternalBlobReference) ([]byte, error) {
return int.c.downloadExternalAppStateBlob(ref)
}
func (int *DangerousInternalClient) FetchAppStatePatches(name appstate.WAPatchName, fromVersion uint64, snapshot bool) (*appstate.PatchList, error) {
return int.c.fetchAppStatePatches(name, fromVersion, snapshot)
}
func (int *DangerousInternalClient) RequestMissingAppStateKeys(ctx context.Context, patches *appstate.PatchList) {
int.c.requestMissingAppStateKeys(ctx, patches)
}
func (int *DangerousInternalClient) RequestAppStateKeys(ctx context.Context, rawKeyIDs [][]byte) {
int.c.requestAppStateKeys(ctx, rawKeyIDs)
}
func (int *DangerousInternalClient) HandleDecryptedArmadillo(info *types.MessageInfo, decrypted []byte, retryCount int) bool {
return int.c.handleDecryptedArmadillo(info, decrypted, retryCount)
}
func (int *DangerousInternalClient) GetBroadcastListParticipants(jid types.JID) ([]types.JID, error) {
return int.c.getBroadcastListParticipants(jid)
}
func (int *DangerousInternalClient) GetStatusBroadcastRecipients() ([]types.JID, error) {
return int.c.getStatusBroadcastRecipients()
}
func (int *DangerousInternalClient) HandleCallEvent(node *waBinary.Node) {
int.c.handleCallEvent(node)
}
func (int *DangerousInternalClient) GetSocketWaitChan() <-chan struct{} {
return int.c.getSocketWaitChan()
}
func (int *DangerousInternalClient) CloseSocketWaitChan() {
int.c.closeSocketWaitChan()
}
func (int *DangerousInternalClient) GetOwnID() types.JID {
return int.c.getOwnID()
}
func (int *DangerousInternalClient) OnDisconnect(ns *socket.NoiseSocket, remote bool) {
int.c.onDisconnect(ns, remote)
}
func (int *DangerousInternalClient) ExpectDisconnect() {
int.c.expectDisconnect()
}
func (int *DangerousInternalClient) ResetExpectedDisconnect() {
int.c.resetExpectedDisconnect()
}
func (int *DangerousInternalClient) IsExpectedDisconnect() bool {
return int.c.isExpectedDisconnect()
}
func (int *DangerousInternalClient) AutoReconnect() {
int.c.autoReconnect()
}
func (int *DangerousInternalClient) UnlockedDisconnect() {
int.c.unlockedDisconnect()
}
func (int *DangerousInternalClient) HandleFrame(data []byte) {
int.c.handleFrame(data)
}
func (int *DangerousInternalClient) HandlerQueueLoop(ctx context.Context) {
int.c.handlerQueueLoop(ctx)
}
func (int *DangerousInternalClient) SendNodeAndGetData(node waBinary.Node) ([]byte, error) {
return int.c.sendNodeAndGetData(node)
}
func (int *DangerousInternalClient) SendNode(node waBinary.Node) error {
return int.c.sendNode(node)
}
func (int *DangerousInternalClient) DispatchEvent(evt any) {
int.c.dispatchEvent(evt)
}
func (int *DangerousInternalClient) HandleStreamError(node *waBinary.Node) {
int.c.handleStreamError(node)
}
func (int *DangerousInternalClient) HandleIB(node *waBinary.Node) {
int.c.handleIB(node)
}
func (int *DangerousInternalClient) HandleConnectFailure(node *waBinary.Node) {
int.c.handleConnectFailure(node)
}
func (int *DangerousInternalClient) HandleConnectSuccess(node *waBinary.Node) {
int.c.handleConnectSuccess(node)
}
func (int *DangerousInternalClient) DownloadAndDecrypt(url string, mediaKey []byte, appInfo MediaType, fileLength int, fileEncSHA256, fileSHA256 []byte) (data []byte, err error) {
return int.c.downloadAndDecrypt(url, mediaKey, appInfo, fileLength, fileEncSHA256, fileSHA256)
}
func (int *DangerousInternalClient) DownloadPossiblyEncryptedMediaWithRetries(url string, checksum []byte) (file, mac []byte, err error) {
return int.c.downloadPossiblyEncryptedMediaWithRetries(url, checksum)
}
func (int *DangerousInternalClient) DoMediaDownloadRequest(url string) (*http.Response, error) {
return int.c.doMediaDownloadRequest(url)
}
func (int *DangerousInternalClient) DownloadMedia(url string) ([]byte, error) {
return int.c.downloadMedia(url)
}
func (int *DangerousInternalClient) DownloadEncryptedMedia(url string, checksum []byte) (file, mac []byte, err error) {
return int.c.downloadEncryptedMedia(url, checksum)
}
func (int *DangerousInternalClient) DownloadAndDecryptToFile(url string, mediaKey []byte, appInfo MediaType, fileLength int, fileEncSHA256, fileSHA256 []byte, file File) error {
return int.c.downloadAndDecryptToFile(url, mediaKey, appInfo, fileLength, fileEncSHA256, fileSHA256, file)
}
func (int *DangerousInternalClient) DownloadPossiblyEncryptedMediaWithRetriesToFile(url string, checksum []byte, file File) (mac []byte, err error) {
return int.c.downloadPossiblyEncryptedMediaWithRetriesToFile(url, checksum, file)
}
func (int *DangerousInternalClient) DownloadMediaToFile(url string, file io.Writer) (int64, []byte, error) {
return int.c.downloadMediaToFile(url, file)
}
func (int *DangerousInternalClient) DownloadEncryptedMediaToFile(url string, checksum []byte, file File) ([]byte, error) {
return int.c.downloadEncryptedMediaToFile(url, checksum, file)
}
func (int *DangerousInternalClient) SendGroupIQ(ctx context.Context, iqType infoQueryType, jid types.JID, content waBinary.Node) (*waBinary.Node, error) {
return int.c.sendGroupIQ(ctx, iqType, jid, content)
}
func (int *DangerousInternalClient) GetGroupInfo(ctx context.Context, jid types.JID, lockParticipantCache bool) (*types.GroupInfo, error) {
return int.c.getGroupInfo(ctx, jid, lockParticipantCache)
}
func (int *DangerousInternalClient) GetGroupMembers(ctx context.Context, jid types.JID) ([]types.JID, error) {
return int.c.getGroupMembers(ctx, jid)
}
func (int *DangerousInternalClient) ParseGroupNode(groupNode *waBinary.Node) (*types.GroupInfo, error) {
return int.c.parseGroupNode(groupNode)
}
func (int *DangerousInternalClient) ParseGroupCreate(node *waBinary.Node) (*events.JoinedGroup, error) {
return int.c.parseGroupCreate(node)
}
func (int *DangerousInternalClient) ParseGroupChange(node *waBinary.Node) (*events.GroupInfo, error) {
return int.c.parseGroupChange(node)
}
func (int *DangerousInternalClient) UpdateGroupParticipantCache(evt *events.GroupInfo) {
int.c.updateGroupParticipantCache(evt)
}
func (int *DangerousInternalClient) ParseGroupNotification(node *waBinary.Node) (any, error) {
return int.c.parseGroupNotification(node)
}
func (int *DangerousInternalClient) DoHandshake(fs *socket.FrameSocket, ephemeralKP keys.KeyPair) error {
return int.c.doHandshake(fs, ephemeralKP)
}
func (int *DangerousInternalClient) KeepAliveLoop(ctx context.Context) {
int.c.keepAliveLoop(ctx)
}
func (int *DangerousInternalClient) SendKeepAlive(ctx context.Context) (isSuccess, shouldContinue bool) {
return int.c.sendKeepAlive(ctx)
}
func (int *DangerousInternalClient) RefreshMediaConn(force bool) (*MediaConn, error) {
return int.c.refreshMediaConn(force)
}
func (int *DangerousInternalClient) QueryMediaConn() (*MediaConn, error) {
return int.c.queryMediaConn()
}
func (int *DangerousInternalClient) HandleMediaRetryNotification(node *waBinary.Node) {
int.c.handleMediaRetryNotification(node)
}
func (int *DangerousInternalClient) HandleEncryptedMessage(node *waBinary.Node) {
int.c.handleEncryptedMessage(node)
}
func (int *DangerousInternalClient) ParseMessageSource(node *waBinary.Node, requireParticipant bool) (source types.MessageSource, err error) {
return int.c.parseMessageSource(node, requireParticipant)
}
func (int *DangerousInternalClient) ParseMsgBotInfo(node waBinary.Node) (botInfo types.MsgBotInfo, err error) {
return int.c.parseMsgBotInfo(node)
}
func (int *DangerousInternalClient) ParseMsgMetaInfo(node waBinary.Node) (metaInfo types.MsgMetaInfo, err error) {
return int.c.parseMsgMetaInfo(node)
}
func (int *DangerousInternalClient) ParseMessageInfo(node *waBinary.Node) (*types.MessageInfo, error) {
return int.c.parseMessageInfo(node)
}
func (int *DangerousInternalClient) HandlePlaintextMessage(info *types.MessageInfo, node *waBinary.Node) {
int.c.handlePlaintextMessage(info, node)
}
func (int *DangerousInternalClient) DecryptMessages(info *types.MessageInfo, node *waBinary.Node) {
int.c.decryptMessages(info, node)
}
func (int *DangerousInternalClient) ClearUntrustedIdentity(target types.JID) {
int.c.clearUntrustedIdentity(target)
}
func (int *DangerousInternalClient) DecryptDM(child *waBinary.Node, from types.JID, isPreKey bool) ([]byte, error) {
return int.c.decryptDM(child, from, isPreKey)
}
func (int *DangerousInternalClient) DecryptGroupMsg(child *waBinary.Node, from types.JID, chat types.JID) ([]byte, error) {
return int.c.decryptGroupMsg(child, from, chat)
}
func (int *DangerousInternalClient) HandleSenderKeyDistributionMessage(chat, from types.JID, axolotlSKDM []byte) {
int.c.handleSenderKeyDistributionMessage(chat, from, axolotlSKDM)
}
func (int *DangerousInternalClient) HandleHistorySyncNotificationLoop() {
int.c.handleHistorySyncNotificationLoop()
}
func (int *DangerousInternalClient) HandleHistorySyncNotification(notif *waE2E.HistorySyncNotification) {
int.c.handleHistorySyncNotification(notif)
}
func (int *DangerousInternalClient) HandleAppStateSyncKeyShare(keys *waE2E.AppStateSyncKeyShare) {
int.c.handleAppStateSyncKeyShare(keys)
}
func (int *DangerousInternalClient) HandlePlaceholderResendResponse(msg *waE2E.PeerDataOperationRequestResponseMessage) {
int.c.handlePlaceholderResendResponse(msg)
}
func (int *DangerousInternalClient) HandleProtocolMessage(info *types.MessageInfo, msg *waE2E.Message) {
int.c.handleProtocolMessage(info, msg)
}
func (int *DangerousInternalClient) ProcessProtocolParts(info *types.MessageInfo, msg *waE2E.Message) {
int.c.processProtocolParts(info, msg)
}
func (int *DangerousInternalClient) StoreMessageSecret(info *types.MessageInfo, msg *waE2E.Message) {
int.c.storeMessageSecret(info, msg)
}
func (int *DangerousInternalClient) StoreHistoricalMessageSecrets(conversations []*waHistorySync.Conversation) {
int.c.storeHistoricalMessageSecrets(conversations)
}
func (int *DangerousInternalClient) HandleDecryptedMessage(info *types.MessageInfo, msg *waE2E.Message, retryCount int) {
int.c.handleDecryptedMessage(info, msg, retryCount)
}
func (int *DangerousInternalClient) SendProtocolMessageReceipt(id types.MessageID, msgType types.ReceiptType) {
int.c.sendProtocolMessageReceipt(id, msgType)
}
func (int *DangerousInternalClient) DecryptMsgSecret(msg *events.Message, useCase MsgSecretType, encrypted messageEncryptedSecret, origMsgKey *waCommon.MessageKey) ([]byte, error) {
return int.c.decryptMsgSecret(msg, useCase, encrypted, origMsgKey)
}
func (int *DangerousInternalClient) EncryptMsgSecret(chat, origSender types.JID, origMsgID types.MessageID, useCase MsgSecretType, plaintext []byte) (ciphertext, iv []byte, err error) {
return int.c.encryptMsgSecret(chat, origSender, origMsgID, useCase, plaintext)
}
func (int *DangerousInternalClient) DecryptBotMessage(messageSecret []byte, msMsg messageEncryptedSecret, messageID types.MessageID, targetSenderJID types.JID, info *types.MessageInfo) ([]byte, error) {
return int.c.decryptBotMessage(messageSecret, msMsg, messageID, targetSenderJID, info)
}
func (int *DangerousInternalClient) SendMexIQ(ctx context.Context, queryID string, variables any) (json.RawMessage, error) {
return int.c.sendMexIQ(ctx, queryID, variables)
}
func (int *DangerousInternalClient) GetNewsletterInfo(input map[string]any, fetchViewerMeta bool) (*types.NewsletterMetadata, error) {
return int.c.getNewsletterInfo(input, fetchViewerMeta)
}
func (int *DangerousInternalClient) HandleEncryptNotification(node *waBinary.Node) {
int.c.handleEncryptNotification(node)
}
func (int *DangerousInternalClient) HandleAppStateNotification(node *waBinary.Node) {
int.c.handleAppStateNotification(node)
}
func (int *DangerousInternalClient) HandlePictureNotification(node *waBinary.Node) {
int.c.handlePictureNotification(node)
}
func (int *DangerousInternalClient) HandleDeviceNotification(node *waBinary.Node) {
int.c.handleDeviceNotification(node)
}
func (int *DangerousInternalClient) HandleFBDeviceNotification(node *waBinary.Node) {
int.c.handleFBDeviceNotification(node)
}
func (int *DangerousInternalClient) HandleOwnDevicesNotification(node *waBinary.Node) {
int.c.handleOwnDevicesNotification(node)
}
func (int *DangerousInternalClient) HandleBlocklist(node *waBinary.Node) {
int.c.handleBlocklist(node)
}
func (int *DangerousInternalClient) HandleAccountSyncNotification(node *waBinary.Node) {
int.c.handleAccountSyncNotification(node)
}
func (int *DangerousInternalClient) HandlePrivacyTokenNotification(node *waBinary.Node) {
int.c.handlePrivacyTokenNotification(node)
}
func (int *DangerousInternalClient) ParseNewsletterMessages(node *waBinary.Node) []*types.NewsletterMessage {
return int.c.parseNewsletterMessages(node)
}
func (int *DangerousInternalClient) HandleNewsletterNotification(node *waBinary.Node) {
int.c.handleNewsletterNotification(node)
}
func (int *DangerousInternalClient) HandleMexNotification(node *waBinary.Node) {
int.c.handleMexNotification(node)
}
func (int *DangerousInternalClient) HandleStatusNotification(node *waBinary.Node) {
int.c.handleStatusNotification(node)
}
func (int *DangerousInternalClient) HandleNotification(node *waBinary.Node) {
int.c.handleNotification(node)
}
func (int *DangerousInternalClient) TryHandleCodePairNotification(parentNode *waBinary.Node) {
int.c.tryHandleCodePairNotification(parentNode)
}
func (int *DangerousInternalClient) HandleCodePairNotification(parentNode *waBinary.Node) error {
return int.c.handleCodePairNotification(parentNode)
}
func (int *DangerousInternalClient) HandleIQ(node *waBinary.Node) {
int.c.handleIQ(node)
}
func (int *DangerousInternalClient) HandlePairDevice(node *waBinary.Node) {
int.c.handlePairDevice(node)
}
func (int *DangerousInternalClient) MakeQRData(ref string) string {
return int.c.makeQRData(ref)
}
func (int *DangerousInternalClient) HandlePairSuccess(node *waBinary.Node) {
int.c.handlePairSuccess(node)
}
func (int *DangerousInternalClient) HandlePair(deviceIdentityBytes []byte, reqID, businessName, platform string, jid types.JID) error {
return int.c.handlePair(deviceIdentityBytes, reqID, businessName, platform, jid)
}
func (int *DangerousInternalClient) SendPairError(id string, code int, text string) {
int.c.sendPairError(id, code, text)
}
func (int *DangerousInternalClient) GetServerPreKeyCount() (int, error) {
return int.c.getServerPreKeyCount()
}
func (int *DangerousInternalClient) UploadPreKeys() {
int.c.uploadPreKeys()
}
func (int *DangerousInternalClient) FetchPreKeys(ctx context.Context, users []types.JID) (map[types.JID]preKeyResp, error) {
return int.c.fetchPreKeys(ctx, users)
}
func (int *DangerousInternalClient) HandleChatState(node *waBinary.Node) {
int.c.handleChatState(node)
}
func (int *DangerousInternalClient) HandlePresence(node *waBinary.Node) {
int.c.handlePresence(node)
}
func (int *DangerousInternalClient) ParsePrivacySettings(privacyNode *waBinary.Node, settings *types.PrivacySettings) *events.PrivacySettings {
return int.c.parsePrivacySettings(privacyNode, settings)
}
func (int *DangerousInternalClient) HandlePrivacySettingsNotification(privacyNode *waBinary.Node) {
int.c.handlePrivacySettingsNotification(privacyNode)
}
func (int *DangerousInternalClient) HandleReceipt(node *waBinary.Node) {
int.c.handleReceipt(node)
}
func (int *DangerousInternalClient) HandleGroupedReceipt(partialReceipt events.Receipt, participants *waBinary.Node) {
int.c.handleGroupedReceipt(partialReceipt, participants)
}
func (int *DangerousInternalClient) ParseReceipt(node *waBinary.Node) (*events.Receipt, error) {
return int.c.parseReceipt(node)
}
func (int *DangerousInternalClient) MaybeDeferredAck(node *waBinary.Node) func() {
return int.c.maybeDeferredAck(node)
}
func (int *DangerousInternalClient) SendAck(node *waBinary.Node) {
int.c.sendAck(node)
}
func (int *DangerousInternalClient) SendMessageReceipt(info *types.MessageInfo) {
int.c.sendMessageReceipt(info)
}
func (int *DangerousInternalClient) GenerateRequestID() string {
return int.c.generateRequestID()
}
func (int *DangerousInternalClient) ClearResponseWaiters(node *waBinary.Node) {
int.c.clearResponseWaiters(node)
}
func (int *DangerousInternalClient) WaitResponse(reqID string) chan *waBinary.Node {
return int.c.waitResponse(reqID)
}
@@ -49,38 +507,154 @@ func (int *DangerousInternalClient) CancelResponse(reqID string, ch chan *waBina
int.c.cancelResponse(reqID, ch)
}
func (int *DangerousInternalClient) QueryMediaConn() (*MediaConn, error) {
return int.c.queryMediaConn()
func (int *DangerousInternalClient) ReceiveResponse(data *waBinary.Node) bool {
return int.c.receiveResponse(data)
}
func (int *DangerousInternalClient) RefreshMediaConn(force bool) (*MediaConn, error) {
return int.c.refreshMediaConn(force)
func (int *DangerousInternalClient) SendIQAsyncAndGetData(query *infoQuery) (<-chan *waBinary.Node, []byte, error) {
return int.c.sendIQAsyncAndGetData(query)
}
func (int *DangerousInternalClient) GetServerPreKeyCount() (int, error) {
return int.c.getServerPreKeyCount()
func (int *DangerousInternalClient) SendIQAsync(query infoQuery) (<-chan *waBinary.Node, error) {
return int.c.sendIQAsync(query)
}
func (int *DangerousInternalClient) RequestAppStateKeys(ctx context.Context, keyIDs [][]byte) {
int.c.requestAppStateKeys(ctx, keyIDs)
func (int *DangerousInternalClient) SendIQ(query infoQuery) (*waBinary.Node, error) {
return int.c.sendIQ(query)
}
func (int *DangerousInternalClient) RetryFrame(reqType, id string, data []byte, origResp *waBinary.Node, ctx context.Context, timeout time.Duration) (*waBinary.Node, error) {
return int.c.retryFrame(reqType, id, data, origResp, ctx, timeout)
}
func (int *DangerousInternalClient) AddRecentMessage(to types.JID, id types.MessageID, wa *waE2E.Message, fb *waMsgApplication.MessageApplication) {
int.c.addRecentMessage(to, id, wa, fb)
}
func (int *DangerousInternalClient) GetRecentMessage(to types.JID, id types.MessageID) RecentMessage {
return int.c.getRecentMessage(to, id)
}
func (int *DangerousInternalClient) GetMessageForRetry(receipt *events.Receipt, messageID types.MessageID) (RecentMessage, error) {
return int.c.getMessageForRetry(receipt, messageID)
}
func (int *DangerousInternalClient) ShouldRecreateSession(retryCount int, jid types.JID) (reason string, recreate bool) {
return int.c.shouldRecreateSession(retryCount, jid)
}
func (int *DangerousInternalClient) HandleRetryReceipt(receipt *events.Receipt, node *waBinary.Node) error {
return int.c.handleRetryReceipt(receipt, node)
}
func (int *DangerousInternalClient) CancelDelayedRequestFromPhone(msgID types.MessageID) {
int.c.cancelDelayedRequestFromPhone(msgID)
}
func (int *DangerousInternalClient) DelayedRequestMessageFromPhone(info *types.MessageInfo) {
int.c.delayedRequestMessageFromPhone(info)
}
func (int *DangerousInternalClient) SendRetryReceipt(node *waBinary.Node, info *types.MessageInfo, forceIncludeIdentity bool) {
int.c.sendRetryReceipt(node, info, forceIncludeIdentity)
}
func (int *DangerousInternalClient) EncryptMessageForDevice(plaintext []byte, to types.JID, bundle *prekey.Bundle, extraAttrs waBinary.Attrs) (*waBinary.Node, bool, error) {
return int.c.encryptMessageForDevice(plaintext, to, bundle, extraAttrs)
func (int *DangerousInternalClient) SendGroupV3(ctx context.Context, to, ownID types.JID, id types.MessageID, messageApp []byte, msgAttrs messageAttrs, frankingTag []byte, timings *MessageDebugTimings) (string, []byte, error) {
return int.c.sendGroupV3(ctx, to, ownID, id, messageApp, msgAttrs, frankingTag, timings)
}
func (int *DangerousInternalClient) GetOwnID() types.JID {
return int.c.getOwnID()
func (int *DangerousInternalClient) SendDMV3(ctx context.Context, to, ownID types.JID, id types.MessageID, messageApp []byte, msgAttrs messageAttrs, frankingTag []byte, timings *MessageDebugTimings) ([]byte, string, error) {
return int.c.sendDMV3(ctx, to, ownID, id, messageApp, msgAttrs, frankingTag, timings)
}
func (int *DangerousInternalClient) DecryptDM(child *waBinary.Node, from types.JID, isPreKey bool) ([]byte, error) {
return int.c.decryptDM(child, from, isPreKey)
func (int *DangerousInternalClient) PrepareMessageNodeV3(ctx context.Context, to, ownID types.JID, id types.MessageID, payload *waMsgTransport.MessageTransport_Payload, skdm *waMsgTransport.MessageTransport_Protocol_Ancillary_SenderKeyDistributionMessage, msgAttrs messageAttrs, frankingTag []byte, participants []types.JID, timings *MessageDebugTimings) (*waBinary.Node, []types.JID, error) {
return int.c.prepareMessageNodeV3(ctx, to, ownID, id, payload, skdm, msgAttrs, frankingTag, participants, timings)
}
func (int *DangerousInternalClient) EncryptMessageForDevicesV3(ctx context.Context, allDevices []types.JID, ownID types.JID, id string, payload *waMsgTransport.MessageTransport_Payload, skdm *waMsgTransport.MessageTransport_Protocol_Ancillary_SenderKeyDistributionMessage, dsm *waMsgTransport.MessageTransport_Protocol_Integral_DeviceSentMessage, encAttrs waBinary.Attrs) []waBinary.Node {
return int.c.encryptMessageForDevicesV3(ctx, allDevices, ownID, id, payload, skdm, dsm, encAttrs)
}
func (int *DangerousInternalClient) EncryptMessageForDeviceAndWrapV3(payload *waMsgTransport.MessageTransport_Payload, skdm *waMsgTransport.MessageTransport_Protocol_Ancillary_SenderKeyDistributionMessage, dsm *waMsgTransport.MessageTransport_Protocol_Integral_DeviceSentMessage, to types.JID, bundle *prekey.Bundle, encAttrs waBinary.Attrs) (*waBinary.Node, error) {
return int.c.encryptMessageForDeviceAndWrapV3(payload, skdm, dsm, to, bundle, encAttrs)
}
func (int *DangerousInternalClient) EncryptMessageForDeviceV3(payload *waMsgTransport.MessageTransport_Payload, skdm *waMsgTransport.MessageTransport_Protocol_Ancillary_SenderKeyDistributionMessage, dsm *waMsgTransport.MessageTransport_Protocol_Integral_DeviceSentMessage, to types.JID, bundle *prekey.Bundle, extraAttrs waBinary.Attrs) (*waBinary.Node, error) {
return int.c.encryptMessageForDeviceV3(payload, skdm, dsm, to, bundle, extraAttrs)
}
func (int *DangerousInternalClient) SendNewsletter(to types.JID, id types.MessageID, message *waE2E.Message, mediaID string, timings *MessageDebugTimings) ([]byte, error) {
return int.c.sendNewsletter(to, id, message, mediaID, timings)
}
func (int *DangerousInternalClient) SendGroup(ctx context.Context, to, ownID types.JID, id types.MessageID, message *waE2E.Message, timings *MessageDebugTimings, botNode *waBinary.Node) (string, []byte, error) {
return int.c.sendGroup(ctx, to, ownID, id, message, timings, botNode)
}
func (int *DangerousInternalClient) SendPeerMessage(to types.JID, id types.MessageID, message *waE2E.Message, timings *MessageDebugTimings) ([]byte, error) {
return int.c.sendPeerMessage(to, id, message, timings)
}
func (int *DangerousInternalClient) SendDM(ctx context.Context, to, ownID types.JID, id types.MessageID, message *waE2E.Message, timings *MessageDebugTimings, botNode *waBinary.Node) ([]byte, error) {
return int.c.sendDM(ctx, to, ownID, id, message, timings, botNode)
}
func (int *DangerousInternalClient) PreparePeerMessageNode(to types.JID, id types.MessageID, message *waE2E.Message, timings *MessageDebugTimings) (*waBinary.Node, error) {
return int.c.preparePeerMessageNode(to, id, message, timings)
}
func (int *DangerousInternalClient) GetMessageContent(baseNode waBinary.Node, message *waE2E.Message, msgAttrs waBinary.Attrs, includeIdentity bool, botNode *waBinary.Node) []waBinary.Node {
return int.c.getMessageContent(baseNode, message, msgAttrs, includeIdentity, botNode)
}
func (int *DangerousInternalClient) PrepareMessageNode(ctx context.Context, to, ownID types.JID, id types.MessageID, message *waE2E.Message, participants []types.JID, plaintext, dsmPlaintext []byte, timings *MessageDebugTimings, botNode *waBinary.Node) (*waBinary.Node, []types.JID, error) {
return int.c.prepareMessageNode(ctx, to, ownID, id, message, participants, plaintext, dsmPlaintext, timings, botNode)
}
func (int *DangerousInternalClient) MakeDeviceIdentityNode() waBinary.Node {
return int.c.makeDeviceIdentityNode()
}
func (int *DangerousInternalClient) EncryptMessageForDevices(ctx context.Context, allDevices []types.JID, ownID types.JID, id string, msgPlaintext, dsmPlaintext []byte, encAttrs waBinary.Attrs) ([]waBinary.Node, bool) {
return int.c.encryptMessageForDevices(ctx, allDevices, ownID, id, msgPlaintext, dsmPlaintext, encAttrs)
}
func (int *DangerousInternalClient) EncryptMessageForDeviceAndWrap(plaintext []byte, to types.JID, bundle *prekey.Bundle, encAttrs waBinary.Attrs) (*waBinary.Node, bool, error) {
return int.c.encryptMessageForDeviceAndWrap(plaintext, to, bundle, encAttrs)
}
func (int *DangerousInternalClient) EncryptMessageForDevice(plaintext []byte, to types.JID, bundle *prekey.Bundle, extraAttrs waBinary.Attrs) (*waBinary.Node, bool, error) {
return int.c.encryptMessageForDevice(plaintext, to, bundle, extraAttrs)
}
func (int *DangerousInternalClient) RawUpload(ctx context.Context, dataToUpload io.Reader, uploadSize uint64, fileHash []byte, appInfo MediaType, newsletter bool, resp *UploadResponse) error {
return int.c.rawUpload(ctx, dataToUpload, uploadSize, fileHash, appInfo, newsletter, resp)
}
func (int *DangerousInternalClient) ParseBusinessProfile(node *waBinary.Node) (*types.BusinessProfile, error) {
return int.c.parseBusinessProfile(node)
}
func (int *DangerousInternalClient) HandleHistoricalPushNames(names []*waHistorySync.Pushname) {
int.c.handleHistoricalPushNames(names)
}
func (int *DangerousInternalClient) UpdatePushName(user types.JID, messageInfo *types.MessageInfo, name string) {
int.c.updatePushName(user, messageInfo, name)
}
func (int *DangerousInternalClient) UpdateBusinessName(user types.JID, messageInfo *types.MessageInfo, name string) {
int.c.updateBusinessName(user, messageInfo, name)
}
func (int *DangerousInternalClient) GetFBIDDevices(ctx context.Context, jids []types.JID) (*waBinary.Node, error) {
return int.c.getFBIDDevices(ctx, jids)
}
func (int *DangerousInternalClient) Usync(ctx context.Context, jids []types.JID, mode, context string, query []waBinary.Node, extra ...UsyncQueryExtras) (*waBinary.Node, error) {
return int.c.usync(ctx, jids, mode, context, query, extra...)
}
func (int *DangerousInternalClient) ParseBlocklist(node *waBinary.Node) *types.Blocklist {
return int.c.parseBlocklist(node)
}
+202
View File
@@ -0,0 +1,202 @@
// Copyright (c) 2025 Tulir Asokan
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
//go:build ignore
package main
import (
"fmt"
"go/ast"
"go/parser"
"go/token"
"os"
"strings"
"go.mau.fi/util/exerrors"
)
const header = `// GENERATED BY internals_generate.go; DO NOT EDIT
//go:generate go run internals_generate.go
//go:generate goimports -local go.mau.fi/whatsmeow -w internals.go
package whatsmeow
`
const postImportHeader = `
type DangerousInternalClient struct {
c *Client
}
// DangerousInternals allows access to some unexported methods in Client.
//
// Deprecated: dangerous
func (cli *Client) DangerousInternals() *DangerousInternalClient {
return &DangerousInternalClient{cli}
}
type DangerousInfoQuery = infoQuery
type DangerousInfoQueryType = infoQueryType
`
func getTypeName(expr ast.Expr) string {
switch e := expr.(type) {
case *ast.Ident:
return e.Name
case *ast.StarExpr:
return "*" + getTypeName(e.X)
case *ast.ArrayType:
return "[]" + getTypeName(e.Elt)
case *ast.MapType:
return fmt.Sprintf("map[%s]%s", getTypeName(e.Key), getTypeName(e.Value))
case *ast.ChanType:
if e.Dir == ast.SEND {
return fmt.Sprintf("chan<- %s", getTypeName(e.Value))
} else if e.Dir == ast.RECV {
return fmt.Sprintf("<-chan %s", getTypeName(e.Value))
}
return fmt.Sprintf("chan %s", getTypeName(e.Value))
case *ast.FuncType:
var params []string
for _, param := range e.Params.List {
params = append(params, getTypeName(param.Type))
}
var results []string
if e.Results != nil {
for _, result := range e.Results.List {
results = append(results, getTypeName(result.Type))
}
}
return fmt.Sprintf("func(%s) %s", strings.Join(params, ", "), strings.Join(results, ", "))
case *ast.SelectorExpr:
return fmt.Sprintf("%s.%s", getTypeName(e.X), e.Sel.Name)
case *ast.StructType:
// This isn't technically correct, but struct literals shouldn't be used for anything else
return "struct{}"
case *ast.Ellipsis:
return fmt.Sprintf("...%s", e.Elt)
default:
panic(fmt.Errorf("unknown type %T", e))
}
}
var write func(str string)
var writef func(format string, args ...any)
func main() {
fset := token.NewFileSet()
fileNames := []string{
"appstate.go", "armadillomessage.go", "broadcast.go", "call.go", "client.go",
"connectionevents.go", "download.go", "download-to-file.go", "group.go", "handshake.go",
"keepalive.go", "mediaconn.go", "mediaretry.go", "message.go", "msgsecret.go",
"newsletter.go", "notification.go", "pair-code.go", "pair.go", "prekeys.go",
"presence.go", "privacysettings.go", "push.go", "qrchan.go", "receipt.go", "request.go",
"retry.go", "sendfb.go", "send.go", "upload.go", "user.go",
}
files := make([]*ast.File, len(fileNames))
for i, name := range fileNames {
files[i] = exerrors.Must(parser.ParseFile(fset, name, nil, parser.SkipObjectResolution))
}
file := exerrors.Must(os.OpenFile("internals.go", os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644))
write = func(str string) {
exerrors.Must(file.WriteString(str))
}
writef = func(format string, args ...any) {
exerrors.Must(fmt.Fprintf(file, format, args...))
}
write(header)
write("import (\n")
for _, i := range files[0].Imports {
write("\t")
if i.Name != nil {
writef("%s ", i.Name.Name)
}
writef("%s\n", i.Path.Value)
}
write(")\n")
write(postImportHeader)
for _, f := range files {
processFile(f)
}
exerrors.PanicIfNotNil(file.Close())
}
func processFile(f *ast.File) {
ast.Inspect(f, func(node ast.Node) (retVal bool) {
retVal = true
funcDecl, ok := node.(*ast.FuncDecl)
if !ok || funcDecl.Name.IsExported() {
return
}
if funcDecl.Recv == nil || len(funcDecl.Recv.List) == 0 || len(funcDecl.Recv.List[0].Names) == 0 ||
funcDecl.Recv.List[0].Names[0].Name != "cli" {
return
}
writef("\nfunc (int *DangerousInternalClient) %s%s(", strings.ToUpper(funcDecl.Name.Name[0:1]), funcDecl.Name.Name[1:])
for i, param := range funcDecl.Type.Params.List {
if i != 0 {
write(", ")
}
for j, name := range param.Names {
if j != 0 {
write(", ")
}
write(name.Name)
}
if len(param.Names) > 0 {
write(" ")
}
write(getTypeName(param.Type))
}
write(") ")
if funcDecl.Type.Results != nil && len(funcDecl.Type.Results.List) > 0 {
needsParentheses := len(funcDecl.Type.Results.List) > 1 || len(funcDecl.Type.Results.List[0].Names) > 0
if needsParentheses {
write("(")
}
for i, result := range funcDecl.Type.Results.List {
if i != 0 {
write(", ")
}
for j, name := range result.Names {
if j != 0 {
write(", ")
}
write(name.Name)
}
if len(result.Names) > 0 {
write(" ")
}
write(getTypeName(result.Type))
}
if needsParentheses {
write(")")
}
write(" ")
}
write("{\n\t")
if funcDecl.Type.Results != nil {
write("return ")
}
writef("int.c.%s(", funcDecl.Name.Name)
for i, param := range funcDecl.Type.Params.List {
for j, name := range param.Names {
if i != 0 || j != 0 {
write(", ")
}
write(name.Name)
_, isEllipsis := param.Type.(*ast.Ellipsis)
if isEllipsis {
write("...")
}
}
}
write(")\n}\n")
return
})
}