diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2022-03-12 19:35:17 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2022-03-12 19:35:17 +0900 |
| commit | 2cd2d6522e096bfbca244010e30241828d13a3cb (patch) | |
| tree | cf1ba72fdf0bce3ee1b2753c90c9705e36ab3cc6 /packages | |
| parent | Merge branch 'develop' (diff) | |
| parent | 12.108.1 (diff) | |
| download | misskey-2cd2d6522e096bfbca244010e30241828d13a3cb.tar.gz misskey-2cd2d6522e096bfbca244010e30241828d13a3cb.tar.bz2 misskey-2cd2d6522e096bfbca244010e30241828d13a3cb.zip | |
Merge branch 'develop'
Diffstat (limited to 'packages')
| -rw-r--r-- | packages/backend/package.json | 2 | ||||
| -rw-r--r-- | packages/backend/src/misc/download-url.ts | 2 | ||||
| -rw-r--r-- | packages/backend/src/remote/activitypub/misc/ld-signature.ts | 2 | ||||
| -rw-r--r-- | packages/backend/src/server/api/define.ts | 2 | ||||
| -rw-r--r-- | packages/backend/src/server/file/send-drive-file.ts | 2 | ||||
| -rw-r--r-- | packages/backend/yarn.lock | 8 | ||||
| -rw-r--r-- | packages/client/src/components/chart.vue | 47 | ||||
| -rw-r--r-- | packages/client/src/pages/user/index.activity.vue | 31 |
8 files changed, 80 insertions, 16 deletions
diff --git a/packages/backend/package.json b/packages/backend/package.json index f775a99a55..87712faf7c 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -19,7 +19,7 @@ "@elastic/elasticsearch": "7.11.0", "@koa/cors": "3.1.0", "@koa/multer": "3.0.0", - "@koa/router": "10.1.1", + "@koa/router": "9.0.1", "@sinonjs/fake-timers": "9.1.1", "@syuilo/aiscript": "0.11.1", "@types/bcryptjs": "2.4.2", diff --git a/packages/backend/src/misc/download-url.ts b/packages/backend/src/misc/download-url.ts index 21eee57b33..7c57b140ef 100644 --- a/packages/backend/src/misc/download-url.ts +++ b/packages/backend/src/misc/download-url.ts @@ -6,7 +6,7 @@ import { httpAgent, httpsAgent, StatusError } from './fetch.js'; import config from '@/config/index.js'; import chalk from 'chalk'; import Logger from '@/services/logger.js'; -import * as IPCIDR from 'ip-cidr'; +import IPCIDR from 'ip-cidr'; import PrivateIp from 'private-ip'; const pipeline = util.promisify(stream.pipeline); diff --git a/packages/backend/src/remote/activitypub/misc/ld-signature.ts b/packages/backend/src/remote/activitypub/misc/ld-signature.ts index 34294c935d..5132c6ef96 100644 --- a/packages/backend/src/remote/activitypub/misc/ld-signature.ts +++ b/packages/backend/src/remote/activitypub/misc/ld-signature.ts @@ -1,5 +1,5 @@ import * as crypto from 'node:crypto'; -import * as jsonld from 'jsonld'; +import jsonld from 'jsonld'; import { CONTEXTS } from './contexts.js'; import fetch from 'node-fetch'; import { httpAgent, httpsAgent } from '@/misc/fetch.js'; diff --git a/packages/backend/src/server/api/define.ts b/packages/backend/src/server/api/define.ts index 9094fcffc6..4e6d041a29 100644 --- a/packages/backend/src/server/api/define.ts +++ b/packages/backend/src/server/api/define.ts @@ -31,7 +31,7 @@ const ajv = new Ajv({ useDefaults: true, }); -ajv.addFormat('misskey:id', /^[a-z0-9]+$/); +ajv.addFormat('misskey:id', /^[a-zA-Z0-9]+$/); export default function <T extends IEndpointMeta, Ps extends Schema>(meta: T, paramDef: Ps, cb: executor<T, Ps>) : (params: any, user: T['requireCredential'] extends true ? SimpleUserInfo : SimpleUserInfo | null, token: AccessToken | null, file?: any) => Promise<any> { diff --git a/packages/backend/src/server/file/send-drive-file.ts b/packages/backend/src/server/file/send-drive-file.ts index 4e2bba0e20..6bc220b362 100644 --- a/packages/backend/src/server/file/send-drive-file.ts +++ b/packages/backend/src/server/file/send-drive-file.ts @@ -2,7 +2,7 @@ import * as fs from 'node:fs'; import { fileURLToPath } from 'node:url'; import { dirname } from 'node:path'; import Koa from 'koa'; -import * as send from 'koa-send'; +import send from 'koa-send'; import rename from 'rename'; import * as tmp from 'tmp'; import { serverLogger } from '../index.js'; diff --git a/packages/backend/yarn.lock b/packages/backend/yarn.lock index c5b1237721..67a02742d4 100644 --- a/packages/backend/yarn.lock +++ b/packages/backend/yarn.lock @@ -128,10 +128,10 @@ resolved "https://registry.yarnpkg.com/@koa/multer/-/multer-3.0.0.tgz#439777949f28097d7b329c0b4ce3048074c862f8" integrity sha512-y+OQBmex5D1jIl723gAEUYcAWPEicIXppaAKw/zCMfpllQ08ZNweDPwoCLxEoatqd5pCu2XG6V8dl67JRq3RJw== -"@koa/router@10.1.1": - version "10.1.1" - resolved "https://registry.yarnpkg.com/@koa/router/-/router-10.1.1.tgz#8e5a85c9b243e0bc776802c0de564561e57a5f78" - integrity sha512-ORNjq5z4EmQPriKbR0ER3k4Gh7YGNhWDL7JBW+8wXDrHLbWYKYSJaOJ9aN06npF5tbTxe2JBOsurpJDAvjiXKw== +"@koa/router@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@koa/router/-/router-9.0.1.tgz#4090a14223ea7e78aa13b632761209cba69acd95" + integrity sha512-OI+OU49CJV4px0WkIMmayBeqVXB/JS1ZMq7UoGlTZt6Y7ijK7kdeQ18+SEHHJPytmtI1y6Hf8XLrpxva3mhv5Q== dependencies: debug "^4.1.1" http-errors "^1.7.3" diff --git a/packages/client/src/components/chart.vue b/packages/client/src/components/chart.vue index 13ca60efa8..cc1aa9c20a 100644 --- a/packages/client/src/components/chart.vue +++ b/packages/client/src/components/chart.vue @@ -71,7 +71,7 @@ const colors = { purple: '#e300db', orange: '#fe6919', lime: '#bde800', - cyan: '#00efef', + cyan: '#00e0e0', }; const colorSets = [colors.blue, colors.green, colors.yellow, colors.red, colors.purple]; const getColor = (i) => { @@ -127,7 +127,7 @@ export default defineComponent({ name: string; type: 'line' | 'area'; color?: string; - borderDash?: number[]; + dashed?: boolean; hidden?: boolean; data: { x: number; @@ -217,7 +217,7 @@ export default defineComponent({ pointRadius: 0, borderWidth: props.bar ? 0 : 2, borderColor: x.color ? x.color : getColor(i), - borderDash: x.borderDash || [], + borderDash: x.dashed ? [5, 5] : [], borderJoinStyle: 'round', borderRadius: props.bar ? 3 : undefined, backgroundColor: props.bar ? (x.color ? x.color : getColor(i)) : alpha(x.color ? x.color : getColor(i), 0.1), @@ -226,7 +226,7 @@ export default defineComponent({ axis: 'y', colors: { 0: alpha(x.color ? x.color : getColor(i), 0), - [maxes[i]]: alpha(x.color ? x.color : getColor(i), 0.175), + [maxes[i]]: alpha(x.color ? x.color : getColor(i), 0.2), }, }, }, @@ -403,16 +403,19 @@ export default defineComponent({ name: 'Pub & Sub', type: 'line', data: format(raw.pubsub), + dashed: true, color: colors.cyan, }, { name: 'Pub', type: 'line', data: format(raw.pub), + dashed: true, color: colors.purple, }, { name: 'Sub', type: 'line', data: format(raw.sub), + dashed: true, color: colors.orange, }], }; @@ -593,7 +596,7 @@ export default defineComponent({ series: [{ name: 'All', type: 'line', - borderDash: [5, 5], + dashed: true, data: format( sum( raw.local.incSize, @@ -628,7 +631,7 @@ export default defineComponent({ series: [{ name: 'All', type: 'line', - borderDash: [5, 5], + dashed: true, data: format( sum( raw.local.incCount, @@ -795,6 +798,36 @@ export default defineComponent({ }; }; + const fetchPerUserFollowingChart = async (): Promise<typeof data> => { + const raw = await os.api('charts/user/following', { userId: props.args.user.id, limit: props.limit, span: props.span }); + return { + series: [{ + name: 'Local', + type: 'area', + data: format(raw.local.followings.total), + }, { + name: 'Remote', + type: 'area', + data: format(raw.remote.followings.total), + }], + }; + }; + + const fetchPerUserFollowersChart = async (): Promise<typeof data> => { + const raw = await os.api('charts/user/following', { userId: props.args.user.id, limit: props.limit, span: props.span }); + return { + series: [{ + name: 'Local', + type: 'area', + data: format(raw.local.followers.total), + }, { + name: 'Remote', + type: 'area', + data: format(raw.remote.followers.total), + }], + }; + }; + const fetchPerUserDriveChart = async (): Promise<typeof data> => { const raw = await os.api('charts/user/drive', { userId: props.args.user.id, limit: props.limit, span: props.span }); return { @@ -838,6 +871,8 @@ export default defineComponent({ case 'instance-drive-files-total': return fetchInstanceDriveFilesChart(true); case 'per-user-notes': return fetchPerUserNotesChart(); + case 'per-user-following': return fetchPerUserFollowingChart(); + case 'per-user-followers': return fetchPerUserFollowersChart(); case 'per-user-drive': return fetchPerUserDriveChart(); } }; diff --git a/packages/client/src/pages/user/index.activity.vue b/packages/client/src/pages/user/index.activity.vue index f64e9d5b60..aecd25d6b0 100644 --- a/packages/client/src/pages/user/index.activity.vue +++ b/packages/client/src/pages/user/index.activity.vue @@ -1,9 +1,14 @@ <template> <MkContainer> <template #header><i class="fas fa-chart-bar" style="margin-right: 0.5em;"></i>{{ $ts.activity }}</template> + <template #func> + <button class="_button" @click="showMenu"> + <i class="fas fa-ellipsis-h"></i> + </button> + </template> <div style="padding: 8px;"> - <MkChart src="per-user-notes" :args="{ user, withoutAll: true }" span="day" :limit="limit" :bar="true" :stacked="true" :detailed="false" :aspect-ratio="5"/> + <MkChart :src="chartSrc" :args="{ user, withoutAll: true }" span="day" :limit="limit" :bar="true" :stacked="true" :detailed="false" :aspect-ratio="5"/> </div> </MkContainer> </template> @@ -13,6 +18,8 @@ import { } from 'vue'; import * as misskey from 'misskey-js'; import MkContainer from '@/components/ui/container.vue'; import MkChart from '@/components/chart.vue'; +import * as os from '@/os'; +import { i18n } from '@/i18n'; const props = withDefaults(defineProps<{ user: misskey.entities.User; @@ -20,4 +27,26 @@ const props = withDefaults(defineProps<{ }>(), { limit: 50, }); + +let chartSrc = $ref('per-user-notes'); + +function showMenu(ev: MouseEvent) { + os.popupMenu([{ + text: i18n.ts.notes, + active: true, + action: () => { + chartSrc = 'per-user-notes'; + } + }/*, { + text: i18n.ts.following, + action: () => { + chartSrc = 'per-user-following'; + } + }, { + text: i18n.ts.followers, + action: () => { + chartSrc = 'per-user-followers'; + } + }*/], ev.currentTarget ?? ev.target); +} </script> |