@wirecat/whatsapp-cli 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +204 -0
- package/README.md +401 -2
- package/dist/adapter/adapter.d.ts +13 -0
- package/dist/adapter/adapter.d.ts.map +1 -0
- package/dist/adapter/adapter.js +554 -0
- package/dist/adapter/adapter.js.map +1 -0
- package/dist/adapter/channels.d.ts +43 -0
- package/dist/adapter/channels.d.ts.map +1 -0
- package/dist/adapter/channels.js +100 -0
- package/dist/adapter/channels.js.map +1 -0
- package/dist/adapter/checks.d.ts +6 -0
- package/dist/adapter/checks.d.ts.map +1 -0
- package/dist/adapter/checks.js +2 -0
- package/dist/adapter/checks.js.map +1 -0
- package/dist/adapter/errors.d.ts +13 -0
- package/dist/adapter/errors.d.ts.map +1 -0
- package/dist/adapter/errors.js +38 -0
- package/dist/adapter/errors.js.map +1 -0
- package/dist/adapter/format-markdown.d.ts +8 -0
- package/dist/adapter/format-markdown.d.ts.map +1 -0
- package/dist/adapter/format-markdown.js +80 -0
- package/dist/adapter/format-markdown.js.map +1 -0
- package/dist/adapter/groups.d.ts +25 -0
- package/dist/adapter/groups.d.ts.map +1 -0
- package/dist/adapter/groups.js +252 -0
- package/dist/adapter/groups.js.map +1 -0
- package/dist/adapter/map.d.ts +23 -0
- package/dist/adapter/map.d.ts.map +1 -0
- package/dist/adapter/map.js +121 -0
- package/dist/adapter/map.js.map +1 -0
- package/dist/adapter/pins.d.ts +11 -0
- package/dist/adapter/pins.d.ts.map +1 -0
- package/dist/adapter/pins.js +10 -0
- package/dist/adapter/pins.js.map +1 -0
- package/dist/adapter/polls.d.ts +21 -0
- package/dist/adapter/polls.d.ts.map +1 -0
- package/dist/adapter/polls.js +103 -0
- package/dist/adapter/polls.js.map +1 -0
- package/dist/adapter/privacy.d.ts +18 -0
- package/dist/adapter/privacy.d.ts.map +1 -0
- package/dist/adapter/privacy.js +94 -0
- package/dist/adapter/privacy.js.map +1 -0
- package/dist/adapter/settings.d.ts +21 -0
- package/dist/adapter/settings.d.ts.map +1 -0
- package/dist/adapter/settings.js +76 -0
- package/dist/adapter/settings.js.map +1 -0
- package/dist/app.d.ts +6 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +16 -0
- package/dist/app.js.map +1 -0
- package/dist/bin/wa.d.ts +3 -0
- package/dist/bin/wa.d.ts.map +1 -0
- package/dist/bin/wa.js +14 -0
- package/dist/bin/wa.js.map +1 -0
- package/dist/commands/session.d.ts +48 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +201 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +140 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/update.d.ts +2 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +17 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/diagnose.d.ts +77 -0
- package/dist/diagnose.d.ts.map +1 -0
- package/dist/diagnose.js +84 -0
- package/dist/diagnose.js.map +1 -0
- package/dist/engine/channels.d.ts +100 -0
- package/dist/engine/channels.d.ts.map +1 -0
- package/dist/engine/channels.js +29 -0
- package/dist/engine/channels.js.map +1 -0
- package/dist/engine/contract.d.ts +1049 -0
- package/dist/engine/contract.d.ts.map +1 -0
- package/dist/engine/contract.js +353 -0
- package/dist/engine/contract.js.map +1 -0
- package/dist/engine/events.d.ts +9 -0
- package/dist/engine/events.d.ts.map +1 -0
- package/dist/engine/events.js +23 -0
- package/dist/engine/events.js.map +1 -0
- package/dist/engine/go-engine.d.ts +23 -0
- package/dist/engine/go-engine.d.ts.map +1 -0
- package/dist/engine/go-engine.js +227 -0
- package/dist/engine/go-engine.js.map +1 -0
- package/dist/engine/groups.d.ts +171 -0
- package/dist/engine/groups.d.ts.map +1 -0
- package/dist/engine/groups.js +66 -0
- package/dist/engine/groups.js.map +1 -0
- package/dist/engine/privacy.d.ts +33 -0
- package/dist/engine/privacy.d.ts.map +1 -0
- package/dist/engine/privacy.js +23 -0
- package/dist/engine/privacy.js.map +1 -0
- package/dist/engine/settings.d.ts +45 -0
- package/dist/engine/settings.d.ts.map +1 -0
- package/dist/engine/settings.js +34 -0
- package/dist/engine/settings.js.map +1 -0
- package/dist/engine-binary.d.ts +5 -0
- package/dist/engine-binary.d.ts.map +1 -0
- package/dist/engine-binary.js +18 -0
- package/dist/engine-binary.js.map +1 -0
- package/dist/install/postinstall.d.ts +8 -0
- package/dist/install/postinstall.d.ts.map +1 -0
- package/dist/install/postinstall.js +63 -0
- package/dist/install/postinstall.js.map +1 -0
- package/dist/messenger.d.ts +63 -0
- package/dist/messenger.d.ts.map +1 -0
- package/dist/messenger.js +186 -0
- package/dist/messenger.js.map +1 -0
- package/dist/paths.d.ts +5 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +7 -0
- package/dist/paths.js.map +1 -0
- package/dist/program.d.ts +12 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +86 -0
- package/dist/program.js.map +1 -0
- package/dist/reasons.d.ts +4 -0
- package/dist/reasons.d.ts.map +1 -0
- package/dist/reasons.js +21 -0
- package/dist/reasons.js.map +1 -0
- package/dist/update.d.ts +7 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +19 -0
- package/dist/update.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/install/postinstall.mjs +3 -0
- package/install/windows.ps1 +161 -0
- package/package.json +89 -4
- package/skills/whatsapp-cli/SKILL.md +325 -0
package/dist/diagnose.js
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { accessSync, closeSync, constants, existsSync, openSync, readSync, statSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import { engineBinary } from "./engine-binary.js";
|
|
4
|
+
import { privateStore } from "./paths.js";
|
|
5
|
+
import { installer } from "./update.js";
|
|
6
|
+
const octal = (mode) => `0${mode.toString(8)}`;
|
|
7
|
+
/** Whether the engine binary is there to start — never started here. */
|
|
8
|
+
export const engineState = (env, update = {}) => {
|
|
9
|
+
const path = engineBinary(env);
|
|
10
|
+
try {
|
|
11
|
+
accessSync(path, constants.X_OK);
|
|
12
|
+
return { path, found: true };
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
const hint = installer(update) === "checkout"
|
|
16
|
+
? "build it with `pnpm engine:build`"
|
|
17
|
+
: "reinstall wa, or set WA_ENGINE to the engine's path";
|
|
18
|
+
return { path, found: false, hint };
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
/** The device keys' file modes, from `stat` alone: the keys are a credential and are never opened here. */
|
|
22
|
+
export const deviceModes = (storePath, platform = process.platform) => {
|
|
23
|
+
if (platform === "win32")
|
|
24
|
+
return { checked: false, reason: "Windows has no Unix file modes" };
|
|
25
|
+
const wanted = [
|
|
26
|
+
...[storePath, `${storePath}-wal`, `${storePath}-shm`].map((path) => [path, 0o600]),
|
|
27
|
+
[dirname(storePath), 0o700],
|
|
28
|
+
];
|
|
29
|
+
const problems = wanted.flatMap(([path, want]) => {
|
|
30
|
+
if (!existsSync(path))
|
|
31
|
+
return [];
|
|
32
|
+
const mode = statSync(path).mode & 0o777;
|
|
33
|
+
if ((mode & 0o077) === 0)
|
|
34
|
+
return [];
|
|
35
|
+
return [
|
|
36
|
+
{
|
|
37
|
+
path,
|
|
38
|
+
mode: octal(mode),
|
|
39
|
+
want: octal(want),
|
|
40
|
+
fix: `chmod ${want.toString(8)} '${path.replaceAll("'", `'\\''`)}'`,
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
});
|
|
44
|
+
return { checked: true, ok: problems.length === 0, problems };
|
|
45
|
+
};
|
|
46
|
+
const alive = (pid) => {
|
|
47
|
+
try {
|
|
48
|
+
process.kill(pid, 0);
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
return error instanceof Error && "code" in error && error.code === "EPERM";
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Who last held the device's lock, from the name the engine writes into it. The engine never clears that name, so
|
|
57
|
+
* the holder counts as running only while a process with its pid is.
|
|
58
|
+
*/
|
|
59
|
+
export const lockState = (lockPath) => {
|
|
60
|
+
if (!existsSync(lockPath))
|
|
61
|
+
return { path: lockPath, holder: null, pid: null, running: false };
|
|
62
|
+
const buffer = Buffer.alloc(200);
|
|
63
|
+
const fd = openSync(lockPath, "r");
|
|
64
|
+
let read;
|
|
65
|
+
try {
|
|
66
|
+
read = readSync(fd, buffer, 0, buffer.length, 0);
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
closeSync(fd);
|
|
70
|
+
}
|
|
71
|
+
const holder = buffer.subarray(0, read).toString("utf8").split("\n")[0]?.trim() || null;
|
|
72
|
+
const pid = Number(/\(pid (\d+)\)$/.exec(holder ?? "")?.[1]) || null;
|
|
73
|
+
return { path: lockPath, holder, pid, running: pid !== null && alive(pid) };
|
|
74
|
+
};
|
|
75
|
+
/** `doctor`'s WhatsApp block: the engine, the device keys and the lock, read from disk without starting anything. */
|
|
76
|
+
export const diagnoseWhatsApp = (profile, env, update) => {
|
|
77
|
+
const store = privateStore(profile, env);
|
|
78
|
+
return {
|
|
79
|
+
engine: engineState(env, update),
|
|
80
|
+
device: { path: store, exists: existsSync(store), files: deviceModes(store) },
|
|
81
|
+
lock: lockState(`${store}.lock`),
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=diagnose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../src/diagnose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AACpG,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,EAAE,SAAS,EAA0B,MAAM,aAAa,CAAA;AAE/D,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAA;AAEtD,wEAAwE;AACxE,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAsB,EAAE,MAAM,GAAsB,EAAE,EAAE,EAAE;IACpF,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;IAC9B,IAAI,CAAC;QACH,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAA;QAChC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,GACR,SAAS,CAAC,MAAM,CAAC,KAAK,UAAU;YAC9B,CAAC,CAAC,mCAAmC;YACrC,CAAC,CAAC,qDAAqD,CAAA;QAC3D,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IACrC,CAAC;AACH,CAAC,CAAA;AAED,2GAA2G;AAC3G,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAiB,EAAE,QAAQ,GAAoB,OAAO,CAAC,QAAQ,EAAE,EAAE;IAC7F,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gCAAgC,EAAE,CAAA;IAC7F,MAAM,MAAM,GAAuB;QACjC,GAAG,CAAC,SAAS,EAAE,GAAG,SAAS,MAAM,EAAE,GAAG,SAAS,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAoB,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;KAC5B,CAAA;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;QAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAA;QAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,CAAA;QACxC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAA;QACnC,OAAO;YACL;gBACE,IAAI;gBACJ,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;gBACjB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC;gBACjB,GAAG,EAAE,SAAS,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG;aACpE;SACF,CAAA;IACH,CAAC,CAAC,CAAA;IACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAA;AAC/D,CAAC,CAAA;AAED,MAAM,KAAK,GAAG,CAAC,GAAW,EAAW,EAAE;IACrC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAA;IAC5E,CAAC;AACH,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,EAAE;IAC5C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IAC7F,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAChC,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IAClC,IAAI,IAAY,CAAA;IAChB,IAAI,CAAC;QACH,IAAI,GAAG,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;IAClD,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAA;IACf,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAA;IACvF,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;IACpE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAA;AAC7E,CAAC,CAAA;AAED,qHAAqH;AACrH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAE,GAAsB,EAAE,MAA0B,EAAE,EAAE;IACtG,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IACxC,OAAO;QACL,MAAM,EAAE,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC;QAChC,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE;QAC7E,IAAI,EAAE,SAAS,CAAC,GAAG,KAAK,OAAO,CAAC;KACjC,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
import type { EngineRequest } from "./groups.js";
|
|
3
|
+
/**
|
|
4
|
+
* A WhatsApp channel (whatsmeow's newsletter). `chat.participants` is its follower count. `role` is the account's own
|
|
5
|
+
* in it, `""` when WhatsApp did not say; only `owner` and `admin` may post.
|
|
6
|
+
*/
|
|
7
|
+
export declare const waChannel: v.StrictObjectSchema<{
|
|
8
|
+
readonly chat: v.StrictObjectSchema<{
|
|
9
|
+
readonly jid: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
|
|
10
|
+
readonly name: v.OptionalSchema<v.NullableSchema<v.StringSchema<undefined>, undefined>, undefined>;
|
|
11
|
+
readonly kind: v.PicklistSchema<["dm", "self", "group", "newsletter", "broadcast"], undefined>;
|
|
12
|
+
readonly unread: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
|
|
13
|
+
readonly lastMessageAt: v.OptionalSchema<v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, undefined>]>, undefined>, undefined>;
|
|
14
|
+
readonly participants: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
|
|
15
|
+
readonly archived: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
16
|
+
readonly muted: v.OptionalSchema<v.BooleanSchema<undefined>, undefined>;
|
|
17
|
+
readonly parent: v.OptionalSchema<v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>, undefined>, undefined>;
|
|
18
|
+
readonly community: v.OptionalSchema<v.LiteralSchema<true, undefined>, undefined>;
|
|
19
|
+
readonly membershipState: v.OptionalSchema<v.PicklistSchema<["left", "member"], undefined>, undefined>;
|
|
20
|
+
}, undefined>;
|
|
21
|
+
readonly description: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
22
|
+
readonly link: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
23
|
+
readonly role: v.PicklistSchema<["owner", "admin", "subscriber", "guest", ""], undefined>;
|
|
24
|
+
}, undefined>;
|
|
25
|
+
/**
|
|
26
|
+
* A channel's posts read from WhatsApp's servers, oldest first or in any order. Each carries `serverId`, which the
|
|
27
|
+
* next read counts back from. No posts and `more: false` is the channel's start.
|
|
28
|
+
*/
|
|
29
|
+
export declare const waChannelPage: v.StrictObjectSchema<{
|
|
30
|
+
readonly messages: v.ArraySchema<v.StrictObjectSchema<{
|
|
31
|
+
readonly id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.NonEmptyAction<string, undefined>]>;
|
|
32
|
+
readonly chat: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>;
|
|
33
|
+
readonly sender: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IncludesAction<string, "@", undefined>]>, undefined>;
|
|
34
|
+
readonly senderName: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
35
|
+
readonly fromMe: v.BooleanSchema<undefined>;
|
|
36
|
+
readonly timestamp: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, undefined>]>;
|
|
37
|
+
readonly editedAt: v.NullableSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, undefined>]>, undefined>;
|
|
38
|
+
readonly text: v.StringSchema<undefined>;
|
|
39
|
+
readonly replyTo: v.NullableSchema<v.StringSchema<undefined>, undefined>;
|
|
40
|
+
readonly attachments: v.OptionalSchema<v.ArraySchema<v.StrictObjectSchema<{
|
|
41
|
+
readonly kind: v.PicklistSchema<["photo", "video", "voice", "audio", "document", "sticker", "location", "contact"], undefined>;
|
|
42
|
+
readonly url: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
43
|
+
readonly width: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
|
|
44
|
+
readonly height: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
|
|
45
|
+
readonly title: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
46
|
+
readonly name: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
47
|
+
readonly size: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
|
|
48
|
+
readonly mime: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
49
|
+
readonly duration: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
|
|
50
|
+
readonly ref: v.OptionalSchema<v.UnionSchema<[v.StrictObjectSchema<{
|
|
51
|
+
readonly media: v.PicklistSchema<["image", "video", "audio", "document", "sticker"], undefined>;
|
|
52
|
+
readonly directPath: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.NonEmptyAction<string, undefined>]>;
|
|
53
|
+
readonly mediaKey: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
54
|
+
readonly fileSha256: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
55
|
+
readonly fileEncSha256: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
56
|
+
readonly url: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
57
|
+
readonly mediaKeyTimestamp: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
|
|
58
|
+
}, undefined>, v.StrictObjectSchema<{
|
|
59
|
+
readonly place: v.StrictObjectSchema<{
|
|
60
|
+
readonly latitude: v.NumberSchema<undefined>;
|
|
61
|
+
readonly longitude: v.NumberSchema<undefined>;
|
|
62
|
+
readonly name: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
63
|
+
readonly address: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
64
|
+
readonly url: v.OptionalSchema<v.StringSchema<undefined>, undefined>;
|
|
65
|
+
}, undefined>;
|
|
66
|
+
}, undefined>, v.StrictObjectSchema<{
|
|
67
|
+
readonly card: v.StrictObjectSchema<{
|
|
68
|
+
readonly name: v.StringSchema<undefined>;
|
|
69
|
+
readonly vcard: v.StringSchema<undefined>;
|
|
70
|
+
}, undefined>;
|
|
71
|
+
}, undefined>], undefined>, undefined>;
|
|
72
|
+
}, undefined>, undefined>, undefined>;
|
|
73
|
+
readonly poll: v.OptionalSchema<v.StrictObjectSchema<{
|
|
74
|
+
readonly question: v.StringSchema<undefined>;
|
|
75
|
+
readonly answers: v.ArraySchema<v.StrictObjectSchema<{
|
|
76
|
+
readonly id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.NonEmptyAction<string, undefined>]>;
|
|
77
|
+
readonly text: v.StringSchema<undefined>;
|
|
78
|
+
}, undefined>, undefined>;
|
|
79
|
+
readonly multiple: v.BooleanSchema<undefined>;
|
|
80
|
+
}, undefined>, undefined>;
|
|
81
|
+
readonly starred: v.OptionalSchema<v.LiteralSchema<true, undefined>, undefined>;
|
|
82
|
+
readonly serverId: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
|
|
83
|
+
}, undefined>, undefined>;
|
|
84
|
+
readonly more: v.BooleanSchema<undefined>;
|
|
85
|
+
}, undefined>;
|
|
86
|
+
export type WaChannel = v.InferOutput<typeof waChannel>;
|
|
87
|
+
export type WaChannelPage = v.InferOutput<typeof waChannelPage>;
|
|
88
|
+
/** The most posts one read asks for; unverified against WhatsApp, whatsmeow sets no limit. */
|
|
89
|
+
export declare const CHANNEL_PAGE_MAX = 50;
|
|
90
|
+
/** The engine's channel requests. Following and unfollowing are seen by the channel's admins. */
|
|
91
|
+
export interface ChannelEngine {
|
|
92
|
+
channel(jid: string): Promise<WaChannel>;
|
|
93
|
+
/** Posts sent before the one numbered `before` on WhatsApp's servers; without it, the newest. */
|
|
94
|
+
channelMessages(jid: string, count: number, before?: number): Promise<WaChannelPage>;
|
|
95
|
+
/** By its link, `https://whatsapp.com/channel/<code>`. */
|
|
96
|
+
followChannel(link: string): Promise<WaChannel>;
|
|
97
|
+
unfollowChannel(jid: string): Promise<void>;
|
|
98
|
+
}
|
|
99
|
+
export declare const goChannels: (request: EngineRequest) => ChannelEngine;
|
|
100
|
+
//# sourceMappingURL=channels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channels.d.ts","sourceRoot":"","sources":["../../src/engine/channels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAE5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD;;;GAGG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;aAKpB,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAAsE,CAAA;AAEhG,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,SAAS,CAAC,CAAA;AACvD,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,aAAa,CAAC,CAAA;AAE/D,8FAA8F;AAC9F,eAAO,MAAM,gBAAgB,KAAK,CAAA;AAElC,iGAAiG;AACjG,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IACxC,iGAAiG;IACjG,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IACpF,0DAA0D;IAC1D,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/C,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAC5C;AAID,eAAO,MAAM,UAAU,YAAa,aAAa,KAAG,aAQlD,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as v from "valibot";
|
|
2
|
+
import { waChat, waMessage } from "./contract.js";
|
|
3
|
+
/**
|
|
4
|
+
* A WhatsApp channel (whatsmeow's newsletter). `chat.participants` is its follower count. `role` is the account's own
|
|
5
|
+
* in it, `""` when WhatsApp did not say; only `owner` and `admin` may post.
|
|
6
|
+
*/
|
|
7
|
+
export const waChannel = v.strictObject({
|
|
8
|
+
chat: waChat,
|
|
9
|
+
description: v.nullable(v.string()),
|
|
10
|
+
link: v.nullable(v.string()),
|
|
11
|
+
role: v.picklist(["owner", "admin", "subscriber", "guest", ""]),
|
|
12
|
+
});
|
|
13
|
+
/**
|
|
14
|
+
* A channel's posts read from WhatsApp's servers, oldest first or in any order. Each carries `serverId`, which the
|
|
15
|
+
* next read counts back from. No posts and `more: false` is the channel's start.
|
|
16
|
+
*/
|
|
17
|
+
export const waChannelPage = v.strictObject({ messages: v.array(waMessage), more: v.boolean() });
|
|
18
|
+
/** The most posts one read asks for; unverified against WhatsApp, whatsmeow sets no limit. */
|
|
19
|
+
export const CHANNEL_PAGE_MAX = 50;
|
|
20
|
+
const nothing = v.nullable(v.unknown());
|
|
21
|
+
export const goChannels = (request) => ({
|
|
22
|
+
channel: (jid) => request("channel", { jid }, waChannel),
|
|
23
|
+
channelMessages: (jid, count, before) => request("channelMessages", { jid, count, ...(before === undefined ? {} : { before }) }, waChannelPage),
|
|
24
|
+
followChannel: (link) => request("followChannel", { link }, waChannel),
|
|
25
|
+
unfollowChannel: async (jid) => {
|
|
26
|
+
await request("unfollowChannel", { jid }, nothing);
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=channels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channels.js","sourceRoot":"","sources":["../../src/engine/channels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAGjD;;;GAGG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,YAAY,CAAC;IACtC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACnC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;CAChE,CAAC,CAAA;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;AAKhG,8FAA8F;AAC9F,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAA;AAYlC,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA;AAEvC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,OAAsB,EAAiB,EAAE,CAAC,CAAC;IACpE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,EAAE,SAAS,CAAC;IACxD,eAAe,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CACtC,OAAO,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,aAAa,CAAC;IACxG,aAAa,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC;IACtE,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC7B,MAAM,OAAO,CAAC,iBAAiB,EAAE,EAAE,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;IACpD,CAAC;CACF,CAAC,CAAA"}
|