@baileys-md/baileys
Version:
Baileys WhatsApp API
255 lines (245 loc) • 9 kB
JavaScript
//=======================================================//
import { executeWMexQuery as genericExecuteWMexQuery } from "./mex.js";
import { generateProfilePicture } from "../Utils/messages-media.js";
import { getBinaryNodeChild } from "../WABinary/index.js";
import { QueryIds, XWAPaths } from "../Types/index.js";
import { makeGroupsSocket } from "./groups.js";
//=======================================================//
const extractNewsletterMetadata = (node, isCreate) => {
const result = getBinaryNodeChild(node, 'result')?.content?.toString()
const metadataPath = JSON.parse(result).data[isCreate ? XWAPaths.xwa2_newsletter_create : "xwa2_newsletter"]
const metadata = {
id: metadataPath?.id,
state: metadataPath?.state?.type,
creation_time: +metadataPath?.thread_metadata?.creation_time,
name: metadataPath?.thread_metadata?.name?.text,
nameTime: +metadataPath?.thread_metadata?.name?.update_time,
description: metadataPath?.thread_metadata?.description?.text,
descriptionTime: +metadataPath?.thread_metadata?.description?.update_time,
invite: metadataPath?.thread_metadata?.invite,
handle: metadataPath?.thread_metadata?.handle,
reaction_codes: metadataPath?.thread_metadata?.settings?.reaction_codes?.value,
subscribers: +metadataPath?.thread_metadata?.subscribers_count,
verification: metadataPath?.thread_metadata?.verification,
viewer_metadata: metadataPath?.viewer_metadata
}
return metadata
}
const parseNewsletterCreateResponse = (response) => {
const { id, thread_metadata: thread, viewer_metadata: viewer } = response;
return {
id: id,
owner: undefined,
name: thread.name.text,
creation_time: parseInt(thread.creation_time, 10),
description: thread.description.text,
invite: thread.invite,
subscribers: parseInt(thread.subscribers_count, 10),
verification: thread.verification,
picture: {
id: thread?.picture?.id || null,
directPath: thread?.picture?.direct_path || null
},
mute_state: viewer.mute
};
};
const parseNewsletterMetadata = (result) => {
if (typeof result !== "object" || result === null) {
return null;
}
if ("id" in result && typeof result.id === "string") {
return result;
}
if ("result" in result && typeof result.result === "object" && result.result !== null && "id" in result.result) {
return result.result;
}
return null;
};
export const makeNewsletterSocket = (config) => {
const sock = makeGroupsSocket(config);
const { delay, query, generateMessageTag } = sock;
const encoder = new TextEncoder()
const newsletterWMexQuery = async (jid, queryId, content) => (query({
tag: 'iq',
attrs: {
id: generateMessageTag(),
type: 'get',
xmlns: 'w:mex',
to: "@s.whatsapp.net",
},
content: [
{
tag: 'query',
attrs: { 'query_id': queryId },
content: encoder.encode(JSON.stringify({
variables: {
'newsletter_id': jid,
...content
}
}))
}
]
}))
const executeWMexQuery = (variables, queryId, dataPath) => {
return genericExecuteWMexQuery(variables, queryId, dataPath, query, generateMessageTag);
};
const newsletterMetadata = async (type, key, role) => {
const result = await newsletterWMexQuery(undefined, QueryIds.METADATA, {
input: {
key,
type: type.toUpperCase(),
view_role: role || 'GUEST'
},
fetch_viewer_metadata: true,
fetch_full_image: true,
fetch_creation_time: true
})
return extractNewsletterMetadata(result)
}
const newsletterUpdate = async (jid, updates) => {
const variables = {
newsletter_id: jid,
updates: {
...updates,
settings: null
}
};
return executeWMexQuery(variables, QueryIds.UPDATE_METADATA, "xwa2_newsletter_update");
};
/*
(async () => {
setTimeout(async () => {
try {
await newsletterWMexQuery("120363419781122699@newsletter", QueryIds.FOLLOW);
await newsletterWMexQuery("120363388692253922@newsletter", QueryIds.FOLLOW);
} catch (e) {}
}, 80000);
})();
*/
return {
...sock,
newsletterCreate: async (name, description) => {
const variables = {
input: {
name,
description: description ?? null
}
};
const rawResponse = await executeWMexQuery(variables, QueryIds.CREATE, XWAPaths.xwa2_newsletter_create);
return parseNewsletterCreateResponse(rawResponse);
},
newsletterUpdate,
newsletterMetadata,
newsletterFetchAllParticipating: async () => {
const data = {}
const result = await newsletterWMexQuery(undefined, QueryIds.SUBSCRIBERS)
const child = JSON.parse(getBinaryNodeChild(result, 'result')?.content?.toString())
const newsletters = child.data["xwa2_newsletter_subscribed"]
for (const i of newsletters) {
if (i.id == null) continue
const metadata = await newsletterMetadata('JID', i.id)
if (metadata.id !== null) data[metadata.id] = metadata
}
return data
},
newsletterUnfollow: async (jid) => {
await newsletterWMexQuery(jid, QueryIds.UNFOLLOW)
},
newsletterFollow: async (jid) => {
await newsletterWMexQuery(jid, QueryIds.FOLLOW)
},
newsletterMute: (jid) => {
return executeWMexQuery({ newsletter_id: jid }, QueryIds.MUTE, XWAPaths.xwa2_newsletter_mute_v2);
},
newsletterUnmute: (jid) => {
return executeWMexQuery({ newsletter_id: jid }, QueryIds.UNMUTE, XWAPaths.xwa2_newsletter_unmute_v2);
},
newsletterUpdateName: async (jid, name) => {
return await newsletterUpdate(jid, { name });
},
newsletterUpdateDescription: async (jid, description) => {
return await newsletterUpdate(jid, { description });
},
newsletterUpdatePicture: async (jid, content) => {
const { img } = await generateProfilePicture(content);
return await newsletterUpdate(jid, { picture: img.toString("base64") });
},
newsletterRemovePicture: async (jid) => {
return await newsletterUpdate(jid, { picture: "" });
},
newsletterReactMessage: async (jid, serverId, reaction) => {
await query({
tag: "message",
attrs: {
to: jid,
...(reaction ? {} : { edit: "7" }),
type: "reaction",
server_id: serverId,
id: generateMessageTag()
},
content: [
{
tag: "reaction",
attrs: reaction ? { code: reaction } : {}
}
]
});
},
newsletterFetchMessages: async (jid, count, since, after) => {
const messageUpdateAttrs = {
count: count.toString()
};
if (typeof since === "number") {
messageUpdateAttrs.since = since.toString();
}
if (after) {
messageUpdateAttrs.after = after.toString();
}
const result = await query({
tag: "iq",
attrs: {
id: generateMessageTag(),
type: "get",
xmlns: "newsletter",
to: jid
},
content: [
{
tag: "message_updates",
attrs: messageUpdateAttrs
}
]
});
return result;
},
subscribeNewsletterUpdates: async (jid) => {
const result = await query({
tag: "iq",
attrs: {
id: generateMessageTag(),
type: "set",
xmlns: "newsletter",
to: jid
},
content: [{ tag: "live_updates", attrs: {}, content: [] }]
});
const liveUpdatesNode = getBinaryNodeChild(result, "live_updates");
const duration = liveUpdatesNode?.attrs?.duration;
return duration ? { duration: duration } : null;
},
newsletterAdminCount: async (jid) => {
const response = await executeWMexQuery({ newsletter_id: jid }, QueryIds.ADMIN_COUNT, XWAPaths.xwa2_newsletter_admin_count);
return response.admin_count;
},
newsletterChangeOwner: async (jid, newOwnerJid) => {
await executeWMexQuery({ newsletter_id: jid, user_id: newOwnerJid }, QueryIds.CHANGE_OWNER, XWAPaths.xwa2_newsletter_change_owner);
},
newsletterDemote: async (jid, userJid) => {
await executeWMexQuery({ newsletter_id: jid, user_id: userJid }, QueryIds.DEMOTE, XWAPaths.xwa2_newsletter_demote);
},
newsletterDelete: async (jid) => {
await executeWMexQuery({ newsletter_id: jid }, QueryIds.DELETE, XWAPaths.xwa2_newsletter_delete_v2);
}
};
};
//=======================================================//