Merge pull request MisskeyIO#376 from hotfix
This commit is contained in:
		| @@ -1,6 +1,6 @@ | ||||
| { | ||||
| 	"name": "misskey", | ||||
| 	"version": "2024.1.0-io", | ||||
| 	"version": "2024.1.0-io.1", | ||||
| 	"codename": "nasubi", | ||||
| 	"repository": { | ||||
| 		"type": "git", | ||||
|   | ||||
| @@ -40,6 +40,14 @@ class AntennaChannel extends Channel { | ||||
| 		if (data.type === 'note') { | ||||
| 			const note = await this.noteEntityService.pack(data.body.id, this.user, { detail: true }); | ||||
|  | ||||
| 			if (note.reply) { | ||||
| 				const reply = note.reply; | ||||
| 				// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く | ||||
| 				if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return; | ||||
| 				// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く | ||||
| 				if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return; | ||||
| 			} | ||||
|  | ||||
| 			// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する | ||||
| 			if (isUserRelated(note, this.userIdsWhoMeMuting)) return; | ||||
| 			// 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する | ||||
|   | ||||
| @@ -38,6 +38,14 @@ class ChannelChannel extends Channel { | ||||
| 	private async onNote(note: Packed<'Note'>) { | ||||
| 		if (note.channelId !== this.channelId) return; | ||||
|  | ||||
| 		if (note.reply) { | ||||
| 			const reply = note.reply; | ||||
| 			// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く | ||||
| 			if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return; | ||||
| 			// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く | ||||
| 			if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return; | ||||
| 		} | ||||
|  | ||||
| 		// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する | ||||
| 		if (isUserRelated(note, this.userIdsWhoMeMuting)) return; | ||||
| 		// 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する | ||||
|   | ||||
| @@ -19,6 +19,7 @@ class GlobalTimelineChannel extends Channel { | ||||
| 	public static shouldShare = false; | ||||
| 	public static requireCredential = false as const; | ||||
| 	private withRenotes: boolean; | ||||
| 	private withReplies: boolean; | ||||
| 	private withFiles: boolean; | ||||
|  | ||||
| 	constructor( | ||||
| @@ -39,6 +40,7 @@ class GlobalTimelineChannel extends Channel { | ||||
| 		if (!policies.gtlAvailable) return; | ||||
|  | ||||
| 		this.withRenotes = params.withRenotes ?? true; | ||||
| 		this.withReplies = params.withReplies ?? false; | ||||
| 		this.withFiles = params.withFiles ?? false; | ||||
|  | ||||
| 		// Subscribe events | ||||
| @@ -56,10 +58,17 @@ class GlobalTimelineChannel extends Channel { | ||||
| 		if (this.withFiles && (note.files === undefined || note.files.length === 0)) return; | ||||
|  | ||||
| 		// 関係ない返信は除外 | ||||
| 		if (note.reply && !this.following[note.userId]?.withReplies) { | ||||
| 		if (note.reply) { | ||||
| 			const reply = note.reply; | ||||
| 			// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合 | ||||
| 			if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; | ||||
| 			if ((this.following[note.userId]?.withReplies ?? false) || this.withReplies) { | ||||
| 				// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く | ||||
| 				if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return; | ||||
| 				// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く | ||||
| 				if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return; | ||||
| 			} else { | ||||
| 				// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合 | ||||
| 				if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (note.renote && note.text == null && (note.fileIds == null || note.fileIds.length === 0) && !this.withRenotes) return; | ||||
|   | ||||
| @@ -43,6 +43,14 @@ class HashtagChannel extends Channel { | ||||
| 		const matched = this.q.some(tags => tags.every(tag => noteTags.includes(normalizeForSearch(tag)))); | ||||
| 		if (!matched) return; | ||||
|  | ||||
| 		if (note.reply) { | ||||
| 			const reply = note.reply; | ||||
| 			// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く | ||||
| 			if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return; | ||||
| 			// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く | ||||
| 			if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return; | ||||
| 		} | ||||
|  | ||||
| 		// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する | ||||
| 		if (isUserRelated(note, this.userIdsWhoMeMuting)) return; | ||||
| 		// 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する | ||||
|   | ||||
| @@ -68,6 +68,8 @@ class HomeTimelineChannel extends Channel { | ||||
| 			if (this.following[note.userId]?.withReplies) { | ||||
| 				// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く | ||||
| 				if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return; | ||||
| 				// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く | ||||
| 				if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return; | ||||
| 			} else { | ||||
| 				// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合 | ||||
| 				if (reply.userId !== this.user!.id && !isMe && reply.userId !== note.userId) return; | ||||
|   | ||||
| @@ -82,6 +82,8 @@ class HybridTimelineChannel extends Channel { | ||||
| 			if ((this.following[note.userId]?.withReplies ?? false) || this.withReplies) { | ||||
| 				// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く | ||||
| 				if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return; | ||||
| 				// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く | ||||
| 				if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return; | ||||
| 			} else { | ||||
| 				// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合 | ||||
| 				if (reply.userId !== this.user!.id && !isMe && reply.userId !== note.userId) return; | ||||
|   | ||||
| @@ -58,10 +58,17 @@ class LocalTimelineChannel extends Channel { | ||||
| 		if (this.withFiles && (note.files === undefined || note.files.length === 0)) return; | ||||
|  | ||||
| 		// 関係ない返信は除外 | ||||
| 		if (note.reply && this.user && !this.following[note.userId]?.withReplies && !this.withReplies) { | ||||
| 		if (note.reply) { | ||||
| 			const reply = note.reply; | ||||
| 			// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合 | ||||
| 			if (reply.userId !== this.user.id && note.userId !== this.user.id && reply.userId !== note.userId) return; | ||||
| 			if ((this.following[note.userId]?.withReplies ?? false) || this.withReplies) { | ||||
| 				// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く | ||||
| 				if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return; | ||||
| 				// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く | ||||
| 				if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return; | ||||
| 			} else { | ||||
| 				// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合 | ||||
| 				if (reply.userId !== this.user!.id && note.userId !== this.user!.id && reply.userId !== note.userId) return; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if (note.renote && note.text == null && (note.fileIds == null || note.fileIds.length === 0) && !this.withRenotes) return; | ||||
|   | ||||
| @@ -46,6 +46,14 @@ class RoleTimelineChannel extends Channel { | ||||
| 			} | ||||
| 			if (note.visibility !== 'public') return; | ||||
|  | ||||
| 			if (note.reply) { | ||||
| 				const reply = note.reply; | ||||
| 				// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く | ||||
| 				if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return; | ||||
| 				// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く | ||||
| 				if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return; | ||||
| 			} | ||||
|  | ||||
| 			// 流れてきたNoteがミュートしているユーザーが関わるものだったら無視する | ||||
| 			if (isUserRelated(note, this.userIdsWhoMeMuting)) return; | ||||
| 			// 流れてきたNoteがブロックされているユーザーが関わるものだったら無視する | ||||
|   | ||||
| @@ -100,6 +100,8 @@ class UserListChannel extends Channel { | ||||
| 			if (this.membershipsMap[note.userId]?.withReplies) { | ||||
| 				// 自分のフォローしていないユーザーの visibility: followers な投稿への返信は弾く | ||||
| 				if (reply.visibility === 'followers' && !Object.hasOwn(this.following, reply.userId)) return; | ||||
| 				// 自分の見ることができないユーザーの visibility: specified な投稿への返信は弾く | ||||
| 				if (reply.visibility === 'specified' && !reply.visibleUserIds!.includes(this.user!.id)) return; | ||||
| 			} else { | ||||
| 				// 「チャンネル接続主への返信」でもなければ、「チャンネル接続主が行った返信」でもなければ、「投稿者の投稿者自身への返信」でもない場合 | ||||
| 				if (reply.userId !== this.user!.id && !isMe && reply.userId !== note.userId) return; | ||||
|   | ||||
| @@ -44,7 +44,6 @@ | ||||
| 		"compare-versions": "6.1.0", | ||||
| 		"cropperjs": "2.0.0-beta.4", | ||||
| 		"date-fns": "2.30.0", | ||||
| 		"defu": "^6.1.4", | ||||
| 		"escape-regexp": "0.0.1", | ||||
| 		"estree-walker": "3.0.3", | ||||
| 		"eventemitter3": "5.0.1", | ||||
| @@ -52,6 +51,7 @@ | ||||
| 		"insert-text-at-cursor": "0.3.0", | ||||
| 		"is-file-animated": "1.0.2", | ||||
| 		"json5": "2.2.3", | ||||
| 		"lodash.defaultsdeep": "4.6.1", | ||||
| 		"matter-js": "0.19.0", | ||||
| 		"mfm-js": "0.24.0", | ||||
| 		"misskey-bubble-game": "workspace:*", | ||||
| @@ -101,6 +101,7 @@ | ||||
| 		"@testing-library/vue": "8.0.1", | ||||
| 		"@types/escape-regexp": "0.0.3", | ||||
| 		"@types/estree": "1.0.5", | ||||
| 		"@types/lodash.defaultsdeep": "4.6.9", | ||||
| 		"@types/matter-js": "0.19.6", | ||||
| 		"@types/micromatch": "4.0.6", | ||||
| 		"@types/node": "20.11.5", | ||||
|   | ||||
| @@ -7,7 +7,7 @@ | ||||
|  | ||||
| import { onUnmounted, Ref, ref, watch } from 'vue'; | ||||
| import { BroadcastChannel } from 'broadcast-channel'; | ||||
| import { defu } from 'defu'; | ||||
| import defaultsDeep from 'lodash.defaultsdeep'; | ||||
| import { $i } from '@/account.js'; | ||||
| import { misskeyApi } from '@/scripts/misskey-api.js'; | ||||
| import { get, set } from '@/scripts/idb-proxy.js'; | ||||
| @@ -81,18 +81,6 @@ export class Storage<T extends StateDef> { | ||||
| 		this.loaded = this.ready.then(() => this.load()); | ||||
| 	} | ||||
|  | ||||
| 	private isPureObject(value: unknown): value is Record<string, unknown> { | ||||
| 		return typeof value === 'object' && value !== null && !Array.isArray(value); | ||||
| 	} | ||||
|  | ||||
| 	private mergeState<T>(value: T, def: T): T { | ||||
| 		if (this.isPureObject(value) && this.isPureObject(def)) { | ||||
| 			if (_DEV_) console.log('Merging state. Incoming: ', value, ' Default: ', def); | ||||
| 			return defu(value, def) as T; | ||||
| 		} | ||||
| 		return value; | ||||
| 	} | ||||
|  | ||||
| 	private async init(): Promise<void> { | ||||
| 		await this.migrate(); | ||||
|  | ||||
| @@ -102,11 +90,11 @@ export class Storage<T extends StateDef> { | ||||
|  | ||||
| 		for (const [k, v] of Object.entries(this.def) as [keyof T, T[keyof T]['default']][]) { | ||||
| 			if (v.where === 'device' && Object.prototype.hasOwnProperty.call(deviceState, k)) { | ||||
| 				this.reactiveState[k].value = this.state[k] = this.mergeState<T[keyof T]['default']>(deviceState[k], v.default); | ||||
| 				this.reactiveState[k].value = this.state[k] = defaultsDeep(deviceState[k], v.default); | ||||
| 			} else if (v.where === 'account' && $i && Object.prototype.hasOwnProperty.call(registryCache, k)) { | ||||
| 				this.reactiveState[k].value = this.state[k] = this.mergeState<T[keyof T]['default']>(registryCache[k], v.default); | ||||
| 				this.reactiveState[k].value = this.state[k] = defaultsDeep(registryCache[k], v.default); | ||||
| 			} else if (v.where === 'deviceAccount' && Object.prototype.hasOwnProperty.call(deviceAccountState, k)) { | ||||
| 				this.reactiveState[k].value = this.state[k] = this.mergeState<T[keyof T]['default']>(deviceAccountState[k], v.default); | ||||
| 				this.reactiveState[k].value = this.state[k] = defaultsDeep(deviceAccountState[k], v.default); | ||||
| 			} else { | ||||
| 				this.reactiveState[k].value = this.state[k] = v.default; | ||||
| 				if (_DEV_) console.log('Use default value', k, v.default); | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| { | ||||
| 	"type": "module", | ||||
| 	"name": "misskey-js", | ||||
| 	"version": "2024.1.0-io", | ||||
| 	"version": "2024.1.0-io.1", | ||||
| 	"description": "Misskey SDK for JavaScript", | ||||
| 	"types": "./built/dts/index.d.ts", | ||||
| 	"exports": { | ||||
|   | ||||
							
								
								
									
										20
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										20
									
								
								pnpm-lock.yaml
									
									
									
										generated
									
									
									
								
							| @@ -746,9 +746,6 @@ importers: | ||||
|       date-fns: | ||||
|         specifier: 2.30.0 | ||||
|         version: 2.30.0 | ||||
|       defu: | ||||
|         specifier: ^6.1.4 | ||||
|         version: 6.1.4 | ||||
|       escape-regexp: | ||||
|         specifier: 0.0.1 | ||||
|         version: 0.0.1 | ||||
| @@ -770,6 +767,9 @@ importers: | ||||
|       json5: | ||||
|         specifier: 2.2.3 | ||||
|         version: 2.2.3 | ||||
|       lodash.defaultsdeep: | ||||
|         specifier: 4.6.1 | ||||
|         version: 4.6.1 | ||||
|       matter-js: | ||||
|         specifier: 0.19.0 | ||||
|         version: 0.19.0 | ||||
| @@ -912,6 +912,9 @@ importers: | ||||
|       '@types/estree': | ||||
|         specifier: 1.0.5 | ||||
|         version: 1.0.5 | ||||
|       '@types/lodash.defaultsdeep': | ||||
|         specifier: 4.6.9 | ||||
|         version: 4.6.9 | ||||
|       '@types/matter-js': | ||||
|         specifier: 0.19.6 | ||||
|         version: 0.19.6 | ||||
| @@ -7813,6 +7816,12 @@ packages: | ||||
|       '@types/node': 20.11.5 | ||||
|     dev: false | ||||
|  | ||||
|   /@types/lodash.defaultsdeep@4.6.9: | ||||
|     resolution: {integrity: sha512-pLtCFK0YkHfGtGLYLNMTbFB5/G5+RsmQCIbbHH8GOAXjv+gDkVilY98kILfe8JH2Kev0OCReYxp1AjxEjP8ixA==} | ||||
|     dependencies: | ||||
|       '@types/lodash': 4.14.202 | ||||
|     dev: true | ||||
|  | ||||
|   /@types/lodash@4.14.202: | ||||
|     resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} | ||||
|     dev: true | ||||
| @@ -10589,6 +10598,7 @@ packages: | ||||
|  | ||||
|   /defu@6.1.4: | ||||
|     resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} | ||||
|     dev: true | ||||
|  | ||||
|   /del@6.1.1: | ||||
|     resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} | ||||
| @@ -14155,6 +14165,10 @@ packages: | ||||
|     resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} | ||||
|     dev: false | ||||
|  | ||||
|   /lodash.defaultsdeep@4.6.1: | ||||
|     resolution: {integrity: sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==} | ||||
|     dev: false | ||||
|  | ||||
|   /lodash.get@4.4.2: | ||||
|     resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} | ||||
|     dev: true | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 まっちゃとーにゅ
					まっちゃとーにゅ