Skip to content

Commit

Permalink
Export types CommandMiddleware, HearsMiddleware, etc (#154)
Browse files Browse the repository at this point in the history
Co-authored-by: KnorpelSenf <[email protected]>
  • Loading branch information
IlyaSemenov and KnorpelSenf authored May 19, 2022
1 parent 5d452cc commit 2eda2a5
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 22 deletions.
74 changes: 52 additions & 22 deletions src/composer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ export class Composer<C extends Context> implements MiddlewareObj<C> {
*/
hears(
trigger: MaybeArray<string | RegExp>,
...middleware: Array<Middleware<HearsContext<C>>>
...middleware: Array<HearsMiddleware<C>>
): Composer<HearsContext<C>> {
const trg = triggerFn(trigger);
return this.on([":text", ":caption"]).filter(
Expand Down Expand Up @@ -376,7 +376,7 @@ export class Composer<C extends Context> implements MiddlewareObj<C> {
command: MaybeArray<
StringWithSuggestions<S | "start" | "help" | "settings">
>,
...middleware: Array<Middleware<CommandContext<C>>>
...middleware: Array<CommandMiddleware<C>>
): Composer<CommandContext<C>> {
const atCommands = new Set<string>();
const noAtCommands = new Set<string>();
Expand Down Expand Up @@ -461,8 +461,8 @@ export class Composer<C extends Context> implements MiddlewareObj<C> {
*/
callbackQuery(
trigger: MaybeArray<string | RegExp>,
...middleware: Array<Middleware<Filter<C, "callback_query:data">>>
): Composer<Filter<C, "callback_query:data">> {
...middleware: Array<CallbackQueryMiddleware<C>>
): Composer<CallbackQueryContext<C>> {
const trg = triggerFn(trigger);
return this.on("callback_query:data").filter(
(ctx) => match(ctx, ctx.callbackQuery.data, trg),
Expand Down Expand Up @@ -490,10 +490,8 @@ export class Composer<C extends Context> implements MiddlewareObj<C> {
*/
gameQuery(
trigger: MaybeArray<string | RegExp>,
...middleware: Array<
Middleware<Filter<C, "callback_query:game_short_name">>
>
): Composer<Filter<C, "callback_query:game_short_name">> {
...middleware: Array<GameQueryMiddleware<C>>
): Composer<GameQueryContext<C>> {
const trg = triggerFn(trigger);
return this.on("callback_query:game_short_name").filter(
(ctx) => match(ctx, ctx.callbackQuery.game_short_name, trg),
Expand Down Expand Up @@ -525,8 +523,8 @@ export class Composer<C extends Context> implements MiddlewareObj<C> {
*/
inlineQuery(
trigger: MaybeArray<string | RegExp>,
...middleware: Array<Middleware<Filter<C, "inline_query">>>
): Composer<Filter<C, "inline_query">> {
...middleware: Array<InlineQueryMiddleware<C>>
): Composer<InlineQueryContext<C>> {
const trg = triggerFn(trigger);
return this.on("inline_query").filter(
(ctx) => match(ctx, ctx.inlineQuery.query, trg),
Expand Down Expand Up @@ -817,25 +815,57 @@ export class Composer<C extends Context> implements MiddlewareObj<C> {
}
}

// === Util functions and types
function triggerFn(trigger: MaybeArray<string | RegExp>) {
return toArray(trigger).map((t) =>
typeof t === "string"
? (txt: string) => (txt === t ? t : null)
: (txt: string) => txt.match(t)
);
}

type HearsContext<C extends Context> = Filter<
// === Filtered context types
export type HearsContext<C extends Context> = Filter<
Omit<C, "match"> & {
match: Extract<C["match"], string | RegExpMatchArray>;
},
":text" | ":caption"
>;
type CommandContext<C extends Context> = Filter<
Omit<C, "match"> & { match: Extract<C["match"], string> },
export type CommandContext<C extends Context> = Filter<
Omit<C, "match"> & {
match: Extract<C["match"], string>;
},
":entities:bot_command"
>;
export type CallbackQueryContext<C extends Context> = Filter<
C,
"callback_query:data"
>;
export type GameQueryContext<C extends Context> = Filter<
C,
"callback_query:game_short_name"
>;
export type InlineQueryContext<C extends Context> = Filter<
C,
"inline_query"
>;

// === Filtered context middleware types
export type HearsMiddleware<C extends Context> = Middleware<
HearsContext<C>
>;
export type CommandMiddleware<C extends Context> = Middleware<
CommandContext<C>
>;
export type CallbackQueryMiddleware<C extends Context> = Middleware<
CallbackQueryContext<C>
>;
export type GameQueryMiddleware<C extends Context> = Middleware<
GameQueryContext<C>
>;
export type InlineQueryMiddleware<C extends Context> = Middleware<
InlineQueryContext<C>
>;

// === Util functions
function triggerFn(trigger: MaybeArray<string | RegExp>) {
return toArray(trigger).map((t) =>
typeof t === "string"
? (txt: string) => (txt === t ? t : null)
: (txt: string) => txt.match(t)
);
}

function match<C extends Context>(
ctx: C,
Expand Down
10 changes: 10 additions & 0 deletions src/mod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,17 @@ export * from "./convenience/webhook.ts";

// A little more advanced stuff
export {
type CallbackQueryContext,
type CallbackQueryMiddleware,
type CommandContext,
type CommandMiddleware,
Composer,
type GameQueryContext,
type GameQueryMiddleware,
type HearsContext,
type HearsMiddleware,
type InlineQueryContext,
type InlineQueryMiddleware,
type Middleware,
type MiddlewareFn,
type MiddlewareObj,
Expand Down

0 comments on commit 2eda2a5

Please sign in to comment.