@mtcute/dispatcher 0.17.2 → 0.18.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.
Files changed (111) hide show
  1. package/callback-data-builder.cjs +126 -0
  2. package/callback-data-builder.d.cts +49 -0
  3. package/callback-data-builder.js +121 -0
  4. package/callback-data-builder.test.d.cts +1 -0
  5. package/context/base.d.cts +9 -0
  6. package/context/business-message.cjs +143 -0
  7. package/context/business-message.d.cts +60 -0
  8. package/context/business-message.js +138 -0
  9. package/context/callback-query.cjs +92 -0
  10. package/context/callback-query.d.cts +62 -0
  11. package/context/callback-query.js +87 -0
  12. package/context/chat-join-request.cjs +32 -0
  13. package/context/chat-join-request.d.cts +17 -0
  14. package/context/chat-join-request.d.ts +1 -1
  15. package/context/chat-join-request.js +27 -0
  16. package/context/chosen-inline-result.cjs +30 -0
  17. package/context/chosen-inline-result.d.cts +22 -0
  18. package/context/chosen-inline-result.d.ts +1 -1
  19. package/context/chosen-inline-result.js +25 -0
  20. package/context/index.d.cts +9 -0
  21. package/context/inline-query.cjs +20 -0
  22. package/context/inline-query.d.cts +15 -0
  23. package/context/inline-query.js +15 -0
  24. package/context/message.cjs +182 -0
  25. package/context/message.d.cts +82 -0
  26. package/context/message.d.ts +2 -2
  27. package/context/message.js +177 -0
  28. package/context/parse.cjs +45 -0
  29. package/context/parse.d.cts +13 -0
  30. package/context/parse.js +40 -0
  31. package/context/pre-checkout-query.cjs +24 -0
  32. package/context/pre-checkout-query.d.cts +17 -0
  33. package/context/pre-checkout-query.d.ts +1 -1
  34. package/context/pre-checkout-query.js +19 -0
  35. package/context/scene-transition.cjs +52 -0
  36. package/context/scene-transition.d.cts +24 -0
  37. package/context/scene-transition.d.ts +1 -1
  38. package/context/scene-transition.js +47 -0
  39. package/dispatcher.cjs +860 -0
  40. package/dispatcher.d.cts +880 -0
  41. package/dispatcher.d.ts +4 -4
  42. package/dispatcher.js +855 -0
  43. package/filters/bots.cjs +94 -0
  44. package/filters/bots.d.cts +62 -0
  45. package/filters/bots.d.ts +2 -4
  46. package/filters/bots.js +89 -0
  47. package/filters/bots.test.d.cts +1 -0
  48. package/filters/bundle.cjs +79 -0
  49. package/filters/bundle.d.cts +10 -0
  50. package/filters/bundle.js +74 -0
  51. package/filters/chat.cjs +43 -0
  52. package/filters/chat.d.cts +29 -0
  53. package/filters/chat.d.ts +8 -6
  54. package/filters/chat.js +38 -0
  55. package/filters/group.cjs +49 -0
  56. package/filters/group.d.cts +26 -0
  57. package/filters/group.js +44 -0
  58. package/filters/index.d.cts +4 -0
  59. package/filters/logic.cjs +57 -0
  60. package/filters/logic.d.cts +29 -0
  61. package/filters/logic.js +52 -0
  62. package/filters/logic.test.d.cts +1 -0
  63. package/filters/message.cjs +130 -0
  64. package/filters/message.d.cts +223 -0
  65. package/filters/message.d.ts +5 -1
  66. package/filters/message.js +125 -0
  67. package/filters/state.cjs +21 -0
  68. package/filters/state.d.cts +15 -0
  69. package/filters/state.js +16 -0
  70. package/filters/text.cjs +87 -0
  71. package/filters/text.d.cts +64 -0
  72. package/filters/text.d.ts +2 -2
  73. package/filters/text.js +82 -0
  74. package/filters/types.d.cts +91 -0
  75. package/filters/updates.cjs +27 -0
  76. package/filters/updates.d.cts +39 -0
  77. package/filters/updates.js +22 -0
  78. package/filters/user.cjs +57 -0
  79. package/filters/user.d.cts +24 -0
  80. package/filters/user.js +52 -0
  81. package/handler.d.cts +41 -0
  82. package/handler.d.ts +1 -1
  83. package/index.cjs +37 -2528
  84. package/index.js +16 -2507
  85. package/package.json +10 -9
  86. package/propagation.cjs +15 -0
  87. package/propagation.d.cts +22 -0
  88. package/propagation.js +10 -0
  89. package/state/index.d.cts +5 -0
  90. package/state/key.cjs +32 -0
  91. package/state/key.d.cts +24 -0
  92. package/state/key.js +27 -0
  93. package/state/provider.d.cts +5 -0
  94. package/state/providers/index.d.cts +2 -0
  95. package/state/providers/memory.cjs +79 -0
  96. package/state/providers/memory.d.cts +29 -0
  97. package/state/providers/memory.js +74 -0
  98. package/state/providers/sqlite.cjs +99 -0
  99. package/state/providers/sqlite.d.cts +28 -0
  100. package/state/providers/sqlite.js +94 -0
  101. package/state/repository.d.cts +62 -0
  102. package/state/service.cjs +69 -0
  103. package/state/service.d.cts +20 -0
  104. package/state/service.js +64 -0
  105. package/state/update-state.cjs +206 -0
  106. package/state/update-state.d.cts +151 -0
  107. package/state/update-state.d.ts +1 -1
  108. package/state/update-state.js +201 -0
  109. package/wizard.cjs +90 -0
  110. package/wizard.d.cts +64 -0
  111. package/wizard.js +85 -0
