diff --git a/packages/core/src/bot.ts b/packages/core/src/bot.ts index 5b2e03a7..06b64f35 100644 --- a/packages/core/src/bot.ts +++ b/packages/core/src/bot.ts @@ -137,7 +137,7 @@ export abstract class Bot { } async supports(name: string, session: Partial = {}) { - return !!this[Universal.Methods[name]] + return !!this[Universal.Methods[name]?.name] } async checkPermission(name: string, session: Partial) { diff --git a/packages/core/src/session.ts b/packages/core/src/session.ts index 63c7b3df..b0b03126 100644 --- a/packages/core/src/session.ts +++ b/packages/core/src/session.ts @@ -48,7 +48,9 @@ export class Session { constructor(bot: Bot, payload: Partial = {}) { this.data = {} + Object.assign(this, payload) for (const [key, descriptor] of Object.entries(Object.getOwnPropertyDescriptors(payload))) { + if (descriptor.enumerable) continue Object.defineProperty(this, key, descriptor) } this.selfId = bot.selfId diff --git a/packages/core/src/universal.ts b/packages/core/src/universal.ts index cf827fb6..48623ae1 100644 --- a/packages/core/src/universal.ts +++ b/packages/core/src/universal.ts @@ -3,29 +3,39 @@ import { SendOptions } from './session' import { Dict } from 'cosmokit' export namespace Universal { - export const Methods = { - 'message.get': 'getMessage', - 'message.list': 'getMessageList', - 'message.update': 'editMessage', - 'message.delete': 'deleteMessage', - 'reaction.create': 'createReaction', - 'reaction.delete': 'deleteReaction', - 'reaction.clear': 'clearReaction', - 'reaction.list': 'getReactions', - 'guild.get': 'getGuild', - 'guild.list': 'getGuildList', - 'guild.member.get': 'getGuildMember', - 'guild.member.list': 'getGuildMemberList', - 'guild.member.kick': 'kickGuildMember', - 'guild.member.mute': 'muteGuildMember', - 'guild.member.role': 'setGuildMemberRole', - 'guild.role.list': 'getGuildRoles', - 'guild.role.create': 'createGuildRole', - 'guild.role.update': 'modifyGuildRole', - 'guild.role.delete': 'deleteGuildRole', - 'channel.get': 'getChannel', - 'channel.list': 'getChannelList', - 'channel.mute': 'muteChannel', + export interface Method { + name: string + fields: string[] + } + + function Method(name: string, fields: string[]): Method { + return { name, fields } + } + + export const Methods: Dict = { + 'message.send': Method('sendMessage', ['channelId', 'content', 'guildId', 'options']), + 'message.get': Method('getMessage', ['channelId', 'messageId']), + 'message.list': Method('getMessageList', ['channelId', 'next']), + 'message.update': Method('editMessage', ['channelId', 'messageId']), + 'message.delete': Method('deleteMessage', ['channelId', 'messageId']), + 'reaction.create': Method('createReaction', ['channelId', 'messageId', 'emoji']), + 'reaction.delete': Method('deleteReaction', ['channelId', 'messageId', 'emoji', 'userId']), + 'reaction.clear': Method('clearReaction', ['channelId', 'messageId', 'emoji']), + 'reaction.list': Method('getReactionList', ['channelId', 'messageId', 'emoji', 'next']), + 'guild.get': Method('getGuild', ['guildId']), + 'guild.list': Method('getGuildList', ['next']), + 'guild.member.get': Method('getGuildMember', ['guildId', 'userId']), + 'guild.member.list': Method('getGuildMemberList', ['guildId', 'next']), + 'guild.member.kick': Method('kickGuildMember', ['guildId', 'userId', 'permanent']), + 'guild.member.mute': Method('muteGuildMember', ['guildId', 'userId', 'duration', 'reason']), + 'guild.member.role': Method('setGuildMemberRole', ['guildId', 'userId', 'roleId']), + 'guild.role.list': Method('getGuildRoleList', ['guildId', 'next']), + 'guild.role.create': Method('createGuildRole', ['guildId', 'data']), + 'guild.role.update': Method('modifyGuildRole', ['guildId', 'roleId', 'data']), + 'guild.role.delete': Method('deleteGuildRole', ['guildId', 'roleId']), + 'channel.get': Method('getChannel', ['channelId', 'guildId']), + 'channel.list': Method('getChannelList', ['guildId', 'next']), + 'channel.mute': Method('muteChannel', ['channelId', 'guildId', 'enable']), } export interface List { diff --git a/packages/server-basic/src/index.ts b/packages/server-basic/src/index.ts new file mode 100644 index 00000000..54e95968 --- /dev/null +++ b/packages/server-basic/src/index.ts @@ -0,0 +1,33 @@ +import { Context, Schema, Universal } from '@satorijs/satori' + +export interface Config { + path: string +} + +export const Config: Schema = Schema.object({ + path: Schema.string().default('/basic'), +}) + +export function apply(ctx: Context, config: Config) { + ctx.router.all(config + '/:name', async (koa) => { + const method = Universal.Methods[koa.params.name] + if (!method) { + koa.body = 'method not found' + return koa.status = 404 + } + + const json = koa.method === 'GET' ? koa.query : koa.request.body + const selfId = json.self_id + const platform = json.platform + const bot = ctx.bots.find(bot => bot.selfId === selfId && bot.platform === platform) + if (!bot) { + koa.body = 'bot not found' + return koa.status = 403 + } + + const args = method.fields.map(field => json[field]) + const result = await bot[method.name](...args) + koa.body = result + koa.status = 200 + }) +}