diff --git a/packages/plugin-github/package.json b/packages/plugin-github/package.json index 247adc8c19..562d3681c2 100644 --- a/packages/plugin-github/package.json +++ b/packages/plugin-github/package.json @@ -30,6 +30,8 @@ ], "devDependencies": { "@types/marked": "^2.0.0", + "koishi-plugin-mongo": "^2.1.1", + "koishi-plugin-mysql": "^3.1.0", "koishi-plugin-puppeteer": "^2.0.0", "koishi-test-utils": "^6.0.0-beta.10" }, diff --git a/packages/plugin-github/src/index.ts b/packages/plugin-github/src/index.ts index a2e0070635..3e78e5b97d 100644 --- a/packages/plugin-github/src/index.ts +++ b/packages/plugin-github/src/index.ts @@ -2,27 +2,20 @@ /* eslint-disable quote-props */ import { createHmac } from 'crypto' -import { Context } from 'koishi-core' -import { camelize, defineProperty, Time, Random } from 'koishi-utils' import { encode } from 'querystring' +import { Context, camelize, Time, Random } from 'koishi-core' import { CommonPayload, addListeners, defaultEvents } from './events' -import { Config, GitHub, ReplyHandler, EventData } from './server' +import { Config, GitHub, ReplyHandler, ReplySession, EventData } from './server' export * from './server' -declare module 'koishi-core' { - interface App { - github?: GitHub - } -} - const defaultOptions: Config = { secret: '', messagePrefix: '[GitHub] ', webhook: '/github/webhook', authorize: '/github/authorize', replyTimeout: Time.hour, - repos: {}, + repos: [], events: {}, } @@ -111,7 +104,7 @@ export function apply(ctx: Context, config: Config = {}) { } }) - ctx.middleware((session, next) => { + ctx.middleware((session: ReplySession, next) => { if (!session.quote) return next() const body = session.parsed.content.trim() const payloads = history[session.quote.messageId.slice(0, 6)] diff --git a/packages/plugin-github/src/server.ts b/packages/plugin-github/src/server.ts index e3f8a8537f..4c250cf3da 100644 --- a/packages/plugin-github/src/server.ts +++ b/packages/plugin-github/src/server.ts @@ -2,14 +2,28 @@ import { EventConfig } from './events' import axios, { AxiosError, Method } from 'axios' -import { App, Session, User } from 'koishi-core' +import { App, Channel, Database, Session, User } from 'koishi-core' import { segment, Logger } from 'koishi-utils' import {} from 'koishi-plugin-puppeteer' +import {} from 'koishi-plugin-mysql' +import {} from 'koishi-plugin-mongo' declare module 'koishi-core' { + interface App { + github?: GitHub + } + interface User { - ghAccessToken?: string - ghRefreshToken?: string + ghAccessToken: string + ghRefreshToken: string + } + + interface Channel { + githubWebhooks: Record + } + + interface Tables { + github: Repository } } @@ -18,6 +32,33 @@ User.extend(() => ({ ghRefreshToken: '', })) +Channel.extend(() => ({ + githubWebhooks: {}, +})) + +Database.extend('koishi-plugin-mysql', ({ tables, Domain }) => { + tables.user.ghAccessToken = 'varchar(50)' + tables.user.ghRefreshToken = 'varchar(50)' + tables.channel.githubWebhooks = new Domain.Json() + tables.github = Object.assign(['primary key (`name`)'], { + name: 'varchar(50)', + secret: 'varchar(50)', + }) +}) + +Database.extend('koishi-plugin-mongo', ({ tables }) => { + tables.github = { primary: 'name' } +}) + +interface Repository { + name: string + secret: string +} + +interface RepoConfig extends Repository { + targets: string[] +} + export interface Config { secret?: string webhook?: string @@ -29,7 +70,7 @@ export interface Config { promptTimeout?: number replyTimeout?: number requestTimeout?: number - repos?: Record + repos?: RepoConfig[] events?: EventConfig } @@ -42,7 +83,7 @@ export interface OAuth { scope: string } -type ReplySession = Session<'ghAccessToken' | 'ghRefreshToken'> +export type ReplySession = Session<'ghAccessToken' | 'ghRefreshToken'> const logger = new Logger('github') @@ -131,7 +172,7 @@ type ReplyPayloads = { export type EventData = [string, (ReplyPayloads & T)?] export class ReplyHandler { - constructor(public github: GitHub, public session: Session, public content?: string) {} + constructor(public github: GitHub, public session: ReplySession, public content?: string) {} link(url: string) { return this.session.send(url) diff --git a/packages/plugin-mongo/src/database.ts b/packages/plugin-mongo/src/database.ts index 967bd103a0..0729a3324a 100644 --- a/packages/plugin-mongo/src/database.ts +++ b/packages/plugin-mongo/src/database.ts @@ -23,7 +23,7 @@ export interface Config { } interface TableConfig { - primary: keyof O + primary?: keyof O type?: 'incremental' }