Skip to content

Commit

Permalink
feat(analytics): sunburst for platform bots
Browse files Browse the repository at this point in the history
  • Loading branch information
shigma committed Dec 15, 2023
1 parent 1233cd7 commit 1fd4481
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 37 deletions.
54 changes: 30 additions & 24 deletions plugins/analytics/client/charts/bot.ts
Original file line number Diff line number Diff line change
@@ -1,43 +1,49 @@
import { Context } from '@koishijs/client'
import { createChart } from './utils'
import { createChart, Tooltip } from './utils'

export default (ctx: Context) => {
ctx.slot({
type: 'chart',
component: createChart({
title: '各平台消息数量',
title: '各平台占比',
fields: ['analytics'],
options({ analytics }) {
if (!Object.keys(analytics.messageByBot).length) return
const platformData = Object
const data = Object
.entries(analytics.messageByBot)
.map(([key, value]) => ({
name: key,
value: Object.values(value).reduce((a, b) => a + b.send, 0),
children: Object
.entries(value)
.map(([key, value]) => ({
name: value.name || key,
value: value.send,
})),
}))
.sort((a, b) => b.value - a.value)
const botData = platformData.flatMap(({ name }) => {
return Object
.entries(analytics.messageByBot[name])
.map(([key, value]) => ({
name: key,
platform: name,
value: value.send,
}))
.sort((a, b) => b.value - a.value)
})

return {
tooltip: Tooltip.item(({ data }) => {
return `${data.children ? '平台' : '昵称'}${data.name}<br>消息数量:${data.value.toFixed(2)}`
}),
series: [{
type: 'pie',
data: platformData,
radius: ['0%', '35%'],
minShowLabelAngle: 3,
}, {
type: 'pie',
data: botData,
radius: ['35%', '65%'],
minShowLabelAngle: 3,
type: 'sunburst',
data,
radius: ['0', '65%'],
nodeClick: false,
emphasis: {
focus: 'ancestor',
},
levels: [{}, {
label: {
rotate: 'tangential',
},
}, {
label: {
position: 'outside',
padding: 3,
silent: false,
},
}],
}],
}
},
Expand Down
2 changes: 1 addition & 1 deletion plugins/analytics/client/charts/command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export default (ctx: Context) => {
return {
tooltip: Tooltip.item(({ data }) => {
const output = [data.name]
output.push(`日均调用:${data.value}`)
output.push(`日均调用:${data.value.toFixed(2)}`)
return output.join('<br>')
}),
series: [{
Expand Down
4 changes: 2 additions & 2 deletions plugins/analytics/client/charts/echarts.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers'
import { GridComponent, TooltipComponent } from 'echarts/components'
import { BarChart, LineChart, PieChart } from 'echarts/charts'
import { BarChart, LineChart, PieChart, SunburstChart } from 'echarts/charts'
import VChart from 'vue-echarts'

use([BarChart, CanvasRenderer, GridComponent, LineChart, TooltipComponent, PieChart])
use([BarChart, CanvasRenderer, GridComponent, LineChart, TooltipComponent, PieChart, SunburstChart])

export default VChart
4 changes: 2 additions & 2 deletions plugins/analytics/client/charts/history.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@ export default (ctx: Context) => {
}),
xAxis: {
type: 'category',
data: Object.keys(analytics.messageByDate).reverse(),
data: Object.keys(analytics.messageByDate),
},
yAxis: {
type: 'value',
},
series: {
type: 'line',
smooth: true,
data: Object.values(analytics.messageByDate).map(stats => stats.send).reverse(),
data: Object.values(analytics.messageByDate).map(stats => stats.send),
},
}
},
Expand Down
1 change: 1 addition & 0 deletions plugins/analytics/client/charts/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export function createChart({ title, fields, options }: ChartOptions) {
interface CommonData {
name: string
value: number
children?: CommonData
}

export namespace Tooltip {
Expand Down
20 changes: 12 additions & 8 deletions plugins/analytics/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { $, Context, deepEqual, Dict, Logger, Row, Schema, Session, Time } from 'koishi'
import { $, Context, deepEqual, Dict, Logger, pick, Row, Schema, Session, Time, Universal } from 'koishi'
import { DataService } from '@koishijs/console'
import { resolve } from 'path'

Expand Down Expand Up @@ -54,7 +54,7 @@ class Analytics extends DataService<Analytics.Payload> {
hour: 'integer',
name: 'string',
selfId: 'string',
userId: 'string',
userId: 'integer',
channelId: 'string',
platform: 'string',
count: 'integer',
Expand Down Expand Up @@ -111,8 +111,8 @@ class Analytics extends DataService<Analytics.Payload> {
}
}

private addAudit<T extends Analytics.Message | Analytics.Command>(buffer: T[], index: Omit<T, 'count'>) {
const audit = buffer.find(data => deepEqual(data, index))
private addAudit<T extends Analytics.Audit>(buffer: T[], index: Omit<T, 'count'>) {
const audit = buffer.find(data => deepEqual(pick(data, Object.keys(index) as (keyof T)[]), index))
if (audit) {
audit.count += 1
} else {
Expand Down Expand Up @@ -182,9 +182,13 @@ class Analytics extends DataService<Analytics.Payload> {
count: row => $.sum(row.count),
})
.execute()
const result = {} as Dict<Dict<MessageStats>>
const result = {} as Dict<Dict<MessageStats & Universal.User>>
data.forEach((stat) => {
const entry = (result[stat.platform] ||= {})[stat.selfId] ||= { send: 0, receive: 0 }
const entry = (result[stat.platform] ||= {})[stat.selfId] ||= {
...this.ctx.bots[`${stat.platform}:${stat.selfId}`]?.user,
send: 0,
receive: 0,
}
entry[stat.type] = stat.count / 7
})
return result
Expand Down Expand Up @@ -296,7 +300,7 @@ namespace Analytics {

export interface Command extends Index {
name: string
userId: string
userId: number
channelId: string
count: number
}
Expand All @@ -308,7 +312,7 @@ namespace Analytics {
guildIncrement: number
dauHistory: Dict<number>
commandRate: Dict<number>
messageByBot: Dict<Dict<MessageStats>>
messageByBot: Dict<Dict<MessageStats & Universal.User>>
messageByDate: Dict<MessageStats>
messageByHour: MessageStats[]
}
Expand Down

0 comments on commit 1fd4481

Please sign in to comment.