Merge branch 'develop'
This commit is contained in:
		
						commit
						2cd2d6522e
					
				
					 29 changed files with 108 additions and 18 deletions
				
			
		|  | @ -10,6 +10,14 @@ | |||
| You should also include the user name that made the change. | ||||
| --> | ||||
| 
 | ||||
| ## 12.108.1 (2022/03/12) | ||||
| 
 | ||||
| ### Bugfixes | ||||
| - リレーが動作しない問題を修正 @xianonn | ||||
| - ulidを使用していると動作しない問題を修正 @syuilo | ||||
| - 外部からOGPが正しく取得できない問題を修正 @syuilo | ||||
| - instance can not get the files from other instance when there are items in allowedPrivateNetworks in .config/default.yml @ybw2016v | ||||
| 
 | ||||
| ## 12.108.0 (2022/03/09) | ||||
| 
 | ||||
| ### NOTE | ||||
|  |  | |||
|  | @ -12,6 +12,7 @@ gotIt: "Ho he entès!" | |||
| cancel: "Cancel·lar" | ||||
| smtpUser: "Nom d'usuari" | ||||
| smtpPass: "Contrasenya" | ||||
| searchByGoogle: "Cercar" | ||||
| _mfm: | ||||
|   search: "Cercar" | ||||
| _sfx: | ||||
|  |  | |||
|  | @ -449,6 +449,7 @@ clearCache: "Vyprázdnit mezipaměť" | |||
| info: "Informace" | ||||
| user: "Uživatelé" | ||||
| administration: "Administrace" | ||||
| searchByGoogle: "Vyhledávání" | ||||
| _email: | ||||
|   _follow: | ||||
|     title: "Máte nového následovníka" | ||||
|  |  | |||
|  | @ -762,6 +762,7 @@ muteThread: "Ocultar hilo" | |||
| unmuteThread: "Mostrar hilo" | ||||
| ffVisibility: "Visibilidad de seguidores y seguidos" | ||||
| hide: "Ocultar" | ||||
| searchByGoogle: "Buscar" | ||||
| indefinitely: "Sin límite de tiempo" | ||||
| _ffVisibility: | ||||
|   public: "Publicar" | ||||
|  |  | |||
|  | @ -825,6 +825,7 @@ overridedDeviceKind: "Tipe perangkat" | |||
| smartphone: "Ponsel" | ||||
| tablet: "Tablet" | ||||
| auto: "Otomatis" | ||||
| searchByGoogle: "Penelusuran" | ||||
| indefinitely: "Selamanya" | ||||
| _emailUnavailable: | ||||
|   used: "Alamat surel ini telah digunakan" | ||||
|  |  | |||
|  | @ -802,6 +802,7 @@ leaveGroupConfirm: "Uscire da「{name}」?" | |||
| useDrawerReactionPickerForMobile: "Mostra sul drawer da dispositivo mobile" | ||||
| welcomeBackWithName: "Bentornato/a, {name}" | ||||
| clickToFinishEmailVerification: "Fai click su [{ok}] per completare la verifica dell'indirizzo email." | ||||
| searchByGoogle: "Cerca" | ||||
| indefinitely: "Non scade" | ||||
| _emailUnavailable: | ||||
|   used: "Email già in uso" | ||||
|  |  | |||
|  | @ -830,7 +830,7 @@ auto: "自動" | |||
| themeColor: "テーマカラー" | ||||
| size: "サイズ" | ||||
| numberOfColumn: "列の数" | ||||
| searchByGoogle: "ググる" | ||||
| searchByGoogle: "検索" | ||||
| instanceDefaultLightTheme: "インスタンスデフォルトのライトテーマ" | ||||
| instanceDefaultDarkTheme: "インスタンスデフォルトのダークテーマ" | ||||
| instanceDefaultThemeDescription: "オブジェクト形式のテーマコードを記入します。" | ||||
|  |  | |||
|  | @ -655,6 +655,7 @@ global: "グローバル" | |||
| sent: "送信" | ||||
| hashtags: "ハッシュタグ" | ||||
| hide: "隠す" | ||||
| searchByGoogle: "探す" | ||||
| indefinitely: "無期限" | ||||
| _ad: | ||||
|   back: "戻る" | ||||
|  |  | |||
|  | @ -55,6 +55,7 @@ accountInfo: "Talɣut n umiḍan" | |||
| emailNotification: "Ilɣa imayl" | ||||
| selectAccount: "Fren amiḍan" | ||||
| accounts: "Imiḍan" | ||||
| searchByGoogle: "Nadi" | ||||
| _email: | ||||
|   _follow: | ||||
|     title: "Yeṭṭafaṛ-ik·em-id" | ||||
|  |  | |||
|  | @ -59,6 +59,7 @@ remove: "ಅಳಿಸು" | |||
| smtpUser: "ಬಳಕೆಹೆಸರು" | ||||
| smtpPass: "ಗುಪ್ತಪದ" | ||||
| user: "ಬಳಕೆದಾರ" | ||||
| searchByGoogle: "ಹುಡುಕು" | ||||
| _email: | ||||
|   _follow: | ||||
|     title: "ಹಿಂಬಾಲಿಸಿದರು" | ||||
|  |  | |||
|  | @ -825,6 +825,7 @@ overridedDeviceKind: "장치 유형" | |||
| smartphone: "스마트폰" | ||||
| tablet: "태블릿" | ||||
| auto: "자동" | ||||
| searchByGoogle: "검색" | ||||
| indefinitely: "무기한" | ||||
| _emailUnavailable: | ||||
|   used: "이 메일 주소는 사용중입니다" | ||||
|  |  | |||
|  | @ -256,6 +256,7 @@ user: "Gebruikers" | |||
| muteThread: "Discussies dempen " | ||||
| unmuteThread: "Dempen van discussie ongedaan maken" | ||||
| hide: "Verbergen" | ||||
| searchByGoogle: "Zoeken" | ||||
| _email: | ||||
|   _follow: | ||||
|     title: "volgde jou" | ||||
|  |  | |||
|  | @ -758,6 +758,7 @@ received: "Otrzymane" | |||
| hashtags: "Hashtag" | ||||
| pubSub: "Konta Pub/Sub" | ||||
| hide: "Ukryj" | ||||
| searchByGoogle: "Szukaj" | ||||
| indefinitely: "Nigdy" | ||||
| _ffVisibility: | ||||
|   public: "Publikuj" | ||||
|  |  | |||
|  | @ -61,6 +61,7 @@ pinnedNotes: "Post fixado" | |||
| smtpUser: "Nome de usuário" | ||||
| smtpPass: "Senha" | ||||
| user: "Usuários" | ||||
| searchByGoogle: "Pesquisar" | ||||
| _email: | ||||
|   _follow: | ||||
|     title: "Você tem um novo seguidor" | ||||
|  |  | |||
|  | @ -477,6 +477,7 @@ smtpPass: "Parolă" | |||
| clearCache: "Golește cache-ul" | ||||
| info: "Despre" | ||||
| user: "Utilizatori" | ||||
| searchByGoogle: "Caută" | ||||
| _email: | ||||
|   _follow: | ||||
|     title: "te-a urmărit" | ||||
|  |  | |||
|  | @ -815,6 +815,7 @@ leaveGroupConfirm: "Покинуть группу «{name}»?" | |||
| useDrawerReactionPickerForMobile: "Выдвижная палитра на мобильном устройстве" | ||||
| welcomeBackWithName: "С возвращением, {name}!" | ||||
| clickToFinishEmailVerification: "Пожалуйста, нажмите [{ok}], чтобы завершить подтверждение адреса электронной почты." | ||||
| searchByGoogle: "Поиск" | ||||
| indefinitely: "вечно" | ||||
| _emailUnavailable: | ||||
|   used: "Уже используется" | ||||
|  |  | |||
|  | @ -47,6 +47,7 @@ remove: "Sil" | |||
| smtpUser: "Kullanıcı Adı" | ||||
| smtpPass: "Şifre" | ||||
| user: "Kullanıcı" | ||||
| searchByGoogle: "Arama" | ||||
| _mfm: | ||||
|   search: "Arama" | ||||
| _sfx: | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| --- | ||||
| _lang_: "ياپونچە" | ||||
| search: "ئىزدەش" | ||||
| searchByGoogle: "ئىزدەش" | ||||
| _mfm: | ||||
|   search: "ئىزدەش" | ||||
|  |  | |||
|  | @ -685,6 +685,7 @@ global: "Глобальна" | |||
| sent: "Відправити" | ||||
| hashtags: "Хештеґ" | ||||
| hide: "Сховати" | ||||
| searchByGoogle: "Пошук" | ||||
| indefinitely: "Ніколи" | ||||
| _ad: | ||||
|   back: "Назад" | ||||
|  |  | |||
|  | @ -747,6 +747,7 @@ global: "公開" | |||
| sent: "發送" | ||||
| hashtags: "#tag" | ||||
| hide: "隱藏" | ||||
| searchByGoogle: "搜尋" | ||||
| indefinitely: "無期限" | ||||
| _ffVisibility: | ||||
|   public: "發佈" | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
| 	"name": "misskey", | ||||
| 	"version": "12.108.0", | ||||
| 	"version": "12.108.1", | ||||
| 	"codename": "indigo", | ||||
| 	"repository": { | ||||
| 		"type": "git", | ||||
|  |  | |||
|  | @ -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", | ||||
|  |  | |||
|  | @ -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); | ||||
|  |  | |||
|  | @ -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'; | ||||
|  |  | |||
|  | @ -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> { | ||||
|  |  | |||
|  | @ -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'; | ||||
|  |  | |||
|  | @ -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" | ||||
|  |  | |||
|  | @ -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(); | ||||
| 				} | ||||
| 			}; | ||||
|  |  | |||
|  | @ -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> | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue