Плагин Hydration для grammY (hydrate
)
Этот плагин добавляет полезные методы на два типа объектов, а именно
- результаты вызовов API, и
- объекты в контекстном объекте
ctx
.
Вместо того чтобы вызывать ctx
или bot
и вводить всевозможные идентификаторы, теперь вы можете просто вызывать методы на объектах, и они будут работать. Лучше всего это видно на примере.
БЕЗ этого плагина:
bot.on(":photo", async (ctx) => {
const statusMessage = await ctx.reply("Обрабатываю");
await doWork(ctx.msg.photo); // длительная обработка изображения
await ctx.api.editMessageText(
ctx.chat.id,
statusMessage.message_id,
"Готово!",
);
setTimeout(
() =>
ctx.api.deleteMessage(ctx.chat.id, statusMessage.message_id).catch(() => {
// Ничего не делайте при ошибках.
}),
3000,
);
});
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
C этим плагином:
bot.on(":photo", async (ctx) => {
const statusMessage = await ctx.reply("Обрабатываю");
await doWork(ctx.msg.photo); // длительная обработка изображения
await statusMessage.editText("Done!"); // очень просто!
setTimeout(() => statusMessage.delete().catch(() => {}), 3000);
});
2
3
4
5
6
Неплохо, правда?
Установка
Существует два способа установки этого плагина.
Простая установка
Этот плагин можно установить простым способом, которого должно быть достаточно для большинства пользователей.
import { Bot, Context } from "grammy";
import { hydrate, HydrateFlavor } from "@grammyjs/hydrate";
type MyContext = HydrateFlavor<Context>;
const bot = new Bot<MyContext>("");
bot.use(hydrate());
2
3
4
5
6
7
8
import { Bot } from "grammy";
import { hydrate } from "@grammyjs/hydrate";
const bot = new Bot("");
bot.use(hydrate());
2
3
4
5
6
import { Bot, Context } from "https://deno.land/x/grammy@v1.33.0/mod.ts";
import {
hydrate,
HydrateFlavor,
} from "https://deno.land/x/grammy_hydrate@v1.4.1/mod.ts";
type MyContext = HydrateFlavor<Context>;
const bot = new Bot<MyContext>("");
bot.use(hydrate());
2
3
4
5
6
7
8
9
10
11
Расширенная установка
При использовании простой установки гидратируются только те результаты вызовов API, которые проходят через ctx
, например, ctx
. Это большинство вызовов для большинства ботов.
Однако некоторым ботам может потребоваться обращение к bot
. В этом случае вам следует использовать эту расширенную установку.
Она интегрирует гидратацию контекста и гидратацию результатов вызовов API отдельно в вашего бота. Обратите внимание, что теперь вам также необходимо установить расширители API.
import { Api, Bot, Context } from "grammy";
import {
hydrateApi,
HydrateApiFlavor,
hydrateContext,
HydrateFlavor,
} from "@grammyjs/hydrate";
type MyContext = HydrateFlavor<Context>;
type MyApi = HydrateApiFlavor<Api>;
const bot = new Bot<MyContext, MyApi>("");
bot.use(hydrateContext());
bot.api.config.use(hydrateApi());
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import { Bot } from "grammy";
import { hydrateApi, hydrateContext } from "@grammyjs/hydrate";
const bot = new Bot("");
bot.use(hydrateContext());
bot.api.config.use(hydrateApi());
2
3
4
5
6
7
import { Api, Bot, Context } from "https://deno.land/x/grammy@v1.33.0/mod.ts";
import {
hydrateApi,
HydrateApiFlavor,
hydrateContext,
HydrateFlavor,
} from "https://deno.land/x/grammy_hydrate@v1.4.1/mod.ts";
type MyContext = HydrateFlavor<Context>;
type MyApi = HydrateApiFlavor<Api>;
const bot = new Bot<MyContext, MyApi>("");
bot.use(hydrateContext());
bot.api.config.use(hydrateApi());
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Какие предметы гидратируются
В настоящее время этот плагин гидратирует
- сообщения и посты канала
- редактируемые сообщения и редактируемые посты канала
- callback queries
- inline queries
- выбранные результаты inline
- запросы веб приложения
- запросы перед оформлением заказа и доставкой
- запросы на присоединение к чату
Все объекты гидратируются на
- объект контекста
ctx
, - объект обновления
ctx
внутри контекста,.update - краткие записи на объекте контекста, такие как
ctx
, и.msg - результаты вызовов API, где это применимо.