@wirecat/cli-core 0.264.0 → 0.265.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/dist/cli/envelope.d.ts +2 -0
- package/dist/cli/envelope.d.ts.map +1 -1
- package/dist/cli/envelope.js +2 -2
- package/dist/cli/envelope.js.map +1 -1
- package/dist/cli/list-query.d.ts +14 -2
- package/dist/cli/list-query.d.ts.map +1 -1
- package/dist/cli/list-query.js +59 -8
- package/dist/cli/list-query.js.map +1 -1
- package/dist/cli/messenger/admin-commands.d.ts.map +1 -1
- package/dist/cli/messenger/admin-commands.js +34 -46
- package/dist/cli/messenger/admin-commands.js.map +1 -1
- package/dist/cli/messenger/admin-contacts-command.d.ts.map +1 -1
- package/dist/cli/messenger/admin-contacts-command.js +7 -3
- package/dist/cli/messenger/admin-contacts-command.js.map +1 -1
- package/dist/cli/messenger/admin-folders-command.d.ts.map +1 -1
- package/dist/cli/messenger/admin-folders-command.js +21 -21
- package/dist/cli/messenger/admin-folders-command.js.map +1 -1
- package/dist/cli/messenger/admin-moderation-command.d.ts.map +1 -1
- package/dist/cli/messenger/admin-moderation-command.js +11 -13
- package/dist/cli/messenger/admin-moderation-command.js.map +1 -1
- package/dist/cli/messenger/chat-answers.d.ts +155 -0
- package/dist/cli/messenger/chat-answers.d.ts.map +1 -0
- package/dist/cli/messenger/chat-answers.js +243 -0
- package/dist/cli/messenger/chat-answers.js.map +1 -0
- package/dist/cli/messenger/chat-lists.d.ts +161 -0
- package/dist/cli/messenger/chat-lists.d.ts.map +1 -0
- package/dist/cli/messenger/chat-lists.js +82 -0
- package/dist/cli/messenger/chat-lists.js.map +1 -0
- package/dist/cli/messenger/chat-queries.d.ts +14 -0
- package/dist/cli/messenger/chat-queries.d.ts.map +1 -0
- package/dist/cli/messenger/chat-queries.js +48 -0
- package/dist/cli/messenger/chat-queries.js.map +1 -0
- package/dist/cli/messenger/chats-bots-command.d.ts.map +1 -1
- package/dist/cli/messenger/chats-bots-command.js +7 -2
- package/dist/cli/messenger/chats-bots-command.js.map +1 -1
- package/dist/cli/messenger/chats-command.d.ts.map +1 -1
- package/dist/cli/messenger/chats-command.js +33 -71
- package/dist/cli/messenger/chats-command.js.map +1 -1
- package/dist/cli/messenger/chats-documents-command.d.ts.map +1 -1
- package/dist/cli/messenger/chats-documents-command.js +10 -5
- package/dist/cli/messenger/chats-documents-command.js.map +1 -1
- package/dist/cli/messenger/chats-members-command.d.ts.map +1 -1
- package/dist/cli/messenger/chats-members-command.js +38 -64
- package/dist/cli/messenger/chats-members-command.js.map +1 -1
- package/dist/cli/messenger/chats-read-command.d.ts.map +1 -1
- package/dist/cli/messenger/chats-read-command.js +4 -2
- package/dist/cli/messenger/chats-read-command.js.map +1 -1
- package/dist/cli/messenger/chats-stats-command.d.ts.map +1 -1
- package/dist/cli/messenger/chats-stats-command.js +24 -17
- package/dist/cli/messenger/chats-stats-command.js.map +1 -1
- package/dist/cli/messenger/chats-tracking-command.d.ts.map +1 -1
- package/dist/cli/messenger/chats-tracking-command.js +11 -17
- package/dist/cli/messenger/chats-tracking-command.js.map +1 -1
- package/dist/cli/messenger/contacts-command.d.ts.map +1 -1
- package/dist/cli/messenger/contacts-command.js +61 -43
- package/dist/cli/messenger/contacts-command.js.map +1 -1
- package/dist/cli/messenger/hearing-command.d.ts +1 -1
- package/dist/cli/messenger/hearing-command.d.ts.map +1 -1
- package/dist/cli/messenger/hearing-command.js +1 -1
- package/dist/cli/messenger/hearing-command.js.map +1 -1
- package/dist/cli/messenger/history-query.d.ts +18 -0
- package/dist/cli/messenger/history-query.d.ts.map +1 -0
- package/dist/cli/messenger/history-query.js +63 -0
- package/dist/cli/messenger/history-query.js.map +1 -0
- package/dist/cli/messenger/list-query.d.ts +13 -0
- package/dist/cli/messenger/list-query.d.ts.map +1 -0
- package/dist/cli/messenger/list-query.js +23 -0
- package/dist/cli/messenger/list-query.js.map +1 -0
- package/dist/cli/messenger/message-items.d.ts +31 -0
- package/dist/cli/messenger/message-items.d.ts.map +1 -0
- package/dist/cli/messenger/message-items.js +95 -0
- package/dist/cli/messenger/message-items.js.map +1 -0
- package/dist/cli/messenger/messages-command.d.ts.map +1 -1
- package/dist/cli/messenger/messages-command.js +52 -77
- package/dist/cli/messenger/messages-command.js.map +1 -1
- package/dist/cli/messenger/messages-comments-command.d.ts.map +1 -1
- package/dist/cli/messenger/messages-comments-command.js +39 -28
- package/dist/cli/messenger/messages-comments-command.js.map +1 -1
- package/dist/cli/messenger/messages-link-command.d.ts.map +1 -1
- package/dist/cli/messenger/messages-link-command.js +16 -14
- package/dist/cli/messenger/messages-link-command.js.map +1 -1
- package/dist/cli/messenger/messages-scheduled-command.d.ts.map +1 -1
- package/dist/cli/messenger/messages-scheduled-command.js +23 -26
- package/dist/cli/messenger/messages-scheduled-command.js.map +1 -1
- package/dist/cli/messenger/people-queries.d.ts +6 -0
- package/dist/cli/messenger/people-queries.d.ts.map +1 -0
- package/dist/cli/messenger/people-queries.js +15 -0
- package/dist/cli/messenger/people-queries.js.map +1 -0
- package/dist/cli/messenger/polls-command.d.ts.map +1 -1
- package/dist/cli/messenger/polls-command.js +29 -23
- package/dist/cli/messenger/polls-command.js.map +1 -1
- package/dist/cli/messenger/reactions-command.d.ts.map +1 -1
- package/dist/cli/messenger/reactions-command.js +6 -2
- package/dist/cli/messenger/reactions-command.js.map +1 -1
- package/dist/cli/messenger/topics-command.d.ts.map +1 -1
- package/dist/cli/messenger/topics-command.js +21 -9
- package/dist/cli/messenger/topics-command.js.map +1 -1
- package/dist/cli/steps.d.ts.map +1 -1
- package/dist/cli/steps.js +24 -0
- package/dist/cli/steps.js.map +1 -1
- package/dist/entities/attachment.d.ts +6 -0
- package/dist/entities/attachment.d.ts.map +1 -1
- package/dist/entities/attachment.js +6 -0
- package/dist/entities/attachment.js.map +1 -1
- package/dist/entities/chat-event.d.ts +28 -0
- package/dist/entities/chat-event.d.ts.map +1 -0
- package/dist/entities/chat-event.js +19 -0
- package/dist/entities/chat-event.js.map +1 -0
- package/dist/entities/chat.d.ts +29 -0
- package/dist/entities/chat.d.ts.map +1 -1
- package/dist/entities/chat.js +15 -0
- package/dist/entities/chat.js.map +1 -1
- package/dist/entities/contact.d.ts +137 -0
- package/dist/entities/contact.d.ts.map +1 -1
- package/dist/entities/contact.js +6 -1
- package/dist/entities/contact.js.map +1 -1
- package/dist/entities/folder.d.ts +31 -0
- package/dist/entities/folder.d.ts.map +1 -0
- package/dist/entities/folder.js +25 -0
- package/dist/entities/folder.js.map +1 -0
- package/dist/entities/index.d.ts +364 -1
- package/dist/entities/index.d.ts.map +1 -1
- package/dist/entities/index.js +17 -1
- package/dist/entities/index.js.map +1 -1
- package/dist/entities/invite-link.d.ts +17 -0
- package/dist/entities/invite-link.d.ts.map +1 -0
- package/dist/entities/invite-link.js +18 -0
- package/dist/entities/invite-link.js.map +1 -0
- package/dist/entities/join-request.d.ts +12 -0
- package/dist/entities/join-request.d.ts.map +1 -0
- package/dist/entities/join-request.js +13 -0
- package/dist/entities/join-request.js.map +1 -0
- package/dist/entities/member.d.ts +24 -0
- package/dist/entities/member.d.ts.map +1 -0
- package/dist/entities/member.js +25 -0
- package/dist/entities/member.js.map +1 -0
- package/dist/entities/message-link.d.ts +10 -0
- package/dist/entities/message-link.d.ts.map +1 -0
- package/dist/entities/message-link.js +11 -0
- package/dist/entities/message-link.js.map +1 -0
- package/dist/entities/message.d.ts +19 -0
- package/dist/entities/message.d.ts.map +1 -1
- package/dist/entities/message.js +4 -0
- package/dist/entities/message.js.map +1 -1
- package/dist/entities/poll-vote.d.ts +11 -0
- package/dist/entities/poll-vote.d.ts.map +1 -0
- package/dist/entities/poll-vote.js +12 -0
- package/dist/entities/poll-vote.js.map +1 -0
- package/dist/entities/topic.d.ts +14 -0
- package/dist/entities/topic.d.ts.map +1 -0
- package/dist/entities/topic.js +15 -0
- package/dist/entities/topic.js.map +1 -0
- package/dist/mcp/instructions.d.ts.map +1 -1
- package/dist/mcp/instructions.js +3 -2
- package/dist/mcp/instructions.js.map +1 -1
- package/dist/mcp/tools/admin.d.ts.map +1 -1
- package/dist/mcp/tools/admin.js +41 -39
- package/dist/mcp/tools/admin.js.map +1 -1
- package/dist/mcp/tools/chats-read.d.ts.map +1 -1
- package/dist/mcp/tools/chats-read.js +4 -2
- package/dist/mcp/tools/chats-read.js.map +1 -1
- package/dist/mcp/tools/chats.d.ts.map +1 -1
- package/dist/mcp/tools/chats.js +77 -84
- package/dist/mcp/tools/chats.js.map +1 -1
- package/dist/mcp/tools/contacts-write.d.ts.map +1 -1
- package/dist/mcp/tools/contacts-write.js +4 -2
- package/dist/mcp/tools/contacts-write.js.map +1 -1
- package/dist/mcp/tools/contacts.d.ts.map +1 -1
- package/dist/mcp/tools/contacts.js +55 -30
- package/dist/mcp/tools/contacts.js.map +1 -1
- package/dist/mcp/tools/folders.d.ts.map +1 -1
- package/dist/mcp/tools/folders.js +12 -11
- package/dist/mcp/tools/folders.js.map +1 -1
- package/dist/mcp/tools/messages.d.ts.map +1 -1
- package/dist/mcp/tools/messages.js +74 -59
- package/dist/mcp/tools/messages.js.map +1 -1
- package/dist/mcp/tools/moderation.d.ts.map +1 -1
- package/dist/mcp/tools/moderation.js +5 -3
- package/dist/mcp/tools/moderation.js.map +1 -1
- package/dist/mcp/tools/polls.d.ts.map +1 -1
- package/dist/mcp/tools/polls.js +31 -14
- package/dist/mcp/tools/polls.js.map +1 -1
- package/dist/mcp/tools/reactions.d.ts.map +1 -1
- package/dist/mcp/tools/reactions.js +4 -2
- package/dist/mcp/tools/reactions.js.map +1 -1
- package/dist/mcp/tools/topics.d.ts.map +1 -1
- package/dist/mcp/tools/topics.js +30 -20
- package/dist/mcp/tools/topics.js.map +1 -1
- package/dist/services/admin.js +2 -2
- package/dist/services/admin.js.map +1 -1
- package/dist/services/chats.d.ts +6 -20
- package/dist/services/chats.d.ts.map +1 -1
- package/dist/services/chats.js +6 -43
- package/dist/services/chats.js.map +1 -1
- package/dist/services/document-pictures.d.ts +26 -0
- package/dist/services/document-pictures.d.ts.map +1 -0
- package/dist/services/document-pictures.js +37 -0
- package/dist/services/document-pictures.js.map +1 -0
- package/dist/services/index.d.ts +3 -2
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +2 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/messages.d.ts +2 -0
- package/dist/services/messages.d.ts.map +1 -1
- package/dist/services/messages.js +1 -0
- package/dist/services/messages.js.map +1 -1
- package/dist/services/notes-search.d.ts +14 -1
- package/dist/services/notes-search.d.ts.map +1 -1
- package/dist/services/notes-search.js +46 -1
- package/dist/services/notes-search.js.map +1 -1
- package/dist/services/people.d.ts +1 -1
- package/dist/services/people.d.ts.map +1 -1
- package/dist/services/people.js +0 -18
- package/dist/services/people.js.map +1 -1
- package/dist/speech/hearing.d.ts +3 -0
- package/dist/speech/hearing.d.ts.map +1 -1
- package/dist/speech/hearing.js +16 -0
- package/dist/speech/hearing.js.map +1 -1
- package/dist/store/sqlite/document-pictures.d.ts +29 -0
- package/dist/store/sqlite/document-pictures.d.ts.map +1 -0
- package/dist/store/sqlite/document-pictures.js +81 -0
- package/dist/store/sqlite/document-pictures.js.map +1 -0
- package/dist/store/sqlite/entity-types.d.ts +1 -0
- package/dist/store/sqlite/entity-types.d.ts.map +1 -1
- package/dist/store/sqlite/entity-types.js +1 -0
- package/dist/store/sqlite/entity-types.js.map +1 -1
- package/dist/store/sqlite/note-index.d.ts.map +1 -1
- package/dist/store/sqlite/note-index.js +3 -0
- package/dist/store/sqlite/note-index.js.map +1 -1
- package/dist/store/sqlite/note-search.d.ts +2 -1
- package/dist/store/sqlite/note-search.d.ts.map +1 -1
- package/dist/store/sqlite/note-search.js +2 -0
- package/dist/store/sqlite/note-search.js.map +1 -1
- package/package.json +1 -1
- package/parity.json +10 -77
- package/dist/cli/messenger/after.d.ts +0 -20
- package/dist/cli/messenger/after.d.ts.map +0 -1
- package/dist/cli/messenger/after.js +0 -27
- package/dist/cli/messenger/after.js.map +0 -1
|
@@ -2,10 +2,11 @@ import { CliError } from "@wirecat/cli-base";
|
|
|
2
2
|
import { annotate } from "@wirecat/cli-base/commands";
|
|
3
3
|
import { Command } from "commander";
|
|
4
4
|
import { FOLDER_KINDS, FOLDER_SKIPS } from "../../domain/models.js";
|
|
5
|
-
import {
|
|
5
|
+
import { itemOf, renderAnswer } from "../envelope.js";
|
|
6
|
+
import { folderAnswer, lines, renderItem, wholeList } from "./chat-answers.js";
|
|
6
7
|
import { messengerContext } from "./context.js";
|
|
7
8
|
const collect = (value, previous = []) => [...previous, value];
|
|
8
|
-
const
|
|
9
|
+
const wordsOf = (flag, allowed) => (value) => {
|
|
9
10
|
if (value.trim() === "none")
|
|
10
11
|
return [];
|
|
11
12
|
const words = value.split(",").map((one) => one.trim());
|
|
@@ -20,8 +21,8 @@ const withRules = (command, messenger, replaces) => {
|
|
|
20
21
|
return command;
|
|
21
22
|
const set = replaces ? "; replaces what it had, none clears it" : "";
|
|
22
23
|
return command
|
|
23
|
-
.option("--include <kinds>", `every chat of these kinds: ${FOLDER_KINDS.join(", ")}${set}`,
|
|
24
|
-
.option("--skip <which>", `leave out chats that are ${FOLDER_SKIPS.join(", ")}${set}`,
|
|
24
|
+
.option("--include <kinds>", `every chat of these kinds: ${FOLDER_KINDS.join(", ")}${set}`, wordsOf("--include", FOLDER_KINDS))
|
|
25
|
+
.option("--skip <which>", `leave out chats that are ${FOLDER_SKIPS.join(", ")}${set}`, wordsOf("--skip", FOLDER_SKIPS))
|
|
25
26
|
.option("--exclude-chat <chat>", "never show this chat in it; repeat it for more", collect)
|
|
26
27
|
.option("--pin <chat>", "pin this chat at the top of the folder; repeat it for more", collect)
|
|
27
28
|
.option("--emoji <emoji>", "the folder's icon");
|
|
@@ -39,21 +40,20 @@ const rulesOf = (command) => {
|
|
|
39
40
|
/** `chats folders …`, in max-cli's words. */
|
|
40
41
|
export const foldersCommand = (messenger) => {
|
|
41
42
|
const folders = new Command("folders").description("your chat folders");
|
|
42
|
-
folders
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
.action(async function () {
|
|
43
|
+
folders.addCommand(annotate(new Command("list").description("your chat folders, in the order the app shows them"), {
|
|
44
|
+
output: { entity: "folder" },
|
|
45
|
+
}).action(async function () {
|
|
46
46
|
const context = messengerContext(this, messenger);
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
const found = await context.withServices((services) => services.folders.list());
|
|
48
|
+
renderAnswer(this, context, wholeList("chats folders list", found.map(folderAnswer)), lines(({ id, title, emoji, chat_ids }) => [id, emoji ?? "", title, `${chat_ids.length} chats`].join(" ")));
|
|
49
|
+
}));
|
|
50
|
+
folders.addCommand(annotate(new Command("show")
|
|
51
51
|
.description("one chat folder, with the names of the chats in it")
|
|
52
|
-
.argument("<folder>", "the folder's id, or its title exactly")
|
|
53
|
-
.action(async function (folder) {
|
|
52
|
+
.argument("<folder>", "the folder's id, or its title exactly"), { output: { entity: "folder" } }).action(async function (folder) {
|
|
54
53
|
const context = messengerContext(this, messenger);
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
const found = await context.withServices((services) => services.folders.show(folder));
|
|
55
|
+
renderAnswer(this, context, itemOf(folderAnswer(found)));
|
|
56
|
+
}));
|
|
57
57
|
folders.addCommand(withRules(annotate(new Command("create"), { mutates: true })
|
|
58
58
|
.description("create a chat folder")
|
|
59
59
|
.argument("<title>", "the folder's name; the app may refuse a long one")
|
|
@@ -61,7 +61,7 @@ export const foldersCommand = (messenger) => {
|
|
|
61
61
|
const context = messengerContext(this, messenger);
|
|
62
62
|
const { chat = [] } = this.opts();
|
|
63
63
|
const rules = rulesOf(this);
|
|
64
|
-
context
|
|
64
|
+
renderItem(this, context, await context.withServices((services) => services.folders.create(title, chat, rules)));
|
|
65
65
|
}));
|
|
66
66
|
folders.addCommand(withRules(annotate(new Command("update"), { mutates: true })
|
|
67
67
|
.description("rename a folder, or change which chats are in it")
|
|
@@ -77,14 +77,14 @@ export const foldersCommand = (messenger) => {
|
|
|
77
77
|
...(remove === undefined ? {} : { remove }),
|
|
78
78
|
...rulesOf(this),
|
|
79
79
|
};
|
|
80
|
-
context
|
|
80
|
+
renderItem(this, context, await context.withServices((services) => services.folders.update(folder, edit)));
|
|
81
81
|
}));
|
|
82
82
|
folders.addCommand(annotate(new Command("delete"), { mutates: true })
|
|
83
83
|
.description("delete a folder; the chats in it stay")
|
|
84
84
|
.argument("<folder>", "folder id, or its title exactly")
|
|
85
85
|
.action(async function (folder) {
|
|
86
86
|
const context = messengerContext(this, messenger);
|
|
87
|
-
context
|
|
87
|
+
renderItem(this, context, await context.withServices((services) => services.folders.delete(folder)));
|
|
88
88
|
}));
|
|
89
89
|
if (messenger.folderOrder !== false)
|
|
90
90
|
folders.addCommand(annotate(new Command("order"), { mutates: true })
|
|
@@ -92,7 +92,7 @@ export const foldersCommand = (messenger) => {
|
|
|
92
92
|
.argument("<folders...>", "folder ids, or titles exactly, first one first")
|
|
93
93
|
.action(async function (typed) {
|
|
94
94
|
const context = messengerContext(this, messenger);
|
|
95
|
-
context
|
|
95
|
+
renderItem(this, context, await context.withServices((services) => services.folders.order(typed)));
|
|
96
96
|
}));
|
|
97
97
|
if (messenger.folderJoin !== false)
|
|
98
98
|
folders.addCommand(annotate(new Command("join"), { mutates: true })
|
|
@@ -100,7 +100,7 @@ export const foldersCommand = (messenger) => {
|
|
|
100
100
|
.argument("<link>", "the folder's link, as t.me/addlist/…")
|
|
101
101
|
.action(async function (link) {
|
|
102
102
|
const context = messengerContext(this, messenger);
|
|
103
|
-
context
|
|
103
|
+
renderItem(this, context, await context.withServices((services) => services.folders.join(link)));
|
|
104
104
|
}));
|
|
105
105
|
return folders;
|
|
106
106
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-folders-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/admin-folders-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAEnE,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"admin-folders-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/admin-folders-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-moderation-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/admin-moderation-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"admin-moderation-command.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/admin-moderation-command.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAOnC,OAAO,EAAE,KAAK,SAAS,EAAoB,MAAM,cAAc,CAAA;AAE/D,gIAAgI;AAChI,eAAO,MAAM,YAAY,cAAe,SAAS,KAAG,OAkCnD,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,cAAe,SAAS,KAAG,OA4CjD,CAAA"}
|
|
@@ -4,7 +4,9 @@ import { Command } from "commander";
|
|
|
4
4
|
import { describe, MAX_ACTIONS } from "../../moderation/check.js";
|
|
5
5
|
import { RULE_KEYS } from "../../moderation/rules.js";
|
|
6
6
|
import { momentOf } from "../../services/moment.js";
|
|
7
|
+
import { itemOf, renderAnswer } from "../envelope.js";
|
|
7
8
|
import { answerOf } from "./ask.js";
|
|
9
|
+
import { renderItem, snakeKeys } from "./chat-answers.js";
|
|
8
10
|
import { messengerContext } from "./context.js";
|
|
9
11
|
/** `chats rules show|set|unset`: the rules live in a file of this profile, and only the chat's id is asked of the messenger. */
|
|
10
12
|
export const rulesCommand = (messenger) => {
|
|
@@ -15,7 +17,7 @@ export const rulesCommand = (messenger) => {
|
|
|
15
17
|
.argument("<chat>", messenger.chatArgument)
|
|
16
18
|
.action(async function (chat) {
|
|
17
19
|
const context = messengerContext(this, messenger);
|
|
18
|
-
context
|
|
20
|
+
renderItem(this, context, await context.withServices((services) => services.moderation.rules(chat)));
|
|
19
21
|
});
|
|
20
22
|
rules.addCommand(annotate(new Command("set"), { mutates: true, local: true })
|
|
21
23
|
.description("change one rule; the group's first change writes every rule with its default")
|
|
@@ -24,7 +26,7 @@ export const rulesCommand = (messenger) => {
|
|
|
24
26
|
.argument("<value>", "the new value; a list is comma-separated")
|
|
25
27
|
.action(async function (chat, key, value) {
|
|
26
28
|
const context = messengerContext(this, messenger);
|
|
27
|
-
context
|
|
29
|
+
renderItem(this, context, await context.withServices((services) => services.moderation.set(chat, key, value)));
|
|
28
30
|
}));
|
|
29
31
|
rules.addCommand(annotate(new Command("unset"), { mutates: true, local: true })
|
|
30
32
|
.description("put one rule back to its default")
|
|
@@ -32,7 +34,7 @@ export const rulesCommand = (messenger) => {
|
|
|
32
34
|
.argument("<key>", `one of: ${RULE_KEYS.join(", ")}`)
|
|
33
35
|
.action(async function (chat, key) {
|
|
34
36
|
const context = messengerContext(this, messenger);
|
|
35
|
-
context
|
|
37
|
+
renderItem(this, context, await context.withServices((services) => services.moderation.unset(chat, key)));
|
|
36
38
|
}));
|
|
37
39
|
return rules;
|
|
38
40
|
};
|
|
@@ -67,16 +69,12 @@ export const moderateCommand = (messenger) => annotate(new Command("moderate"),
|
|
|
67
69
|
return /^\s*y(es)?\s*$/i.test(answer);
|
|
68
70
|
},
|
|
69
71
|
}));
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
outcome: row.outcome,
|
|
77
|
-
...(row.reason ? { why: row.reason } : {}),
|
|
78
|
-
}))
|
|
79
|
-
: { chatId, rows });
|
|
72
|
+
renderAnswer(this, context, itemOf(snakeKeys({ chatId, rows })), () => rows
|
|
73
|
+
.map((row) => [row.kind, row.personName ?? row.personId, row.rule, row.action, row.outcome, row.reason ?? ""]
|
|
74
|
+
.join(" ")
|
|
75
|
+
.trimEnd())
|
|
76
|
+
.map((line) => `${line}\n`)
|
|
77
|
+
.join(""));
|
|
80
78
|
for (const note of notes)
|
|
81
79
|
context.renderer.note(note);
|
|
82
80
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-moderation-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/admin-moderation-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnC,OAAO,EAAkB,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/D,gIAAgI;AAChI,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,SAAoB,EAAW,EAAE;IAC5D,MAAM,KAAK,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAC5C,yEAAyE,CAC1E,CAAA;IACD,KAAK;SACF,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,uEAAuE,CAAC;SACpF,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,YAAY,CAAC;SAC1C,MAAM,CAAC,KAAK,WAA0B,IAAY;QACjD,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;QACjD,
|
|
1
|
+
{"version":3,"file":"admin-moderation-command.js","sourceRoot":"","sources":["../../../src/cli/messenger/admin-moderation-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { type QueryAst } from "@wirecat/cli-base/query";
|
|
2
|
+
import type { NextStep } from "@wirecat/cli-base/standards";
|
|
3
|
+
import type { Command } from "commander";
|
|
4
|
+
import type * as v from "valibot";
|
|
5
|
+
import type { Chat, ChatCard, ChatEvent, Contact, Folder, GroupMember, GroupSettings, InviteLink, JoinRequest, Member, PersonCard, PollVote, Topic } from "../../domain/models.js";
|
|
6
|
+
import type { chatEvent as chatEventSchema, chat as chatSchema, contact as contactSchema, folder as folderSchema, inviteLink as inviteLinkSchema, joinRequest as joinRequestSchema, member as memberSchema, pollVote as pollVoteSchema, topic as topicSchema } from "../../entities/index.js";
|
|
7
|
+
import type { ChatDocument } from "../../services/chat-documents.js";
|
|
8
|
+
import type { FolderShown } from "../../services/folders.js";
|
|
9
|
+
import type { MemberEvent } from "../../services/member-history.js";
|
|
10
|
+
import { type AuditedMember, type MembersAudit } from "../../services/members-audit.js";
|
|
11
|
+
import type { AccountKey } from "../../store/store.js";
|
|
12
|
+
import { type AnswerOutput, type ListInput } from "../envelope.js";
|
|
13
|
+
type Out<T extends v.GenericSchema> = v.InferOutput<T>;
|
|
14
|
+
/**
|
|
15
|
+
* An answer that has no entity yet — a write's receipt, a count — with snake_case keys, nested ones too.
|
|
16
|
+
* Only for records whose keys are field names, never for one keyed by data.
|
|
17
|
+
*/
|
|
18
|
+
export declare const snakeKeys: (value: unknown) => unknown;
|
|
19
|
+
export declare const chatRef: (account: AccountKey, chat: string) => string;
|
|
20
|
+
type ShownChat = Chat & Partial<Pick<ChatCard, "members">> & {
|
|
21
|
+
description?: string | null;
|
|
22
|
+
link?: string | null;
|
|
23
|
+
settings?: GroupSettings;
|
|
24
|
+
};
|
|
25
|
+
export declare const chatAnswer: (account: AccountKey, chat: ShownChat) => Out<typeof chatSchema>;
|
|
26
|
+
export declare const memberAnswer: (member: Member | GroupMember | AuditedMember) => Out<typeof memberSchema>;
|
|
27
|
+
export declare const contactRef: (provider: string, id: string) => string;
|
|
28
|
+
export declare const contactAnswer: (account: AccountKey, contact: Contact | PersonCard) => Out<typeof contactSchema>;
|
|
29
|
+
export declare const chatEventAnswer: (chatId: string, event: ChatEvent) => Out<typeof chatEventSchema>;
|
|
30
|
+
export declare const memberEventAnswer: (chatId: string, event: MemberEvent) => Out<typeof chatEventSchema>;
|
|
31
|
+
export declare const inviteLinkAnswer: (link: InviteLink) => Out<typeof inviteLinkSchema>;
|
|
32
|
+
export declare const joinRequestAnswer: (request: JoinRequest) => Out<typeof joinRequestSchema>;
|
|
33
|
+
export declare const pollVoteAnswer: (vote: PollVote) => Out<typeof pollVoteSchema>;
|
|
34
|
+
export declare const topicAnswer: (topic: Topic) => Out<typeof topicSchema>;
|
|
35
|
+
export declare const folderAnswer: (folder: Folder | FolderShown) => Out<typeof folderSchema>;
|
|
36
|
+
/** A person's view of a list: one line per item. */
|
|
37
|
+
export declare const lines: <T>(line: (item: T) => string) => (body: {
|
|
38
|
+
items?: T[];
|
|
39
|
+
item?: T;
|
|
40
|
+
}) => string;
|
|
41
|
+
/** `limit` and `page` of a list paged by `--page`; `--all` is one page holding everything. */
|
|
42
|
+
export declare const pageOf: ({ limit, page, all }: {
|
|
43
|
+
limit: number;
|
|
44
|
+
page: number;
|
|
45
|
+
all?: boolean;
|
|
46
|
+
}, { items, hasMore }: {
|
|
47
|
+
items: readonly unknown[];
|
|
48
|
+
hasMore: boolean;
|
|
49
|
+
}) => {
|
|
50
|
+
limit: number;
|
|
51
|
+
has_more: boolean;
|
|
52
|
+
page: number;
|
|
53
|
+
};
|
|
54
|
+
/** A list read whole, in one page. */
|
|
55
|
+
export declare const wholeList: <T>(command: string, items: T[], extra?: Pick<ListInput<T>, "next" | "missing" | "meta">) => import("../envelope.js").ListBody<T>;
|
|
56
|
+
/** `chats show`: the chat, and where its member list is shorter than its own count, the command that lists them all. */
|
|
57
|
+
export declare const chatShown: (account: AccountKey, card: Parameters<typeof chatAnswer>[1]) => import("../envelope.js").ItemBody<{
|
|
58
|
+
ref: string;
|
|
59
|
+
id: string;
|
|
60
|
+
provider?: string | undefined;
|
|
61
|
+
account?: string | undefined;
|
|
62
|
+
title: string | null;
|
|
63
|
+
kind: "channel" | "dialog" | "group" | "saved" | "unknown";
|
|
64
|
+
unread_count: number | null;
|
|
65
|
+
unread_mentions?: number | undefined;
|
|
66
|
+
last_message_at: string | null;
|
|
67
|
+
participants_count: number | null;
|
|
68
|
+
muted?: boolean | undefined;
|
|
69
|
+
archived?: boolean | undefined;
|
|
70
|
+
membership_state?: "archived" | "external" | "imported" | "joined" | "left" | "public" | undefined;
|
|
71
|
+
parent_chat_id?: string | undefined;
|
|
72
|
+
scope?: "personal" | "work" | undefined;
|
|
73
|
+
provider_metadata?: {
|
|
74
|
+
[x: string]: unknown;
|
|
75
|
+
} | undefined;
|
|
76
|
+
description?: string | null | undefined;
|
|
77
|
+
invite_link?: string | null | undefined;
|
|
78
|
+
settings?: {
|
|
79
|
+
all_can_pin?: boolean | null | undefined;
|
|
80
|
+
only_admins_add?: boolean | null | undefined;
|
|
81
|
+
only_admins_call?: boolean | null | undefined;
|
|
82
|
+
only_owner_edits_info?: boolean | null | undefined;
|
|
83
|
+
members_see_link?: boolean | null | undefined;
|
|
84
|
+
join_approval?: boolean | null | undefined;
|
|
85
|
+
} | undefined;
|
|
86
|
+
members?: {
|
|
87
|
+
id: string;
|
|
88
|
+
name: string | null;
|
|
89
|
+
username: string | null;
|
|
90
|
+
role?: "admin" | "member" | "owner" | undefined;
|
|
91
|
+
last_seen_at?: string | null | undefined;
|
|
92
|
+
registered_at?: string | null | undefined;
|
|
93
|
+
joined_at?: string | null | undefined;
|
|
94
|
+
invited_by?: string | null | undefined;
|
|
95
|
+
is_bot?: boolean | undefined;
|
|
96
|
+
deleted?: boolean | undefined;
|
|
97
|
+
flagged?: "fake" | "scam" | undefined;
|
|
98
|
+
has_photo?: boolean | undefined;
|
|
99
|
+
score?: number | undefined;
|
|
100
|
+
reasons?: string[] | undefined;
|
|
101
|
+
check?: {
|
|
102
|
+
[x: string]: unknown;
|
|
103
|
+
} | undefined;
|
|
104
|
+
}[] | null | undefined;
|
|
105
|
+
}>;
|
|
106
|
+
/** The lowest score `score>=n` asks for; the audit's own floor when the query names none. */
|
|
107
|
+
export declare const scoreFloor: (ast: QueryAst | undefined) => number;
|
|
108
|
+
export declare const auditAnswer: (audit: MembersAudit) => import("../envelope.js").ListBody<{
|
|
109
|
+
id: string;
|
|
110
|
+
name: string | null;
|
|
111
|
+
username: string | null;
|
|
112
|
+
role?: "admin" | "member" | "owner" | undefined;
|
|
113
|
+
last_seen_at?: string | null | undefined;
|
|
114
|
+
registered_at?: string | null | undefined;
|
|
115
|
+
joined_at?: string | null | undefined;
|
|
116
|
+
invited_by?: string | null | undefined;
|
|
117
|
+
is_bot?: boolean | undefined;
|
|
118
|
+
deleted?: boolean | undefined;
|
|
119
|
+
flagged?: "fake" | "scam" | undefined;
|
|
120
|
+
has_photo?: boolean | undefined;
|
|
121
|
+
score?: number | undefined;
|
|
122
|
+
reasons?: string[] | undefined;
|
|
123
|
+
check?: {
|
|
124
|
+
[x: string]: unknown;
|
|
125
|
+
} | undefined;
|
|
126
|
+
}>;
|
|
127
|
+
/** An answer with no entity yet: the item as it is, its keys in snake_case. */
|
|
128
|
+
export declare const renderItem: (command: Command, output: AnswerOutput, value: unknown, next?: NextStep[]) => void;
|
|
129
|
+
/**
|
|
130
|
+
* `--limit` and `--page` for a list whose source takes a count but no offset: page n reads n pages and shows
|
|
131
|
+
* the last, so the step to the next page is honest.
|
|
132
|
+
*/
|
|
133
|
+
export declare const withPage: (command: Command) => Command;
|
|
134
|
+
export declare const pageOfRead: ({ hasMore }: {
|
|
135
|
+
hasMore: boolean;
|
|
136
|
+
}, limit: number, page: number) => {
|
|
137
|
+
limit: number;
|
|
138
|
+
has_more: boolean;
|
|
139
|
+
page: number;
|
|
140
|
+
};
|
|
141
|
+
/** A document link in a chat's stored messages; `ref` is the message's locator. */
|
|
142
|
+
export declare const documentLinkAnswer: ({ url, documentId, title, inStore, locator, sentAt, sender }: ChatDocument) => {
|
|
143
|
+
url: string;
|
|
144
|
+
document_id: string | null;
|
|
145
|
+
title: string | null;
|
|
146
|
+
in_store: boolean;
|
|
147
|
+
ref: string;
|
|
148
|
+
sent_at: string;
|
|
149
|
+
sender: {
|
|
150
|
+
id: import("../../domain/models.js").Id | null;
|
|
151
|
+
name: string | null;
|
|
152
|
+
};
|
|
153
|
+
};
|
|
154
|
+
export {};
|
|
155
|
+
//# sourceMappingURL=chat-answers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-answers.d.ts","sourceRoot":"","sources":["../../../src/cli/messenger/chat-answers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAc,MAAM,yBAAyB,CAAA;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,KAAK,KAAK,CAAC,MAAM,SAAS,CAAA;AACjC,OAAO,KAAK,EACV,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,OAAO,EACP,MAAM,EACN,WAAW,EACX,aAAa,EACb,UAAU,EACV,WAAW,EACX,MAAM,EACN,UAAU,EACV,QAAQ,EACR,KAAK,EACN,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EACV,SAAS,IAAI,eAAe,EAC5B,IAAI,IAAI,UAAU,EAClB,OAAO,IAAI,aAAa,EACxB,MAAM,IAAI,YAAY,EACtB,UAAU,IAAI,gBAAgB,EAC9B,WAAW,IAAI,iBAAiB,EAChC,MAAM,IAAI,YAAY,EACtB,QAAQ,IAAI,cAAc,EAC1B,KAAK,IAAI,WAAW,EACrB,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAmB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,iCAAiC,CAAA;AACxG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,KAAK,YAAY,EAAU,KAAK,SAAS,EAAwB,MAAM,gBAAgB,CAAA;AAKhG,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;AAItD;;;GAGG;AACH,eAAO,MAAM,SAAS,UAAW,OAAO,KAAG,OAM1C,CAAA;AAKD,eAAO,MAAM,OAAO,YAAa,UAAU,QAAQ,MAAM,KAAG,MACmC,CAAA;AAY/F,KAAK,SAAS,GAAG,IAAI,GACnB,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,GAAG;IACnC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,CAAC,EAAE,aAAa,CAAA;CACzB,CAAA;AAEH,eAAO,MAAM,UAAU,YAAa,UAAU,QAAQ,SAAS,KAAG,GAAG,CAAC,OAAO,UAAU,CAoBnF,CAAA;AAEJ,eAAO,MAAM,YAAY,WAAY,MAAM,GAAG,WAAW,GAAG,aAAa,KAAG,GAAG,CAAC,OAAO,YAAY,CAmBlG,CAAA;AAED,eAAO,MAAM,UAAU,aAAc,MAAM,MAAM,MAAM,KAAG,MAA4D,CAAA;AAEtH,eAAO,MAAM,aAAa,YAAa,UAAU,WAAW,OAAO,GAAG,UAAU,KAAG,GAAG,CAAC,OAAO,aAAa,CA0B1G,CAAA;AAED,eAAO,MAAM,eAAe,WAAY,MAAM,SAAS,SAAS,KAAG,GAAG,CAAC,OAAO,eAAe,CASzF,CAAA;AAIJ,eAAO,MAAM,iBAAiB,WAAY,MAAM,SAAS,WAAW,KAAG,GAAG,CAAC,OAAO,eAAe,CAQ7F,CAAA;AAEJ,eAAO,MAAM,gBAAgB,SAAU,UAAU,KAAG,GAAG,CAAC,OAAO,gBAAgB,CAU3E,CAAA;AAEJ,eAAO,MAAM,iBAAiB,YAAa,WAAW,KAAG,GAAG,CAAC,OAAO,iBAAiB,CAOjF,CAAA;AAEJ,eAAO,MAAM,cAAc,SAAU,QAAQ,KAAG,GAAG,CAAC,OAAO,cAAc,CAMvE,CAAA;AAEF,eAAO,MAAM,WAAW,UAAW,KAAK,KAAG,GAAG,CAAC,OAAO,WAAW,CAU7D,CAAA;AAEJ,eAAO,MAAM,YAAY,WAAY,MAAM,GAAG,WAAW,KAAG,GAAG,CAAC,OAAO,YAAY,CAgBlF,CAAA;AAED,oDAAoD;AACpD,eAAO,MAAM,KAAK,GACf,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,YACtB;IAAE,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,CAAC,CAAA;CAAE,KAAG,MAC+E,CAAA;AAEpH,8FAA8F;AAC9F,eAAO,MAAM,MAAM,yBACK;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,sBAChD;IAAE,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE;;;;CAC2C,CAAA;AAEhH,sCAAsC;AACtC,eAAO,MAAM,SAAS,GAAI,CAAC,WAChB,MAAM,SACR,CAAC,EAAE,UACH,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAC,yCACoC,CAAA;AAE5F,wHAAwH;AACxH,eAAO,MAAM,SAAS,YAAa,UAAU,QAAQ,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBpF,CAAA;AAED,6FAA6F;AAC7F,eAAO,MAAM,UAAU,QAAS,QAAQ,GAAG,SAAS,KAAG,MAWtD,CAAA;AAED,eAAO,MAAM,WAAW,UAAW,YAAY;;;;;;;;;;;;;;;;;;EAe3C,CAAA;AAEJ,+EAA+E;AAC/E,eAAO,MAAM,UAAU,YAAa,OAAO,UAAU,YAAY,SAAS,OAAO,SAAQ,QAAQ,EAAE,KAAQ,IACxC,CAAA;AAEnE;;;GAGG;AACH,eAAO,MAAM,QAAQ,YAAa,OAAO,KAAG,OAGmC,CAAA;AAE/E,eAAO,MAAM,UAAU,gBAAiB;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,SAAS,MAAM,QAAQ,MAAM;;;;CAIvF,CAAA;AAEF,mFAAmF;AACnF,eAAO,MAAM,kBAAkB,iEAAkE,YAAY;;;;;;;;;;;CAQ3G,CAAA"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { queryError } from "@wirecat/cli-base/query";
|
|
2
|
+
import { formatReference } from "../../domain/references.js";
|
|
3
|
+
import { AUDIT_MIN_SCORE } from "../../services/members-audit.js";
|
|
4
|
+
import { itemOf, listOf, renderAnswer } from "../envelope.js";
|
|
5
|
+
import { LIST_QUERY_GUIDE, nativeTerms } from "../list-query.js";
|
|
6
|
+
import { positiveCount } from "../paging.js";
|
|
7
|
+
import { nextStep } from "../steps.js";
|
|
8
|
+
const snake = (key) => key.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
|
|
9
|
+
/**
|
|
10
|
+
* An answer that has no entity yet — a write's receipt, a count — with snake_case keys, nested ones too.
|
|
11
|
+
* Only for records whose keys are field names, never for one keyed by data.
|
|
12
|
+
*/
|
|
13
|
+
export const snakeKeys = (value) => {
|
|
14
|
+
if (Array.isArray(value))
|
|
15
|
+
return value.map(snakeKeys);
|
|
16
|
+
if (value === null || typeof value !== "object" || value.constructor !== Object)
|
|
17
|
+
return value;
|
|
18
|
+
return Object.fromEntries(Object.entries(value).flatMap(([key, inner]) => (inner === undefined ? [] : [[snake(key), snakeKeys(inner)]])));
|
|
19
|
+
};
|
|
20
|
+
const defined = (record) => Object.fromEntries(Object.entries(record).filter(([, value]) => value !== undefined));
|
|
21
|
+
export const chatRef = (account, chat) => formatReference({ type: "chat", provider: account.provider, account: account.account, chat });
|
|
22
|
+
const settingsOf = (settings) => defined({
|
|
23
|
+
all_can_pin: settings.allCanPin,
|
|
24
|
+
only_admins_add: settings.onlyAdminsAdd,
|
|
25
|
+
only_admins_call: settings.onlyAdminsCall,
|
|
26
|
+
only_owner_edits_info: settings.onlyOwnerEditsInfo,
|
|
27
|
+
members_see_link: settings.membersSeeLink,
|
|
28
|
+
join_approval: settings.joinApproval,
|
|
29
|
+
});
|
|
30
|
+
export const chatAnswer = (account, chat) => defined({
|
|
31
|
+
ref: chatRef(account, chat.id),
|
|
32
|
+
id: chat.id,
|
|
33
|
+
title: chat.title,
|
|
34
|
+
kind: chat.kind,
|
|
35
|
+
unread_count: chat.unreadCount,
|
|
36
|
+
unread_mentions: chat.unreadMentions,
|
|
37
|
+
last_message_at: chat.lastMessageAt,
|
|
38
|
+
participants_count: chat.participantsCount,
|
|
39
|
+
muted: chat.muted,
|
|
40
|
+
archived: chat.archived,
|
|
41
|
+
membership_state: chat.membershipState,
|
|
42
|
+
parent_chat_id: chat.parentChatId,
|
|
43
|
+
scope: chat.scope,
|
|
44
|
+
provider_metadata: chat.providerMetadata,
|
|
45
|
+
description: chat.description,
|
|
46
|
+
invite_link: chat.link,
|
|
47
|
+
settings: chat.settings ? settingsOf(chat.settings) : undefined,
|
|
48
|
+
members: chat.members === undefined ? undefined : (chat.members?.map(memberAnswer) ?? null),
|
|
49
|
+
});
|
|
50
|
+
export const memberAnswer = (member) => {
|
|
51
|
+
const group = member;
|
|
52
|
+
return defined({
|
|
53
|
+
id: member.id,
|
|
54
|
+
name: member.name,
|
|
55
|
+
username: member.username,
|
|
56
|
+
role: group.role,
|
|
57
|
+
last_seen_at: group.lastSeenAt,
|
|
58
|
+
registered_at: group.registeredAt,
|
|
59
|
+
joined_at: group.joinedAt,
|
|
60
|
+
invited_by: group.invitedBy,
|
|
61
|
+
is_bot: group.isBot,
|
|
62
|
+
deleted: group.deleted,
|
|
63
|
+
flagged: group.flagged,
|
|
64
|
+
has_photo: group.hasPhoto,
|
|
65
|
+
score: group.score,
|
|
66
|
+
reasons: group.reasons,
|
|
67
|
+
check: group.check ? snakeKeys(group.check) : undefined,
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
export const contactRef = (provider, id) => formatReference({ type: "contact", provider, id });
|
|
71
|
+
export const contactAnswer = (account, contact) => {
|
|
72
|
+
const card = contact;
|
|
73
|
+
return defined({
|
|
74
|
+
ref: contactRef(account.provider, contact.id),
|
|
75
|
+
id: contact.id,
|
|
76
|
+
name: contact.name,
|
|
77
|
+
username: contact.username,
|
|
78
|
+
alias: contact.alias,
|
|
79
|
+
display_name: contact.displayName,
|
|
80
|
+
description: contact.description,
|
|
81
|
+
last_messaged_at: contact.lastMessagedAt,
|
|
82
|
+
chats: card.chats?.map((chat) => ({
|
|
83
|
+
ref: chatRef(account, chat.id),
|
|
84
|
+
id: chat.id,
|
|
85
|
+
title: chat.title,
|
|
86
|
+
kind: chat.kind,
|
|
87
|
+
last_message_at: chat.lastMessageAt,
|
|
88
|
+
})),
|
|
89
|
+
notes: card.notes?.map(({ id, text, revision, createdAt, updatedAt }) => ({
|
|
90
|
+
id,
|
|
91
|
+
text,
|
|
92
|
+
revision,
|
|
93
|
+
created_at: createdAt,
|
|
94
|
+
updated_at: updatedAt,
|
|
95
|
+
})),
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
export const chatEventAnswer = (chatId, event) => defined({
|
|
99
|
+
chat_id: chatId,
|
|
100
|
+
time: event.timestamp,
|
|
101
|
+
type: event.event,
|
|
102
|
+
message_id: event.messageId,
|
|
103
|
+
by: event.by,
|
|
104
|
+
people: event.people,
|
|
105
|
+
title: event.title,
|
|
106
|
+
});
|
|
107
|
+
const HISTORY_TYPES = { joined: "join", left: "leave", changed: "profile" };
|
|
108
|
+
export const memberEventAnswer = (chatId, event) => defined({
|
|
109
|
+
chat_id: chatId,
|
|
110
|
+
time: event.at,
|
|
111
|
+
type: HISTORY_TYPES[event.event],
|
|
112
|
+
by: event.invitedBy === undefined ? undefined : { id: event.invitedBy, name: null },
|
|
113
|
+
people: [{ id: event.id, name: event.name, username: event.username }],
|
|
114
|
+
before: event.before ? { name: event.before.name, username: event.before.username } : undefined,
|
|
115
|
+
});
|
|
116
|
+
export const inviteLinkAnswer = (link) => defined({
|
|
117
|
+
link: link.link,
|
|
118
|
+
approval: link.approval,
|
|
119
|
+
expires_at: link.expiresAt,
|
|
120
|
+
max_uses: link.maxUses,
|
|
121
|
+
primary: link.primary,
|
|
122
|
+
revoked: link.revoked,
|
|
123
|
+
pending_count: link.pending,
|
|
124
|
+
joined_count: link.joined,
|
|
125
|
+
});
|
|
126
|
+
export const joinRequestAnswer = (request) => defined({
|
|
127
|
+
person_id: request.person.id,
|
|
128
|
+
name: request.person.name,
|
|
129
|
+
username: request.person.username,
|
|
130
|
+
requested_at: request.requestedAt,
|
|
131
|
+
about: request.about,
|
|
132
|
+
});
|
|
133
|
+
export const pollVoteAnswer = (vote) => ({
|
|
134
|
+
person_id: vote.person.id,
|
|
135
|
+
name: vote.person.name,
|
|
136
|
+
username: vote.person.username,
|
|
137
|
+
answers: vote.answers,
|
|
138
|
+
voted_at: vote.votedAt,
|
|
139
|
+
});
|
|
140
|
+
export const topicAnswer = (topic) => defined({
|
|
141
|
+
id: topic.id,
|
|
142
|
+
title: topic.title,
|
|
143
|
+
closed: topic.closed,
|
|
144
|
+
pinned: topic.pinned,
|
|
145
|
+
hidden: topic.hidden,
|
|
146
|
+
unread_count: topic.unreadCount,
|
|
147
|
+
last_message_at: topic.lastMessageAt,
|
|
148
|
+
created_at: topic.createdAt,
|
|
149
|
+
});
|
|
150
|
+
export const folderAnswer = (folder) => {
|
|
151
|
+
const shown = "chats" in folder ? folder : undefined;
|
|
152
|
+
const listed = shown ? undefined : folder;
|
|
153
|
+
return defined({
|
|
154
|
+
id: folder.id,
|
|
155
|
+
title: folder.title,
|
|
156
|
+
chat_ids: listed ? listed.chatIds : (shown?.chats.map((chat) => chat.id) ?? []),
|
|
157
|
+
emoji: folder.emoji,
|
|
158
|
+
include: folder.include,
|
|
159
|
+
skip: folder.skip,
|
|
160
|
+
excluded_chat_ids: listed?.excludedChatIds ?? shown?.excluded.map((chat) => chat.id),
|
|
161
|
+
pinned_chat_ids: listed?.pinnedChatIds ?? shown?.pinned.map((chat) => chat.id),
|
|
162
|
+
chats: shown?.chats,
|
|
163
|
+
pinned_chats: shown?.pinned,
|
|
164
|
+
excluded_chats: shown?.excluded,
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
/** A person's view of a list: one line per item. */
|
|
168
|
+
export const lines = (line) => (body) => (body.items ?? (body.item === undefined ? [] : [body.item])).map((item) => `${line(item).trimEnd()}\n`).join("");
|
|
169
|
+
/** `limit` and `page` of a list paged by `--page`; `--all` is one page holding everything. */
|
|
170
|
+
export const pageOf = ({ limit, page, all }, { items, hasMore }) => (all ? { limit: Math.max(1, items.length), has_more: false, page: 1 } : { limit, has_more: hasMore, page });
|
|
171
|
+
/** A list read whole, in one page. */
|
|
172
|
+
export const wholeList = (command, items, extra = {}) => listOf(command, { items, limit: Math.max(1, items.length), has_more: false, ...extra });
|
|
173
|
+
/** `chats show`: the chat, and where its member list is shorter than its own count, the command that lists them all. */
|
|
174
|
+
export const chatShown = (account, card) => {
|
|
175
|
+
const listed = card.members?.length;
|
|
176
|
+
const short = listed !== undefined && card.participantsCount !== null && listed < card.participantsCount;
|
|
177
|
+
return itemOf(chatAnswer(account, card), short
|
|
178
|
+
? {
|
|
179
|
+
missing: [
|
|
180
|
+
{
|
|
181
|
+
field: "members",
|
|
182
|
+
why: `${listed} listed; the chat reports ${card.participantsCount} — the list may omit your account or be partial`,
|
|
183
|
+
step: "chats.members",
|
|
184
|
+
},
|
|
185
|
+
],
|
|
186
|
+
next: [nextStep("chats.members", { args: { chat: card.id } })],
|
|
187
|
+
}
|
|
188
|
+
: {});
|
|
189
|
+
};
|
|
190
|
+
/** The lowest score `score>=n` asks for; the audit's own floor when the query names none. */
|
|
191
|
+
export const scoreFloor = (ast) => {
|
|
192
|
+
const term = nativeTerms(ast, "chats members audit").get("score");
|
|
193
|
+
if (!term)
|
|
194
|
+
return AUDIT_MIN_SCORE;
|
|
195
|
+
const upper = term.operator === "range" ? (term.upper ?? "*") : term.value;
|
|
196
|
+
if (term.operator !== "range" || upper !== "*")
|
|
197
|
+
queryError("query.unsupported-operator", term.span, "score takes a lower bound: score>=3", {
|
|
198
|
+
command: "chats members audit",
|
|
199
|
+
guide: LIST_QUERY_GUIDE,
|
|
200
|
+
});
|
|
201
|
+
const floor = Number(term.value);
|
|
202
|
+
return Math.ceil(term.lower_inclusive === false ? floor + 1 : floor);
|
|
203
|
+
};
|
|
204
|
+
export const auditAnswer = (audit) => wholeList("chats members audit", audit.items.map(memberAnswer), {
|
|
205
|
+
...(audit.more ? { meta: { truncated: true } } : {}),
|
|
206
|
+
...(audit.fetch
|
|
207
|
+
? {
|
|
208
|
+
missing: [
|
|
209
|
+
{
|
|
210
|
+
field: "reasons",
|
|
211
|
+
why: "never_wrote counts only stored messages, and the store does not hold the chat whole",
|
|
212
|
+
step: "messages.sync",
|
|
213
|
+
},
|
|
214
|
+
],
|
|
215
|
+
next: [nextStep("messages.sync", { args: { chat: audit.chatId } })],
|
|
216
|
+
}
|
|
217
|
+
: {}),
|
|
218
|
+
});
|
|
219
|
+
/** An answer with no entity yet: the item as it is, its keys in snake_case. */
|
|
220
|
+
export const renderItem = (command, output, value, next = []) => renderAnswer(command, output, itemOf(snakeKeys(value), { next }));
|
|
221
|
+
/**
|
|
222
|
+
* `--limit` and `--page` for a list whose source takes a count but no offset: page n reads n pages and shows
|
|
223
|
+
* the last, so the step to the next page is honest.
|
|
224
|
+
*/
|
|
225
|
+
export const withPage = (command) => command
|
|
226
|
+
.option("--limit <n>", "how many to show", positiveCount("--limit"))
|
|
227
|
+
.option("--page <n>", "which page, starting at 1", positiveCount("--page"));
|
|
228
|
+
export const pageOfRead = ({ hasMore }, limit, page) => ({
|
|
229
|
+
limit,
|
|
230
|
+
has_more: hasMore,
|
|
231
|
+
page,
|
|
232
|
+
});
|
|
233
|
+
/** A document link in a chat's stored messages; `ref` is the message's locator. */
|
|
234
|
+
export const documentLinkAnswer = ({ url, documentId, title, inStore, locator, sentAt, sender }) => ({
|
|
235
|
+
url,
|
|
236
|
+
document_id: documentId,
|
|
237
|
+
title,
|
|
238
|
+
in_store: inStore,
|
|
239
|
+
ref: locator,
|
|
240
|
+
sent_at: sentAt,
|
|
241
|
+
sender,
|
|
242
|
+
});
|
|
243
|
+
//# sourceMappingURL=chat-answers.js.map
|