mirror of
https://github.com/ReCloudStudio/WebHooker.git
synced 2026-09-22 16:11:29 +00:00
- add feishu_links D1 table and link store helpers - implement X-Lark-Signature verification, url_verification, /gh login|logout|comment|merge|close and card.action.trigger Merge/Close - render interactive cards with clickable title link, inline links and callback buttons (no whole-card card_link) - bind Feishu account in OAuth callback - document event subscription and required scopes
37 lines
1.4 KiB
TypeScript
37 lines
1.4 KiB
TypeScript
import type { RouteTarget, Env, NeutralMessage } from "../../types";
|
|
import type { PlatformDriver, SendResult } from "../types";
|
|
import { getTenantAccessToken, sendMessage, updateMessage } from "./rest";
|
|
import { renderNeutralMessage } from "./render";
|
|
|
|
export class FeishuDriver implements PlatformDriver {
|
|
readonly id = "feishu";
|
|
|
|
async send(message: NeutralMessage, target: RouteTarget, env: Env): Promise<SendResult> {
|
|
const chatId = target.chatId ?? "";
|
|
if (!chatId) {
|
|
return { ok: false, error: "target.chatId is required", errorCode: "NO_TARGET" };
|
|
}
|
|
const tokenRes = await getTenantAccessToken(env);
|
|
if (!tokenRes.ok || !tokenRes.token) {
|
|
return { ok: false, error: tokenRes.error ?? "No token", errorCode: tokenRes.errorCode ?? "NO_TOKEN" };
|
|
}
|
|
return sendMessage(tokenRes.token, chatId, renderNeutralMessage(message));
|
|
}
|
|
|
|
async edit(
|
|
message: NeutralMessage,
|
|
target: RouteTarget,
|
|
env: Env,
|
|
messageId: string,
|
|
): Promise<SendResult> {
|
|
const chatId = target.chatId ?? "";
|
|
if (!chatId) {
|
|
return { ok: false, error: "target.chatId is required", errorCode: "NO_TARGET" };
|
|
}
|
|
const tokenRes = await getTenantAccessToken(env);
|
|
if (!tokenRes.ok || !tokenRes.token) {
|
|
return { ok: false, error: tokenRes.error ?? "No token", errorCode: tokenRes.errorCode ?? "NO_TOKEN" };
|
|
}
|
|
return updateMessage(tokenRes.token, messageId, renderNeutralMessage(message));
|
|
}
|
|
}
|