@adriangalilea/utils 0.7.0 → 0.9.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/README.md +29 -5
- package/dist/bot/access-control.d.ts +106 -62
- package/dist/bot/access-control.d.ts.map +1 -1
- package/dist/bot/access-control.js +255 -146
- package/dist/bot/access-control.js.map +1 -1
- package/dist/bot/index.d.ts +3 -0
- package/dist/bot/index.d.ts.map +1 -1
- package/dist/bot/index.js +3 -0
- package/dist/bot/index.js.map +1 -1
- package/dist/bot/kit.d.ts.map +1 -1
- package/dist/bot/kit.js +6 -0
- package/dist/bot/kit.js.map +1 -1
- package/dist/bot/language.d.ts +305 -0
- package/dist/bot/language.d.ts.map +1 -0
- package/dist/bot/language.js +250 -0
- package/dist/bot/language.js.map +1 -0
- package/dist/bot/menu.d.ts +189 -0
- package/dist/bot/menu.d.ts.map +1 -0
- package/dist/bot/menu.js +331 -0
- package/dist/bot/menu.js.map +1 -0
- package/dist/bot/message-history.d.ts +259 -0
- package/dist/bot/message-history.d.ts.map +1 -0
- package/dist/bot/message-history.js +111 -0
- package/dist/bot/message-history.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/say/index.d.ts +62 -0
- package/dist/say/index.d.ts.map +1 -0
- package/dist/say/index.js +59 -0
- package/dist/say/index.js.map +1 -0
- package/package.json +17 -1
- package/dist/currency/crypto-symbols-data.d.ts +0 -10
- package/dist/currency/crypto-symbols-data.d.ts.map +0 -1
- package/dist/currency/crypto-symbols-data.js +0 -13765
- package/dist/currency/crypto-symbols-data.js.map +0 -1
- package/dist/currency/crypto-symbols.d.ts +0 -20
- package/dist/currency/crypto-symbols.d.ts.map +0 -1
- package/dist/currency/crypto-symbols.js +0 -23
- package/dist/currency/crypto-symbols.js.map +0 -1
- package/dist/currency/download-crypto-list.d.ts +0 -10
- package/dist/currency/download-crypto-list.d.ts.map +0 -1
- package/dist/currency/download-crypto-list.js +0 -69
- package/dist/currency/download-crypto-list.js.map +0 -1
- package/dist/currency/index.d.ts +0 -84
- package/dist/currency/index.d.ts.map +0 -1
- package/dist/currency/index.js +0 -230
- package/dist/currency/index.js.map +0 -1
- package/dist/dir.d.ts +0 -40
- package/dist/dir.d.ts.map +0 -1
- package/dist/dir.js +0 -108
- package/dist/dir.js.map +0 -1
- package/dist/file.d.ts +0 -53
- package/dist/file.d.ts.map +0 -1
- package/dist/file.js +0 -211
- package/dist/file.js.map +0 -1
- package/dist/format.d.ts +0 -40
- package/dist/format.d.ts.map +0 -1
- package/dist/format.js +0 -83
- package/dist/format.js.map +0 -1
- package/dist/kev.d.ts +0 -149
- package/dist/kev.d.ts.map +0 -1
- package/dist/kev.js +0 -761
- package/dist/kev.js.map +0 -1
- package/dist/log.d.ts +0 -91
- package/dist/log.d.ts.map +0 -1
- package/dist/log.js +0 -300
- package/dist/log.js.map +0 -1
- package/dist/logger.d.ts +0 -91
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js +0 -269
- package/dist/logger.js.map +0 -1
- package/dist/path.d.ts +0 -67
- package/dist/path.d.ts.map +0 -1
- package/dist/path.js +0 -107
- package/dist/path.js.map +0 -1
- package/dist/project.d.ts +0 -35
- package/dist/project.d.ts.map +0 -1
- package/dist/project.js +0 -154
- package/dist/project.js.map +0 -1
package/README.md
CHANGED
|
@@ -8,8 +8,6 @@ TypeScript utilities - logger, currency, offensive programming, file operations,
|
|
|
8
8
|
pnpm add @adriangalilea/utils
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
Also available on [JSR](https://jsr.io/@adriangalilea/utils) but the JSR publish pipeline is not automated — versions may lag behind npm.
|
|
12
|
-
|
|
13
11
|
## Usage
|
|
14
12
|
|
|
15
13
|
### Logger
|
|
@@ -250,6 +248,34 @@ newMessages = [{ id: '2', from: 'bob', text: 'hey' }]
|
|
|
250
248
|
|
|
251
249
|
Saves state to: `$XDG_STATE_HOME/unseen/{name}.json`
|
|
252
250
|
|
|
251
|
+
### Polyglot strings (`say`)
|
|
252
|
+
|
|
253
|
+
A typed multi-language string is just an object literal `{ en, es, … }` — the keys are the source of truth, the TS compiler enforces completeness, there's no JSON file / extraction tool / registry.
|
|
254
|
+
|
|
255
|
+
```typescript
|
|
256
|
+
import { say, type Polyglot } from '@adriangalilea/utils/say'
|
|
257
|
+
|
|
258
|
+
say({ en: 'Hello', es: 'Hola' }, 'es') // → 'Hola'
|
|
259
|
+
say({ en: 'Hello', es: 'Hola' }, 'fr') // TS error: '"fr"' not in '"en" | "es"'
|
|
260
|
+
|
|
261
|
+
// parametric — closures, no wrapper:
|
|
262
|
+
const greeting = (name: string) => ({ en: `Hi ${name}`, es: `Hola ${name}` })
|
|
263
|
+
say(greeting('Adrian'), 'es') // → 'Hola Adrian'
|
|
264
|
+
|
|
265
|
+
// type your own adapter:
|
|
266
|
+
const notify = (msg: Polyglot<'en' | 'es'>, lang: 'en' | 'es') =>
|
|
267
|
+
transport.send(say(msg, lang))
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
In a bot, `bot/language` adds `ctx.say` — a callable namespace bound to `ctx.lang`:
|
|
271
|
+
|
|
272
|
+
```typescript
|
|
273
|
+
ctx.say({ en: 'Continue', es: 'Continuar' }) // → string
|
|
274
|
+
await ctx.say.send({ en: 'Hi', es: 'Hola' }) // → ctx.send(resolved)
|
|
275
|
+
await ctx.say.edit({ en: 'Done', es: 'Listo' }) // → ctx.editText (callback only)
|
|
276
|
+
await ctx.say.answer({ en: 'OK', es: 'OK' }) // → ctx.answer (callback only)
|
|
277
|
+
```
|
|
278
|
+
|
|
253
279
|
### Telegram bot plugins (GramIO)
|
|
254
280
|
|
|
255
281
|
Plugins for personal Telegram bots built on [GramIO](https://gramio.dev). Each plugin lives at its own subpath; peer deps (`gramio`, `@gramio/storage`, `@gramio/session`, `@gramio/format`, `marked`) are **all optional** — install only what you import.
|
|
@@ -297,15 +323,13 @@ See `src/bot/CLAUDE.md` for storage layout, design decisions, and gotchas.
|
|
|
297
323
|
|
|
298
324
|
## Release
|
|
299
325
|
|
|
300
|
-
Bump version in `package.json
|
|
326
|
+
Bump version in `package.json`, push to `main`. CI handles everything:
|
|
301
327
|
|
|
302
328
|
1. Type-check, lint, build
|
|
303
329
|
2. Publish to npm via [OIDC trusted publishing](https://docs.npmjs.com/generating-provenance-statements) (no tokens — GitHub Actions proves identity directly to npm)
|
|
304
330
|
3. Create git tag `vX.Y.Z`
|
|
305
331
|
4. Generate changelog via [git-cliff](https://github.com/orhun/git-cliff) and create GitHub release
|
|
306
332
|
|
|
307
|
-
JSR publishing is not automated — see `jsr.json` TODO.
|
|
308
|
-
|
|
309
333
|
## License
|
|
310
334
|
|
|
311
335
|
MIT
|
|
@@ -11,51 +11,71 @@
|
|
|
11
11
|
* │ no → drop + notify admin (rate-limited) │
|
|
12
12
|
* └─────────────────────────────────────────────────┘
|
|
13
13
|
* │
|
|
14
|
-
* admin gets DM with [✅
|
|
14
|
+
* admin gets DM with [✅ Approve] [❌ Deny]
|
|
15
15
|
* │
|
|
16
16
|
* admin taps
|
|
17
17
|
* │
|
|
18
18
|
* stranger's session updated · stranger gets DM
|
|
19
19
|
*
|
|
20
|
-
* **Storage layout.**
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* the `/access` admin menu can list without scanning the whole DB.
|
|
20
|
+
* **Storage layout.** This plugin stores its per-user record under
|
|
21
|
+
* the `access` field of the shared session record (see
|
|
22
|
+
* `bot/CLAUDE.md` § "Shared session, one record per user"). All
|
|
23
|
+
* per-user state across our plugins coexists in the same record:
|
|
25
24
|
*
|
|
26
|
-
* storage
|
|
27
|
-
* access
|
|
28
|
-
*
|
|
25
|
+
* storage[String(userId)] = {
|
|
26
|
+
* access: { status, approvedAt, … }, // ← this plugin
|
|
27
|
+
* language: 'es', // ← bot/language
|
|
28
|
+
* history: { items: [...] }, // ← bot/message-history
|
|
29
|
+
* }
|
|
29
30
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* own record. To mutate Pepe's record we hit the storage at the same
|
|
33
|
-
* key format we registered the session with (`access:<id>`) and
|
|
34
|
-
* update the index. This isn't a hack — it's our own module
|
|
35
|
-
* coordinating with itself.
|
|
31
|
+
* Plus one tiny admin-side index so `/access` can list pending /
|
|
32
|
+
* approved / denied without scanning every user:
|
|
36
33
|
*
|
|
37
|
-
*
|
|
38
|
-
* extended first or `bot.start()` throws. Inside this plugin,
|
|
39
|
-
* `ctx.adminId` and `ctx.isAdmin` are typed.
|
|
34
|
+
* storage['ac:index'] = { pending: [...ids], approved: [...], denied: [...] }
|
|
40
35
|
*
|
|
41
|
-
*
|
|
36
|
+
* **Cross-user mutations.** When the admin taps `[✅ Approve]` on
|
|
37
|
+
* Pepe's notification, `ctx` is the admin's, so `ctx.session` is the
|
|
38
|
+
* admin's record — useless for mutating Pepe. We reach for Pepe's
|
|
39
|
+
* record directly via `storage.get(String(pepeId))`, preserve other
|
|
40
|
+
* plugins' fields in it (read-modify-write), and put it back.
|
|
41
|
+
*
|
|
42
|
+
* **i18n.** Every user-facing string is an inline `{ en, es }`
|
|
43
|
+
* polyglot literal resolved via `say(value, lang)` at the call site
|
|
44
|
+
* — no message bundle, no override registry. The recipient's stored
|
|
45
|
+
* `language` field (set by `bot/language`) picks the variant; falls
|
|
46
|
+
* back to `'en'`. Want a different default? Set `language` on the
|
|
47
|
+
* relevant session record before this plugin fires.
|
|
48
|
+
*
|
|
49
|
+
* **Composes with**:
|
|
50
|
+
* - `adminContext` (kit.ts) — required, gives us `ctx.adminId` /
|
|
51
|
+
* `ctx.isAdmin`. Declared as a runtime dependency.
|
|
52
|
+
* - `@gramio/session` — the user creates ONE session at bot level
|
|
53
|
+
* and passes it to this plugin (and the other session-using
|
|
54
|
+
* ones). gramio's runtime dedup ensures the session derive runs
|
|
55
|
+
* exactly once per update.
|
|
56
|
+
*
|
|
57
|
+
* Peer deps: `gramio`, `@gramio/session`, `@gramio/storage`.
|
|
42
58
|
*
|
|
43
59
|
* @example
|
|
44
60
|
* import { Bot } from 'gramio'
|
|
61
|
+
* import { session } from '@gramio/session'
|
|
45
62
|
* import { redisStorage } from '@gramio/storage-redis'
|
|
46
63
|
* import { adminContext, gracefulStart } from '@adriangalilea/utils/bot/kit'
|
|
47
64
|
* import { accessControl } from '@adriangalilea/utils/bot/access-control'
|
|
48
65
|
*
|
|
49
66
|
* const storage = redisStorage()
|
|
67
|
+
* const userSession = session({ storage, key: 'session', initial: () => ({}) })
|
|
50
68
|
*
|
|
51
69
|
* const bot = new Bot(process.env.BOT_TOKEN!)
|
|
52
70
|
* .extend(adminContext({ adminId: 190202471 }))
|
|
53
|
-
* .extend(
|
|
54
|
-
* .
|
|
71
|
+
* .extend(userSession)
|
|
72
|
+
* .extend(accessControl({ session: userSession, storage, defaults: [1158734055] }))
|
|
73
|
+
* .command('start', (ctx) => ctx.send(`source=${ctx.access.source ?? 'denied'}`))
|
|
55
74
|
*
|
|
56
75
|
* await gracefulStart(bot)
|
|
57
76
|
*/
|
|
58
77
|
import { type AnyBot, type DeriveDefinitions, Plugin } from 'gramio';
|
|
78
|
+
import { session } from '@gramio/session';
|
|
59
79
|
import { type Storage } from '@gramio/storage';
|
|
60
80
|
export type AccessStatus = 'unknown' | 'pending' | 'approved' | 'denied';
|
|
61
81
|
export type AccessUser = {
|
|
@@ -65,8 +85,10 @@ export type AccessUser = {
|
|
|
65
85
|
username?: string;
|
|
66
86
|
};
|
|
67
87
|
/**
|
|
68
|
-
*
|
|
69
|
-
* `
|
|
88
|
+
* What this plugin persists under `ctx.session.access` per user. When
|
|
89
|
+
* `ctx.session.access` is `undefined`, the user has never interacted
|
|
90
|
+
* (or has been wiped via /forget). The plugin treats that as
|
|
91
|
+
* status='unknown' for gating purposes.
|
|
70
92
|
*/
|
|
71
93
|
export type AccessRecord = {
|
|
72
94
|
status: AccessStatus;
|
|
@@ -105,13 +127,33 @@ export type AccessInfo = {
|
|
|
105
127
|
allowed: false;
|
|
106
128
|
reason: 'denied' | 'pending' | 'unknown' | 'no-sender';
|
|
107
129
|
};
|
|
130
|
+
/**
|
|
131
|
+
* Loose session shape — this plugin writes `access`; it READS `language`
|
|
132
|
+
* to localize messages it sends to the subject. Both are optional.
|
|
133
|
+
*/
|
|
134
|
+
type SessionLike = {
|
|
135
|
+
access?: AccessRecord;
|
|
136
|
+
language?: string;
|
|
137
|
+
};
|
|
138
|
+
/** @internal — kept unexported so it doesn't clash with peers' refs. */
|
|
139
|
+
type AcSessionPluginRef = ReturnType<typeof session<SessionLike, 'session'>>;
|
|
108
140
|
export type AccessControlOptions = {
|
|
109
|
-
/**
|
|
110
|
-
|
|
141
|
+
/**
|
|
142
|
+
* Shared session plugin. This plugin extends it for type flow;
|
|
143
|
+
* gramio's runtime dedup ensures it only runs once per update.
|
|
144
|
+
* `ctx.session.access` is where the per-user access record lives.
|
|
145
|
+
*/
|
|
146
|
+
session: AcSessionPluginRef;
|
|
147
|
+
/**
|
|
148
|
+
* Storage backend for cross-user mutations (admin approves Pepe →
|
|
149
|
+
* write to Pepe's session record from admin's ctx). Must be the
|
|
150
|
+
* same storage instance passed to `session()`.
|
|
151
|
+
*/
|
|
152
|
+
storage: Storage;
|
|
111
153
|
/** Always-allowed user ids, hardcoded. Bypass the entire flow. */
|
|
112
154
|
defaults?: ReadonlyArray<number>;
|
|
113
|
-
/**
|
|
114
|
-
|
|
155
|
+
/** Pass `false` to silence the first-attempt reply to denied users. */
|
|
156
|
+
silentDeny?: boolean;
|
|
115
157
|
/** Min ms between repeat admin notifications for the same user. Default 6h. */
|
|
116
158
|
notifyThrottleMs?: number;
|
|
117
159
|
/** Callbacks for your own logging / metrics. */
|
|
@@ -132,157 +174,159 @@ type AdminDerives = {
|
|
|
132
174
|
adminId: number;
|
|
133
175
|
isAdmin: boolean;
|
|
134
176
|
};
|
|
135
|
-
type AccessSessionDerives = {
|
|
136
|
-
_accessSession: AccessRecord;
|
|
137
|
-
};
|
|
138
177
|
type AccessDerives = {
|
|
139
178
|
access: AccessInfo;
|
|
140
179
|
};
|
|
141
|
-
|
|
142
|
-
|
|
180
|
+
type SessionDerives = {
|
|
181
|
+
session: SessionLike & {
|
|
182
|
+
$clear: () => Promise<void>;
|
|
183
|
+
};
|
|
184
|
+
};
|
|
185
|
+
export declare const accessControl: (opts: AccessControlOptions) => Plugin<{}, DeriveDefinitions & {
|
|
186
|
+
global: AdminDerives & AccessDerives & SessionDerives;
|
|
143
187
|
} & {
|
|
144
188
|
message: {
|
|
145
|
-
|
|
189
|
+
session: SessionLike & {
|
|
146
190
|
$clear: () => Promise<void>;
|
|
147
191
|
};
|
|
148
192
|
};
|
|
149
193
|
channel_post: {
|
|
150
|
-
|
|
194
|
+
session: SessionLike & {
|
|
151
195
|
$clear: () => Promise<void>;
|
|
152
196
|
};
|
|
153
197
|
};
|
|
154
198
|
inline_query: {
|
|
155
|
-
|
|
199
|
+
session: SessionLike & {
|
|
156
200
|
$clear: () => Promise<void>;
|
|
157
201
|
};
|
|
158
202
|
};
|
|
159
203
|
chosen_inline_result: {
|
|
160
|
-
|
|
204
|
+
session: SessionLike & {
|
|
161
205
|
$clear: () => Promise<void>;
|
|
162
206
|
};
|
|
163
207
|
};
|
|
164
208
|
callback_query: {
|
|
165
|
-
|
|
209
|
+
session: SessionLike & {
|
|
166
210
|
$clear: () => Promise<void>;
|
|
167
211
|
};
|
|
168
212
|
};
|
|
169
213
|
shipping_query: {
|
|
170
|
-
|
|
214
|
+
session: SessionLike & {
|
|
171
215
|
$clear: () => Promise<void>;
|
|
172
216
|
};
|
|
173
217
|
};
|
|
174
218
|
pre_checkout_query: {
|
|
175
|
-
|
|
219
|
+
session: SessionLike & {
|
|
176
220
|
$clear: () => Promise<void>;
|
|
177
221
|
};
|
|
178
222
|
};
|
|
179
223
|
poll_answer: {
|
|
180
|
-
|
|
224
|
+
session: SessionLike & {
|
|
181
225
|
$clear: () => Promise<void>;
|
|
182
226
|
};
|
|
183
227
|
};
|
|
184
228
|
chat_join_request: {
|
|
185
|
-
|
|
229
|
+
session: SessionLike & {
|
|
186
230
|
$clear: () => Promise<void>;
|
|
187
231
|
};
|
|
188
232
|
};
|
|
189
233
|
new_chat_members: {
|
|
190
|
-
|
|
234
|
+
session: SessionLike & {
|
|
191
235
|
$clear: () => Promise<void>;
|
|
192
236
|
};
|
|
193
237
|
};
|
|
194
238
|
new_chat_title: {
|
|
195
|
-
|
|
239
|
+
session: SessionLike & {
|
|
196
240
|
$clear: () => Promise<void>;
|
|
197
241
|
};
|
|
198
242
|
};
|
|
199
243
|
new_chat_photo: {
|
|
200
|
-
|
|
244
|
+
session: SessionLike & {
|
|
201
245
|
$clear: () => Promise<void>;
|
|
202
246
|
};
|
|
203
247
|
};
|
|
204
248
|
delete_chat_photo: {
|
|
205
|
-
|
|
249
|
+
session: SessionLike & {
|
|
206
250
|
$clear: () => Promise<void>;
|
|
207
251
|
};
|
|
208
252
|
};
|
|
209
253
|
group_chat_created: {
|
|
210
|
-
|
|
254
|
+
session: SessionLike & {
|
|
211
255
|
$clear: () => Promise<void>;
|
|
212
256
|
};
|
|
213
257
|
};
|
|
214
258
|
message_auto_delete_timer_changed: {
|
|
215
|
-
|
|
259
|
+
session: SessionLike & {
|
|
216
260
|
$clear: () => Promise<void>;
|
|
217
261
|
};
|
|
218
262
|
};
|
|
219
263
|
migrate_to_chat_id: {
|
|
220
|
-
|
|
264
|
+
session: SessionLike & {
|
|
221
265
|
$clear: () => Promise<void>;
|
|
222
266
|
};
|
|
223
267
|
};
|
|
224
268
|
migrate_from_chat_id: {
|
|
225
|
-
|
|
269
|
+
session: SessionLike & {
|
|
226
270
|
$clear: () => Promise<void>;
|
|
227
271
|
};
|
|
228
272
|
};
|
|
229
273
|
pinned_message: {
|
|
230
|
-
|
|
274
|
+
session: SessionLike & {
|
|
231
275
|
$clear: () => Promise<void>;
|
|
232
276
|
};
|
|
233
277
|
};
|
|
234
278
|
invoice: {
|
|
235
|
-
|
|
279
|
+
session: SessionLike & {
|
|
236
280
|
$clear: () => Promise<void>;
|
|
237
281
|
};
|
|
238
282
|
};
|
|
239
283
|
successful_payment: {
|
|
240
|
-
|
|
284
|
+
session: SessionLike & {
|
|
241
285
|
$clear: () => Promise<void>;
|
|
242
286
|
};
|
|
243
287
|
};
|
|
244
288
|
chat_shared: {
|
|
245
|
-
|
|
289
|
+
session: SessionLike & {
|
|
246
290
|
$clear: () => Promise<void>;
|
|
247
291
|
};
|
|
248
292
|
};
|
|
249
293
|
proximity_alert_triggered: {
|
|
250
|
-
|
|
294
|
+
session: SessionLike & {
|
|
251
295
|
$clear: () => Promise<void>;
|
|
252
296
|
};
|
|
253
297
|
};
|
|
254
298
|
video_chat_scheduled: {
|
|
255
|
-
|
|
299
|
+
session: SessionLike & {
|
|
256
300
|
$clear: () => Promise<void>;
|
|
257
301
|
};
|
|
258
302
|
};
|
|
259
303
|
video_chat_started: {
|
|
260
|
-
|
|
304
|
+
session: SessionLike & {
|
|
261
305
|
$clear: () => Promise<void>;
|
|
262
306
|
};
|
|
263
307
|
};
|
|
264
308
|
video_chat_ended: {
|
|
265
|
-
|
|
309
|
+
session: SessionLike & {
|
|
266
310
|
$clear: () => Promise<void>;
|
|
267
311
|
};
|
|
268
312
|
};
|
|
269
313
|
video_chat_participants_invited: {
|
|
270
|
-
|
|
314
|
+
session: SessionLike & {
|
|
271
315
|
$clear: () => Promise<void>;
|
|
272
316
|
};
|
|
273
317
|
};
|
|
274
318
|
web_app_data: {
|
|
275
|
-
|
|
319
|
+
session: SessionLike & {
|
|
276
320
|
$clear: () => Promise<void>;
|
|
277
321
|
};
|
|
278
322
|
};
|
|
279
323
|
location: {
|
|
280
|
-
|
|
324
|
+
session: SessionLike & {
|
|
281
325
|
$clear: () => Promise<void>;
|
|
282
326
|
};
|
|
283
327
|
};
|
|
284
328
|
passport_data: {
|
|
285
|
-
|
|
329
|
+
session: SessionLike & {
|
|
286
330
|
$clear: () => Promise<void>;
|
|
287
331
|
};
|
|
288
332
|
};
|
|
@@ -329,7 +373,7 @@ export declare const accessControl: (opts?: AccessControlOptions) => Plugin<{},
|
|
|
329
373
|
* easily spin up a second Telegram account. Writes a `pending` record
|
|
330
374
|
* to storage at the same key the plugin's session would, updates the
|
|
331
375
|
* index, then DMs the admin with the real
|
|
332
|
-
* `[✅
|
|
376
|
+
* `[✅ Approve][❌ Deny]` keyboard. Tapping those buttons exercises
|
|
333
377
|
* the real callback handlers end-to-end.
|
|
334
378
|
*
|
|
335
379
|
* Pass the SAME `storage` instance you passed to `accessControl({ storage })`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"access-control.d.ts","sourceRoot":"","sources":["../../src/bot/access-control.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"access-control.d.ts","sourceRoot":"","sources":["../../src/bot/access-control.ts"],"names":[],"mappings":"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"}
|