Hydration(hydrate

这个插件会安装一些有用的方法在两种类型的对象,即

  1. API调用的结果, 和
  2. 上下文对象 ctx 上的对象。

你现在可以直接调用对象上的方法, 它们就可以正常工作,而不需要调用 ctx.apibot.api,也不需要提供各种标识符。 这一点最好用一个例子来说明。

没有这个插件的情况下:

bot.on(":photo", async (ctx) => {
  const statusMessage = await ctx.reply("Processing");
  await doWork(ctx.msg.photo); // 一些漫长的图像处理
  await ctx.api.editMessageText(
    ctx.chat.id,
    statusMessage.message_id,
    "Done!",
  );
  setTimeout(
    () =>
      ctx.api.deleteMessage(ctx.chat.id, statusMessage.message_id).catch(
        () => {
          // 出错时什么也不做。
        },
      ),
    3000,
  );
});

这个插件的情况下:

bot.on(":photo", async (ctx) => {
  const statusMessage = await ctx.reply("Processing");
  await doWork(ctx.msg.photo); // 一些漫长的图像处理
  await statusMessage.editText("Done!"); // 看,如此简单!
  setTimeout(() => statusMessage.delete().catch(() => {}), 3000);
});

是不是非常简洁?

安装

有两种方式安装这个插件。

简单安装

这个插件可以简单直接地安装,应该可以满足绝大多数用户。

import { Bot, Context } from "grammy";
import { hydrate, HydrateFlavor } from "@grammyjs/hydrate";

type MyContext = HydrateFlavor<Context>;

const bot = new Bot<MyContext>("");

bot.use(hydrate());
import { Bot } from "grammy";
import { hydrate } from "@grammyjs/hydrate";

const bot = new Bot("");

bot.use(hydrate());
import { Bot, Context } from "https://deno.land/x/grammy@v1.11.2/mod.ts";
import {
  hydrate,
  HydrateFlavor,
} from "https://deno.land/x/grammy_hydrate@v1.2.1/mod.ts";

type MyContext = HydrateFlavor<Context>;

const bot = new Bot<MyContext>("");

bot.use(hydrate());

高级安装

当使用简单安装时,只有通过 ctx.api 的 API 调用结果将被 hydrated,例如 ctx.reply。 这是大多数 bot 最常用的调用。

然而,有些 bot 可能需要调用 bot.api。 在这种情况下,你应该使用高级安装。

它将会在你的 bot 中分别集成上下文 hydration 和 API 调用结果 hydration。 请注意,你还需要安装一个 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());
import { Bot } from "grammy";
import { hydrateApi, hydrateContext } from "@grammyjs/hydrate";

const bot = new Bot("");

bot.use(hydrateContext());
bot.api.config.use(hydrateApi());
import { Api, Bot, Context } from "https://deno.land/x/grammy@v1.11.2/mod.ts";
import {
  hydrateApi,
  HydrateApiFlavor,
  hydrateContext,
  HydrateFlavor,
} from "https://deno.land/x/grammy_hydrate@v1.2.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());

什么对象会被 hydrated

这个插件目前会 hydrates

  • 消息和频道消息
  • 编辑过的消息和编辑过的频道消息
  • 回调查询
  • inline 查询
  • 选定的 inline 结果
  • web 应用查询
  • 预付款和配送查询
  • 加入聊天请求

所有对象都会被 hydrated 在

  • 在上下文对象 ctx 中,
  • 上下文对象中的 update 对象 ctx.update
  • 上下文对象的快捷方式,例如 ctx.msg
  • 适用的 API 调用结果。

插件概述