@@ -0,0 +1,44 @@
1
+ function every(filter) {
2
+ return (ctx, state) => {
3
+ let i = 0;
4
+ const upds = ctx.messages;
5
+ const max = upds.length;
6
+ const next = () => {
7
+ if (i === max) return true;
8
+ const res = filter(upds[i++], state);
9
+ if (typeof res === "boolean") {
10
+ if (!res) return false;
11
+ return next();
12
+ }
13
+ return res.then((r) => {
14
+ if (!r) return false;
15
+ return next();
16
+ });
17
+ };
18
+ return next();
19
+ };
20
+ }
21
+ function some(filter) {
22
+ return (ctx, state) => {
23
+ let i = 0;
24
+ const upds = ctx.messages;
25
+ const max = upds.length;
26
+ const next = () => {
27
+ if (i === max) return false;
28
+ const res = filter(upds[i++], state);
29
+ if (typeof res === "boolean") {
30
+ if (res) return true;
31
+ return next();
32
+ }
33
+ return res.then((r) => {
34
+ if (r) return true;
35
+ return next();
36
+ });
37
+ };
38
+ return next();
39
+ };
40
+ }
41
+ export {
42
+ every,
43
+ some
44
+ };
@@ -0,0 +1,4 @@
1
+ import * as filters from './bundle.js';
2
+ import UpdateFilter = filters.UpdateFilter;
3
+ export { filters };
4
+ export type { UpdateFilter };
@@ -0,0 +1,57 @@
1
+ if (typeof globalThis !== "undefined" && !globalThis._MTCUTE_CJS_DEPRECATION_WARNED) {
2
+ globalThis._MTCUTE_CJS_DEPRECATION_WARNED = true;
3
+ console.warn("[mtcute-workspace] CommonJS support is deprecated and will be removed in 0.20.0. Please consider switching to ESM, it's " + (/* @__PURE__ */ new Date()).getFullYear() + " already.");
4
+ console.warn("[mtcute-workspace] Learn more about switching to ESM: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c");
5
+ }
6
+ "use strict";
7
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
8
+ const any = () => true;
9
+ function not(fn) {
10
+ return (upd, state) => {
11
+ const res = fn(upd, state);
12
+ if (typeof res === "boolean") return !res;
13
+ return res.then((r) => !r);
14
+ };
15
+ }
16
+ function and(...fns) {
17
+ return (upd, state) => {
18
+ let i = 0;
19
+ const max = fns.length;
20
+ const next = () => {
21
+ if (i === max) return true;
22
+ const res = fns[i++](upd, state);
23
+ if (typeof res === "boolean") {
24
+ if (!res) return false;
25
+ return next();
26
+ }
27
+ return res.then((r) => {
28
+ if (!r) return false;
29
+ return next();
30
+ });
31
+ };
32
+ return next();
33
+ };
34
+ }
35
+ function or(...fns) {
36
+ return (upd, state) => {
37
+ let i = 0;
38
+ const max = fns.length;
39
+ const next = () => {
40
+ if (i === max) return false;
41
+ const res = fns[i++](upd, state);
42
+ if (typeof res === "boolean") {
43
+ if (res) return true;
44
+ return next();
45
+ }
46
+ return res.then((r) => {
47
+ if (r) return true;
48
+ return next();
49
+ });
50
+ };
51
+ return next();
52
+ };
53
+ }
54
+ exports.and = and;
55
+ exports.any = any;
56
+ exports.not = not;
57
+ exports.or = or;
@@ -0,0 +1,29 @@
1
+ import { ExtractBaseMany, ExtractMod, Invert, UnionToIntersection, UpdateFilter } from './types.js';
2
+ /**
3
+ * Filter that matches any update
4
+ */
5
+ export declare const any: UpdateFilter<any>;
6
+ /**
7
+ * Invert a filter by applying a NOT logical operation:
8
+ * `not(fn) = NOT fn`
9
+ *
10
+ * > **Note**: This also inverts type modification, i.e.
11
+ * > if the base is `{ field: string | number | null }`
12
+ * > and the modification is `{ field: string }`,
13
+ * > then the negated filter will have
14
+ * > inverted modification `{ field: number | null }`
15
+ *
16
+ * @param fn Filter to negate
17
+ */
18
+ export declare function not<Base, Mod, State extends object>(fn: UpdateFilter<Base, Mod, State>): UpdateFilter<Base, Invert<Base, Mod>, State>;
19
+ export declare function and<Base1, Mod1, State1 extends object, Base2, Mod2, State2 extends object>(fn1: UpdateFilter<Base1, Mod1, State1>, fn2: UpdateFilter<Base2, Mod2, State2>): UpdateFilter<Base1 & Base2, Mod1 & Mod2, State1 | State2>;
20
+ export declare function and<Base1, Mod1, State1 extends object, Base2, Mod2, State2 extends object, Base3, Mod3, State3 extends object>(fn1: UpdateFilter<Base1, Mod1, State1>, fn2: UpdateFilter<Base2, Mod2, State2>, fn3: UpdateFilter<Base3, Mod3, State3>): UpdateFilter<Base1 & Base2 & Base3, Mod1 & Mod2 & Mod3, State1 | State2 | State3>;
21
+ export declare function and<Base1, Mod1, State1 extends object, Base2, Mod2, State2 extends object, Base3, Mod3, State3 extends object, Base4, Mod4, State4 extends object>(fn1: UpdateFilter<Base1, Mod1, State1>, fn2: UpdateFilter<Base2, Mod2, State2>, fn3: UpdateFilter<Base3, Mod3, State3>, fn4: UpdateFilter<Base4, Mod4, State4>): UpdateFilter<Base1 & Base2 & Base3 & Base4, Mod1 & Mod2 & Mod3 & Mod4, State1 | State2 | State3 | State4>;
22
+ export declare function and<Base1, Mod1, State1 extends object, Base2, Mod2, State2 extends object, Base3, Mod3, State3 extends object, Base4, Mod4, State4 extends object, Base5, Mod5, State5 extends object>(fn1: UpdateFilter<Base1, Mod1, State1>, fn2: UpdateFilter<Base2, Mod2, State2>, fn3: UpdateFilter<Base3, Mod3, State3>, fn4: UpdateFilter<Base4, Mod4, State4>, fn5: UpdateFilter<Base5, Mod5, State5>): UpdateFilter<Base1 & Base2 & Base3 & Base4 & Base5, Mod1 & Mod2 & Mod3 & Mod4 & Mod5, State1 | State2 | State3 | State4 | State5>;
23
+ export declare function and<Base1, Mod1, State1 extends object, Base2, Mod2, State2 extends object, Base3, Mod3, State3 extends object, Base4, Mod4, State4 extends object, Base5, Mod5, State5 extends object, Base6, Mod6, State6 extends object>(fn1: UpdateFilter<Base1, Mod1, State1>, fn2: UpdateFilter<Base2, Mod2, State2>, fn3: UpdateFilter<Base3, Mod3, State3>, fn4: UpdateFilter<Base4, Mod4, State4>, fn5: UpdateFilter<Base5, Mod5, State5>, fn6: UpdateFilter<Base6, Mod6, State6>): UpdateFilter<Base1 & Base2 & Base3 & Base4 & Base5 & Base6, Mod1 & Mod2 & Mod3 & Mod4 & Mod5 & Mod6, State1 | State2 | State3 | State4 | State5 | State6>;
24
+ export declare function and<Filters extends UpdateFilter<any, any>[]>(...fns: Filters): UpdateFilter<ExtractBaseMany<Filters>, UnionToIntersection<ExtractMod<Filters[number]>>>;
25
+ export declare function or<Base1, Mod1, State1 extends object, Base2, Mod2, State2 extends object>(fn1: UpdateFilter<Base1, Mod1, State1>, fn2: UpdateFilter<Base2, Mod2, State2>): UpdateFilter<Base1 & Base2, Mod1 | Mod2, State1 | State2>;
26
+ export declare function or<Base1, Mod1, State1 extends object, Base2, Mod2, State2 extends object, Base3, Mod3, State3 extends object>(fn1: UpdateFilter<Base1, Mod1, State1>, fn2: UpdateFilter<Base2, Mod2, State2>, fn3: UpdateFilter<Base3, Mod3, State3>): UpdateFilter<Base1 & Base2 & Base3, Mod1 | Mod2 | Mod3, State1 | State2 | State3>;
27
+ export declare function or<Base1, Mod1, State1 extends object, Base2, Mod2, State2 extends object, Base3, Mod3, State3 extends object, Base4, Mod4, State4 extends object>(fn1: UpdateFilter<Base1, Mod1, State1>, fn2: UpdateFilter<Base2, Mod2, State2>, fn3: UpdateFilter<Base3, Mod3, State3>, fn4: UpdateFilter<Base4, Mod4, State4>): UpdateFilter<Base1 & Base2 & Base3 & Base4, Mod1 | Mod2 | Mod3 | Mod4, State1 | State2 | State3 | State4>;
28
+ export declare function or<Base1, Mod1, State1 extends object, Base2, Mod2, State2 extends object, Base3, Mod3, State3 extends object, Base4, Mod4, State4 extends object, Base5, Mod5, State5 extends object>(fn1: UpdateFilter<Base1, Mod1, State1>, fn2: UpdateFilter<Base2, Mod2, State2>, fn3: UpdateFilter<Base3, Mod3, State3>, fn4: UpdateFilter<Base4, Mod4, State4>, fn5: UpdateFilter<Base5, Mod5, State5>): UpdateFilter<Base1 & Base2 & Base3 & Base4 & Base5, Mod1 | Mod2 | Mod3 | Mod4 | Mod5, State1 | State2 | State3 | State4 | State5>;
29
+ export declare function or<Base1, Mod1, State1 extends object, Base2, Mod2, State2 extends object, Base3, Mod3, State3 extends object, Base4, Mod4, State4 extends object, Base5, Mod5, State5 extends object, Base6, Mod6, State6 extends object>(fn1: UpdateFilter<Base1, Mod1, State1>, fn2: UpdateFilter<Base2, Mod2, State2>, fn3: UpdateFilter<Base3, Mod3, State3>, fn4: UpdateFilter<Base4, Mod4, State4>, fn5: UpdateFilter<Base5, Mod5, State5>, fn6: UpdateFilter<Base6, Mod6, State6>): UpdateFilter<Base1 & Base2 & Base3 & Base4 & Base5 & Base6, Mod1 | Mod2 | Mod3 | Mod4 | Mod5 | Mod6, State1 | State2 | State3 | State4 | State5 | State6>;
@@ -0,0 +1,52 @@
1
+ const any = () => true;
2
+ function not(fn) {
3
+ return (upd, state) => {
4
+ const res = fn(upd, state);
5
+ if (typeof res === "boolean") return !res;
6
+ return res.then((r) => !r);
7
+ };
8
+ }
9
+ function and(...fns) {
10
+ return (upd, state) => {
11
+ let i = 0;
12
+ const max = fns.length;
13
+ const next = () => {
14
+ if (i === max) return true;
15
+ const res = fns[i++](upd, state);
16
+ if (typeof res === "boolean") {
17
+ if (!res) return false;
18
+ return next();
19
+ }
20
+ return res.then((r) => {
21
+ if (!r) return false;
22
+ return next();
23
+ });
24
+ };
25
+ return next();
26
+ };
27
+ }
28
+ function or(...fns) {
29
+ return (upd, state) => {
30
+ let i = 0;
31
+ const max = fns.length;
32
+ const next = () => {
33
+ if (i === max) return false;
34
+ const res = fns[i++](upd, state);
35
+ if (typeof res === "boolean") {
36
+ if (res) return true;
37
+ return next();
38
+ }
39
+ return res.then((r) => {
40
+ if (r) return true;
41
+ return next();
42
+ });
43
+ };
44
+ return next();
45
+ };
46
+ }
47
+ export {
48
+ and,
49
+ any,
50
+ not,
51
+ or
52
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,130 @@
1
+ if (typeof globalThis !== "undefined" && !globalThis._MTCUTE_CJS_DEPRECATION_WARNED) {
2
+ globalThis._MTCUTE_CJS_DEPRECATION_WARNED = true;
3
+ console.warn("[mtcute-workspace] CommonJS support is deprecated and will be removed in 0.20.0. Please consider switching to ESM, it's " + (/* @__PURE__ */ new Date()).getFullYear() + " already.");
4
+ console.warn("[mtcute-workspace] Learn more about switching to ESM: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c");
5
+ }
6
+ "use strict";
7
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
8
+ const core = require("@mtcute/core");
9
+ const incoming = (msg) => !msg.isOutgoing;
10
+ const outgoing = (msg) => msg.isOutgoing;
11
+ const scheduled = (msg) => msg.isScheduled;
12
+ const reply = (msg) => msg.replyToMessage !== null;
13
+ function replyOrigin(origin) {
14
+ return (msg) => msg.replyToMessage?.originIs(origin) ?? false;
15
+ }
16
+ const media = (msg) => msg.media !== null;
17
+ function mediaOf(type) {
18
+ return (msg) => msg.media?.type === type;
19
+ }
20
+ const photo = mediaOf("photo");
21
+ const dice = mediaOf("dice");
22
+ const contact = mediaOf("contact");
23
+ const audio = mediaOf("audio");
24
+ const voice = mediaOf("voice");
25
+ const sticker = mediaOf("sticker");
26
+ const document = mediaOf("document");
27
+ const anyVideo = mediaOf("video");
28
+ const location = mediaOf("location");
29
+ const liveLocation = mediaOf("live_location");
30
+ const game = mediaOf("game");
31
+ const webpage = mediaOf("webpage");
32
+ const venue = mediaOf("venue");
33
+ const poll = mediaOf("poll");
34
+ const invoice = mediaOf("invoice");
35
+ const story = mediaOf("story");
36
+ const anyLocation = (msg) => msg.media instanceof core.RawLocation;
37
+ const anyDocument = (msg) => msg.media instanceof core.RawDocument;
38
+ const video = (msg) => msg.media?.type === "video" && !msg.media.isAnimation && !msg.media.isRound;
39
+ const animation = (msg) => msg.media?.type === "video" && msg.media.isAnimation && !msg.media.isRound;
40
+ const roundMessage = (msg) => msg.media?.type === "video" && !msg.media.isAnimation && msg.media.isRound;
41
+ function stickerByType(type) {
42
+ return (msg) => msg.media?.type === "sticker" && msg.media.stickerType === type;
43
+ }
44
+ function stickerBySourceType(type) {
45
+ return (msg) => msg.media?.type === "sticker" && msg.media.sourceType === type;
46
+ }
47
+ const text = (msg) => msg.media === null && !msg.isService;
48
+ const service = (msg) => msg.isService;
49
+ function action(type) {
50
+ if (Array.isArray(type)) {
51
+ const index = {};
52
+ type.forEach((it) => index[it] = true);
53
+ return (msg) => msg.action?.type in index;
54
+ }
55
+ return (msg) => msg.action?.type === type;
56
+ }
57
+ function sender(type) {
58
+ return (msg) => msg.sender.type === type;
59
+ }
60
+ function replyTo(filter) {
61
+ return async (msg, state) => {
62
+ if (!msg.replyToMessage?.id) return false;
63
+ const reply2 = msg._name === "new_message" ? await msg.getReplyTo() : msg.replyTo;
64
+ if (!reply2) return false;
65
+ if (msg._name === "new_message") {
66
+ msg.getReplyTo = () => Promise.resolve(reply2);
67
+ }
68
+ if (!filter) return true;
69
+ return filter(reply2, state);
70
+ };
71
+ }
72
+ function withCompleteSender(filter) {
73
+ return async (msg, state) => {
74
+ try {
75
+ await msg.getCompleteSender();
76
+ } catch {
77
+ return false;
78
+ }
79
+ if (!filter) return true;
80
+ return filter(msg, state);
81
+ };
82
+ }
83
+ function withCompleteChat(filter) {
84
+ return async (msg, state) => {
85
+ try {
86
+ await msg.getCompleteChat();
87
+ } catch {
88
+ return false;
89
+ }
90
+ if (!filter) return true;
91
+ return filter(msg, state);
92
+ };
93
+ }
94
+ exports.action = action;
95
+ exports.animation = animation;
96
+ exports.anyDocument = anyDocument;
97
+ exports.anyLocation = anyLocation;
98
+ exports.anyVideo = anyVideo;
99
+ exports.audio = audio;
100
+ exports.contact = contact;
101
+ exports.dice = dice;
102
+ exports.document = document;
103
+ exports.game = game;
104
+ exports.incoming = incoming;
105
+ exports.invoice = invoice;
106
+ exports.liveLocation = liveLocation;
107
+ exports.location = location;
108
+ exports.media = media;
109
+ exports.mediaOf = mediaOf;
110
+ exports.outgoing = outgoing;
111
+ exports.photo = photo;
112
+ exports.poll = poll;
113
+ exports.reply = reply;
114
+ exports.replyOrigin = replyOrigin;
115
+ exports.replyTo = replyTo;
116
+ exports.roundMessage = roundMessage;
117
+ exports.scheduled = scheduled;
118
+ exports.sender = sender;
119
+ exports.service = service;
120
+ exports.sticker = sticker;
121
+ exports.stickerBySourceType = stickerBySourceType;
122
+ exports.stickerByType = stickerByType;
123
+ exports.story = story;
124
+ exports.text = text;
125
+ exports.venue = venue;
126
+ exports.video = video;
127
+ exports.voice = voice;
128
+ exports.webpage = webpage;
129
+ exports.withCompleteChat = withCompleteChat;
130
+ exports.withCompleteSender = withCompleteSender;
@@ -0,0 +1,223 @@
1
+ import { _RepliedMessageAssertionsByOrigin, Audio, Contact, Dice, Document, Game, Invoice, LiveLocation, Location, MaybeArray, Message, MessageAction, MessageMediaType, Peer, Photo, Poll, RepliedMessageInfo, RepliedMessageOrigin, Sticker, StickerSourceType, StickerType, Story, User, Venue, Video, Voice, WebPage, RawDocument } from '@mtcute/core';
2
+ import { BusinessMessageContext } from '../context/business-message.js';
3
+ import { MessageContext } from '../index.js';
4
+ import { Modify, UpdateFilter } from './types.js';
5
+ /**
6
+ * Filter incoming messages.
7
+ *
8
+ * Messages sent to yourself (i.e. Saved Messages) are also "incoming"
9
+ */
10
+ export declare const incoming: UpdateFilter<Message, {
11
+ isOutgoing: false;
12
+ }>;
13
+ /**
14
+ * Filter outgoing messages.
15
+ *
16
+ * Messages sent to yourself (i.e. Saved Messages) are **not** "outgoing"
17
+ */
18
+ export declare const outgoing: UpdateFilter<Message, {
19
+ isOutgoing: true;
20
+ }>;
21
+ /**
22
+ * Filter for scheduled messages
23
+ */
24
+ export declare const scheduled: UpdateFilter<Message, {
25
+ isScheduled: true;
26
+ }>;
27
+ /**
28
+ * Filter messages that are replies to some other message
29
+ */
30
+ export declare const reply: UpdateFilter<Message, {
31
+ replyToMessage: RepliedMessageInfo;
32
+ }>;
33
+ /**
34
+ * Filter messages that are replies with the given origin type
35
+ */
36
+ export declare function replyOrigin<T extends RepliedMessageOrigin>(origin: T): UpdateFilter<Message, {
37
+ replyToMessage: Modify<RepliedMessageInfo, _RepliedMessageAssertionsByOrigin[T] & {
38
+ origin: T;
39
+ }>;
40
+ }>;
41
+ /**
42
+ * Filter messages containing some media
43
+ */
44
+ export declare const media: UpdateFilter<Message, {
45
+ media: Exclude<Message['media'], null>;
46
+ }>;
47
+ /**
48
+ * Filter messages containing media of given type
49
+ */
50
+ export declare function mediaOf<T extends MessageMediaType>(type: T): UpdateFilter<Message, {
51
+ media: Extract<Message['media'], {
52
+ type: T;
53
+ }>;
54
+ }>;
55
+ /** Filter messages containing a photo */
56
+ export declare const photo: UpdateFilter<Message, {
57
+ media: Photo;
58
+ }>;
59
+ /** Filter messages containing a dice */
60
+ export declare const dice: UpdateFilter<Message, {
61
+ media: Dice;
62
+ }>;
63
+ /** Filter messages containing a contact */
64
+ export declare const contact: UpdateFilter<Message, {
65
+ media: Contact;
66
+ }>;
67
+ /** Filter messages containing an audio file */
68
+ export declare const audio: UpdateFilter<Message, {
69
+ media: Audio;
70
+ }>;
71
+ /** Filter messages containing a voice message (audio-only) */
72
+ export declare const voice: UpdateFilter<Message, {
73
+ media: Voice;
74
+ }>;
75
+ /** Filter messages containing a sticker */
76
+ export declare const sticker: UpdateFilter<Message, {
77
+ media: Sticker;
78
+ }>;
79
+ /** Filter messages containing a document (a file) */
80
+ export declare const document: UpdateFilter<Message, {
81
+ media: Document;
82
+ }>;
83
+ /** Filter messages containing any video (videos, round messages and animations) */
84
+ export declare const anyVideo: UpdateFilter<Message, {
85
+ media: Video;
86
+ }>;
87
+ /** Filter messages containing a static location */
88
+ export declare const location: UpdateFilter<Message, {
89
+ media: Location;
90
+ }>;
91
+ /** Filter messages containing a live location */
92
+ export declare const liveLocation: UpdateFilter<Message, {
93
+ media: LiveLocation;
94
+ }>;
95
+ /** Filter messages containing a game */
96
+ export declare const game: UpdateFilter<Message, {
97
+ media: Game;
98
+ }>;
99
+ /** Filter messages containing a web page */
100
+ export declare const webpage: UpdateFilter<Message, {
101
+ media: WebPage;
102
+ }>;
103
+ /** Filter messages containing a venue */
104
+ export declare const venue: UpdateFilter<Message, {
105
+ media: Venue;
106
+ }>;
107
+ /** Filter messages containing a poll */
108
+ export declare const poll: UpdateFilter<Message, {
109
+ media: Poll;
110
+ }>;
111
+ /** Filter messages containing an invoice */
112
+ export declare const invoice: UpdateFilter<Message, {
113
+ media: Invoice;
114
+ }>;
115
+ /** Filter messages containing a story */
116
+ export declare const story: UpdateFilter<Message, {
117
+ media: Story;
118
+ }>;
119
+ /**
120
+ * Filter messages containing any location (live or static).
121
+ */
122
+ export declare const anyLocation: UpdateFilter<Message, {
123
+ media: Location;
124
+ }>;
125
+ /**
126
+ * Filter messages containing a document
127
+ *
128
+ * This will also match media like audio, video, voice
129
+ * that also use Documents
130
+ */
131
+ export declare const anyDocument: UpdateFilter<Message, {
132
+ media: RawDocument;
133
+ }>;
134
+ /**
135
+ * Filter messages containing a simple video.
136
+ *
137
+ * This does not include round messages and animations
138
+ */
139
+ export declare const video: UpdateFilter<Message, {
140
+ media: Modify<Video, {
141
+ isRound: false;
142
+ isAnimation: false;
143
+ }>;
144
+ }>;
145
+ /**
146
+ * Filter messages containing an animation.
147
+ *
148
+ * > **Note**: Legacy GIFs (i.e. documents with `image/gif` MIME)
149
+ * > are also considered animations.
150
+ */
151
+ export declare const animation: UpdateFilter<Message, {
152
+ media: Modify<Video, {
153
+ isRound: false;
154
+ isAnimation: true;
155
+ }>;
156
+ }>;
157
+ /**
158
+ * Filter messages containing a round message (aka video note).
159
+ */
160
+ export declare const roundMessage: UpdateFilter<Message, {
161
+ media: Modify<Video, {
162
+ isRound: true;
163
+ isAnimation: false;
164
+ }>;
165
+ }>;
166
+ /**
167
+ * Filter messages containing a sticker by its type
168
+ */
169
+ export declare function stickerByType(type: StickerType): UpdateFilter<Message, {
170
+ media: Sticker;
171
+ }>;
172
+ /**
173
+ * Filter messages containing a sticker by its source file type
174
+ */
175
+ export declare function stickerBySourceType(type: StickerSourceType): UpdateFilter<Message, {
176
+ media: Sticker;
177
+ }>;
178
+ /**
179
+ * Filter text-only messages non-service messages
180
+ */
181
+ export declare const text: UpdateFilter<Message, {
182
+ media: null;
183
+ isService: false;
184
+ }>;
185
+ /**
186
+ * Filter service messages
187
+ */
188
+ export declare const service: UpdateFilter<Message, {
189
+ isService: true;
190
+ }>;
191
+ /**
192
+ * Filter service messages by action type
193
+ */
194
+ export declare function action<T extends Exclude<MessageAction, null>['type']>(type: MaybeArray<T>): UpdateFilter<Message, {
195
+ action: Extract<MessageAction, {
196
+ type: T;
197
+ }>;
198
+ sender: T extends 'user_joined_link' | 'user_removed' | 'history_cleared' | 'contact_joined' | 'bot_allowed' ? User : Peer;
199
+ }>;
200
+ export declare function sender<T extends Message['sender']['type']>(type: T): UpdateFilter<Message, {
201
+ sender: Extract<Message['sender'], {
202
+ type: T;
203
+ }>;
204
+ }>;
205
+ /**
206
+ * Filter that matches messages that are replies to some other message that can be fetched
207
+ * (i.e. not `private` origin, and has not been deleted)
208
+ *
209
+ * Optionally, you can pass a filter that will be applied to the replied message.
210
+ */
211
+ export declare function replyTo<Mod, State extends object>(filter?: UpdateFilter<Message, Mod, State>): UpdateFilter<MessageContext | BusinessMessageContext, {
212
+ getReplyTo: () => Promise<Message & Mod>;
213
+ }, State>;
214
+ /**
215
+ * Middleware-like filter that will fetch the sender of the message
216
+ * and make it available to further filters, as well as the handler itself.
217
+ */
218
+ export declare function withCompleteSender<Mod, State extends object>(filter?: UpdateFilter<MessageContext, Mod, State>): UpdateFilter<MessageContext, Mod, State>;
219
+ /**
220
+ * Middleware-like filter that will fetch the chat of the message
221
+ * and make it available to further filters, as well as the handler itself.
222
+ */
223
+ export declare function withCompleteChat<Mod, State extends object>(filter?: UpdateFilter<MessageContext, Mod, State>): UpdateFilter<MessageContext, Mod, State>;
@@ -1,4 +1,4 @@
1
- import { Audio, Contact, Dice, Document, Game, Invoice, LiveLocation, Location, MaybeArray, Message, MessageAction, MessageMediaType, Peer, Photo, Poll, RepliedMessageInfo, RepliedMessageOrigin, Sticker, StickerSourceType, StickerType, User, Venue, Video, Voice, WebPage, _RepliedMessageAssertionsByOrigin, RawDocument } from '@mtcute/core';
1
+ import { _RepliedMessageAssertionsByOrigin, Audio, Contact, Dice, Document, Game, Invoice, LiveLocation, Location, MaybeArray, Message, MessageAction, MessageMediaType, Peer, Photo, Poll, RepliedMessageInfo, RepliedMessageOrigin, Sticker, StickerSourceType, StickerType, Story, User, Venue, Video, Voice, WebPage, RawDocument } from '@mtcute/core';
2
2
  import { BusinessMessageContext } from '../context/business-message.js';
3
3
  import { MessageContext } from '../index.js';
4
4
  import { Modify, UpdateFilter } from './types.js';
@@ -112,6 +112,10 @@ export declare const poll: UpdateFilter<Message, {
112
112
  export declare const invoice: UpdateFilter<Message, {
113
113
  media: Invoice;
114
114
  }>;
115
+ /** Filter messages containing a story */
116
+ export declare const story: UpdateFilter<Message, {
117
+ media: Story;
118
+ }>;
115
119
  /**
116
120
  * Filter messages containing any location (live or static).
117
121
  */
@@ -0,0 +1,125 @@
1
+ import { RawLocation, RawDocument } from "@mtcute/core";
2
+ const incoming = (msg) => !msg.isOutgoing;
3
+ const outgoing = (msg) => msg.isOutgoing;
4
+ const scheduled = (msg) => msg.isScheduled;
5
+ const reply = (msg) => msg.replyToMessage !== null;
6
+ function replyOrigin(origin) {
7
+ return (msg) => msg.replyToMessage?.originIs(origin) ?? false;
8
+ }
9
+ const media = (msg) => msg.media !== null;
10
+ function mediaOf(type) {
11
+ return (msg) => msg.media?.type === type;
12
+ }
13
+ const photo = mediaOf("photo");
14
+ const dice = mediaOf("dice");
15
+ const contact = mediaOf("contact");
16
+ const audio = mediaOf("audio");
17
+ const voice = mediaOf("voice");
18
+ const sticker = mediaOf("sticker");
19
+ const document = mediaOf("document");
20
+ const anyVideo = mediaOf("video");
21
+ const location = mediaOf("location");
22
+ const liveLocation = mediaOf("live_location");
23
+ const game = mediaOf("game");
24
+ const webpage = mediaOf("webpage");
25
+ const venue = mediaOf("venue");
26
+ const poll = mediaOf("poll");
27
+ const invoice = mediaOf("invoice");
28
+ const story = mediaOf("story");
29
+ const anyLocation = (msg) => msg.media instanceof RawLocation;
30
+ const anyDocument = (msg) => msg.media instanceof RawDocument;
31
+ const video = (msg) => msg.media?.type === "video" && !msg.media.isAnimation && !msg.media.isRound;
32
+ const animation = (msg) => msg.media?.type === "video" && msg.media.isAnimation && !msg.media.isRound;
33
+ const roundMessage = (msg) => msg.media?.type === "video" && !msg.media.isAnimation && msg.media.isRound;
34
+ function stickerByType(type) {
35
+ return (msg) => msg.media?.type === "sticker" && msg.media.stickerType === type;
36
+ }
37
+ function stickerBySourceType(type) {
38
+ return (msg) => msg.media?.type === "sticker" && msg.media.sourceType === type;
39
+ }
40
+ const text = (msg) => msg.media === null && !msg.isService;
41
+ const service = (msg) => msg.isService;
42
+ function action(type) {
43
+ if (Array.isArray(type)) {
44
+ const index = {};
45
+ type.forEach((it) => index[it] = true);
46
+ return (msg) => msg.action?.type in index;
47
+ }
48
+ return (msg) => msg.action?.type === type;
49
+ }
50
+ function sender(type) {
51
+ return (msg) => msg.sender.type === type;
52
+ }
53
+ function replyTo(filter) {
54
+ return async (msg, state) => {
55
+ if (!msg.replyToMessage?.id) return false;
56
+ const reply2 = msg._name === "new_message" ? await msg.getReplyTo() : msg.replyTo;
57
+ if (!reply2) return false;
58
+ if (msg._name === "new_message") {
59
+ msg.getReplyTo = () => Promise.resolve(reply2);
60
+ }
61
+ if (!filter) return true;
62
+ return filter(reply2, state);
63
+ };
64
+ }
65
+ function withCompleteSender(filter) {
66
+ return async (msg, state) => {
67
+ try {
68
+ await msg.getCompleteSender();
69
+ } catch {
70
+ return false;
71
+ }
72
+ if (!filter) return true;
73
+ return filter(msg, state);
74
+ };
75
+ }
76
+ function withCompleteChat(filter) {
77
+ return async (msg, state) => {
78
+ try {
79
+ await msg.getCompleteChat();
80
+ } catch {
81
+ return false;
82
+ }
83
+ if (!filter) return true;
84
+ return filter(msg, state);
85
+ };
86
+ }
87
+ export {
88
+ action,
89
+ animation,
90
+ anyDocument,
91
+ anyLocation,
92
+ anyVideo,
93
+ audio,
94
+ contact,
95
+ dice,
96
+ document,
97
+ game,
98
+ incoming,
99
+ invoice,
100
+ liveLocation,
101
+ location,
102
+ media,
103
+ mediaOf,
104
+ outgoing,
105
+ photo,
106
+ poll,
107
+ reply,
108
+ replyOrigin,
109
+ replyTo,
110
+ roundMessage,
111
+ scheduled,
112
+ sender,
113
+ service,
114
+ sticker,
115
+ stickerBySourceType,
116
+ stickerByType,
117
+ story,
118
+ text,
119
+ venue,
120
+ video,
121
+ voice,
122
+ webpage,
123
+ withCompleteChat,
124
+ withCompleteSender
125
+ };