feat: 迁移type & 迁移lark接口位置
All checks were successful
Egg CI/CD / build-image (push) Successful in 2m39s
Egg CI/CD / deploy (push) Successful in 4m6s

This commit is contained in:
zhaoyingbo 2024-05-05 03:38:24 +00:00
parent 865308ee31
commit eb7a821549
11 changed files with 660 additions and 606 deletions

22
db/appConfig/index.ts Normal file
View File

@ -0,0 +1,22 @@
import pbClient from "../pbClient";
const getAppId = async () => {
const { value } = await pbClient
.collection("config")
.getOne("iscqaiwe0bnp8ej");
return value as string;
};
const getAppSecret = async () => {
const { value } = await pbClient
.collection("config")
.getOne("9kyiw5mv8unia49");
return value as string;
};
const appConfig = {
getAppId,
getAppSecret,
};
export default appConfig;

View File

@ -1,7 +1,9 @@
import messageGroup from "./messageGroup";
import tenantAccessToken from "./tenantAccessToken";
import appConfig from "./appConfig";
const db = {
appConfig,
messageGroup,
tenantAccessToken,
};

View File

@ -1,10 +1,25 @@
import { managePb404 } from "../../utils/pbTools";
import pbClient from "../pbClient";
export interface PBMessageGroup {
collectionId: string;
collectionName: string;
updated: string;
created: string;
desc: string;
id: string;
name: string;
email?: string[];
chat_id?: string[];
open_id?: string[];
union_id?: string[];
user_id?: string[];
}
const getOne = (groupId: string) =>
managePb404(
async () => await pbClient.collection("message_group").getOne(groupId)
);
) as Promise<PBMessageGroup>;
const messageGroup = {
getOne,

View File

@ -1,14 +0,0 @@
interface PBMessageGroup {
collectionId: string;
collectionName: string;
updated: string;
created: string;
desc: string;
id: string;
name: string;
email?: string[];
chat_id?: string[];
open_id?: string[];
union_id?: string[];
user_id?: string[];
}

View File

@ -1,7 +1,8 @@
import { sleep } from "bun";
import { fetchCIMonitor } from "../../service";
import { getActionType, getIsActionMsg } from "../../utils/msgTools";
import { updateCard } from "../../utils/sendMsg";
import { LarkUserAction } from "../../types";
import lark from "../../service/lark";
const makeChatIdCard = async (body: LarkUserAction) => {
await sleep(500);
@ -38,7 +39,7 @@ const manageBtnClick = async (body: LarkUserAction) => {
const card = await func(body);
if (!card) return;
// 更新飞书的卡片
await updateCard(body.open_message_id, card);
await lark.updateCard(body.open_message_id, card);
};
/**

View File

@ -1,5 +1,6 @@
import lark from "../../service/lark";
import { LarkMessageEvent } from "../../types";
import { getChatId, getIsEventMsg, getMsgType } from "../../utils/msgTools";
import { sendMsg } from "../../utils/sendMsg";
/**
*
@ -35,7 +36,7 @@ const filterIllegalMsg = (body: LarkMessageEvent) => {
// 发表情包就直接发回去
if (msgType === "sticker") {
const content = body?.event?.message?.content;
sendMsg("chat_id", chatId, "sticker", content);
lark.sendMsg("chat_id", chatId, "sticker", content);
return true;
}
// 剩下的非文字消息暂时不处理
@ -50,7 +51,7 @@ const filterIllegalMsg = (body: LarkMessageEvent) => {
const content = JSON.stringify({
text: textList[Math.floor(Math.random() * textList.length)],
});
sendMsg("chat_id", chatId, "text", content);
lark.sendMsg("chat_id", chatId, "text", content);
return true;
}
// 还得过滤下艾特全体成员的消息
@ -76,7 +77,7 @@ const replyNomalMsg = async (body: LarkMessageEvent) => {
template_id: "ctp_AAyVx5R39xU9",
},
});
await sendMsg("chat_id", chatId, "interactive", content);
await lark.sendMsg("chat_id", chatId, "interactive", content);
};
/**

View File

@ -1,5 +1,6 @@
import db from "../../db";
import { sendMsg } from "../../utils/sendMsg";
import lark from "../../service/lark";
import { MsgType, ReceiveIDType } from "../../types";
interface BaseMsg {
msg_type: MsgType;
@ -59,9 +60,7 @@ export const manageMessageReq = async (req: Request) => {
if (body.group_id) {
// 获取所有接收者
const group = (await db.messageGroup.getOne(
body.group_id!
)) as PBMessageGroup;
const group = await db.messageGroup.getOne(body.group_id!);
if (!group) {
return new Response("group not found");
}
@ -72,7 +71,7 @@ export const manageMessageReq = async (req: Request) => {
const makeSendFunc = (receive_id_type: ReceiveIDType) => {
return (receive_id: string) => {
sendList.push(
sendMsg(
lark.sendMsg(
receive_id_type,
receive_id,
body.msg_type,
@ -94,7 +93,7 @@ export const manageMessageReq = async (req: Request) => {
if (body.receive_id && body.receive_id_type) {
sendList.push(
sendMsg(
lark.sendMsg(
body.receive_id_type,
body.receive_id,
body.msg_type,

View File

@ -1,20 +1,21 @@
import db from "../db"
import db from "../db";
export const resetAccessToken = async () => {
const URL = 'https://open.f.mioffice.cn/open-apis/auth/v3/tenant_access_token/internal'
const app_id = 'cli_a1eff35b43b89063'
const app_secret = 'IFSl8ig5DMwMnFjwPiljCfoEWlgRwDxW'
const URL =
"https://open.f.mioffice.cn/open-apis/auth/v3/tenant_access_token/internal";
const app_id = await db.appConfig.getAppId();
const app_secret = await db.appConfig.getAppSecret();
const res = await fetch(URL, {
method: 'POST',
method: "POST",
headers: {
'Content-Type': 'application/json'
"Content-Type": "application/json",
},
body: JSON.stringify({
app_id,
app_secret
})
})
const { tenant_access_token } = await res.json() as any
await db.tenantAccessToken.update(tenant_access_token)
return tenant_access_token
}
app_secret,
}),
});
const { tenant_access_token } = (await res.json()) as any;
await db.tenantAccessToken.update(tenant_access_token);
return tenant_access_token;
};

View File

@ -1,115 +1,125 @@
import db from "../db";
/**
*
* @param func fetch
* @returns
*/
const manageFetch = async (func: Function) => {
try {
const res = await func();
const data = (await res.json()) as ServerResponse;
console.log("🚀 ~ manageFetch ~ data:", data);
return data;
} catch (error) {
console.log("🚀 ~ manageFetch ~ error:", error);
return {
code: 1,
data: null,
msg: "sendMsg fetch error",
};
}
};
/**
* header
* @returns header
*/
const getHeaders = async () => {
const tenant_access_token = await db.tenantAccessToken.get();
return {
"Content-Type": "application/json",
Authorization: `Bearer ${tenant_access_token}`,
};
};
/**
*
* @param {ReceiveIDType} receive_id_type id类型 open_id/user_id/union_id/email/chat_id
* @param {string} receive_id IDID类型应与查询参数receive_id_type
* @param {MsgType} msg_type textpostimagefileaudiomediastickerinteractiveshare_chatshare_user
* @param {string} content JSON结构序列化后的字符串msg_type对应不同内容
*/
export const sendMsg = async (
receive_id_type: ReceiveIDType,
receive_id: string,
msg_type: MsgType,
content: string
) => {
const URL = `https://open.f.mioffice.cn/open-apis/im/v1/messages?receive_id_type=${receive_id_type}`;
const headers = await getHeaders();
return await manageFetch(() =>
fetch(URL, {
method: "POST",
headers,
body: JSON.stringify({ receive_id, msg_type, content }),
})
);
};
/**
*
* @param {string} message_id id
* @param {string} content JSON结构序列化后的字符串msg_type对应不同内容
*/
export const updateCard = async (message_id: string, content: string) => {
const URL = `https://open.f.mioffice.cn/open-apis/im/v1/messages/${message_id}`;
const headers = await getHeaders();
return await manageFetch(() =>
fetch(URL, {
method: "PATCH",
headers,
body: JSON.stringify({ content }),
})
);
};
/**
*
* @param {string} chat_id ID
* @param {string} open_id ID
* @param {MsgType} msg_type textpostimagefileaudiomediastickerinteractiveshare_chatshare_user
* @param {*} card String
*/
export const sendEphemeralMsg = async (
chat_id: string,
open_id: string,
msg_type: MsgType,
card: any
) => {
const URL = `https://open.f.mioffice.cn/open-apis/ephemeral/v1/send`;
const headers = await getHeaders();
return await manageFetch(() =>
fetch(URL, {
method: "POST",
headers,
body: JSON.stringify({ chat_id, open_id, msg_type, card }),
})
);
};
/**
*
* @param message_id id
*/
export const delEphemeralMsg = async (message_id: string) => {
const URL = `https://open.f.mioffice.cn/open-apis/ephemeral/v1/delete`;
const headers = await getHeaders();
return await manageFetch(() =>
fetch(URL, {
method: "POST",
headers,
body: JSON.stringify({ message_id }),
})
);
};
import db from "../db";
import { MsgType, ReceiveIDType, ServerResponse } from "../types";
/**
*
* @param func fetch
* @returns
*/
const manageFetch = async (func: Function) => {
try {
const res = await func();
const data = (await res.json()) as ServerResponse;
console.log("🚀 ~ manageFetch ~ data:", data);
return data;
} catch (error) {
console.log("🚀 ~ manageFetch ~ error:", error);
return {
code: 1,
data: null,
msg: "sendMsg fetch error",
};
}
};
/**
* header
* @returns header
*/
const getHeaders = async () => {
const tenant_access_token = await db.tenantAccessToken.get();
return {
"Content-Type": "application/json",
Authorization: `Bearer ${tenant_access_token}`,
};
};
/**
*
* @param {ReceiveIDType} receive_id_type id类型 open_id/user_id/union_id/email/chat_id
* @param {string} receive_id IDID类型应与查询参数receive_id_type
* @param {MsgType} msg_type textpostimagefileaudiomediastickerinteractiveshare_chatshare_user
* @param {string} content JSON结构序列化后的字符串msg_type对应不同内容
*/
const sendMsg = async (
receive_id_type: ReceiveIDType,
receive_id: string,
msg_type: MsgType,
content: string
) => {
const URL = `https://open.f.mioffice.cn/open-apis/im/v1/messages?receive_id_type=${receive_id_type}`;
const headers = await getHeaders();
return await manageFetch(() =>
fetch(URL, {
method: "POST",
headers,
body: JSON.stringify({ receive_id, msg_type, content }),
})
);
};
/**
*
* @param {string} message_id id
* @param {string} content JSON结构序列化后的字符串msg_type对应不同内容
*/
const updateCard = async (message_id: string, content: string) => {
const URL = `https://open.f.mioffice.cn/open-apis/im/v1/messages/${message_id}`;
const headers = await getHeaders();
return await manageFetch(() =>
fetch(URL, {
method: "PATCH",
headers,
body: JSON.stringify({ content }),
})
);
};
/**
*
* @param {string} chat_id ID
* @param {string} open_id ID
* @param {MsgType} msg_type textpostimagefileaudiomediastickerinteractiveshare_chatshare_user
* @param {*} card String
*/
const sendEphemeralMsg = async (
chat_id: string,
open_id: string,
msg_type: MsgType,
card: any
) => {
const URL = `https://open.f.mioffice.cn/open-apis/ephemeral/v1/send`;
const headers = await getHeaders();
return await manageFetch(() =>
fetch(URL, {
method: "POST",
headers,
body: JSON.stringify({ chat_id, open_id, msg_type, card }),
})
);
};
/**
*
* @param message_id id
*/
const delEphemeralMsg = async (message_id: string) => {
const URL = `https://open.f.mioffice.cn/open-apis/ephemeral/v1/delete`;
const headers = await getHeaders();
return await manageFetch(() =>
fetch(URL, {
method: "POST",
headers,
body: JSON.stringify({ message_id }),
})
);
};
const lark = {
sendMsg,
updateCard,
sendEphemeralMsg,
delEphemeralMsg,
};
export default lark;

View File

@ -1,451 +1,466 @@
/**
*
*/
interface User {
/**
* id
*/
id: string;
/**
*
* @example zhaoyingbo
*/
userId: string;
/**
* open_id
*/
openId: string;
/**
*
*/
remindList: string[];
}
/**
*
*/
interface Remind {
/**
* id
*/
id: string;
/**
* id
*/
owner: string;
/**
* Id
*/
messageId: string;
/**
*
*/
subscriberType: "open_id" | "user_id" | "union_id" | "email" | "chat_id";
/**
* Id
*/
subscriberId: string;
/**
*
*/
needReply: boolean;
/**
*
*/
delayTime: number;
/**
*
*/
cardInfo: {
/**
*
*/
title: string;
/**
* key
*/
imageKey?: string;
/**
*
*/
content?: string;
/**
*
*/
confirmText?: string;
/**
*
*/
cancelText?: string;
/**
*
*/
delayText?: string;
} | null;
/**
*
*/
templateInfo: {
/**
* ID
* ${owner}
* ${remindTime}
*/
pendingTemplateId: string;
/**
* ID
* ${owner}
* ${remindTime}
* ${result} textresult对应的
* ${interactTime}
*/
interactedTemplateId: string;
/**
* ID
*/
confirmedTemplateId: string;
/**
* ID
*/
cancelededTemplateId: string;
/**
* ID
*/
delayedTemplateId: string;
} | null;
/**
*
*/
remindTimes: RemindTime[];
/**
*
*/
enabled: boolean;
/**
* yyyy-MM-dd HH:mm
*/
nextRemindTime: string;
/**
*
*/
nextRemindTimeCHS: string;
}
/**
*
*
*/
interface RemindTime {
/**
*
* single: 一次性
* daily: 每天
* weekly: 每周
* monthly: 每月
* yearly: 每年
* workday: 工作日
* holiday: 节假日
*/
frequency:
| "single"
| "daily"
| "weekly"
| "monthly"
| "yearly"
| "workday"
| "holiday";
/**
* 格式为HH:mm single类型时仅作展示用yyyy-MM-dd HH:mm
*/
time: string;
/**
* [1-7]frequency为weekly时有效
*/
daysOfWeek: number[];
/**
* [1-31]frequency为monthly时有效
*/
daysOfMonth: number[];
/**
* frequency为 yearly MM-dd
*/
dayOfYear: string;
}
/**
*
*
*/
interface RemindRecord {
/**
* Id
*/
id: string;
/**
* Id
*/
remindId: string;
/**
* Id
*/
messageId: string;
/**
*
* pending: 待确认
* delay: 已延迟
* confirmed: 已确认
* canceled: 已取消
*/
status: "pending" | "delayed" | "confirmed" | "canceled";
/**
* yyyy-MM-dd HH:mm
*/
remindTime: string;
/**
* yyyy-MM-dd HH:mm
*/
interactTime: string;
/**
* 07:00
*/
result: object;
}
/**
*
*/
interface Header {
/**
* ID
* @example 0f8ab23b60993cf8dd15c8cde4d7b0f5
*/
event_id: string;
/**
* token
* @example tV9djUKSjzVnekV7xTg2Od06NFTcsBnj
*/
token: string;
/**
*
* @example 1693565712117
*/
create_time: string;
/**
*
* @example im.message.receive_v1
*/
event_type: string;
/**
* tenant_key
* @example 2ee61fe50f4f1657
*/
tenant_key: string;
/**
* app_id
* @example cli_a1eff35b43b89063
*/
app_id: string;
}
/**
* ID信息
*/
interface UserIdInfo {
/**
*
* @example ou_032f507d08f9a7f28b042fcd086daef5
*/
open_id: string;
/**
*
* @example on_7111660fddd8302ce47bf1999147c011
*/
union_id: string;
/**
*
* @example zhaoyingbo
*/
user_id: string;
}
/**
* AT的人的信息
*/
interface Mention {
/**
* ID信息
*/
id: UserIdInfo;
/**
*
* @example "@_user_1"
*/
key: string;
/**
*
* @example
*/
name: string;
/**
* ID
* @example 2ee61fe50f4f1657
*/
tenant_key: string;
}
/**
*
*/
interface Message {
/**
* ID
* @example oc_433b1cb7a9dbb7ebe70a4e1a59cb8bb1
*/
chat_id: string;
/**
*
* @example group | p2p
*/
chat_type: string;
/**
* JSON字符串文本内容
* @example "{\"text\":\"@_user_1 测试\"}"
*/
content: string;
/**
*
* @example 1693565711996
*/
create_time: string;
/**
*
*/
mentions?: Mention[];
/**
* ID
* @example om_038fc0eceed6224a1abc1cdaa4266405
*/
message_id: string;
/**
*
* @example textpostimagefileaudiomediastickerinteractiveshare_chatshare_user
*/
message_type: string;
}
/**
*
*/
interface Sender {
/**
* id
*/
sender_id: UserIdInfo;
/**
*
* @example user
*/
sender_type: string;
/**
* ID
* @example 2ee61fe50f4f1657
*/
tenant_key: string;
}
/**
*
*/
interface Event {
message: Message;
sender: Sender;
}
/**
*
*/
interface LarkMessageEvent {
/**
*
* @example 2.0
*/
schema: string;
/**
*
*/
header: Header;
/**
*
*/
event: Event;
}
/**
* Action信息
*/
interface LarkUserAction {
/**
* open_id
*/
open_id: string;
/**
*
* @example zhaoyingbo
*/
user_id: string;
/**
* ID
* @example om_038fc0eceed6224a1abc1cdaa4266405
*/
open_message_id: string;
/**
* ID
* @example oc_433b1cb7a9dbb7ebe70a4e1a59cb8bb1
*/
open_chat_id: string;
/**
* ID
* @example 2ee61fe50f4f1657
*/
tenant_key: string;
/**
* token
* @example tV9djUKSjzVnekV7xTg2Od06NFTcsBnj
*/
token: string;
/**
*
*/
action: {
/**
*
*/
value: any;
/**
*
* @example picker_datetime
*/
tag: string;
/**
*
* @example 2023-09-03 10:35 +0800
*/
option: string;
/**
*
*/
timezone: string;
};
}
type ReceiveIDType = "open_id" | "user_id" | "union_id" | "email" | "chat_id";
type MsgType = "text" | "post" | "image" | "file" | "audio" | "media" | "sticker" | "interactive" | "share_chat" | "share_user";
interface ServerResponse {
code: number;
data: any;
msg: string;
}
/**
*
*/
export interface User {
/**
* id
*/
id: string;
/**
*
* @example zhaoyingbo
*/
userId: string;
/**
* open_id
*/
openId: string;
/**
*
*/
remindList: string[];
}
/**
*
*/
export interface Remind {
/**
* id
*/
id: string;
/**
* id
*/
owner: string;
/**
* Id
*/
messageId: string;
/**
*
*/
subscriberType: "open_id" | "user_id" | "union_id" | "email" | "chat_id";
/**
* Id
*/
subscriberId: string;
/**
*
*/
needReply: boolean;
/**
*
*/
delayTime: number;
/**
*
*/
cardInfo: {
/**
*
*/
title: string;
/**
* key
*/
imageKey?: string;
/**
*
*/
content?: string;
/**
*
*/
confirmText?: string;
/**
*
*/
cancelText?: string;
/**
*
*/
delayText?: string;
} | null;
/**
*
*/
templateInfo: {
/**
* ID
* ${owner}
* ${remindTime}
*/
pendingTemplateId: string;
/**
* ID
* ${owner}
* ${remindTime}
* ${result} textresult对应的
* ${interactTime}
*/
interactedTemplateId: string;
/**
* ID
*/
confirmedTemplateId: string;
/**
* ID
*/
cancelededTemplateId: string;
/**
* ID
*/
delayedTemplateId: string;
} | null;
/**
*
*/
remindTimes: RemindTime[];
/**
*
*/
enabled: boolean;
/**
* yyyy-MM-dd HH:mm
*/
nextRemindTime: string;
/**
*
*/
nextRemindTimeCHS: string;
}
/**
*
*
*/
export interface RemindTime {
/**
*
* single: 一次性
* daily: 每天
* weekly: 每周
* monthly: 每月
* yearly: 每年
* workday: 工作日
* holiday: 节假日
*/
frequency:
| "single"
| "daily"
| "weekly"
| "monthly"
| "yearly"
| "workday"
| "holiday";
/**
* 格式为HH:mm single类型时仅作展示用yyyy-MM-dd HH:mm
*/
time: string;
/**
* [1-7]frequency为weekly时有效
*/
daysOfWeek: number[];
/**
* [1-31]frequency为monthly时有效
*/
daysOfMonth: number[];
/**
* frequency为 yearly MM-dd
*/
dayOfYear: string;
}
/**
*
*
*/
export interface RemindRecord {
/**
* Id
*/
id: string;
/**
* Id
*/
remindId: string;
/**
* Id
*/
messageId: string;
/**
*
* pending: 待确认
* delay: 已延迟
* confirmed: 已确认
* canceled: 已取消
*/
status: "pending" | "delayed" | "confirmed" | "canceled";
/**
* yyyy-MM-dd HH:mm
*/
remindTime: string;
/**
* yyyy-MM-dd HH:mm
*/
interactTime: string;
/**
* 07:00
*/
result: object;
}
/**
*
*/
export interface Header {
/**
* ID
* @example 0f8ab23b60993cf8dd15c8cde4d7b0f5
*/
event_id: string;
/**
* token
* @example tV9djUKSjzVnekV7xTg2Od06NFTcsBnj
*/
token: string;
/**
*
* @example 1693565712117
*/
create_time: string;
/**
*
* @example im.message.receive_v1
*/
event_type: string;
/**
* tenant_key
* @example 2ee61fe50f4f1657
*/
tenant_key: string;
/**
* app_id
* @example cli_a1eff35b43b89063
*/
app_id: string;
}
/**
* ID信息
*/
export interface UserIdInfo {
/**
*
* @example ou_032f507d08f9a7f28b042fcd086daef5
*/
open_id: string;
/**
*
* @example on_7111660fddd8302ce47bf1999147c011
*/
union_id: string;
/**
*
* @example zhaoyingbo
*/
user_id: string;
}
/**
* AT的人的信息
*/
export interface Mention {
/**
* ID信息
*/
id: UserIdInfo;
/**
*
* @example "@_user_1"
*/
key: string;
/**
*
* @example
*/
name: string;
/**
* ID
* @example 2ee61fe50f4f1657
*/
tenant_key: string;
}
/**
*
*/
export interface Message {
/**
* ID
* @example oc_433b1cb7a9dbb7ebe70a4e1a59cb8bb1
*/
chat_id: string;
/**
*
* @example group | p2p
*/
chat_type: string;
/**
* JSON字符串文本内容
* @example "{\"text\":\"@_user_1 测试\"}"
*/
content: string;
/**
*
* @example 1693565711996
*/
create_time: string;
/**
*
*/
mentions?: Mention[];
/**
* ID
* @example om_038fc0eceed6224a1abc1cdaa4266405
*/
message_id: string;
/**
*
* @example textpostimagefileaudiomediastickerinteractiveshare_chatshare_user
*/
message_type: string;
}
/**
*
*/
export interface Sender {
/**
* id
*/
sender_id: UserIdInfo;
/**
*
* @example user
*/
sender_type: string;
/**
* ID
* @example 2ee61fe50f4f1657
*/
tenant_key: string;
}
/**
*
*/
export interface Event {
message: Message;
sender: Sender;
}
/**
*
*/
export interface LarkMessageEvent {
/**
*
* @example 2.0
*/
schema: string;
/**
*
*/
header: Header;
/**
*
*/
event: Event;
}
/**
* Action信息
*/
export interface LarkUserAction {
/**
* open_id
*/
open_id: string;
/**
*
* @example zhaoyingbo
*/
user_id: string;
/**
* ID
* @example om_038fc0eceed6224a1abc1cdaa4266405
*/
open_message_id: string;
/**
* ID
* @example oc_433b1cb7a9dbb7ebe70a4e1a59cb8bb1
*/
open_chat_id: string;
/**
* ID
* @example 2ee61fe50f4f1657
*/
tenant_key: string;
/**
* token
* @example tV9djUKSjzVnekV7xTg2Od06NFTcsBnj
*/
token: string;
/**
*
*/
action: {
/**
*
*/
value: any;
/**
*
* @example picker_datetime
*/
tag: string;
/**
*
* @example 2023-09-03 10:35 +0800
*/
option: string;
/**
*
*/
timezone: string;
};
}
export type ReceiveIDType =
| "open_id"
| "user_id"
| "union_id"
| "email"
| "chat_id";
export type MsgType =
| "text"
| "post"
| "image"
| "file"
| "audio"
| "media"
| "sticker"
| "interactive"
| "share_chat"
| "share_user";
export interface ServerResponse {
code: number;
data: any;
msg: string;
}

View File

@ -1,3 +1,5 @@
import { LarkMessageEvent, LarkUserAction } from "../types";
/**
*
* @param {LarkMessageEvent} body