Skip to content

Commit

Permalink
feat(core): support meta.$argv
Browse files Browse the repository at this point in the history
  • Loading branch information
shigma committed Feb 24, 2020
1 parent eadfbaf commit bbcdab2
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 12 deletions.
39 changes: 27 additions & 12 deletions packages/koishi-core/src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,6 @@ export class App extends Context {
let nickname = ''
let prefix: string = null
let message = simplify(meta.message.trim())
let parsedArgv: ParsedCommandLine

if (meta.messageType !== 'private' && (capture = message.match(this.atMeRE))) {
atMe = true
Expand All @@ -309,15 +308,20 @@ export class App extends Context {
}

// store parsed message
meta.$parsed = { atMe, nickname, prefix, message }
Object.defineProperty(meta, '$parsed', {
value: { atMe, nickname, prefix, message },
})

// parse as command
if (prefix !== null || nickname || meta.messageType === 'private') {
parsedArgv = this.parseCommandLine(message, meta)
if (!meta.$argv && (prefix !== null || nickname || meta.messageType === 'private')) {
Object.defineProperty(meta, '$argv', {
configurable: true,
value: this.parseCommandLine(message, meta),
})
}

// parse as shortcut
if (!parsedArgv && !prefix) {
if (!meta.$argv && !prefix) {
for (const shortcut of this._shortcuts) {
const { name, fuzzy, command, oneArg, prefix, options, args = [] } = shortcut
if (prefix && !nickname) continue
Expand All @@ -330,33 +334,44 @@ export class App extends Context {
: command.parse(_message.trim())
result.options = { ...options, ...result.options }
result.args.unshift(...args)
parsedArgv = { meta, command, ...result }
Object.defineProperty(meta, '$argv', {
configurable: true,
value: { meta, command, ...result },
})
break
}
}
}

if (!meta.$argv) {
Object.defineProperty(meta, '$argv', {
configurable: true,
value: { meta },
})
}

const { command } = meta.$argv
if (this.database) {
if (meta.messageType === 'group') {
// attach group data
const groupFields = new Set<GroupField>(['flag', 'assignee'])
this.emitEvent(meta, 'before-group', groupFields, parsedArgv || { meta })
this.emitEvent(meta, 'before-group', groupFields, meta.$argv)
const group = await this.database.observeGroup(meta.groupId, Array.from(groupFields))
Object.defineProperty(meta, '$group', { value: group, writable: true })

// ignore some group calls
const isAssignee = !group.assignee || group.assignee === this.selfId
const noCommand = group.flag & GroupFlag.noCommand
const noResponse = group.flag & GroupFlag.noResponse || !isAssignee
if (noCommand && parsedArgv) return
if (noCommand && command) return
if (noResponse && !atMe) return
const originalNext = next
next = (fallback?: NextFunction) => noResponse as never || originalNext(fallback)
}

// attach user data
const userFields = new Set<UserField>(['flag'])
this.emitEvent(meta, 'before-user', userFields, parsedArgv || { meta })
this.emitEvent(meta, 'before-user', userFields, meta.$argv)
const user = await this.database.observeUser(meta.userId, Array.from(userFields))
Object.defineProperty(meta, '$user', { value: user, writable: true })

Expand All @@ -368,13 +383,13 @@ export class App extends Context {
}

// execute command
if (parsedArgv && !parsedArgv.command.getConfig('disable', meta)) {
return parsedArgv.command.execute(parsedArgv, next)
if (command && !command.getConfig('disable', meta)) {
return command.execute(meta.$argv, next)
}

// show suggestions
const target = message.split(/\s/, 1)[0].toLowerCase()
if (!target || !capture || parsedArgv) return next()
if (!target || !capture || command) return next()

const executableMap = new Map<Command, boolean>()
return showSuggestions({
Expand Down
2 changes: 2 additions & 0 deletions packages/koishi-core/src/meta.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { User, Group } from './database'
import { ParsedCommandLine } from './command'

export type PostType = 'message' | 'notice' | 'request' | 'meta_event' | 'send'
export type MessageType = 'private' | 'group' | 'discuss'
Expand Down Expand Up @@ -60,6 +61,7 @@ export interface Meta <T extends PostType = PostType> {
$ctxType?: ContextType

// other properties
$argv?: ParsedCommandLine
$parsed?: ParsedMessage

// quick operations
Expand Down

0 comments on commit bbcdab2

Please sign in to comment.