Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
shigma committed May 5, 2021
2 parents ab64fee + a40f58b commit e276985
Show file tree
Hide file tree
Showing 48 changed files with 278 additions and 114 deletions.
2 changes: 1 addition & 1 deletion docs/.vuepress/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ module.exports = {

head: [
['link', { rel: 'icon', href: `/koishi.png` }],
// ['link', { rel: 'manifest', href: '/manifest.json' }],
['link', { rel: 'manifest', href: '/manifest.json' }],
['meta', { name: 'theme-color', content: '#5546a3' }],
// ['meta', { name: 'apple-mobile-web-app-capable', content: 'yes' }],
// ['meta', { name: 'apple-mobile-web-app-status-bar-style', content: 'black' }],
Expand Down
16 changes: 16 additions & 0 deletions docs/.vuepress/public/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"name": "Koishi",
"short_name": "Koishi",
"description": "跨平台机器人框架",
"start_url": "/index.html",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#5546a3",
"icons": [
{
"src": "/koishi.png",
"sizes": "384x384",
"type": "image/png"
}
]
}
10 changes: 10 additions & 0 deletions docs/.vuepress/theme/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,16 @@ module.exports = {
['medium-zoom', {
selector: '.theme-default-content :not(a) > img:not(.no-zooming)',
}],
['@vuepress/pwa', {
skipWaiting: true,
}],
['@vuepress/docsearch', {
apiKey: '24a872e49e34cdb7736d132917a308c6',
indexName: 'koishi',
searchParameters: {
facetFilters: ['tags:latest'],
},
}],
['@vuepress/container', {
type: 'code-group',
before: (info) => {
Expand Down
36 changes: 36 additions & 0 deletions docs/api/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,42 @@ externalIcon: false

# v3 更新日志

## [Koishi 3.10.2](https://github.com/koishijs/koishi/releases/tag/3.10.2)

### Features

- **chat:** 优化了 at 消息段的处理 (=d80af91267986e1455c1f52998248c2d460c5a3c)
- **common:** assign 指令支持了 -T 选项,用于取消频道代理者 (=40afea00a027b62b2a5e51375c7036a75309d5f2)
- **core:** 支持了函数类型的 `app.options.prefix` (=578008098031fc7942a074e907d8c9ca8601a46b)
- **discord:** 为 at, sharp 消息段添加了 name 属性 (=43a23cae0c096d257dcd4aa944455d16215956c2)
- **kaiheila:** 导出了 `KaiheilaBot` 构造函数 (#258) (=8fb118e57b8bfafda1711e2b50a7cb9cdd5c6dc6)
- **puppeteer:** 使用 inline-block 布局以获得更好的截图区域 (=8f3c98dd7bcbf4ab41289db025894d228f9f438b)
- **webui:** 将自动删除距今过于遥远的统计数据 (=767853efadae08db3c1ba06fe4daedc085ee3e20)
- **webui:** 新增了指令调用频率的统计图表 (#252) (=4d5d87a533e02ecab5f573247f4732ae40156feb)

### Bug Fixes

- **common:** 修复了错误的类型标注 (#254) (=ab64feec34f59aab3a21f25409d089398604d41b)
- **discord:** 修复了 message-deleted 事件缺少 `id` 属性的问题 (#251) (=bbd8d6c3e9684ddb3bc6ca2e71ab839c7b1d6aa3)
- **webui:** 修复了群聊消息频率统计图表当鼠标悬浮时出现报错的问题 (=361ea7c145b1e247f30fed394511a9c4e0756c9b)

## [Koishi 3.10.1](https://github.com/koishijs/koishi/releases/tag/3.10.1)

### Features

- **cli:** 优化了 koishi init 时可供选择的插件列表 (=a9b7000ac6c2da383bb3fe679cc84f78be2f5f1b)
- **kaiheila:** 新增了 `kaiheila.attachMode` 配置项 (=7bc59993f59bea5e2b4d3e751965fa58e4c85d58)
- **github:** 新增了 github.issue 和 github.star 指令 (=104841c9be749ade6c44dab6bcc59d5d4e32a596)
- **webui:** 将「机器人」页面合并入「仪表盘」页面 (=d70fdcff63690ae4ec0e3afb8d2c57c4f08d8652)

### Bug Fixes

- **cli:** 修复了插件热重载功能将小概率触发调用爆栈的问题 (=45690007150441cbb568f85049395085756a301e)
- **discord:** 修复了不符合规范的 `user.avatar` (=14c92ca96723f7f96ebda93e20f7c5ce8436d9b1)
- **discord:** 修复了 `bot.getMessage()` 返回值缺少 `groupId` 的问题 (=c5a012437744e396d500d67a3996fc5d9dfc2c3c)
- **image-search:** 修复了消息段错误导致在部分平台上无法发送的问题 (=ff82bd60fa2959f5387d71d84028e046a04f93aa)
- **webui:** 修复了配合 MySQL 使用时小概率上传数据失败的问题 (#248) (=2a0bbfb2d53520ba14a9014e9015f511a5d92d24)

## [Koishi 3.10.0](https://github.com/koishijs/koishi/releases/tag/3.10.0)

### Notable Changes
Expand Down
58 changes: 58 additions & 0 deletions docs/guide/database.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,38 @@ User.extend(() => ({ foo: 'bar' }))
```
:::

如果你是插件开发者,你还需要手动处理 MySQL 字段的定义:

::: code-group language
```js
const { Database } = require('koishi-core')

Database.extend('koishi-plugin-mysql', ({ tables }) => {
tables.user.foo = 'varchar(100)' // MySQL 类型
})
```
```ts
import { Database } from 'koishi-core'

// 引入 koishi-plugin-mysql 的类型定义
// 如果你是插件开发者,你应该将 koishi-plugin-mysql 作为你的 devDep
// 这行代码不会真正 require 这个依赖,因此即使用户使用的不是 MySQL 也没有关系
import {} from 'koishi-plugin-mysql'

Database.extend('koishi-plugin-mysql', ({ tables }) => {
tables.user.foo = 'varchar(100)' // MySQL 类型
})
```
:::

向 Channel 注入字段同理。

::: tip
#### 为什么 MySQL 需要编写两份代码

看起来这是不必要的重复,但其实不然。`User.extend()` 定义的是用户表中各列的**默认值**,而 `Database.extend()` 定义的是数据库的**字段类型**,会被用于自动建表和补全字段。换句话说,如果你已经手动建好表了,那么你确实不需要编写后面的额外代码。但是反过来,如果你是插件开发者,你的用户很可能不知道这个插件需要哪些用户字段,因此这样的写法可以在用户安装插件的时候就自动创建字段。
:::

## 使用 ORM API

Koishi 设计了一套对象关系映射(ORM)接口,它易于扩展并广泛地运用于各种插件中。
Expand Down Expand Up @@ -212,6 +242,34 @@ Tables.extend('schedule', {
})
```

与上面一致,如果你是插件开发者,你还需要手动处理 MySQL 字段的定义:

::: code-group language
```js
const { Database } = require('koishi-core')

Database.extend('koishi-plugin-mysql', ({ tables }) => {
tables.schedule = {
id: 'int',
assignee: 'varchar(50)',
// 其他字段定义
}
})
```
```ts
import { Database } from 'koishi-core'
import {} from 'koishi-plugin-mysql'

Database.extend('koishi-plugin-mysql', ({ tables }) => {
tables.schedule = {
id: 'int',
assignee: 'varchar(50)',
// 其他字段定义
}
})
```
:::

## 扩展数据库

由于 Koishi 的数据库实现使用了注入策略,因此无论是字段,表,方法还是数据库都是可以扩展的。
Expand Down
6 changes: 4 additions & 2 deletions docs/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@
"build": "vuepress build ."
},
"devDependencies": {
"@vuepress/plugin-register-components": "^2.0.0-beta.11",
"@vuepress/plugin-docsearch": "^2.0.0-beta.12",
"@vuepress/plugin-pwa": "^2.0.0-beta.12",
"@vuepress/plugin-register-components": "^2.0.0-beta.12",
"diacritics": "^1.3.0",
"shiki": "^0.9.3",
"typescript": "^4.2.4",
"vuepress-plugin-medium-zoom": "^1.1.9",
"vuepress-vite": "^2.0.0-beta.11"
"vuepress-vite": "^2.0.0-beta.12"
}
}
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -44,21 +44,21 @@
"@types/estree": "^0.0.47",
"@types/fs-extra": "^9.0.11",
"@types/mocha": "^8.2.2",
"@types/node": "^15.0.1",
"@types/node": "^15.0.2",
"@types/rimraf": "^3.0.0",
"@types/semver": "^7.3.5",
"@types/sinonjs__fake-timers": "^6.0.2",
"@types/source-map-support": "^0.5.3",
"@typescript-eslint/eslint-plugin": "^3.10.1",
"@typescript-eslint/parser": "^3.10.1",
"c8": "^7.7.1",
"c8": "^7.7.2",
"cac": "^6.7.3",
"chai": "^4.3.4",
"chai-as-promised": "^7.1.1",
"cross-env": "^7.0.3",
"cross-spawn": "^7.0.3",
"del": "^6.0.0",
"esbuild": "^0.11.15",
"esbuild": "^0.11.18",
"eslint": "^7.25.0",
"eslint-config-standard": "^16.0.2",
"eslint-import-resolver-typescript": "^2.4.0",
Expand Down
4 changes: 2 additions & 2 deletions packages/adapter-discord/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "koishi-adapter-discord",
"description": "Discord adapter for Koishi",
"version": "1.1.1",
"version": "1.1.2",
"main": "lib/index.js",
"typings": "lib/index.d.ts",
"files": [
Expand All @@ -28,7 +28,7 @@
"koishi"
],
"peerDependencies": {
"koishi-core": "^3.10.1"
"koishi-core": "^3.10.2"
},
"devDependencies": {
"@types/ws": "^7.4.2",
Expand Down
14 changes: 10 additions & 4 deletions packages/adapter-discord/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,18 @@ export async function adaptMessage(bot: DiscordBot, meta: DC.Message, session: P
if (meta.mention_roles.includes(id)) {
return segment('at', { role: id })
} else {
return segment('at', { id })
const user = meta.mentions?.find(u => u.id === id)
return segment.at(id, { name: user?.username })
}
})
.replace(/<:(.*):(.+?)>/, (_, name, id) => segment('face', { id: id, name }))
.replace(/<a:(.*):(.+?)>/, (_, name, id) => segment('face', { id: id, name, animated: true }))
.replace(/@everyone/, () => segment('at', { type: 'all' }))
.replace(/@here/, () => segment('at', { type: 'here' }))
.replace(/<#(.+?)>/, (_, id) => segment.sharp(id))
.replace(/<#(.+?)>/, (_, id) => {
const channel = meta.mention_channels?.find(c => c.id === id)
return segment.sharp(id, { name: channel?.name })
})
}

// embed 的 update event 太阴间了 只有 id embeds channel_id guild_id 四个成员
Expand Down Expand Up @@ -100,10 +104,10 @@ export async function adaptMessage(bot: DiscordBot, meta: DC.Message, session: P
return session
}

async function adaptMessageSession(bot: DiscordBot, meta: DC.Message, session: Partial<Session.Payload<Session.MessageAction>> = {}) {
async function adaptMessageSession(bot: DiscordBot, meta: DC.Message, session: Partial<Session.Message> = {}) {
await adaptMessage(bot, meta, session)
session.messageId = meta.id
session.timestamp = new Date(meta.timestamp).valueOf() || new Date().valueOf()
session.timestamp = new Date(meta.timestamp).valueOf() || Date.now()
// 遇到过 cross post 的消息在这里不会传消息 id
if (meta.message_reference) {
const { message_id, channel_id } = meta.message_reference
Expand Down Expand Up @@ -142,6 +146,8 @@ export async function adaptSession(bot: DiscordBot, input: DC.Payload) {
} else if (input.t === 'MESSAGE_DELETE') {
session.type = 'message-deleted'
session.messageId = input.d.id
session.groupId = input.d.guild_id
session.channelId = input.d.channel_id
}
return new Session(bot.app, session)
}
4 changes: 2 additions & 2 deletions packages/adapter-kaiheila/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "koishi-adapter-kaiheila",
"description": "Kaiheila adapter for Koishi",
"version": "1.1.1",
"version": "1.1.2",
"main": "lib/index.js",
"typings": "lib/index.d.ts",
"files": [
Expand All @@ -24,7 +24,7 @@
"koishi"
],
"peerDependencies": {
"koishi-core": "^3.10.1"
"koishi-core": "^3.10.2"
},
"devDependencies": {
"koishi-test-utils": "^6.0.0-beta.12"
Expand Down
1 change: 1 addition & 0 deletions packages/adapter-kaiheila/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ declare module 'koishi-core' {

export * from './types'
export * from './utils'
export * from './bot'

Adapter.types['kaiheila:http'] = HttpServer
Adapter.types['kaiheila:ws'] = WsClient
Expand Down
2 changes: 1 addition & 1 deletion packages/adapter-onebot/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
"koishi"
],
"peerDependencies": {
"koishi-core": "^3.10.1"
"koishi-core": "^3.10.2"
},
"devDependencies": {
"@types/ws": "^7.4.2",
Expand Down
2 changes: 1 addition & 1 deletion packages/adapter-telegram/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
"koishi"
],
"peerDependencies": {
"koishi-core": "^3.10.1"
"koishi-core": "^3.10.2"
},
"devDependencies": {
"koishi-test-utils": "^6.0.0-beta.12"
Expand Down
2 changes: 1 addition & 1 deletion packages/adapter-tomon/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
"koishi"
],
"peerDependencies": {
"koishi-core": "^3.10.1"
"koishi-core": "^3.10.2"
},
"devDependencies": {
"@types/pako": "^1.0.1",
Expand Down
2 changes: 1 addition & 1 deletion packages/koishi-core/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "koishi-core",
"description": "Core features for Koishi",
"version": "3.10.1",
"version": "3.10.2",
"main": "lib/index.js",
"typings": "lib/index.d.ts",
"engines": {
Expand Down
23 changes: 13 additions & 10 deletions packages/koishi-core/src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export interface DelayOptions {
export interface AppOptions extends BotOptions {
port?: number
bots?: BotOptions[]
prefix?: string | string[]
prefix?: string | string[] | ((session: Session.Message) => void | string | string[])
nickname?: string | string[]
maxListeners?: number
prettyErrors?: boolean
Expand Down Expand Up @@ -65,7 +65,6 @@ export class App extends Context {
_sessions: Record<string, Session> = {}

private _nameRE: RegExp
private _prefixRE: RegExp

static defaultConfig: AppOptions = {
maxListeners: 64,
Expand Down Expand Up @@ -161,11 +160,9 @@ export class App extends Context {
}

prepare() {
const { nickname, prefix } = this.options
const { nickname } = this.options
this.options.nickname = makeArray(nickname)
this.options.prefix = Array.isArray(prefix) ? prefix : [prefix || '']
this._nameRE = createLeadingRE(this.options.nickname, '@?', '([,,]\\s*|\\s+)')
this._prefixRE = createLeadingRE(this.options.prefix)
}

async start() {
Expand Down Expand Up @@ -205,7 +202,13 @@ export class App extends Context {
this._httpServer?.close()
}

private async _process(session: Session, next: NextFunction) {
private _resolvePrefixes(session: Session.Message) {
const { prefix } = this.options
const temp = typeof prefix === 'function' ? prefix(session) : prefix
return Array.isArray(temp) ? temp : [temp || '']
}

private async _process(session: Session.Message, next: NextFunction) {
let capture: RegExpMatchArray
let atSelf = false, appel = false, prefix: string = null
const pattern = /^\[CQ:(\w+)((,\w+=[^,\]]*)*)\]/
Expand All @@ -221,10 +224,10 @@ export class App extends Context {
content = content.slice(capture[0].length)
}

// eslint-disable-next-line no-cond-assign
if (capture = content.match(this._prefixRE)) {
prefix = capture[0]
content = content.slice(capture[0].length)
for (const _prefix of this._resolvePrefixes(session)) {
if (!content.startsWith(_prefix)) continue
prefix = _prefix
content = content.slice(_prefix.length)
}

// store parsed message
Expand Down
Loading

0 comments on commit e276985

Please sign in to comment.