| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- // Copyright (c) 2024 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/.
- package whatsmeow
- import (
- "context"
- "encoding/base64"
- "go.mau.fi/util/random"
- waBinary "go.mau.fi/whatsmeow/binary"
- "go.mau.fi/whatsmeow/types"
- )
- type PushConfig interface {
- GetPushConfigAttrs() waBinary.Attrs
- }
- type FCMPushConfig struct {
- Token string `json:"token"`
- }
- func (fpc *FCMPushConfig) GetPushConfigAttrs() waBinary.Attrs {
- return waBinary.Attrs{
- "id": fpc.Token,
- "num_acc": 1,
- "platform": "gcm",
- }
- }
- type APNsPushConfig struct {
- Token string `json:"token"`
- VoIPToken string `json:"voip_token"`
- MsgIDEncKey []byte `json:"msg_id_enc_key"`
- }
- func (apc *APNsPushConfig) GetPushConfigAttrs() waBinary.Attrs {
- if len(apc.MsgIDEncKey) != 32 {
- apc.MsgIDEncKey = random.Bytes(32)
- }
- attrs := waBinary.Attrs{
- "id": apc.Token,
- "platform": "apple",
- "version": 2,
- "reg_push": 1,
- "preview": 1,
- "pkey": base64.RawURLEncoding.EncodeToString(apc.MsgIDEncKey),
- "background_location": 1, // or 0
- "call": "Opening.m4r",
- "default": "note.m4r",
- "groups": "note.m4r",
- "lg": "en",
- "lc": "US",
- "nse_call": 0,
- "nse_ver": 2,
- "nse_read": 0,
- "voip_payload_type": 2,
- }
- if apc.VoIPToken != "" {
- attrs["voip"] = apc.VoIPToken
- }
- return attrs
- }
- type WebPushConfig struct {
- Endpoint string `json:"endpoint"`
- Auth []byte `json:"auth"`
- P256DH []byte `json:"p256dh"`
- }
- func (wpc *WebPushConfig) GetPushConfigAttrs() waBinary.Attrs {
- return waBinary.Attrs{
- "platform": "web",
- "endpoint": wpc.Endpoint,
- "auth": base64.StdEncoding.EncodeToString(wpc.Auth),
- "p256dh": base64.StdEncoding.EncodeToString(wpc.P256DH),
- }
- }
- func (cli *Client) GetServerPushNotificationConfig(ctx context.Context) (*waBinary.Node, error) {
- resp, err := cli.sendIQ(ctx, infoQuery{
- Namespace: "urn:xmpp:whatsapp:push",
- Type: iqGet,
- To: types.ServerJID,
- Content: []waBinary.Node{{Tag: "settings"}},
- })
- return resp, err
- }
- // RegisterForPushNotifications registers a token to receive push notifications for new WhatsApp messages.
- //
- // This is generally not necessary for anything. Don't use this if you don't know what you're doing.
- func (cli *Client) RegisterForPushNotifications(ctx context.Context, pc PushConfig) error {
- _, err := cli.sendIQ(ctx, infoQuery{
- Namespace: "urn:xmpp:whatsapp:push",
- Type: iqSet,
- To: types.ServerJID,
- Content: []waBinary.Node{{
- Tag: "config",
- Attrs: pc.GetPushConfigAttrs(),
- }},
- })
- return err
- }
|