按钮->业务修改
比如,我想通过点击某个按钮来触发,其他业务数据变更,如一个修改数据库的操作,该如何写?
要通过点击按钮来触发其他业务数据变更,例如修改数据库,可以在 set 函数中执行相应的操作。以下是一个扩展的示例,展示如何在按钮回调中进行数据库操作:
import { Bot } from "grammy";
import { MenuTemplate, MenuMiddleware } from "grammy-inline-menu";
import type { MyContext } from '../../my-context.js';
import { backButtons } from '../general.js';
// 模拟数据库操作函数
async function updateDatabase(userId: number, newValue: string): Promise<void> {
// 在这里实现你的数据库更新逻辑
console.log(`Updating database for user ${userId} with value ${newValue}`);
}
const bot = new Bot<MyContext>("<your-bot-token>");
// 创建菜单模板
const menu = new MenuTemplate<MyContext>((ctx) =>
ctx.t('settings-language')
);
// 添加选择按钮并处理回调
menu.select('lang', {
choices: {
en: "English",
es: "Español",
fr: "Français",
},
isSet: async (ctx, key) => await ctx.i18n.getLocale() === key,
async set(ctx, key) {
// 更新用户语 言设置
await ctx.i18n.setLocale(key);
// 执行数据库更新操作
await updateDatabase(ctx.from.id, key);
return true; // 返回 true 表示选择成功
},
});
// 添加返回按钮
menu.manualRow(backButtons);
// 创建菜单中间件
const menuMiddleware = new MenuMiddleware('/', menu);
// 使用中间件
bot.use(menuMiddleware);
// 启动机器人
bot.start();
说明
- 数据库操作:定义一个
updateDatabase函数来模拟数据库更新。在实际应用中,你可以替换为真实的数据库操作。 - 回调处理:在
set函数中,除了更新语言设置外,还调用updateDatabase函数来处理数据变更。 - 上下文信息:使用
ctx.from.id获取用户的 ID,以便在数据库中进行相应的更新。
确保根据你的实际需求和数据库结构调整 updateDatabase 函数的实现。