Skip to content

Commit

Permalink
chore: adjust usage API
Browse files Browse the repository at this point in the history
  • Loading branch information
shigma committed Feb 17, 2020
1 parent fb83432 commit 0453948
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 19 deletions.
1 change: 0 additions & 1 deletion packages/koishi-core/src/command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ export interface CommandConfig {
authority?: number
disable?: UserType<boolean>
maxUsage?: UserType<number>
maxUsageText?: string
minInterval?: UserType<number>
showWarning?: boolean | number
noHelpOption?: boolean
Expand Down
16 changes: 7 additions & 9 deletions packages/koishi-core/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,13 @@ export function getUsage (name: string, user: Pick<UserData, 'usage'>, time = Da
if (key === '$date') continue
const { last } = oldUsage[key]
if (time.valueOf() - last < ONE_DAY) {
newUsage[key] = { last, count: 0 }
newUsage[key] = { last }
}
}
user.usage = newUsage
}

if (!user.usage[name]) {
user.usage[name] = { count: 0 }
}
return user.usage[name]
return user.usage[name] || (user.usage[name] = {})
}

interface UsageOptions {
Expand All @@ -52,15 +49,16 @@ export function updateUsage (name: string, user: Pick<UserData, 'usage'>, option
const { maxUsage = Infinity, minInterval = 0, timestamp = now } = options
const usage = getUsage(name, user, now)

if (now - usage.last <= minInterval) {
if (now - usage.last < minInterval) {
return CommandHint.TOO_FREQUENT
} else if (options.minInterval || options.timestamp) {
usage.last = timestamp
}
usage.last = timestamp

if (usage.count >= maxUsage) {
return CommandHint.USAGE_EXHAUSTED
} else {
usage.count++
} else if (options.maxUsage) {
usage.count = (usage.count || 0) + 1
}
}

Expand Down
27 changes: 18 additions & 9 deletions packages/koishi-core/tests/utils.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,37 +19,46 @@ describe('getTargetId', () => {
})

const user = createUser(123, 1)
const realDateNow = Date.now
const timestamp = 123456789
const mockedDateNow = Date.now = jest.fn().mockReturnValue(timestamp)

describe('getUsage', () => {
test('empty usage', () => {
utils.getDateNumber.mockReturnValue(10000)
const usage = getUsage('foo', user)
expect(usage.count).toBe(0)
expect(usage.last).toBeUndefined()
expect(usage).toEqual({})
})

test('update usage', () => {
expect(updateUsage('foo', user, { maxUsage: 1, minInterval: 1000 })).toBeFalsy()
const usage = getUsage('foo', user)
expect(usage).toEqual({ count: 1, last: timestamp })
})

test('too frequent', () => {
mockedDateNow.mockReturnValue(timestamp - 1000)
expect(updateUsage('foo', user)).toBeTruthy()
const usage = getUsage('foo', user)
expect(usage).toEqual({ count: 1, last: timestamp })
})

test('update usage 2', () => {
mockedDateNow.mockReturnValue(timestamp)
expect(updateUsage('foo', user)).toBeFalsy()
const usage = getUsage('foo', user)
expect(usage.count).toBe(1)
expect(usage.last).toBe(timestamp)
expect(usage).toEqual({ count: 1, last: timestamp })
})

test('another day', () => {
utils.getDateNumber.mockReturnValue(10001)
const usage = getUsage('foo', user)
expect(usage.count).toBe(0)
expect(usage.last).toBe(timestamp)
expect(usage).toEqual({ last: timestamp })
})

test('10 days later', () => {
utils.getDateNumber.mockReturnValue(10010)
mockedDateNow.mockReturnValue(864000000 + timestamp)
const usage = getUsage('foo', user)
expect(usage.count).toBe(0)
expect(usage.last).toBeUndefined()
expect(usage).toEqual({})
})
})

0 comments on commit 0453948

Please sign in to comment.