@wirecat/tg-cli 0.0.0 → 0.43.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 +21 -0
- package/README.md +527 -0
- package/THIRD_PARTY_NOTICES +55 -0
- package/dist/app.d.ts +11 -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/tg.d.ts +3 -0
- package/dist/bin/tg.d.ts.map +1 -0
- package/dist/bin/tg.js +18 -0
- package/dist/bin/tg.js.map +1 -0
- package/dist/bot/adapter.d.ts +9 -0
- package/dist/bot/adapter.d.ts.map +1 -0
- package/dist/bot/adapter.js +171 -0
- package/dist/bot/adapter.js.map +1 -0
- package/dist/bot/generated/definitions.d.ts +3 -0
- package/dist/bot/generated/definitions.d.ts.map +1 -0
- package/dist/bot/generated/definitions.js +19104 -0
- package/dist/bot/generated/definitions.js.map +1 -0
- package/dist/bot/generated/manifest.d.ts +3 -0
- package/dist/bot/generated/manifest.d.ts.map +1 -0
- package/dist/bot/generated/manifest.js +15354 -0
- package/dist/bot/generated/manifest.js.map +1 -0
- package/dist/bot/generated/schemas.d.ts +1407 -0
- package/dist/bot/generated/schemas.d.ts.map +1 -0
- package/dist/bot/generated/schemas.js +5118 -0
- package/dist/bot/generated/schemas.js.map +1 -0
- package/dist/bot/generated/types.d.ts +6884 -0
- package/dist/bot/generated/types.d.ts.map +1 -0
- package/dist/bot/generated/types.js +5 -0
- package/dist/bot/generated/types.js.map +1 -0
- package/dist/bot/map.d.ts +122 -0
- package/dist/bot/map.d.ts.map +1 -0
- package/dist/bot/map.js +193 -0
- package/dist/bot/map.js.map +1 -0
- package/dist/bot/proxy.d.ts +15 -0
- package/dist/bot/proxy.d.ts.map +1 -0
- package/dist/bot/proxy.js +64 -0
- package/dist/bot/proxy.js.map +1 -0
- package/dist/bot/transport.d.ts +42 -0
- package/dist/bot/transport.d.ts.map +1 -0
- package/dist/bot/transport.js +158 -0
- package/dist/bot/transport.js.map +1 -0
- package/dist/browser.d.ts +6 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +18 -0
- package/dist/browser.js.map +1 -0
- package/dist/commands/bot-api.d.ts +3 -0
- package/dist/commands/bot-api.d.ts.map +1 -0
- package/dist/commands/bot-api.js +112 -0
- package/dist/commands/bot-api.js.map +1 -0
- package/dist/commands/bot.d.ts +7 -0
- package/dist/commands/bot.d.ts.map +1 -0
- package/dist/commands/bot.js +99 -0
- package/dist/commands/bot.js.map +1 -0
- package/dist/commands/context.d.ts +59 -0
- package/dist/commands/context.d.ts.map +1 -0
- package/dist/commands/context.js +176 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/proxy-config.d.ts +9 -0
- package/dist/commands/proxy-config.d.ts.map +1 -0
- package/dist/commands/proxy-config.js +63 -0
- package/dist/commands/proxy-config.js.map +1 -0
- package/dist/commands/session.d.ts +22 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +191 -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 +203 -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 +35 -0
- package/dist/commands/update.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 +62 -0
- package/dist/install/postinstall.js.map +1 -0
- package/dist/paths.d.ts +9 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +11 -0
- package/dist/paths.js.map +1 -0
- package/dist/program.d.ts +8 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +138 -0
- package/dist/program.js.map +1 -0
- package/dist/proxy.d.ts +31 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +99 -0
- package/dist/proxy.js.map +1 -0
- package/dist/telegram/adapter.d.ts +432 -0
- package/dist/telegram/adapter.d.ts.map +1 -0
- package/dist/telegram/adapter.js +1898 -0
- package/dist/telegram/adapter.js.map +1 -0
- package/dist/telegram/bot-history.d.ts +18 -0
- package/dist/telegram/bot-history.d.ts.map +1 -0
- package/dist/telegram/bot-history.js +145 -0
- package/dist/telegram/bot-history.js.map +1 -0
- package/dist/telegram/comments.d.ts +18 -0
- package/dist/telegram/comments.d.ts.map +1 -0
- package/dist/telegram/comments.js +48 -0
- package/dist/telegram/comments.js.map +1 -0
- package/dist/telegram/credentials.d.ts +22 -0
- package/dist/telegram/credentials.d.ts.map +1 -0
- package/dist/telegram/credentials.js +49 -0
- package/dist/telegram/credentials.js.map +1 -0
- package/dist/telegram/errors.d.ts +6 -0
- package/dist/telegram/errors.d.ts.map +1 -0
- package/dist/telegram/errors.js +186 -0
- package/dist/telegram/errors.js.map +1 -0
- package/dist/telegram/folder-rules.d.ts +14 -0
- package/dist/telegram/folder-rules.d.ts.map +1 -0
- package/dist/telegram/folder-rules.js +23 -0
- package/dist/telegram/folder-rules.js.map +1 -0
- package/dist/telegram/format-html.d.ts +4 -0
- package/dist/telegram/format-html.d.ts.map +1 -0
- package/dist/telegram/format-html.js +29 -0
- package/dist/telegram/format-html.js.map +1 -0
- package/dist/telegram/format-markdown.d.ts +3 -0
- package/dist/telegram/format-markdown.d.ts.map +1 -0
- package/dist/telegram/format-markdown.js +160 -0
- package/dist/telegram/format-markdown.js.map +1 -0
- package/dist/telegram/join-requests.d.ts +15 -0
- package/dist/telegram/join-requests.d.ts.map +1 -0
- package/dist/telegram/join-requests.js +35 -0
- package/dist/telegram/join-requests.js.map +1 -0
- package/dist/telegram/map.d.ts +92 -0
- package/dist/telegram/map.d.ts.map +1 -0
- package/dist/telegram/map.js +471 -0
- package/dist/telegram/map.js.map +1 -0
- package/dist/telegram/poll-voters.d.ts +15 -0
- package/dist/telegram/poll-voters.d.ts.map +1 -0
- package/dist/telegram/poll-voters.js +31 -0
- package/dist/telegram/poll-voters.js.map +1 -0
- package/dist/telegram/polls.d.ts +5 -0
- package/dist/telegram/polls.d.ts.map +1 -0
- package/dist/telegram/polls.js +20 -0
- package/dist/telegram/polls.js.map +1 -0
- package/dist/telegram/profile.d.ts +9 -0
- package/dist/telegram/profile.d.ts.map +1 -0
- package/dist/telegram/profile.js +175 -0
- package/dist/telegram/profile.js.map +1 -0
- package/dist/telegram/proxy.d.ts +48 -0
- package/dist/telegram/proxy.d.ts.map +1 -0
- package/dist/telegram/proxy.js +108 -0
- package/dist/telegram/proxy.js.map +1 -0
- package/dist/telegram/registration.d.ts +31 -0
- package/dist/telegram/registration.d.ts.map +1 -0
- package/dist/telegram/registration.js +95 -0
- package/dist/telegram/registration.js.map +1 -0
- package/dist/telegram/send-as.d.ts +17 -0
- package/dist/telegram/send-as.d.ts.map +1 -0
- package/dist/telegram/send-as.js +67 -0
- package/dist/telegram/send-as.js.map +1 -0
- package/dist/telegram/stats.d.ts +13 -0
- package/dist/telegram/stats.d.ts.map +1 -0
- package/dist/telegram/stats.js +135 -0
- package/dist/telegram/stats.js.map +1 -0
- package/dist/telegram/storage.d.ts +4 -0
- package/dist/telegram/storage.d.ts.map +1 -0
- package/dist/telegram/storage.js +68 -0
- package/dist/telegram/storage.js.map +1 -0
- package/dist/telegram/upload.d.ts +9 -0
- package/dist/telegram/upload.d.ts.map +1 -0
- package/dist/telegram/upload.js +29 -0
- package/dist/telegram/upload.js.map +1 -0
- package/dist/update.d.ts +28 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +56 -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 +71 -2
- package/skills/tg-cli/SKILL.md +489 -0
- package/spec/bot/LICENSE +21 -0
- package/spec/bot/README.md +16 -0
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { MtArgumentError, MtcuteError, MtEmptyError, MtInvalidPeerTypeError, MtMessageNotFoundError, MtPeerNotFoundError, MtSecurityError, MtTimeoutError, MtTypeAssertionError, MtUnsupportedError, tl, } from "@mtcute/node";
|
|
2
|
+
import { CliError, isCliError } from "@wirecat/cli-core";
|
|
3
|
+
const { RpcError } = tl;
|
|
4
|
+
const NOT_FOUND = new Set([
|
|
5
|
+
"PEER_ID_INVALID",
|
|
6
|
+
"CHANNEL_INVALID",
|
|
7
|
+
"CHAT_ID_INVALID",
|
|
8
|
+
"USERNAME_INVALID",
|
|
9
|
+
"USERNAME_NOT_OCCUPIED",
|
|
10
|
+
"MSG_ID_INVALID",
|
|
11
|
+
"MESSAGE_ID_INVALID",
|
|
12
|
+
]);
|
|
13
|
+
/** Refusals whose name alone would not tell a person what to do. */
|
|
14
|
+
const EXPLAINED = {
|
|
15
|
+
CHANNEL_PRIVATE: ["permission_error", "you cannot access this channel or supergroup"],
|
|
16
|
+
CHAT_DISCUSSION_UNALLOWED: ["validation_error", "a linked discussion group cannot enable forum topics"],
|
|
17
|
+
CHANNEL_FORUM_MISSING: ["validation_error", "enable forum topics before creating a topic"],
|
|
18
|
+
TOPIC_CLOSED: ["permission_error", "that forum topic is closed; choose an open topic"],
|
|
19
|
+
TOPIC_DELETED: ["not_found", "that forum topic was deleted; check `topics list`"],
|
|
20
|
+
TOPIC_ID_INVALID: ["not_found", "that forum topic does not exist; check `topics list`"],
|
|
21
|
+
MSG_VOICE_MISSING: ["validation_error", "that message is not a voice or video note"],
|
|
22
|
+
MSG_VOICE_TOO_LONG: ["validation_error", "the voice message is too long for Telegram to transcribe"],
|
|
23
|
+
PREMIUM_ACCOUNT_REQUIRED: [
|
|
24
|
+
"permission_error",
|
|
25
|
+
"Telegram transcribes only for Premium accounts, or a few messages a week on the free trial, used up now",
|
|
26
|
+
],
|
|
27
|
+
TRANSCRIPTION_FAILED: ["provider_error", "Telegram could not transcribe this voice message"],
|
|
28
|
+
PHONE_NOT_OCCUPIED: ["not_found", "nobody Telegram lets you find has this number"],
|
|
29
|
+
USER_NOT_MUTUAL_CONTACT: [
|
|
30
|
+
"permission_error",
|
|
31
|
+
"Telegram lets you add someone who left or was removed only if you are each other's contacts — " +
|
|
32
|
+
"send them the invite link instead (`tg chats link show <chat>`)",
|
|
33
|
+
],
|
|
34
|
+
USER_PRIVACY_RESTRICTED: ["permission_error", "their privacy settings do not let you add them to a group"],
|
|
35
|
+
CHAT_ADMIN_REQUIRED: ["permission_error", "only an admin of this chat may do that"],
|
|
36
|
+
MESSAGE_AUTHOR_REQUIRED: ["permission_error", "only whoever sent that message may change it"],
|
|
37
|
+
CHAT_SEND_POLL_FORBIDDEN: ["permission_error", "this chat's admins have turned polls off"],
|
|
38
|
+
BROADCAST_PUBLIC_VOTERS_FORBIDDEN: [
|
|
39
|
+
"validation_error",
|
|
40
|
+
"a channel's polls cannot show who voted — create it with --anonymous",
|
|
41
|
+
],
|
|
42
|
+
MESSAGE_POLL_CLOSED: ["validation_error", "this poll is closed; `tg polls show` has its result"],
|
|
43
|
+
REVOTE_NOT_ALLOWED: ["validation_error", "this poll takes one vote, and yours is final — it cannot be changed"],
|
|
44
|
+
OPTIONS_TOO_MUCH: ["validation_error", "this poll takes one answer; give one id"],
|
|
45
|
+
OPTION_INVALID: ["validation_error", "that is not an answer of this poll — `tg polls show` lists them"],
|
|
46
|
+
POLL_VOTE_REQUIRED: ["permission_error", "Telegram shows who voted only once you have voted in this poll"],
|
|
47
|
+
BROADCAST_FORBIDDEN: ["permission_error", "a channel does not show who voted in its polls"],
|
|
48
|
+
POLL_ANSWERS_INVALID: ["validation_error", "Telegram refused how many answers this poll has"],
|
|
49
|
+
POLL_ANSWER_INVALID: ["validation_error", "an answer is empty or too long for Telegram"],
|
|
50
|
+
POLL_OPTION_INVALID: ["validation_error", "an answer is empty or too long for Telegram"],
|
|
51
|
+
POLL_OPTION_DUPLICATE: ["validation_error", "two answers are the same; each must differ"],
|
|
52
|
+
POLL_QUESTION_INVALID: ["validation_error", "the question is empty or too long for Telegram"],
|
|
53
|
+
QUIZ_CORRECT_ANSWERS_EMPTY: ["validation_error", "a quiz needs its right answer: --correct <n>"],
|
|
54
|
+
QUIZ_CORRECT_ANSWERS_TOO_MUCH: ["validation_error", "a quiz takes one right answer"],
|
|
55
|
+
QUIZ_CORRECT_ANSWER_INVALID: ["validation_error", "--correct names no answer of this quiz"],
|
|
56
|
+
QUIZ_MULTIPLE_INVALID: ["validation_error", "a quiz takes one answer; not with --multiple"],
|
|
57
|
+
CHAT_PUBLIC_REQUIRED: [
|
|
58
|
+
"validation_error",
|
|
59
|
+
"Telegram would not make this group ask everyone for approval — make an invite link that needs it: " +
|
|
60
|
+
"`tg chats link create <chat> --approval`",
|
|
61
|
+
],
|
|
62
|
+
MEGAGROUP_REQUIRED: ["validation_error", "that works only in a supergroup"],
|
|
63
|
+
BROADCAST_REQUIRED: ["validation_error", "that works only in a channel"],
|
|
64
|
+
};
|
|
65
|
+
const revoked = (login) => ["authentication_error", `Telegram ended this login — run ${login}`, "revoked"];
|
|
66
|
+
const frozen = () => [
|
|
67
|
+
"permission_error",
|
|
68
|
+
"Telegram froze this account: it can read but not write — `tg doctor --online` shows until when, and where to appeal",
|
|
69
|
+
"frozen",
|
|
70
|
+
];
|
|
71
|
+
/**
|
|
72
|
+
* Refusals that say what state the account is in, so `doctor --online` can name it. Logging in again
|
|
73
|
+
* cannot undo a ban, so those never send the person to `session start`. FROZEN_METHOD_INVALID is a
|
|
74
|
+
* 420, Telegram's flood code, and would otherwise read as "wait and retry" (core.telegram.org/api/auth#frozen-accounts).
|
|
75
|
+
*/
|
|
76
|
+
const STANDINGS = {
|
|
77
|
+
AUTH_KEY_UNREGISTERED: revoked,
|
|
78
|
+
SESSION_REVOKED: revoked,
|
|
79
|
+
SESSION_EXPIRED: revoked,
|
|
80
|
+
USER_DEACTIVATED: () => [
|
|
81
|
+
"authentication_error",
|
|
82
|
+
"this Telegram account was deleted — a new login cannot bring it back",
|
|
83
|
+
"deactivated",
|
|
84
|
+
],
|
|
85
|
+
USER_DEACTIVATED_BAN: () => [
|
|
86
|
+
"authentication_error",
|
|
87
|
+
"Telegram banned this account — a new login cannot lift it; only Telegram can",
|
|
88
|
+
"banned",
|
|
89
|
+
],
|
|
90
|
+
FROZEN_METHOD_INVALID: frozen,
|
|
91
|
+
FROZEN_PARTICIPANT_MISSING: frozen,
|
|
92
|
+
// Not a wait: retrying is what made it. `limited` makes cli-messaging hold every write for a while.
|
|
93
|
+
PEER_FLOOD: () => [
|
|
94
|
+
"permission_error",
|
|
95
|
+
"Telegram limited this account's messages as spam (PEER_FLOOD) — it can still read; " +
|
|
96
|
+
"message @SpamBot in a Telegram app to see until when",
|
|
97
|
+
"limited",
|
|
98
|
+
],
|
|
99
|
+
};
|
|
100
|
+
/** mtcute's argument errors by the start of their text, which may go on to quote what was typed. */
|
|
101
|
+
const ARGUMENT_KINDS = [
|
|
102
|
+
[/^You haven't joined /, "you are not a member of that chat"],
|
|
103
|
+
[/^Invalid message link/, "that is not a message link Telegram understands"],
|
|
104
|
+
[/^Invalid invite link/, "that is not an invite link Telegram understands"],
|
|
105
|
+
[
|
|
106
|
+
/^Invalid phone number|^phone should only contain digits|is an invalid test phone number$/,
|
|
107
|
+
"that phone number is not valid",
|
|
108
|
+
],
|
|
109
|
+
[/^Provided code was invalid/, "the login code was wrong"],
|
|
110
|
+
[/^Provided password was invalid/, "the two-step verification password was wrong"],
|
|
111
|
+
[/^You can forward no more than 100 messages/, "Telegram forwards at most 100 messages at once"],
|
|
112
|
+
];
|
|
113
|
+
const argumentKind = (message) => ARGUMENT_KINDS.find(([pattern]) => pattern.test(message))?.[1] ?? "Telegram refused an argument this command passed";
|
|
114
|
+
/**
|
|
115
|
+
* Telegram's refusals as the closed list of codes a script branches on. Only the error's name
|
|
116
|
+
* travels into the message — never a parameter the caller passed, which may be somebody's text.
|
|
117
|
+
*/
|
|
118
|
+
export const toCliError = (error, login = "`tg session start`") => {
|
|
119
|
+
if (isCliError(error))
|
|
120
|
+
return error;
|
|
121
|
+
if (RpcError.is(error, "FLOOD_WAIT_%d")) {
|
|
122
|
+
return new CliError("rate_limited", `Telegram asks to wait ${error.seconds} s before the next request`, {
|
|
123
|
+
retryAfterMs: error.seconds * 1000,
|
|
124
|
+
providerError: "FLOOD_WAIT",
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
if (RpcError.is(error)) {
|
|
128
|
+
const details = { providerError: error.text, status: error.code };
|
|
129
|
+
// The signal that reopens owner-process routing (docs/plans/2026-10-04-session-sharing.md, §6).
|
|
130
|
+
if (error.text === "AUTH_KEY_DUPLICATED") {
|
|
131
|
+
return new CliError("authentication_error", `Telegram ended this login because two connections used it at once (tg serve, tg mcp, ` +
|
|
132
|
+
`tg watch or a command beside them) — run ${login}`, details);
|
|
133
|
+
}
|
|
134
|
+
const standing = STANDINGS[error.text];
|
|
135
|
+
if (standing) {
|
|
136
|
+
const [code, message, state] = standing(login);
|
|
137
|
+
return new CliError(code, message, { ...details, standing: { state, hint: message } });
|
|
138
|
+
}
|
|
139
|
+
if (error.code === RpcError.UNAUTHORIZED) {
|
|
140
|
+
return new CliError("authentication_error", `not logged in, or the session was ended — run ${login}`, details);
|
|
141
|
+
}
|
|
142
|
+
const explained = EXPLAINED[error.text];
|
|
143
|
+
if (explained)
|
|
144
|
+
return new CliError(explained[0], explained[1], details);
|
|
145
|
+
if (NOT_FOUND.has(error.text))
|
|
146
|
+
return new CliError("not_found", `Telegram does not know that (${error.text})`, details);
|
|
147
|
+
if (error.code === RpcError.FORBIDDEN)
|
|
148
|
+
return new CliError("permission_error", `Telegram refused: ${error.text}`, details);
|
|
149
|
+
if (error.code === RpcError.FLOOD)
|
|
150
|
+
return new CliError("rate_limited", `Telegram refused: ${error.text}`, details);
|
|
151
|
+
if (error.code >= 500)
|
|
152
|
+
return new CliError("provider_unavailable", `Telegram failed: ${error.text}`, details);
|
|
153
|
+
return new CliError("provider_error", `Telegram refused: ${error.text}`, details);
|
|
154
|
+
}
|
|
155
|
+
if (error instanceof MtTimeoutError)
|
|
156
|
+
return new CliError("timeout", "Telegram did not answer in time");
|
|
157
|
+
// mtcute builds these messages from what was typed — a chat title can be somebody's text — so none is passed on.
|
|
158
|
+
if (error instanceof MtArgumentError)
|
|
159
|
+
return new CliError("validation_error", argumentKind(error.message));
|
|
160
|
+
// Measured 2026-10-01: a bare user id fails until this session has seen the person somewhere.
|
|
161
|
+
if (error instanceof MtPeerNotFoundError) {
|
|
162
|
+
return new CliError("not_found", "Telegram does not know that chat or user — a person's id works only once this account has seen them; " +
|
|
163
|
+
"name them by @username, or read a chat they are in first");
|
|
164
|
+
}
|
|
165
|
+
if (error instanceof MtMessageNotFoundError) {
|
|
166
|
+
return new CliError("not_found", `there is no message ${error.messageId} in that chat`);
|
|
167
|
+
}
|
|
168
|
+
if (error instanceof MtInvalidPeerTypeError) {
|
|
169
|
+
return new CliError("validation_error", "that chat is not the kind this command works on");
|
|
170
|
+
}
|
|
171
|
+
// Thrown on what Telegram sent (an expired file reference, a CDN redirect), not on what was typed.
|
|
172
|
+
if (error instanceof MtUnsupportedError) {
|
|
173
|
+
return new CliError("provider_error", "Telegram answered with something tg cannot handle yet");
|
|
174
|
+
}
|
|
175
|
+
if (error instanceof MtTypeAssertionError || error instanceof MtEmptyError || error instanceof MtSecurityError) {
|
|
176
|
+
return new CliError("invalid_response", `Telegram answered with something unexpected (${error.constructor.name})`);
|
|
177
|
+
}
|
|
178
|
+
if (error instanceof MtcuteError)
|
|
179
|
+
return new CliError("provider_error", `Telegram failed (${error.constructor.name})`);
|
|
180
|
+
const code = error?.code;
|
|
181
|
+
if (typeof code === "string" && /^(ECONN|ENOTFOUND|EAI_AGAIN|ETIMEDOUT|ENETUNREACH|EHOSTUNREACH)/.test(code)) {
|
|
182
|
+
return new CliError("network_error", `cannot reach Telegram (${code})`);
|
|
183
|
+
}
|
|
184
|
+
return error;
|
|
185
|
+
};
|
|
186
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/telegram/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { tl } from "@mtcute/node";
|
|
2
|
+
import type { FolderKind, FolderSkip } from "@wirecat/cli-messaging";
|
|
3
|
+
/** Every flag of a set given, so a kind left out is turned off, not kept. */
|
|
4
|
+
export declare const ruleFlags: ({ include, skip }: {
|
|
5
|
+
include?: FolderKind[];
|
|
6
|
+
skip?: FolderSkip[];
|
|
7
|
+
}) => {
|
|
8
|
+
[x: string]: boolean;
|
|
9
|
+
};
|
|
10
|
+
export declare const rulesOf: (filter: tl.RawDialogFilter) => {
|
|
11
|
+
include?: FolderKind[];
|
|
12
|
+
skip?: FolderSkip[];
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=folder-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder-rules.d.ts","sourceRoot":"","sources":["../../src/telegram/folder-rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAcpE,6EAA6E;AAC7E,eAAO,MAAM,SAAS,sBAAuB;IAAE,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,EAAE,CAAA;CAAE;;CAO1F,CAAA;AAEF,eAAO,MAAM,OAAO,WAAY,EAAE,CAAC,eAAe,KAAG;IAAE,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,UAAU,EAAE,CAAA;CAIjG,CAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const KINDS = {
|
|
2
|
+
contacts: "contacts",
|
|
3
|
+
"non-contacts": "nonContacts",
|
|
4
|
+
groups: "groups",
|
|
5
|
+
channels: "broadcasts",
|
|
6
|
+
bots: "bots",
|
|
7
|
+
};
|
|
8
|
+
const SKIPS = { muted: "excludeMuted", read: "excludeRead", archived: "excludeArchived" };
|
|
9
|
+
/** Every flag of a set given, so a kind left out is turned off, not kept. */
|
|
10
|
+
export const ruleFlags = ({ include, skip }) => ({
|
|
11
|
+
...(include === undefined
|
|
12
|
+
? {}
|
|
13
|
+
: Object.fromEntries(Object.entries(KINDS).map(([kind, flag]) => [flag, include.includes(kind)]))),
|
|
14
|
+
...(skip === undefined
|
|
15
|
+
? {}
|
|
16
|
+
: Object.fromEntries(Object.entries(SKIPS).map(([which, flag]) => [flag, skip.includes(which)]))),
|
|
17
|
+
});
|
|
18
|
+
export const rulesOf = (filter) => {
|
|
19
|
+
const include = Object.keys(KINDS).filter((kind) => filter[KINDS[kind]]);
|
|
20
|
+
const skip = Object.keys(SKIPS).filter((which) => filter[SKIPS[which]]);
|
|
21
|
+
return { ...(include.length > 0 ? { include } : {}), ...(skip.length > 0 ? { skip } : {}) };
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=folder-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folder-rules.js","sourceRoot":"","sources":["../../src/telegram/folder-rules.ts"],"names":[],"mappings":"AAMA,MAAM,KAAK,GAAiC;IAC1C,QAAQ,EAAE,UAAU;IACpB,cAAc,EAAE,aAAa;IAC7B,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,YAAY;IACtB,IAAI,EAAE,MAAM;CACb,CAAA;AACD,MAAM,KAAK,GAAiC,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAA;AAEvH,6EAA6E;AAC7E,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAmD,EAAE,EAAE,CAAC,CAAC;IAChG,GAAG,CAAC,OAAO,KAAK,SAAS;QACvB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IAClH,GAAG,CAAC,IAAI,KAAK,SAAS;QACpB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;CAClH,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAA0B,EAAmD,EAAE;IACrG,MAAM,OAAO,GAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC1F,MAAM,IAAI,GAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAkB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACzF,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;AAC7F,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-html.d.ts","sourceRoot":"","sources":["../../src/telegram/format-html.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAwC,MAAM,wBAAwB,CAAA;AAyBjG,mFAAmF;AACnF,eAAO,MAAM,UAAU,UAAW,MAAM,KAAG,aAG1C,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { thtml } from "@mtcute/node";
|
|
2
|
+
import { CliError } from "@wirecat/cli-core";
|
|
3
|
+
import { validateFormattedText } from "@wirecat/cli-messaging";
|
|
4
|
+
const PLAIN = {
|
|
5
|
+
messageEntityBold: "bold",
|
|
6
|
+
messageEntityItalic: "italic",
|
|
7
|
+
messageEntityUnderline: "underline",
|
|
8
|
+
messageEntityStrike: "strike",
|
|
9
|
+
messageEntityCode: "code",
|
|
10
|
+
messageEntitySpoiler: "spoiler",
|
|
11
|
+
messageEntityBlockquote: "blockquote",
|
|
12
|
+
};
|
|
13
|
+
const spanOf = (entity) => {
|
|
14
|
+
const base = { from: entity.offset, length: entity.length };
|
|
15
|
+
if (entity._ === "messageEntityTextUrl")
|
|
16
|
+
return { type: "link", ...base, url: entity.url };
|
|
17
|
+
if (entity._ === "messageEntityPre")
|
|
18
|
+
return { type: "pre", ...base, ...(entity.language ? { language: entity.language } : {}) };
|
|
19
|
+
const type = PLAIN[entity._];
|
|
20
|
+
if (type)
|
|
21
|
+
return { type, ...base };
|
|
22
|
+
throw new CliError("validation_error", "this HTML has a mention or a custom emoji; tg sends <b>, <i>, <u>, <s>, <a href>, <code>, <pre>, <blockquote> and <tg-spoiler>");
|
|
23
|
+
};
|
|
24
|
+
/** Bot API HTML: whitespace and line breaks stay as typed, unlike in a browser. */
|
|
25
|
+
export const formatHtml = (input) => {
|
|
26
|
+
const { text, entities = [] } = thtml(input);
|
|
27
|
+
return validateFormattedText({ text, spans: entities.map(spanOf) });
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=format-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-html.js","sourceRoot":"","sources":["../../src/telegram/format-html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAW,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAqC,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAEjG,MAAM,KAAK,GAAiE;IAC1E,iBAAiB,EAAE,MAAM;IACzB,mBAAmB,EAAE,QAAQ;IAC7B,sBAAsB,EAAE,WAAW;IACnC,mBAAmB,EAAE,QAAQ;IAC7B,iBAAiB,EAAE,MAAM;IACzB,oBAAoB,EAAE,SAAS;IAC/B,uBAAuB,EAAE,YAAY;CACtC,CAAA;AAED,MAAM,MAAM,GAAG,CAAC,MAA4B,EAAY,EAAE;IACxD,MAAM,IAAI,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAA;IAC3D,IAAI,MAAM,CAAC,CAAC,KAAK,sBAAsB;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAA;IAC1F,IAAI,MAAM,CAAC,CAAC,KAAK,kBAAkB;QACjC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;IAC5F,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAC5B,IAAI,IAAI;QAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,CAAA;IAClC,MAAM,IAAI,QAAQ,CAChB,kBAAkB,EAClB,gIAAgI,CACjI,CAAA;AACH,CAAC,CAAA;AAED,mFAAmF;AACnF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAiB,EAAE;IACzD,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,EAAE,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;IAC5C,OAAO,qBAAqB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AACrE,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-markdown.d.ts","sourceRoot":"","sources":["../../src/telegram/format-markdown.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAwC,MAAM,wBAAwB,CAAA;AA6IjG,eAAO,MAAM,cAAc,UAAW,MAAM,KAAG,aAkB9C,CAAA"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { CliError } from "@wirecat/cli-core";
|
|
2
|
+
import { validateFormattedText } from "@wirecat/cli-messaging";
|
|
3
|
+
const STYLES = [
|
|
4
|
+
["**", "bold"],
|
|
5
|
+
["__", "underline"],
|
|
6
|
+
["~~", "strike"],
|
|
7
|
+
["||", "spoiler"],
|
|
8
|
+
["*", "bold"],
|
|
9
|
+
["_", "italic"],
|
|
10
|
+
["~", "strike"],
|
|
11
|
+
];
|
|
12
|
+
const WORD = /[\p{L}\p{N}]/u;
|
|
13
|
+
const before = (input, at) => {
|
|
14
|
+
const code = input.charCodeAt(at - 1);
|
|
15
|
+
return code >= 0xdc00 && code <= 0xdfff ? input.slice(at - 2, at) : (input[at - 1] ?? "");
|
|
16
|
+
};
|
|
17
|
+
const after = (input, at) => String.fromCodePoint(input.codePointAt(at) ?? 0);
|
|
18
|
+
const fail = (message) => {
|
|
19
|
+
throw new CliError("validation_error", message);
|
|
20
|
+
};
|
|
21
|
+
const balanced = (input, start, open, close) => {
|
|
22
|
+
let depth = 1;
|
|
23
|
+
for (let at = start + 1; at < input.length; at++) {
|
|
24
|
+
if (input[at] === "\\") {
|
|
25
|
+
at++;
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (input[at] === open) {
|
|
29
|
+
if (++depth > 32)
|
|
30
|
+
fail("Markdown nesting exceeds 32 levels");
|
|
31
|
+
}
|
|
32
|
+
if (input[at] === close && --depth === 0)
|
|
33
|
+
return at;
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
};
|
|
37
|
+
const parse = (input, depth = 0) => {
|
|
38
|
+
if (depth > 32)
|
|
39
|
+
fail("Markdown nesting exceeds 32 levels");
|
|
40
|
+
let text = "", at = 0;
|
|
41
|
+
const spans = [];
|
|
42
|
+
const links = input.includes("](");
|
|
43
|
+
const append = (part, type, extra = {}) => {
|
|
44
|
+
const from = text.length;
|
|
45
|
+
text += part.text;
|
|
46
|
+
spans.push(...part.spans.map((span) => ({ ...span, from: from + span.from })));
|
|
47
|
+
if (type && part.text.length > 0)
|
|
48
|
+
spans.push({ type, from, length: part.text.length, ...extra });
|
|
49
|
+
if (spans.length > 100)
|
|
50
|
+
fail("Markdown has more than 100 formatting spans");
|
|
51
|
+
};
|
|
52
|
+
while (at < input.length) {
|
|
53
|
+
const lineStart = at === 0 || input[at - 1] === "\n";
|
|
54
|
+
if (lineStart && input.startsWith("```", at)) {
|
|
55
|
+
const opening = /^```([\w.+#-]*)[ \t]*\r?\n/u.exec(input.slice(at));
|
|
56
|
+
if (!opening)
|
|
57
|
+
throw new CliError("validation_error", "a Markdown code fence needs a newline and an optional language token");
|
|
58
|
+
if (opening) {
|
|
59
|
+
const bodyStart = at + opening[0].length;
|
|
60
|
+
const closing = /^(?:```)[ \t]*(?:\r?\n|$)/gmu;
|
|
61
|
+
closing.lastIndex = bodyStart;
|
|
62
|
+
const end = closing.exec(input);
|
|
63
|
+
if (!end)
|
|
64
|
+
throw new CliError("validation_error", "a Markdown code fence needs a closing fence");
|
|
65
|
+
append({ text: input.slice(bodyStart, end.index), spans: [] }, "pre", { language: opening[1] ?? "" });
|
|
66
|
+
at = end.index + end[0].length;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (lineStart && /^>(?: |\r?\n|$)/u.test(input.slice(at))) {
|
|
71
|
+
const quoted = [];
|
|
72
|
+
let trailing = "";
|
|
73
|
+
while (at < input.length && /^>(?: |\r?\n|$)/u.test(input.slice(at))) {
|
|
74
|
+
const end = input.indexOf("\n", at);
|
|
75
|
+
const lineEnd = end === -1 ? input.length : end;
|
|
76
|
+
const line = input.slice(at, lineEnd);
|
|
77
|
+
quoted.push(line.replace(/^> ?/u, ""));
|
|
78
|
+
at = end === -1 ? input.length : end + 1;
|
|
79
|
+
trailing = end === -1 ? "" : "\n";
|
|
80
|
+
}
|
|
81
|
+
append(parse(quoted.join("\n"), depth + 1), "blockquote");
|
|
82
|
+
text += trailing;
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (input[at] === "\\" && at + 1 < input.length) {
|
|
86
|
+
text += input[at + 1];
|
|
87
|
+
at += 2;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (links && input[at] === "[") {
|
|
91
|
+
const labelEnd = balanced(input, at, "[", "]");
|
|
92
|
+
if (labelEnd !== undefined && input[labelEnd + 1] === "(") {
|
|
93
|
+
const urlEnd = balanced(input, labelEnd + 1, "(", ")");
|
|
94
|
+
if (urlEnd !== undefined) {
|
|
95
|
+
const url = input.slice(labelEnd + 2, urlEnd).replace(/\\([\\()])/gu, "$1");
|
|
96
|
+
append(parse(input.slice(at + 1, labelEnd), depth + 1), "link", { url });
|
|
97
|
+
at = urlEnd + 1;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (input[at] === "`" && !input.startsWith("```", at)) {
|
|
103
|
+
const end = input.indexOf("`", at + 1);
|
|
104
|
+
if (end > at + 1) {
|
|
105
|
+
const content = input.slice(at + 1, end);
|
|
106
|
+
if (!content.includes("\n") && !content.includes("\r")) {
|
|
107
|
+
append({ text: content, spans: [] }, "code");
|
|
108
|
+
at = end + 1;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const style = STYLES.find(([marker]) => input.startsWith(marker, at));
|
|
114
|
+
if (style) {
|
|
115
|
+
const [marker, type] = style;
|
|
116
|
+
let end = input.indexOf(marker, at + marker.length);
|
|
117
|
+
while (end !== -1 &&
|
|
118
|
+
(() => {
|
|
119
|
+
let escapes = 0;
|
|
120
|
+
for (let i = end - 1; i >= 0 && input[i] === "\\"; i--)
|
|
121
|
+
escapes++;
|
|
122
|
+
return escapes % 2 === 1;
|
|
123
|
+
})())
|
|
124
|
+
end = input.indexOf(marker, end + marker.length);
|
|
125
|
+
const edge = (marker !== "_" && marker !== "*") ||
|
|
126
|
+
(!WORD.test(before(input, at)) && !WORD.test(after(input, end + marker.length)));
|
|
127
|
+
if (end > at + marker.length && edge) {
|
|
128
|
+
append(parse(input.slice(at + marker.length, end), depth + 1), type);
|
|
129
|
+
at = end + marker.length;
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
text += marker;
|
|
133
|
+
at += marker.length;
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
text += input[at];
|
|
137
|
+
at++;
|
|
138
|
+
}
|
|
139
|
+
return { text, spans };
|
|
140
|
+
};
|
|
141
|
+
export const formatMarkdown = (input) => {
|
|
142
|
+
const result = parse(input);
|
|
143
|
+
for (const a of result.spans)
|
|
144
|
+
for (const b of result.spans) {
|
|
145
|
+
if (a === b || a.from >= b.from + b.length || b.from >= a.from + a.length)
|
|
146
|
+
continue;
|
|
147
|
+
if ([a.type, b.type].some((type) => type === "code" || type === "pre") ||
|
|
148
|
+
(a.type === "link" && b.type === "link") ||
|
|
149
|
+
(a.type === "blockquote" && b.type === "blockquote"))
|
|
150
|
+
fail("Telegram does not support this Markdown entity nesting");
|
|
151
|
+
}
|
|
152
|
+
for (const span of result.spans) {
|
|
153
|
+
while (span.length > 0 && /\s/u.test(result.text[span.from + span.length - 1] ?? ""))
|
|
154
|
+
span.length--;
|
|
155
|
+
}
|
|
156
|
+
result.spans = result.spans.filter((span) => span.length > 0);
|
|
157
|
+
result.spans.sort((a, b) => a.from - b.from || b.length - a.length || a.type.localeCompare(b.type));
|
|
158
|
+
return validateFormattedText(result);
|
|
159
|
+
};
|
|
160
|
+
//# sourceMappingURL=format-markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-markdown.js","sourceRoot":"","sources":["../../src/telegram/format-markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type TelegramClient } from "@mtcute/node";
|
|
2
|
+
import type { JoinRequest, Page } from "@wirecat/cli-messaging";
|
|
3
|
+
type Client = Pick<TelegramClient, "getInviteLinkMembers" | "hideJoinRequest">;
|
|
4
|
+
/** Newest first, as Telegram lists them; `total` counts every pending request, not just this page. */
|
|
5
|
+
export declare const joinRequestsOf: (client: Client, chatId: number, limit: number, { link, search }?: {
|
|
6
|
+
link?: string;
|
|
7
|
+
search?: string;
|
|
8
|
+
}) => Promise<Page<JoinRequest> & {
|
|
9
|
+
total: number;
|
|
10
|
+
}>;
|
|
11
|
+
export declare const answerJoinRequestOf: (client: Client, chatId: number, personId: number, accept: boolean) => Promise<{
|
|
12
|
+
already: boolean;
|
|
13
|
+
}>;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=join-requests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join-requests.d.ts","sourceRoot":"","sources":["../../src/telegram/join-requests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAM,MAAM,cAAc,CAAA;AAEtD,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAA;AAG/D,KAAK,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,sBAAsB,GAAG,iBAAiB,CAAC,CAAA;AAE9E,sGAAsG;AACtG,eAAO,MAAM,cAAc,WACjB,MAAM,UACN,MAAM,SACP,MAAM,qBACK;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,KACnD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAgB/C,CAAA;AAED,eAAO,MAAM,mBAAmB,WACtB,MAAM,UACN,MAAM,YACJ,MAAM,UACR,OAAO,KACd,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAa9B,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { tl } from "@mtcute/node";
|
|
2
|
+
import { CliError } from "@wirecat/cli-core";
|
|
3
|
+
import { toMember } from "./map.js";
|
|
4
|
+
/** Newest first, as Telegram lists them; `total` counts every pending request, not just this page. */
|
|
5
|
+
export const joinRequestsOf = async (client, chatId, limit, { link, search } = {}) => {
|
|
6
|
+
const page = await client.getInviteLinkMembers(chatId, {
|
|
7
|
+
requested: true,
|
|
8
|
+
limit,
|
|
9
|
+
...(link ? { link } : {}),
|
|
10
|
+
...(search ? { requestedSearch: search } : {}),
|
|
11
|
+
});
|
|
12
|
+
return {
|
|
13
|
+
items: page.map((one) => ({
|
|
14
|
+
person: toMember(one.user),
|
|
15
|
+
requestedAt: one.date.toISOString(),
|
|
16
|
+
...(one.bio ? { about: one.bio } : {}),
|
|
17
|
+
})),
|
|
18
|
+
hasMore: page.total > page.length,
|
|
19
|
+
total: page.total,
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export const answerJoinRequestOf = async (client, chatId, personId, accept) => {
|
|
23
|
+
try {
|
|
24
|
+
await client.hideJoinRequest({ chatId, user: personId, action: accept ? "approve" : "decline" });
|
|
25
|
+
return { already: false };
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (tl.RpcError.is(error, "USER_ALREADY_PARTICIPANT"))
|
|
29
|
+
return { already: true };
|
|
30
|
+
if (tl.RpcError.is(error, "HIDE_REQUESTER_MISSING"))
|
|
31
|
+
throw new CliError("not_found", "they have no request to answer — it was answered already, or withdrawn; see `tg chats requests list`");
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=join-requests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"join-requests.js","sourceRoot":"","sources":["../../src/telegram/join-requests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,EAAE,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE5C,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAInC,sGAAsG;AACtG,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,MAAc,EACd,MAAc,EACd,KAAa,EACb,EAAE,IAAI,EAAE,MAAM,EAAE,GAAuC,EAAE,EACT,EAAE;IAClD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE;QACrD,SAAS,EAAE,IAAI;QACf,KAAK;QACL,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC/C,CAAC,CAAA;IACF,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;YAC1B,WAAW,EAAE,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE;YACnC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM;QACjC,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAA;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,MAAc,EACd,MAAc,EACd,QAAgB,EAChB,MAAe,EACgB,EAAE;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAA;QAChG,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;QAC/E,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,CAAC;YACjD,MAAM,IAAI,QAAQ,CAChB,WAAW,EACX,sGAAsG,CACvG,CAAA;QACH,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC,CAAA"}
|