@satorijs/adapter-lark 3.1.4 → 3.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/bot.d.ts CHANGED
@@ -4,6 +4,7 @@ import { HttpServer } from './http';
4
4
  import { LarkMessageEncoder } from './message';
5
5
  import { Internal } from './types';
6
6
  export declare class LarkBot<C extends Context = Context> extends Bot<C, LarkBot.Config> {
7
+ static inject: string[];
7
8
  static MessageEncoder: typeof LarkMessageEncoder;
8
9
  _token?: string;
9
10
  _refresher?: NodeJS.Timeout;
package/lib/http.d.ts CHANGED
@@ -3,7 +3,9 @@ import { FeishuBot } from './bot';
3
3
  import { AllEvents } from './types';
4
4
  export declare class HttpServer<C extends Context = Context> extends Adapter<C, FeishuBot<C>> {
5
5
  static inject: string[];
6
+ private logger;
6
7
  private ciphers;
8
+ constructor(ctx: C, bot: FeishuBot<C>);
7
9
  fork(ctx: C, bot: FeishuBot<C>): Promise<void>;
8
10
  connect(bot: FeishuBot): Promise<void>;
9
11
  dispatchSession(body: AllEvents): void;
package/lib/index.js CHANGED
@@ -67,7 +67,7 @@ __name(adaptSender, "adaptSender");
67
67
  function adaptMessage(bot, data, session) {
68
68
  var _a, _b;
69
69
  const json = JSON.parse(data.message.content);
70
- const assetEndpoint = (0, import_satori.trimSlash)((_a = bot.config.selfUrl) != null ? _a : bot.ctx.root.config.selfUrl) + bot.config.path + "/assets";
70
+ const assetEndpoint = (0, import_satori.trimSlash)((_a = bot.config.selfUrl) != null ? _a : bot.ctx.router.config.selfUrl) + bot.config.path + "/assets";
71
71
  const content = [];
72
72
  switch (data.message.message_type) {
73
73
  case "text": {
@@ -126,7 +126,7 @@ __name(adaptSession, "adaptSession");
126
126
  async function decodeMessage(bot, body) {
127
127
  var _a, _b;
128
128
  const json = JSON.parse(body.body.content);
129
- const assetEndpoint = (0, import_satori.trimSlash)((_a = bot.config.selfUrl) != null ? _a : bot.ctx.root.config.selfUrl) + bot.config.path + "/assets";
129
+ const assetEndpoint = (0, import_satori.trimSlash)((_a = bot.config.selfUrl) != null ? _a : bot.ctx.router.config.selfUrl) + bot.config.path + "/assets";
130
130
  const content = [];
131
131
  switch (body.msg_type) {
132
132
  case "text": {
@@ -234,9 +234,13 @@ __name(_Cipher, "Cipher");
234
234
  var Cipher = _Cipher;
235
235
 
236
236
  // satori/adapters/lark/src/http.ts
237
- var logger = new import_satori2.Logger("lark");
238
237
  var _HttpServer = class _HttpServer extends import_satori2.Adapter {
238
+ logger;
239
239
  ciphers = {};
240
+ constructor(ctx, bot) {
241
+ super(ctx);
242
+ this.logger = ctx.logger("lark");
243
+ }
240
244
  fork(ctx, bot) {
241
245
  super.fork(ctx, bot);
242
246
  this._refreshCipher();
@@ -283,7 +287,7 @@ var _HttpServer = class _HttpServer extends import_satori2.Adapter {
283
287
  return ctx.status = 403;
284
288
  }
285
289
  }
286
- logger.debug("received decryped event: %o", body);
290
+ bot.logger.debug("received decryped event: %o", body);
287
291
  this.dispatchSession(body);
288
292
  return ctx.status = 200;
289
293
  });
@@ -325,10 +329,10 @@ var _HttpServer = class _HttpServer extends import_satori2.Adapter {
325
329
  } catch {
326
330
  }
327
331
  }
328
- logger.warn("failed to decrypt message: %o", body);
332
+ this.logger.warn("failed to decrypt message: %o", body);
329
333
  }
330
334
  if (typeof body.encrypt === "string" && !ciphers.length) {
331
- logger.warn("encryptKey is not set, but received encrypted message: %o", body);
335
+ this.logger.warn("encryptKey is not set, but received encrypted message: %o", body);
332
336
  }
333
337
  return body;
334
338
  }
@@ -531,17 +535,16 @@ __export(types_exports, {
531
535
  // satori/adapters/lark/src/types/internal.ts
532
536
  var import_form_data2 = __toESM(require("form-data"));
533
537
  var import_satori4 = require("@satorijs/satori");
534
- var logger2 = new import_satori4.Logger("lark");
535
538
  var _Internal = class _Internal {
536
- constructor(http) {
537
- this.http = http;
539
+ constructor(bot) {
540
+ this.bot = bot;
538
541
  }
539
542
  processReponse(response) {
540
543
  const { code, msg } = response;
541
544
  if (code === 0) {
542
545
  return response;
543
546
  } else {
544
- logger2.debug("response: %o", response);
547
+ this.bot.logger.debug("response: %o", response);
545
548
  throw new Error(`HTTP response with non-zero status (${code}) with message "${msg}"`);
546
549
  }
547
550
  }
@@ -573,7 +576,7 @@ var _Internal = class _Internal {
573
576
  } else if (args.length > 1) {
574
577
  throw new Error(`too many arguments for ${path}, received ${raw}`);
575
578
  }
576
- return this.processReponse(await this.http(method, url, config));
579
+ return this.processReponse(await this.bot.http(method, url, config));
577
580
  };
578
581
  }
579
582
  }
@@ -638,7 +641,6 @@ Internal.define({
638
641
  });
639
642
 
640
643
  // satori/adapters/lark/src/bot.ts
641
- var logger3 = new import_satori5.Logger("lark");
642
644
  var _LarkBot = class _LarkBot extends import_satori5.Bot {
643
645
  _token;
644
646
  _refresher;
@@ -646,11 +648,10 @@ var _LarkBot = class _LarkBot extends import_satori5.Bot {
646
648
  assetsQuester;
647
649
  internal;
648
650
  constructor(ctx, config) {
649
- super(ctx, config);
650
- if (!config.selfUrl && !ctx.root.config.selfUrl) {
651
- logger3.warn("selfUrl is not set, some features may not work");
651
+ super(ctx, config, "lark");
652
+ if (!config.selfUrl && !ctx.router.config.selfUrl) {
653
+ this.logger.warn("selfUrl is not set, some features may not work");
652
654
  }
653
- this.platform = "lark";
654
655
  this.selfId = config.appId;
655
656
  this.http = ctx.http.extend({
656
657
  endpoint: config.endpoint,
@@ -659,7 +660,7 @@ var _LarkBot = class _LarkBot extends import_satori5.Bot {
659
660
  }
660
661
  });
661
662
  this.assetsQuester = ctx.http;
662
- this.internal = new Internal(this.http);
663
+ this.internal = new Internal(this);
663
664
  ctx.plugin(HttpServer, this);
664
665
  }
665
666
  async initialize() {
@@ -671,7 +672,7 @@ var _LarkBot = class _LarkBot extends import_satori5.Bot {
671
672
  app_id: this.config.appId,
672
673
  app_secret: this.config.appSecret
673
674
  });
674
- logger3.debug("refreshed token %s", token);
675
+ this.logger.debug("refreshed token %s", token);
675
676
  this.token = token;
676
677
  if (this._refresher)
677
678
  clearTimeout(this._refresher);
@@ -730,6 +731,7 @@ var _LarkBot = class _LarkBot extends import_satori5.Bot {
730
731
  }
731
732
  };
732
733
  __name(_LarkBot, "LarkBot");
734
+ __publicField(_LarkBot, "inject", ["router"]);
733
735
  __publicField(_LarkBot, "MessageEncoder", LarkMessageEncoder);
734
736
  var LarkBot = _LarkBot;
735
737
  ((LarkBot2) => {
package/lib/index.js.map CHANGED
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../src/bot.ts", "../src/http.ts", "../src/utils.ts", "../src/message.ts", "../src/types/index.ts", "../src/types/internal.ts", "../src/types/auth.ts", "../src/types/guild.ts", "../src/types/message/asset.ts", "../src/types/message/index.ts"],
4
- "sourcesContent": ["import { FeishuBot } from './bot'\nimport * as Lark from './types'\n\nexport * from './bot'\n\nexport { Lark, Lark as Feishu }\n\nexport default FeishuBot\n\ndeclare module '@satorijs/core' {\n interface Session {\n feishu: Lark.Internal\n lark: Lark.Internal\n }\n}\n", "import { Bot, Context, h, Logger, Quester, Schema } from '@satorijs/satori'\n\nimport { HttpServer } from './http'\nimport { LarkMessageEncoder } from './message'\nimport { Internal } from './types'\nimport * as Utils from './utils'\n\nconst logger = new Logger('lark')\n\nexport class LarkBot<C extends Context = Context> extends Bot<C, LarkBot.Config> {\n static MessageEncoder = LarkMessageEncoder\n\n _token?: string\n _refresher?: NodeJS.Timeout\n http: Quester\n assetsQuester: Quester\n internal: Internal\n\n constructor(ctx: C, config: LarkBot.Config) {\n super(ctx, config)\n\n // lark bot needs config.selfUrl to be set as it should be serve on a public url\n if (!config.selfUrl && !ctx.root.config.selfUrl) {\n logger.warn('selfUrl is not set, some features may not work')\n }\n\n this.platform = 'lark'\n this.selfId = config.appId\n\n this.http = ctx.http.extend({\n endpoint: config.endpoint,\n headers: {\n 'Content-Type': 'application/json; charset=utf-8',\n },\n })\n this.assetsQuester = ctx.http\n\n this.internal = new Internal(this.http)\n\n ctx.plugin(HttpServer, this)\n }\n\n async initialize() {\n await this.refreshToken()\n this.online()\n }\n\n private async refreshToken() {\n const { tenant_access_token: token } = await this.internal.getTenantAccessToken({\n app_id: this.config.appId,\n app_secret: this.config.appSecret,\n })\n logger.debug('refreshed token %s', token)\n this.token = token\n // Token would be expired in 2 hours, refresh it every 1 hour\n // see https://open.larksuite.com/document/ukTMukTMukTM/ukDNz4SO0MjL5QzM/auth-v3/auth/tenant_access_token_internal\n if (this._refresher) clearTimeout(this._refresher)\n this._refresher = setTimeout(() => this.refreshToken(), 3600 * 1000)\n this.online()\n }\n\n get token() {\n return this._token\n }\n\n set token(v: string) {\n this._token = v\n this.http.config.headers.Authorization = `Bearer ${v}`\n }\n\n async editMessage(channelId: string, messageId: string, content: h.Fragment) {\n await this.internal.updateMessage(messageId, {\n content: h.normalize(content).join(''),\n msg_type: 'text',\n })\n }\n\n async deleteMessage(channelId: string, messageId: string) {\n await this.internal.deleteMessage(messageId)\n }\n\n async getMessage(channelId: string, messageId: string) {\n const data = await this.internal.getMessage(messageId)\n return await Utils.decodeMessage(this, data.data)\n }\n\n async getMessageList(channelId: string, before?: string) {\n const { data: messages } = await this.internal.getMessageList({ container_id_type: 'chat', container_id: channelId, page_token: before })\n const data = await Promise.all(messages.items.reverse().map(data => Utils.decodeMessage(this, data)))\n return { data, next: data[0]?.id }\n }\n\n async getUser(userId: string, guildId?: string) {\n const data = await this.internal.getUserInfo(userId)\n return Utils.decodeUser(data.data)\n }\n\n async getChannel(channelId: string) {\n const { data } = await this.internal.getGuildInfo(channelId)\n return Utils.decodeChannel(data)\n }\n\n async getChannelList(guildId: string) {\n return { data: [await this.getChannel(guildId)] }\n }\n\n async getGuild(guildId: string) {\n const { data } = await this.internal.getGuildInfo(guildId)\n return Utils.decodeGuild(data)\n }\n\n async getGuildList(after?: string) {\n const { data: guilds } = await this.internal.getCurrentUserGuilds({ page_token: after })\n return { data: guilds.items.map(Utils.decodeGuild), next: guilds.page_token }\n }\n\n async getGuildMemberList(guildId: string, after?: string) {\n const { data: users } = await this.internal.getGuildMembers(guildId, { page_token: after })\n const data = users.items.map(v => ({ user: { id: v.member_id, name: v.name }, name: v.name }))\n return { data, next: users.page_token }\n }\n}\n\nexport namespace LarkBot {\n export interface Config extends HttpServer.Config, Quester.Config {\n appId: string\n appSecret: string\n encryptKey?: string\n verificationToken?: string\n }\n\n export const Config: Schema<Config> = Schema.intersect([\n Schema.object({\n platform: Schema.union(['feishu', 'lark']).required().description('平台名称。'),\n appId: Schema.string().required().description('机器人的应用 ID。'),\n appSecret: Schema.string().role('secret').required().description('机器人的应用密钥。'),\n encryptKey: Schema.string().role('secret').description('机器人的 Encrypt Key。'),\n verificationToken: Schema.string().description('事件推送的验证令牌。'),\n }),\n Schema.union([\n Schema.intersect([\n Schema.object({\n platform: Schema.const('feishu').required(),\n }),\n Quester.createConfig('https://open.feishu.cn/open-apis/'),\n HttpServer.createConfig('/feishu'),\n ]),\n Schema.intersect([\n Schema.object({\n platform: Schema.const('lark').required(),\n }),\n Quester.createConfig('https://open.larksuite.com/open-apis/'),\n HttpServer.createConfig('/lark'),\n ]),\n ]),\n ])\n}\n\nexport { LarkBot as FeishuBot }\n", "import internal from 'stream'\n\nimport { Adapter, Context, Logger, Schema } from '@satorijs/satori'\n\nimport { FeishuBot } from './bot'\nimport { AllEvents } from './types'\nimport { adaptSession, Cipher } from './utils'\n\nconst logger = new Logger('lark')\n\nexport class HttpServer<C extends Context = Context> extends Adapter<C, FeishuBot<C>> {\n static inject = ['router']\n\n private ciphers: Record<string, Cipher> = {}\n\n fork(ctx: C, bot: FeishuBot<C>) {\n super.fork(ctx, bot)\n\n this._refreshCipher()\n return bot.initialize()\n }\n\n async connect(bot: FeishuBot) {\n const { path } = bot.config\n bot.ctx.router.post(path, (ctx) => {\n this._refreshCipher()\n\n // compare signature if encryptKey is set\n // But not every message contains signature\n // https://open.larksuite.com/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-subscription-configure-/encrypt-key-encryption-configuration-case#d41e8916\n const signature = ctx.get('X-Lark-Signature')\n const enabledSignatureVerify = this.bots.filter((bot) => bot.config.verifySignature)\n if (signature && enabledSignatureVerify.length) {\n const result = enabledSignatureVerify.some((bot) => {\n const timestamp = ctx.get('X-Lark-Request-Timestamp')\n const nonce = ctx.get('X-Lark-Request-Nonce')\n const body = ctx.request.rawBody\n const actualSignature = this.ciphers[bot.config.appId]?.calculateSignature(timestamp, nonce, body)\n if (actualSignature === signature) return true\n else return false\n })\n if (!result) return (ctx.status = 403)\n }\n\n // try to decrypt message first if encryptKey is set\n const body = this._tryDecryptBody(ctx.request.body)\n // respond challenge message\n // https://open.larksuite.com/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-subscription-configure-/request-url-configuration-case\n if (body?.type === 'url_verification' && body?.challenge && typeof body.challenge === 'string') {\n ctx.response.body = { challenge: body.challenge }\n return\n }\n\n // compare verification token\n const enabledVerifyTokenVerify = this.bots.filter((bot) => bot.config.verifyToken && bot.config.verificationToken)\n if (enabledVerifyTokenVerify.length) {\n const token = ctx.request.body?.token\n // only compare token if token exists\n if (token) {\n const result = enabledVerifyTokenVerify.some((bot) => {\n if (token === bot.config.verificationToken) return true\n else return false\n })\n if (!result) return (ctx.status = 403)\n }\n }\n\n // dispatch message\n logger.debug('received decryped event: %o', body)\n this.dispatchSession(body)\n\n // Lark requires 200 OK response to make sure event is received\n return ctx.status = 200\n })\n\n bot.ctx.router.get(path + '/assets/:type/:message_id/:key', async (ctx) => {\n const type = ctx.params.type === 'image' ? 'image' : 'file'\n const key = ctx.params.key\n const messageId = ctx.params.message_id\n const selfId = ctx.request.query.self_id\n const bot = this.bots.find((bot) => bot.selfId === selfId)\n if (!bot) return ctx.status = 404\n\n const resp = await bot.http.axios<internal.Readable>(`/im/v1/messages/${messageId}/resources/${key}`, {\n method: 'GET',\n params: { type },\n responseType: 'stream',\n })\n\n ctx.status = 200\n ctx.response.headers['Content-Type'] = resp.headers['content-type']\n ctx.response.body = resp.data\n })\n }\n\n dispatchSession(body: AllEvents): void {\n const { header } = body\n if (!header) return\n const { app_id, event_type } = header\n body.type = event_type // add type to body to ease typescript type narrowing\n const bot = this.bots.find((bot) => bot.selfId === app_id)\n const session = adaptSession(bot, body)\n bot.dispatch(session)\n }\n\n private _tryDecryptBody(body: any): any {\n this._refreshCipher()\n // try to decrypt message if encryptKey is set\n // https://open.larksuite.com/document/ukTMukTMukTM/uYDNxYjL2QTM24iN0EjN/event-subscription-configure-/encrypt-key-encryption-configuration-case\n const ciphers = Object.values(this.ciphers)\n if (ciphers.length && typeof body.encrypt === 'string') {\n for (const cipher of ciphers) {\n try {\n return JSON.parse(cipher.decrypt(body.encrypt))\n } catch {}\n }\n logger.warn('failed to decrypt message: %o', body)\n }\n\n if (typeof body.encrypt === 'string' && !ciphers.length) {\n logger.warn('encryptKey is not set, but received encrypted message: %o', body)\n }\n\n return body\n }\n\n private _refreshCipher(): void {\n const ciphers = Object.keys(this.ciphers)\n const bots = this.bots.map((bot) => bot.config.appId)\n if (bots.length === ciphers.length && bots.every((bot) => ciphers.includes(bot))) return\n\n this.ciphers = {}\n for (const bot of this.bots) {\n this.ciphers[bot.config.appId] = new Cipher(bot.config.encryptKey)\n }\n }\n}\n\nexport namespace HttpServer {\n export interface Config {\n selfUrl?: string\n path?: string\n verifyToken?: boolean\n verifySignature?: boolean\n }\n\n export const createConfig = (path: string): Schema<Config> => Schema.object({\n path: Schema.string().role('url').description('要连接的服务器地址。').default(path),\n selfUrl: Schema.string().role('link').description('服务器暴露在公网的地址。缺省时将使用全局配置。'),\n verifyToken: Schema.boolean().description('是否验证令牌。'),\n verifySignature: Schema.boolean().description('是否验证签名。'),\n }).description('服务端设置')\n}\n", "import crypto from 'crypto'\nimport { Channel, Guild, Message, User } from '@satorijs/protocol'\nimport { Context, h, Session, trimSlash } from '@satorijs/satori'\nimport { FeishuBot, LarkBot } from './bot'\nimport { AllEvents, Events, Lark, Message as LarkMessage, MessageContentType, MessageType } from './types'\n\nexport type Sender =\n | {\n sender_id: Lark.UserIds\n sender_type?: string\n tenant_key: string\n }\n | (Lark.UserIdentifiers & { sender_type?: string; tenant_key: string })\n\nexport function adaptSender(sender: Sender, session: Session): Session {\n let userId: string | undefined\n if ('sender_id' in sender) {\n userId = sender.sender_id.open_id\n } else {\n userId = sender.id\n }\n session.userId = userId\n return session\n}\n\nexport function adaptMessage(bot: FeishuBot, data: Events['im.message.receive_v1']['event'], session: Session): Session {\n const json = JSON.parse(data.message.content) as MessageContentType<MessageType>\n const assetEndpoint = trimSlash(bot.config.selfUrl ?? bot.ctx.root.config.selfUrl) + bot.config.path + '/assets'\n const content: (string | h)[] = []\n switch (data.message.message_type) {\n case 'text': {\n const text = json.text as string\n if (!data.message.mentions?.length) {\n content.push(text)\n break\n }\n\n // Lark's `at` Element would be `@user_id` in text\n text.split(' ').forEach((word) => {\n if (word.startsWith('@')) {\n const mention = data.message.mentions.find((mention) => mention.key === word)\n content.push(h.at(mention.id.open_id, { name: mention.name }))\n } else {\n content.push(word)\n }\n })\n break\n }\n case 'image':\n content.push(h.image(`${assetEndpoint}/image/${data.message.message_id}/${json.image_key}?self_id=${bot.selfId}`))\n break\n case 'audio':\n content.push(h.audio(`${assetEndpoint}/file/${data.message.message_id}/${json.file_key}?self_id=${bot.selfId}`))\n break\n case 'media':\n content.push(h.video(`${assetEndpoint}/file/${data.message.message_id}/${json.file_key}?self_id=${bot.selfId}`, json.image_key))\n break\n case 'file':\n content.push(h.file(`${assetEndpoint}/file/${data.message.message_id}/${json.file_key}?self_id=${bot.selfId}`))\n break\n }\n\n session.timestamp = +data.message.create_time\n session.messageId = data.message.message_id\n session.channelId = data.message.chat_id\n session.content = content.map((c) => c.toString()).join(' ')\n\n return session\n}\n\nexport function adaptSession<C extends Context>(bot: FeishuBot<C>, body: AllEvents) {\n const session = bot.session()\n session.setInternal('lark', body)\n\n switch (body.type) {\n case 'im.message.receive_v1':\n session.type = 'message'\n session.subtype = body.event.message.chat_type\n if (session.subtype === 'p2p') session.subtype = 'private'\n session.isDirect = session.subtype === 'private'\n adaptSender(body.event.sender, session)\n adaptMessage(bot, body.event, session)\n break\n }\n return session\n}\n\n// TODO: This function has many duplicated code with `adaptMessage`, should refactor them\nexport async function decodeMessage(bot: LarkBot, body: LarkMessage): Promise<Message> {\n const json = JSON.parse(body.body.content) as MessageContentType<MessageType>\n const assetEndpoint = trimSlash(bot.config.selfUrl ?? bot.ctx.root.config.selfUrl) + bot.config.path + '/assets'\n const content: h[] = []\n switch (body.msg_type) {\n case 'text': {\n const text = json.text as string\n if (!body.mentions?.length) {\n content.push(h.text(text))\n break\n }\n\n // Lark's `at` Element would be `@user_id` in text\n text.split(' ').forEach((word) => {\n if (word.startsWith('@')) {\n const mention = body.mentions.find((mention) => mention.key === word)\n content.push(h.at(mention.id, { name: mention.name }))\n } else {\n content.push(h.text(word))\n }\n })\n break\n }\n case 'image':\n content.push(h.image(`${assetEndpoint}/image/${body.message_id}/${json.image_key}?self_id=${bot.selfId}`))\n break\n case 'audio':\n content.push(h.audio(`${assetEndpoint}/file/${body.message_id}/${json.file_key}?self_id=${bot.selfId}`))\n break\n case 'media':\n content.push(h.video(`${assetEndpoint}/file/${body.message_id}/${json.file_key}?self_id=${bot.selfId}`, json.image_key))\n break\n case 'file':\n content.push(h.file(`${assetEndpoint}/file/${body.message_id}/${json.file_key}?self_id=${bot.selfId}`))\n break\n }\n\n return {\n timestamp: +body.update_time,\n createdAt: +body.create_time,\n updatedAt: +body.update_time,\n id: body.message_id,\n content: content.map((c) => c.toString()).join(' '),\n elements: content,\n quote: body.upper_message_id ? await bot.getMessage(body.chat_id, body.upper_message_id) : undefined,\n }\n}\n\n/**\n * Get ID type from id string\n * @see https://open.larksuite.com/document/home/user-identity-introduction/introduction\n */\nexport function extractIdType(id: string): Lark.ReceiveIdType {\n if (id.startsWith('ou')) return 'open_id'\n if (id.startsWith('on')) return 'union_id'\n if (id.startsWith('oc')) return 'chat_id'\n if (id.includes('@')) return 'email'\n return 'user_id'\n}\n\nexport function decodeChannel(guild: Lark.Guild): Channel {\n return {\n id: guild.chat_id,\n type: Channel.Type.TEXT,\n name: guild.name,\n parentId: guild.chat_id,\n }\n}\n\nexport function decodeGuild(guild: Lark.Guild): Guild {\n return {\n id: guild.chat_id,\n name: guild.name,\n avatar: guild.avatar,\n }\n}\n\nexport function decodeUser(user: Lark.User): User {\n return {\n id: user.open_id,\n avatar: user.avatar?.avatar_origin,\n isBot: false,\n name: user.name,\n }\n}\n\nexport class Cipher {\n encryptKey: string\n key: Buffer\n\n constructor(key: string) {\n this.encryptKey = key\n const hash = crypto.createHash('sha256')\n hash.update(key)\n this.key = hash.digest()\n }\n\n decrypt(encrypt: string) {\n const encryptBuffer = Buffer.from(encrypt, 'base64')\n const decipher = crypto.createDecipheriv('aes-256-cbc', this.key, encryptBuffer.slice(0, 16))\n let decrypted = decipher.update(encryptBuffer.slice(16).toString('hex'), 'hex', 'utf8')\n decrypted += decipher.final('utf8')\n return decrypted\n }\n\n calculateSignature(timestamp: string, nonce: string, body: string): string {\n const content = timestamp + nonce + this.encryptKey + body\n const sign = crypto.createHash('sha256').update(content).digest('hex')\n return sign\n }\n}\n", "import { createReadStream } from 'fs'\nimport internal from 'stream'\n\nimport { Context, h, MessageEncoder, Quester } from '@satorijs/satori'\nimport FormData from 'form-data'\n\nimport { LarkBot } from './bot'\nimport { BaseResponse, Message, MessageContent, MessageType } from './types'\nimport { extractIdType } from './utils'\n\nexport interface Addition {\n file: MessageContent.MediaContents\n type: MessageType\n}\n\nexport class LarkMessageEncoder<C extends Context = Context> extends MessageEncoder<C, LarkBot<C>> {\n private quote: string | undefined\n private content = ''\n private addition: Addition\n // TODO: currently not used, would be supported in the future\n private richText: MessageContent.RichText[string]\n\n async post(data?: any) {\n try {\n let resp: BaseResponse & { data: Message }\n if (this.quote) {\n resp = await this.bot.internal?.replyMessage(this.quote, data)\n } else {\n data.receive_id = this.channelId\n resp = await this.bot.internal?.sendMessage(extractIdType(this.channelId), data)\n }\n const session = this.bot.session()\n session.messageId = resp.data.message_id\n session.timestamp = Number(resp.data.create_time) * 1000\n session.userId = resp.data.sender.id\n session.app.emit(session, 'send', session)\n this.results.push(session.event.message)\n } catch (e) {\n // try to extract error message from Lark API\n if (Quester.isAxiosError(e)) {\n if (e.response?.data?.code) {\n const generalErrorMsg = `Check error code at https://open.larksuite.com/document/server-docs/getting-started/server-error-codes`\n e.message += ` (Lark error code ${e.response.data.code}: ${e.response.data.msg ?? generalErrorMsg})`\n }\n }\n this.errors.push(e)\n }\n }\n\n async flush() {\n if (this.content === '' && !this.addition && !this.richText) return\n\n let message: MessageContent.Contents\n if (this.addition) {\n message = {\n ...message,\n ...this.addition.file,\n }\n }\n if (this.richText) {\n message = { zh_cn: this.richText }\n }\n if (this.content) {\n message = { text: this.content }\n }\n await this.post({\n msg_type: this.richText ? 'post' : this.addition ? this.addition.type : 'text',\n content: JSON.stringify(message),\n })\n\n // reset cached content\n this.quote = undefined\n this.content = ''\n this.addition = undefined\n this.richText = undefined\n }\n\n async sendFile(type: 'image' | 'video' | 'audio' | 'file', url: string): Promise<Addition> {\n const payload = new FormData()\n\n const assetKey = type === 'image' ? 'image' : 'file'\n const [schema, file] = url.split('://')\n const filename = schema === 'base64' ? 'unknown' : new URL(url).pathname.split('/').pop()\n if (schema === 'file') {\n payload.append(assetKey, createReadStream(file))\n } else if (schema === 'base64') {\n payload.append(assetKey, Buffer.from(file, 'base64'))\n } else {\n const resp = await this.bot.assetsQuester.get<internal.Readable>(url, { responseType: 'stream' })\n payload.append(assetKey, resp)\n }\n\n if (type === 'image') {\n payload.append('image_type', 'message')\n const { data } = await this.bot.internal.uploadImage(payload)\n return {\n type: 'image',\n file: {\n image_key: data.image_key,\n },\n }\n } else {\n let msgType: MessageType = 'file'\n if (type === 'audio') {\n // FIXME: only support opus\n payload.append('file_type', 'opus')\n msgType = 'audio'\n } else if (type === 'video') {\n // FIXME: only support mp4\n payload.append('file_type', 'mp4')\n msgType = 'media'\n } else {\n const ext = filename.split('.').pop()\n if (['xls', 'ppt', 'pdf'].includes(ext)) {\n payload.append('file_type', ext)\n } else {\n payload.append('file_type', 'stream')\n }\n }\n payload.append('file_name', filename)\n const { data } = await this.bot.internal.uploadFile(payload)\n return {\n type: msgType,\n file: {\n file_key: data.file_key,\n },\n }\n }\n }\n\n async visit(element: h) {\n const { type, attrs, children } = element\n\n switch (type) {\n case 'text':\n this.content += attrs.content\n break\n case 'at': {\n if (attrs.type === 'all') {\n this.content += `<at user_id=\"all\">${attrs.name ?? '所有人'}</at>`\n } else {\n this.content += `<at user_id=\"${attrs.id}\">${attrs.name}</at>`\n }\n break\n }\n case 'a':\n await this.render(children)\n if (attrs.href) this.content += ` (${attrs.href})`\n break\n case 'p':\n if (!this.content.endsWith('\\n')) this.content += '\\n'\n await this.render(children)\n if (!this.content.endsWith('\\n')) this.content += '\\n'\n break\n case 'br':\n this.content += '\\n'\n break\n case 'sharp':\n // platform does not support sharp\n break\n case 'quote':\n await this.flush()\n this.quote = attrs.id\n break\n case 'image':\n case 'video':\n case 'audio':\n case 'file':\n if (attrs.url) {\n await this.flush()\n this.addition = await this.sendFile(type, attrs.url)\n }\n break\n case 'figure': // FIXME: treat as message element for now\n case 'message':\n await this.flush()\n await this.render(children, true)\n break\n default:\n await this.render(children)\n }\n }\n}\n\nexport { LarkMessageEncoder as FeishuMessageEncoder }\n", "export * from './internal'\nexport * from './auth'\nexport * from './event'\nexport * from './guild'\nexport * from './message'\n\nexport namespace Lark {\n /**\n * A user in Lark has several different IDs.\n * @see https://open.larksuite.com/document/home/user-identity-introduction/introduction\n */\n export interface UserIds {\n union_id: string\n /** *user_id* only available when the app has permissions granted by the administrator */\n user_id?: string\n open_id: string\n }\n\n /**\n * Identify a user in Lark.\n * This behaves like {@link Lark.UserIds}, but it only contains *open_id*.\n * (i.e. the id_type is always `open_id`)\n */\n export interface UserIdentifiers {\n id: string\n id_type: string\n }\n\n export type UserIdType = 'union_id' | 'user_id' | 'open_id'\n /**\n * The id type when specify a receiver, would be used in the request query.\n *\n * NOTE: we always use **open_id** to identify a user, use **chat_id** to identify a channel.\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/create\n */\n export type ReceiveIdType = UserIdType | 'email' | 'chat_id'\n\n export type DepartmentIdType = 'department_id' | 'open_department_id'\n}\n\nexport { Lark as Feishu }\n", "import FormData from 'form-data'\nimport { Dict, Logger, makeArray, Quester } from '@satorijs/satori'\n\nexport interface Internal {}\n\nconst logger = new Logger('lark')\n\nexport interface BaseResponse {\n /** error code. would be 0 if success, and non-0 if failed. */\n code: number\n /** error message. would be 'success' if success. */\n msg: string\n}\n\ntype Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'\n\nexport class Internal {\n constructor(private http: Quester) {}\n\n private processReponse(response: any): BaseResponse {\n const { code, msg } = response\n if (code === 0) {\n return response\n } else {\n logger.debug('response: %o', response)\n throw new Error(`HTTP response with non-zero status (${code}) with message \"${msg}\"`)\n }\n }\n\n static define(routes: Dict<Partial<Record<Method, string | string[]>>>) {\n for (const path in routes) {\n for (const key in routes[path]) {\n const method = key as Method\n for (const name of makeArray(routes[path][method])) {\n Internal.prototype[name] = async function (this: Internal, ...args: any[]) {\n const raw = args.join(', ')\n const url = path.replace(/\\{([^}]+)\\}/g, () => {\n if (!args.length) throw new Error(`too few arguments for ${path}, received ${raw}`)\n return args.shift()\n })\n const config: Quester.AxiosRequestConfig = {}\n if (args.length === 1) {\n if (method === 'GET' || method === 'DELETE') {\n config.params = args[0]\n } else {\n if (method === 'POST' && args[0] instanceof FormData) {\n config.headers = args[0].getHeaders()\n }\n config.data = args[0]\n }\n } else if (args.length === 2 && method !== 'GET' && method !== 'DELETE') {\n config.data = args[0]\n config.params = args[1]\n } else if (args.length > 1) {\n throw new Error(`too many arguments for ${path}, received ${raw}`)\n }\n return this.processReponse(await this.http(method, url, config))\n }\n }\n }\n }\n }\n}\n", "import { BaseResponse, Internal } from '.'\n\n/**\n * Lark defines three types of token:\n * - app_access_token: to access the API in an app (published on App Store).\n * - tenant_access_token: to access the API as an enterprise or a team (tenant).\n * *We commonly use this one*\n * - user_access_token: to access the API as the specific user.\n *\n * @see https://open.larksuite.com/document/ukTMukTMukTM/uMTNz4yM1MjLzUzM\n */\n\nexport interface AppCredentials {\n app_id: string\n app_secret: string\n}\n\nexport interface AppAccessToken extends BaseResponse {\n /** access token */\n app_access_token: string\n /** expire time in seconds. e.g: 7140 (119 minutes) */\n expire: number\n}\n\nexport interface TenantAccessToken extends BaseResponse {\n /** access token */\n tenant_access_token: string\n /** expire time in seconds. e.g: 7140 (119 minutes) */\n expire: number\n}\n\ndeclare module './internal' {\n export interface Internal {\n /**\n * Returns the app_access_token for the bot.\n * @see https://open.larksuite.com/document/ukTMukTMukTM/ukDNz4SO0MjL5QzM/auth-v3/auth/app_access_token_internal\n */\n getAppAccessToken(data: AppCredentials): Promise<AppAccessToken>\n /**\n * Returns the tenant_access_token for the bot.\n * @see https://open.larksuite.com/document/ukTMukTMukTM/ukDNz4SO0MjL5QzM/auth-v3/auth/tenant_access_token_internal\n */\n getTenantAccessToken(data: AppCredentials): Promise<TenantAccessToken>\n }\n}\n\nInternal.define({\n '/auth/v3/app_access_token/internal': {\n POST: 'getAppAccessToken',\n },\n '/auth/v3/tenant_access_token/internal': {\n POST: 'getTenantAccessToken',\n },\n})\n", "import { Dict } from '@satorijs/satori'\n\nimport { Lark } from '.'\nimport { Internal } from './internal'\nimport { Paginated, Pagination } from './utils'\n\ndeclare module '.' {\n export namespace Lark {\n export interface Guild {\n avatar: string\n name: string\n description: string\n i18n_names: Dict<string>\n add_member_permission: string\n share_card_permission: string\n at_all_permission: string\n edit_permission: string\n owner_id_type: string\n owner_id: string\n chat_id: string\n chat_mode: string\n chat_type: string\n chat_tag: string\n join_message_visibility: string\n leave_message_visibility: string\n membership_approval: string\n moderation_permission: string\n external: boolean\n tenant_key: string\n user_count: string\n bot_count: string\n }\n }\n}\n\nexport interface GuildMember {\n member_id_type: Lark.UserIdType\n member_id: string\n name: string\n tenant_key: string\n}\n\ndeclare module './internal' {\n export interface Internal {\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/chat/list */\n getCurrentUserGuilds(params?: Pagination<{ user_id_type?: Lark.UserIdType }>): Promise<{ data: Paginated<Lark.Guild> }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/chat/get */\n getGuildInfo(chat_id: string, params?: { user_id_type?: string }): Promise<BaseResponse & { data: Lark.Guild }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/chat-members/get */\n getGuildMembers(chat_id: string, params?: Pagination<{ member_id_type?: Lark.UserIdType }>): Promise<{ data: Paginated<GuildMember> }>\n }\n}\n\nInternal.define({\n '/im/v1/chats': {\n GET: 'getCurrentUserGuilds',\n },\n '/im/v1/chats/{chat_id}': {\n GET: 'getGuildInfo',\n },\n '/im/v1/chats/{chat_id}/members': {\n GET: 'getGuildMembers',\n },\n})\n", "import FormData from 'form-data'\n\nimport { BaseResponse, Internal } from '..'\n\nexport interface Asset<T> extends BaseResponse {\n data: T\n}\n\nexport type Image = Asset<{ image_key: string }>\nexport type File = Asset<{ file_key: string }>\n\ndeclare module '../internal' {\n interface Internal {\n /**\n * Upload an image to obtain an `image_key` for use in sending messages or changing the avatar.\n *\n * The data should contain:\n * - `image_type`: 'message' | 'avatar'\n * - `image': Buffer\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/image/create\n */\n uploadImage(data: FormData): Promise<Image>\n /**\n * Upload a file to obtain a `file_key` for use in sending messages.\n *\n * The data should contain:\n * - `file_type`: 'opus' | 'mp4' | 'pdf' | 'xls' | 'ppt' | 'stream'\n * - `opus`: Opus audio file\n * - `mp4`: MP4 video file\n * - `pdf`: PDF file\n * - `xls`: Excel file\n * - `ppt`: PowerPoint file\n * - `stream`: Stream file, or any other file not listed above\n * - `file_name`: string, include extension\n * - `duration`?: number, the duration of audio/video file in milliseconds\n * - `file`: Buffer\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/file/create\n */\n uploadFile(data: FormData): Promise<File>\n }\n}\n\nInternal.define({\n '/im/v1/images': {\n POST: 'uploadImage',\n },\n '/im/v1/files': {\n POST: 'uploadFile',\n },\n})\n", "import { Internal, Lark } from '..'\nimport { Paginated, Pagination } from '../utils'\n\nimport { MessageContent } from './content'\n\nexport * from './content'\nexport * from './asset'\n\nexport type MessageType = 'text' | 'post' | 'image' | 'file' | 'audio' | 'media' | 'sticker' | 'interactive' | 'share_chat' | 'share_user'\n\nexport interface MessageContentMap {\n 'text': MessageContent.Text\n 'post': MessageContent.RichText\n 'image': MessageContent.Image\n 'file': MessageContent.File\n 'audio': MessageContent.Audio\n 'media': MessageContent.Media\n 'sticker': MessageContent.Sticker\n 'share_chat': MessageContent.ShareChat\n 'share_user': MessageContent.ShareUser\n}\n\nexport type MessageContentType<T extends MessageType> = T extends keyof MessageContentMap ? MessageContentMap[T] : any\n\nexport interface Sender extends Lark.UserIdentifiers {\n sender_type: string\n tenant_key: string\n}\nexport interface Mention extends Lark.UserIdentifiers {\n key: string\n name: string\n tenant_key: string\n}\n\ndeclare module '../event' {\n export interface Events {\n /**\n * Receive message event.\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/events/receive\n */\n 'im.message.receive_v1': EventSkeleton<'im.message.receive_v1', {\n sender: {\n sender_id: Lark.UserIds\n sender_type?: string\n tenant_key: string\n }\n message: {\n message_id: string\n root_id: string\n parent_id: string\n create_time: string\n chat_id: string\n chat_type: string\n message_type: MessageType\n content: string\n mentions: {\n key: string\n id: Lark.UserIds\n name: string\n tenant_key: string\n }[]\n }\n }>\n /**\n * Message read event.\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/events/message_read\n */\n 'im.message.message_read_v1': EventSkeleton<'im.message.message_read_v1', {\n reader: {\n reader_id: Lark.UserIds\n read_time: string\n tenant_key: string\n }\n message_id_list: string[]\n }>\n }\n}\n\nexport interface MessagePayload {\n receive_id: string\n content: string\n msg_type: string\n}\n\nexport interface Message {\n /**\n * The id of current message\n *\n * Should be started with `om_`\n */\n message_id: string\n /**\n * The id of the *root* message in reply chains\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/intro#ac79c1c2\n */\n root_id: string\n\n /**\n * The id of the direct *parent* message in reply chains\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/intro#ac79c1c2\n */\n parent_id: string\n\n /**\n * The message type.\n * @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/im-v1/message/create_json\n */\n msg_type: MessageType\n\n /**\n * The timestamp when the message is created in milliseconds.\n */\n create_time: string\n\n /**\n * The timestamp when the message is last updated in milliseconds.\n */\n update_time: string\n\n /**\n * Whether the message is deleted.\n */\n deleted: boolean\n\n /**\n * Whether the message is updated.\n */\n updated: boolean\n\n /**\n * The id of the group / channel the message is sent to.\n */\n chat_id: string\n\n /**\n * The sender of the message.\n * Can be a user or an app.\n */\n sender: Sender\n\n /**\n * The body of the message.\n */\n body: {\n /**\n * The content of the message.\n * Should be a string that represents the JSON object contains the message content.\n */\n content: string\n }\n\n /**\n * Users mentioned in the message.\n */\n mentions: Mention[]\n\n /**\n * The id of the direct *parent* message in `merge and repost` chains.\n */\n upper_message_id: string\n}\n\nexport interface ReadUser {\n user_id_type: Lark.UserIdType\n user_id: string\n timestamp: string\n tenant_key: string\n}\n\nexport interface GetMessageListParams {\n /**\n * Currently there is only 'chat' available\n * @see https://open.larksuite.com/document/server-docs/im-v1/message/list\n */\n container_id_type: 'p2p' | 'chat'\n /**\n * Should be in the format like `oc_234jsi43d3ssi993d43545f`\n */\n container_id: string\n /** Timestamp in seconds */\n start_time?: string | number\n /** Timestamp in seconds */\n end_time?: string | number\n /** @default 'ByCreateTimeAsc' */\n sort_type?: 'ByCreateTimeAsc' | 'ByCreateTimeDesc'\n /** Range from 1 to 50 */\n page_size?: number\n /**\n * If the current page is the first page, this field should be omitted.\n * Otherwise you could use the `page_token` from the previous response to\n * get the next page.\n */\n page_token?: string\n}\n\ndeclare module '../internal' {\n export interface Internal {\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/create */\n sendMessage(receive_id_type: Lark.ReceiveIdType, message: MessagePayload): Promise<BaseResponse & { data: Message }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/reply */\n replyMessage(message_id: string, message: MessagePayload): Promise<BaseResponse & { data: Message }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/update */\n updateMessage(message_id: string, message: Omit<MessagePayload, 'receive_id'>): Promise<BaseResponse & { data: Message }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/get */\n getMessage(message_id: string): Promise<BaseResponse & { data: Message }>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/delete */\n deleteMessage(message_id: string): Promise<BaseResponse>\n /** @see https://open.larksuite.com/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/message/read_users */\n getMessageReadUsers(message_id: string, params: Pagination<{ user_id_type: Lark.UserIdType }>): Promise<BaseResponse & { data: Paginated<ReadUser> }>\n /** @see https://open.larksuite.com/document/server-docs/im-v1/message/list */\n getMessageList(params: GetMessageListParams): Promise<BaseResponse & { data: Paginated<Message> }>\n }\n}\n\nInternal.define({\n '/im/v1/messages': {\n GET: 'getMessageList',\n },\n '/im/v1/messages?receive_id_type={receive_id_type}': {\n POST: 'sendMessage',\n },\n '/im/v1/messages/{message_id}/reply': {\n POST: 'replyMessage',\n },\n '/im/v1/messages/{message_id}': {\n GET: 'getMessage',\n PUT: 'updateMessage',\n DELETE: 'deleteMessage',\n },\n '/im/v1/messages/{message_id}/read_users': {\n GET: 'getMessageReadUsers',\n },\n})\n"],
5
- "mappings": "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",
6
- "names": ["import_satori", "import_satori", "mention", "crypto", "bot", "_a", "body", "HttpServer", "import_satori", "FormData", "import_form_data", "import_satori", "logger", "FormData", "logger", "data", "LarkBot"]
4
+ "mappings": "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",
5
+ "names": ["import_satori", "import_satori", "mention", "crypto", "bot", "_a", "body", "HttpServer", "import_satori", "FormData", "import_form_data", "import_satori", "FormData", "data", "LarkBot"]
7
6
  }
@@ -1,4 +1,5 @@
1
- import { Dict, Quester } from '@satorijs/satori';
1
+ import { Dict } from '@satorijs/satori';
2
+ import { LarkBot } from '../bot';
2
3
  export interface Internal {
3
4
  }
4
5
  export interface BaseResponse {
@@ -9,8 +10,8 @@ export interface BaseResponse {
9
10
  }
10
11
  type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
11
12
  export declare class Internal {
12
- private http;
13
- constructor(http: Quester);
13
+ private bot;
14
+ constructor(bot: LarkBot);
14
15
  private processReponse;
15
16
  static define(routes: Dict<Partial<Record<Method, string | string[]>>>): void;
16
17
  }
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@satorijs/adapter-lark",
3
3
  "description": "Lark (飞书) Adapter for Satorijs",
4
- "version": "3.1.4",
4
+ "version": "3.1.6",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
7
7
  "files": [
8
- "lib"
8
+ "lib",
9
+ "src"
9
10
  ],
10
11
  "author": {
11
12
  "name": "Maiko Tan",
@@ -31,10 +32,13 @@
31
32
  "im",
32
33
  "chat"
33
34
  ],
35
+ "devDependencies": {
36
+ "@satorijs/router": "^1.1.2"
37
+ },
34
38
  "peerDependencies": {
35
- "@satorijs/satori": "^3.0.2"
39
+ "@satorijs/satori": "^3.2.0"
36
40
  },
37
41
  "dependencies": {
38
42
  "form-data": "^4.0.0"
39
43
  }
40
- }
44
+ }
package/src/bot.ts ADDED
@@ -0,0 +1,155 @@
1
+ import { Bot, Context, h, Quester, Schema } from '@satorijs/satori'
2
+
3
+ import { HttpServer } from './http'
4
+ import { LarkMessageEncoder } from './message'
5
+ import { Internal } from './types'
6
+ import * as Utils from './utils'
7
+
8
+ export class LarkBot<C extends Context = Context> extends Bot<C, LarkBot.Config> {
9
+ static inject = ['router']
10
+ static MessageEncoder = LarkMessageEncoder
11
+
12
+ _token?: string
13
+ _refresher?: NodeJS.Timeout
14
+ http: Quester
15
+ assetsQuester: Quester
16
+ internal: Internal
17
+
18
+ constructor(ctx: C, config: LarkBot.Config) {
19
+ super(ctx, config, 'lark')
20
+
21
+ // lark bot needs config.selfUrl to be set as it should be serve on a public url
22
+ if (!config.selfUrl && !ctx.router.config.selfUrl) {
23
+ this.logger.warn('selfUrl is not set, some features may not work')
24
+ }
25
+
26
+ this.selfId = config.appId
27
+ this.http = ctx.http.extend({
28
+ endpoint: config.endpoint,
29
+ headers: {
30
+ 'Content-Type': 'application/json; charset=utf-8',
31
+ },
32
+ })
33
+ this.assetsQuester = ctx.http
34
+ this.internal = new Internal(this)
35
+
36
+ ctx.plugin(HttpServer, this)
37
+ }
38
+
39
+ async initialize() {
40
+ await this.refreshToken()
41
+ this.online()
42
+ }
43
+
44
+ private async refreshToken() {
45
+ const { tenant_access_token: token } = await this.internal.getTenantAccessToken({
46
+ app_id: this.config.appId,
47
+ app_secret: this.config.appSecret,
48
+ })
49
+ this.logger.debug('refreshed token %s', token)
50
+ this.token = token
51
+ // Token would be expired in 2 hours, refresh it every 1 hour
52
+ // see https://open.larksuite.com/document/ukTMukTMukTM/ukDNz4SO0MjL5QzM/auth-v3/auth/tenant_access_token_internal
53
+ if (this._refresher) clearTimeout(this._refresher)
54
+ this._refresher = setTimeout(() => this.refreshToken(), 3600 * 1000)
55
+ this.online()
56
+ }
57
+
58
+ get token() {
59
+ return this._token
60
+ }
61
+
62
+ set token(v: string) {
63
+ this._token = v
64
+ this.http.config.headers.Authorization = `Bearer ${v}`
65
+ }
66
+
67
+ async editMessage(channelId: string, messageId: string, content: h.Fragment) {
68
+ await this.internal.updateMessage(messageId, {
69
+ content: h.normalize(content).join(''),
70
+ msg_type: 'text',
71
+ })
72
+ }
73
+
74
+ async deleteMessage(channelId: string, messageId: string) {
75
+ await this.internal.deleteMessage(messageId)
76
+ }
77
+
78
+ async getMessage(channelId: string, messageId: string) {
79
+ const data = await this.internal.getMessage(messageId)
80
+ return await Utils.decodeMessage(this, data.data)
81
+ }
82
+
83
+ async getMessageList(channelId: string, before?: string) {
84
+ const { data: messages } = await this.internal.getMessageList({ container_id_type: 'chat', container_id: channelId, page_token: before })
85
+ const data = await Promise.all(messages.items.reverse().map(data => Utils.decodeMessage(this, data)))
86
+ return { data, next: data[0]?.id }
87
+ }
88
+
89
+ async getUser(userId: string, guildId?: string) {
90
+ const data = await this.internal.getUserInfo(userId)
91
+ return Utils.decodeUser(data.data)
92
+ }
93
+
94
+ async getChannel(channelId: string) {
95
+ const { data } = await this.internal.getGuildInfo(channelId)
96
+ return Utils.decodeChannel(data)
97
+ }
98
+
99
+ async getChannelList(guildId: string) {
100
+ return { data: [await this.getChannel(guildId)] }
101
+ }
102
+
103
+ async getGuild(guildId: string) {
104
+ const { data } = await this.internal.getGuildInfo(guildId)
105
+ return Utils.decodeGuild(data)
106
+ }
107
+
108
+ async getGuildList(after?: string) {
109
+ const { data: guilds } = await this.internal.getCurrentUserGuilds({ page_token: after })
110
+ return { data: guilds.items.map(Utils.decodeGuild), next: guilds.page_token }
111
+ }
112
+
113
+ async getGuildMemberList(guildId: string, after?: string) {
114
+ const { data: users } = await this.internal.getGuildMembers(guildId, { page_token: after })
115
+ const data = users.items.map(v => ({ user: { id: v.member_id, name: v.name }, name: v.name }))
116
+ return { data, next: users.page_token }
117
+ }
118
+ }
119
+
120
+ export namespace LarkBot {
121
+ export interface Config extends HttpServer.Config, Quester.Config {
122
+ appId: string
123
+ appSecret: string
124
+ encryptKey?: string
125
+ verificationToken?: string
126
+ }
127
+
128
+ export const Config: Schema<Config> = Schema.intersect([
129
+ Schema.object({
130
+ platform: Schema.union(['feishu', 'lark']).required().description('平台名称。'),
131
+ appId: Schema.string().required().description('机器人的应用 ID。'),
132
+ appSecret: Schema.string().role('secret').required().description('机器人的应用密钥。'),
133
+ encryptKey: Schema.string().role('secret').description('机器人的 Encrypt Key。'),
134
+ verificationToken: Schema.string().description('事件推送的验证令牌。'),
135
+ }),
136
+ Schema.union([
137
+ Schema.intersect([
138
+ Schema.object({
139
+ platform: Schema.const('feishu').required(),
140
+ }),
141
+ Quester.createConfig('https://open.feishu.cn/open-apis/'),
142
+ HttpServer.createConfig('/feishu'),
143
+ ]),
144
+ Schema.intersect([
145
+ Schema.object({
146
+ platform: Schema.const('lark').required(),
147
+ }),
148
+ Quester.createConfig('https://open.larksuite.com/open-apis/'),
149
+ HttpServer.createConfig('/lark'),
150
+ ]),
151
+ ]),
152
+ ])
153
+ }
154
+
155
+ export { LarkBot as FeishuBot }