From 12932d2831213bb2a60949f8d388fc2f6bd64ba3 Mon Sep 17 00:00:00 2001 From: tamaina Date: Tue, 28 Feb 2023 17:14:23 +0900 Subject: fix: 外部メディアプロキシ使用時にアバタークロップができない問題を修正 (#10142) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * wip * fix * Update packages/frontend/src/scripts/media-proxy.ts Co-authored-by: syuilo --------- Co-authored-by: syuilo --- packages/frontend/src/scripts/media-proxy.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) (limited to 'packages/frontend/src/scripts') diff --git a/packages/frontend/src/scripts/media-proxy.ts b/packages/frontend/src/scripts/media-proxy.ts index 274e96e0a1..2fe5bdcf8f 100644 --- a/packages/frontend/src/scripts/media-proxy.ts +++ b/packages/frontend/src/scripts/media-proxy.ts @@ -1,20 +1,20 @@ -import { query, appendQuery } from '@/scripts/url'; +import { query } from '@/scripts/url'; import { url } from '@/config'; import { instance } from '@/instance'; -export function getProxiedImageUrl(imageUrl: string, type?: 'preview'): string { - if (imageUrl.startsWith(instance.mediaProxy + '/') || imageUrl.startsWith('/proxy/')) { - // もう既にproxyっぽそうだったらsearchParams付けるだけ - return appendQuery(imageUrl, query({ - fallback: '1', - ...(type ? { [type]: '1' } : {}), - })); +export function getProxiedImageUrl(imageUrl: string, type?: 'preview', mustOrigin: boolean = false): string { + const localProxy = `${url}/proxy`; + + if (imageUrl.startsWith(instance.mediaProxy + '/') || imageUrl.startsWith('/proxy/') || imageUrl.startsWith(localProxy + '/')) { + // もう既にproxyっぽそうだったらurlを取り出す + imageUrl = (new URL(imageUrl)).searchParams.get('url') ?? imageUrl; } - return `${instance.mediaProxy}/image.webp?${query({ + return `${mustOrigin ? localProxy : instance.mediaProxy}/image.webp?${query({ url: imageUrl, fallback: '1', ...(type ? { [type]: '1' } : {}), + ...(mustOrigin ? { origin: '1' } : {}), })}`; } -- cgit v1.2.3-freya From 1c5291f8185651c231903129ee7c1cee263f9f03 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 1 Mar 2023 10:20:03 +0900 Subject: feat: 時限ロール (#10145) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 時限ロール * クライアントから期限を確認できるように * リファクタとか * fix test * fix test * fix test * clean up --- CHANGELOG.md | 1 + locales/ja-JP.yml | 2 + .../1677570181236-role-assignment-expires-at.js | 13 + packages/backend/src/core/RoleService.ts | 77 ++++- .../backend/src/core/entities/RoleEntityService.ts | 13 +- .../backend/src/models/entities/RoleAssignment.ts | 6 + .../src/queue/processors/CleanProcessorService.ts | 18 +- .../src/server/api/endpoints/admin/roles/assign.ts | 29 +- .../server/api/endpoints/admin/roles/unassign.ts | 22 +- .../src/server/api/endpoints/admin/roles/users.ts | 6 + .../src/server/api/endpoints/roles/users.ts | 5 + packages/backend/test/unit/RoleService.ts | 75 +++-- packages/backend/test/utils.ts | 317 --------------------- packages/frontend/src/pages/admin/roles.role.vue | 47 ++- packages/frontend/src/pages/user-info.vue | 26 +- packages/frontend/src/scripts/get-user-menu.ts | 28 +- 16 files changed, 295 insertions(+), 390 deletions(-) create mode 100644 packages/backend/migration/1677570181236-role-assignment-expires-at.js (limited to 'packages/frontend/src/scripts') diff --git a/CHANGELOG.md b/CHANGELOG.md index 6be07e3244..ee941d479f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ You should also include the user name that made the change. ## 13.x.x (unreleased) ### Improvements +- 時限ロール - プッシュ通知でカスタム絵文字リアクションを表示できるように - アンテナでCWも検索対象にするように - ノートの操作部をホバー時のみ表示するオプションを追加 diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index ef5e1853b8..fa0cf67e5d 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -848,11 +848,13 @@ instanceDefaultLightTheme: "インスタンスデフォルトのライトテー instanceDefaultDarkTheme: "インスタンスデフォルトのダークテーマ" instanceDefaultThemeDescription: "オブジェクト形式のテーマコードを記入します。" mutePeriod: "ミュートする期限" +period: "期限" indefinitely: "無期限" tenMinutes: "10分" oneHour: "1時間" oneDay: "1日" oneWeek: "1週間" +oneMonth: "1ヶ月" reflectMayTakeTime: "反映されるまで時間がかかる場合があります。" failedToFetchAccountInformation: "アカウント情報の取得に失敗しました" rateLimitExceeded: "レート制限を超えました" diff --git a/packages/backend/migration/1677570181236-role-assignment-expires-at.js b/packages/backend/migration/1677570181236-role-assignment-expires-at.js new file mode 100644 index 0000000000..3ac2edab0a --- /dev/null +++ b/packages/backend/migration/1677570181236-role-assignment-expires-at.js @@ -0,0 +1,13 @@ +export class roleAssignmentExpiresAt1677570181236 { + name = 'roleAssignmentExpiresAt1677570181236' + + async up(queryRunner) { + await queryRunner.query(`ALTER TABLE "role_assignment" ADD "expiresAt" TIMESTAMP WITH TIME ZONE`); + await queryRunner.query(`CREATE INDEX "IDX_539b6c08c05067599743bb6389" ON "role_assignment" ("expiresAt") `); + } + + async down(queryRunner) { + await queryRunner.query(`DROP INDEX "public"."IDX_539b6c08c05067599743bb6389"`); + await queryRunner.query(`ALTER TABLE "role_assignment" DROP COLUMN "expiresAt"`); + } +} diff --git a/packages/backend/src/core/RoleService.ts b/packages/backend/src/core/RoleService.ts index b84d5e7585..7149591198 100644 --- a/packages/backend/src/core/RoleService.ts +++ b/packages/backend/src/core/RoleService.ts @@ -11,6 +11,8 @@ import { UserCacheService } from '@/core/UserCacheService.js'; import type { RoleCondFormulaValue } from '@/models/entities/Role.js'; import { UserEntityService } from '@/core/entities/UserEntityService.js'; import { StreamMessages } from '@/server/api/stream/types.js'; +import { IdService } from '@/core/IdService.js'; +import { GlobalEventService } from '@/core/GlobalEventService.js'; import type { OnApplicationShutdown } from '@nestjs/common'; export type RolePolicies = { @@ -56,6 +58,9 @@ export class RoleService implements OnApplicationShutdown { private rolesCache: Cache; private roleAssignmentByUserIdCache: Cache; + public static AlreadyAssignedError = class extends Error {}; + public static NotAssignedError = class extends Error {}; + constructor( @Inject(DI.redisSubscriber) private redisSubscriber: Redis.Redis, @@ -72,6 +77,8 @@ export class RoleService implements OnApplicationShutdown { private metaService: MetaService, private userCacheService: UserCacheService, private userEntityService: UserEntityService, + private globalEventService: GlobalEventService, + private idService: IdService, ) { //this.onMessage = this.onMessage.bind(this); @@ -128,6 +135,7 @@ export class RoleService implements OnApplicationShutdown { cached.push({ ...body, createdAt: new Date(body.createdAt), + expiresAt: body.expiresAt ? new Date(body.expiresAt) : null, }); } break; @@ -193,7 +201,10 @@ export class RoleService implements OnApplicationShutdown { @bindThis public async getUserRoles(userId: User['id']) { - const assigns = await this.roleAssignmentByUserIdCache.fetch(userId, () => this.roleAssignmentsRepository.findBy({ userId })); + const now = Date.now(); + let assigns = await this.roleAssignmentByUserIdCache.fetch(userId, () => this.roleAssignmentsRepository.findBy({ userId })); + // 期限切れのロールを除外 + assigns = assigns.filter(a => a.expiresAt == null || (a.expiresAt.getTime() > now)); const assignedRoleIds = assigns.map(x => x.roleId); const roles = await this.rolesCache.fetch(null, () => this.rolesRepository.findBy({})); const assignedRoles = roles.filter(r => assignedRoleIds.includes(r.id)); @@ -207,7 +218,10 @@ export class RoleService implements OnApplicationShutdown { */ @bindThis public async getUserBadgeRoles(userId: User['id']) { - const assigns = await this.roleAssignmentByUserIdCache.fetch(userId, () => this.roleAssignmentsRepository.findBy({ userId })); + const now = Date.now(); + let assigns = await this.roleAssignmentByUserIdCache.fetch(userId, () => this.roleAssignmentsRepository.findBy({ userId })); + // 期限切れのロールを除外 + assigns = assigns.filter(a => a.expiresAt == null || (a.expiresAt.getTime() > now)); const assignedRoleIds = assigns.map(x => x.roleId); const roles = await this.rolesCache.fetch(null, () => this.rolesRepository.findBy({})); const assignedBadgeRoles = roles.filter(r => r.asBadge && assignedRoleIds.includes(r.id)); @@ -316,6 +330,65 @@ export class RoleService implements OnApplicationShutdown { return users; } + @bindThis + public async assign(userId: User['id'], roleId: Role['id'], expiresAt: Date | null = null): Promise { + const now = new Date(); + + const existing = await this.roleAssignmentsRepository.findOneBy({ + roleId: roleId, + userId: userId, + }); + + if (existing) { + if (existing.expiresAt && (existing.expiresAt.getTime() < now.getTime())) { + await this.roleAssignmentsRepository.delete({ + roleId: roleId, + userId: userId, + }); + } else { + throw new RoleService.AlreadyAssignedError(); + } + } + + const created = await this.roleAssignmentsRepository.insert({ + id: this.idService.genId(), + createdAt: now, + expiresAt: expiresAt, + roleId: roleId, + userId: userId, + }).then(x => this.roleAssignmentsRepository.findOneByOrFail(x.identifiers[0])); + + this.rolesRepository.update(roleId, { + lastUsedAt: new Date(), + }); + + this.globalEventService.publishInternalEvent('userRoleAssigned', created); + } + + @bindThis + public async unassign(userId: User['id'], roleId: Role['id']): Promise { + const now = new Date(); + + const existing = await this.roleAssignmentsRepository.findOneBy({ roleId, userId }); + if (existing == null) { + throw new RoleService.NotAssignedError(); + } else if (existing.expiresAt && (existing.expiresAt.getTime() < now.getTime())) { + await this.roleAssignmentsRepository.delete({ + roleId: roleId, + userId: userId, + }); + throw new RoleService.NotAssignedError(); + } + + await this.roleAssignmentsRepository.delete(existing.id); + + this.rolesRepository.update(roleId, { + lastUsedAt: now, + }); + + this.globalEventService.publishInternalEvent('userRoleUnassigned', existing); + } + @bindThis public onApplicationShutdown(signal?: string | undefined) { this.redisSubscriber.off('message', this.onMessage); diff --git a/packages/backend/src/core/entities/RoleEntityService.ts b/packages/backend/src/core/entities/RoleEntityService.ts index 80ef5ac1fa..4208e03a8c 100644 --- a/packages/backend/src/core/entities/RoleEntityService.ts +++ b/packages/backend/src/core/entities/RoleEntityService.ts @@ -1,4 +1,5 @@ import { Inject, Injectable } from '@nestjs/common'; +import { Brackets } from 'typeorm'; import { DI } from '@/di-symbols.js'; import type { RoleAssignmentsRepository, RolesRepository } from '@/models/index.js'; import { awaitAll } from '@/misc/prelude/await-all.js'; @@ -28,9 +29,13 @@ export class RoleEntityService { ) { const role = typeof src === 'object' ? src : await this.rolesRepository.findOneByOrFail({ id: src }); - const assigns = await this.roleAssignmentsRepository.findBy({ - roleId: role.id, - }); + const assignedCount = await this.roleAssignmentsRepository.createQueryBuilder('assign') + .where('assign.roleId = :roleId', { roleId: role.id }) + .andWhere(new Brackets(qb => { qb + .where('assign.expiresAt IS NOT NULL') + .orWhere('assign.expiresAt > :now', { now: new Date() }); + })) + .getCount(); const policies = { ...role.policies }; for (const [k, v] of Object.entries(DEFAULT_POLICIES)) { @@ -57,7 +62,7 @@ export class RoleEntityService { asBadge: role.asBadge, canEditMembersByModerator: role.canEditMembersByModerator, policies: policies, - usersCount: assigns.length, + usersCount: assignedCount, }); } diff --git a/packages/backend/src/models/entities/RoleAssignment.ts b/packages/backend/src/models/entities/RoleAssignment.ts index e86f2a8999..972810940f 100644 --- a/packages/backend/src/models/entities/RoleAssignment.ts +++ b/packages/backend/src/models/entities/RoleAssignment.ts @@ -39,4 +39,10 @@ export class RoleAssignment { }) @JoinColumn() public role: Role | null; + + @Index() + @Column('timestamp with time zone', { + nullable: true, + }) + public expiresAt: Date | null; } diff --git a/packages/backend/src/queue/processors/CleanProcessorService.ts b/packages/backend/src/queue/processors/CleanProcessorService.ts index 406184cbde..7fd2cde9c0 100644 --- a/packages/backend/src/queue/processors/CleanProcessorService.ts +++ b/packages/backend/src/queue/processors/CleanProcessorService.ts @@ -1,7 +1,7 @@ import { Inject, Injectable } from '@nestjs/common'; -import { LessThan } from 'typeorm'; +import { In, LessThan } from 'typeorm'; import { DI } from '@/di-symbols.js'; -import type { AntennaNotesRepository, MutedNotesRepository, NotificationsRepository, UserIpsRepository } from '@/models/index.js'; +import type { AntennaNotesRepository, MutedNotesRepository, NotificationsRepository, RoleAssignmentsRepository, UserIpsRepository } from '@/models/index.js'; import type { Config } from '@/config.js'; import type Logger from '@/logger.js'; import { bindThis } from '@/decorators.js'; @@ -29,6 +29,9 @@ export class CleanProcessorService { @Inject(DI.antennaNotesRepository) private antennaNotesRepository: AntennaNotesRepository, + @Inject(DI.roleAssignmentsRepository) + private roleAssignmentsRepository: RoleAssignmentsRepository, + private queueLoggerService: QueueLoggerService, private idService: IdService, ) { @@ -56,6 +59,17 @@ export class CleanProcessorService { id: LessThan(this.idService.genId(new Date(Date.now() - (1000 * 60 * 60 * 24 * 90)))), }); + const expiredRoleAssignments = await this.roleAssignmentsRepository.createQueryBuilder('assign') + .where('assign.expiresAt IS NOT NULL') + .andWhere('assign.expiresAt < :now', { now: new Date() }) + .getMany(); + + if (expiredRoleAssignments.length > 0) { + await this.roleAssignmentsRepository.delete({ + id: In(expiredRoleAssignments.map(x => x.id)), + }); + } + this.logger.succ('Cleaned.'); done(); } diff --git a/packages/backend/src/server/api/endpoints/admin/roles/assign.ts b/packages/backend/src/server/api/endpoints/admin/roles/assign.ts index 7bfb2f6625..b80aaba122 100644 --- a/packages/backend/src/server/api/endpoints/admin/roles/assign.ts +++ b/packages/backend/src/server/api/endpoints/admin/roles/assign.ts @@ -1,10 +1,8 @@ import { Inject, Injectable } from '@nestjs/common'; import { Endpoint } from '@/server/api/endpoint-base.js'; -import type { RoleAssignmentsRepository, RolesRepository, UsersRepository } from '@/models/index.js'; +import type { RolesRepository, UsersRepository } from '@/models/index.js'; import { DI } from '@/di-symbols.js'; import { ApiError } from '@/server/api/error.js'; -import { IdService } from '@/core/IdService.js'; -import { GlobalEventService } from '@/core/GlobalEventService.js'; import { RoleService } from '@/core/RoleService.js'; export const meta = { @@ -39,6 +37,10 @@ export const paramDef = { properties: { roleId: { type: 'string', format: 'misskey:id' }, userId: { type: 'string', format: 'misskey:id' }, + expiresAt: { + type: 'integer', + nullable: true, + }, }, required: [ 'roleId', @@ -56,12 +58,7 @@ export default class extends Endpoint { @Inject(DI.rolesRepository) private rolesRepository: RolesRepository, - @Inject(DI.roleAssignmentsRepository) - private roleAssignmentsRepository: RoleAssignmentsRepository, - - private globalEventService: GlobalEventService, private roleService: RoleService, - private idService: IdService, ) { super(meta, paramDef, async (ps, me) => { const role = await this.rolesRepository.findOneBy({ id: ps.roleId }); @@ -78,19 +75,11 @@ export default class extends Endpoint { throw new ApiError(meta.errors.noSuchUser); } - const date = new Date(); - const created = await this.roleAssignmentsRepository.insert({ - id: this.idService.genId(), - createdAt: date, - roleId: role.id, - userId: user.id, - }).then(x => this.roleAssignmentsRepository.findOneByOrFail(x.identifiers[0])); + if (ps.expiresAt && ps.expiresAt <= Date.now()) { + return; + } - this.rolesRepository.update(ps.roleId, { - lastUsedAt: new Date(), - }); - - this.globalEventService.publishInternalEvent('userRoleAssigned', created); + await this.roleService.assign(user.id, role.id, ps.expiresAt ? new Date(ps.expiresAt) : null); }); } } diff --git a/packages/backend/src/server/api/endpoints/admin/roles/unassign.ts b/packages/backend/src/server/api/endpoints/admin/roles/unassign.ts index 141cc5ee89..45c4f76943 100644 --- a/packages/backend/src/server/api/endpoints/admin/roles/unassign.ts +++ b/packages/backend/src/server/api/endpoints/admin/roles/unassign.ts @@ -1,10 +1,8 @@ import { Inject, Injectable } from '@nestjs/common'; import { Endpoint } from '@/server/api/endpoint-base.js'; -import type { RoleAssignmentsRepository, RolesRepository, UsersRepository } from '@/models/index.js'; +import type { RolesRepository, UsersRepository } from '@/models/index.js'; import { DI } from '@/di-symbols.js'; import { ApiError } from '@/server/api/error.js'; -import { IdService } from '@/core/IdService.js'; -import { GlobalEventService } from '@/core/GlobalEventService.js'; import { RoleService } from '@/core/RoleService.js'; export const meta = { @@ -62,12 +60,7 @@ export default class extends Endpoint { @Inject(DI.rolesRepository) private rolesRepository: RolesRepository, - @Inject(DI.roleAssignmentsRepository) - private roleAssignmentsRepository: RoleAssignmentsRepository, - - private globalEventService: GlobalEventService, private roleService: RoleService, - private idService: IdService, ) { super(meta, paramDef, async (ps, me) => { const role = await this.rolesRepository.findOneBy({ id: ps.roleId }); @@ -84,18 +77,7 @@ export default class extends Endpoint { throw new ApiError(meta.errors.noSuchUser); } - const roleAssignment = await this.roleAssignmentsRepository.findOneBy({ userId: user.id, roleId: role.id }); - if (roleAssignment == null) { - throw new ApiError(meta.errors.notAssigned); - } - - await this.roleAssignmentsRepository.delete(roleAssignment.id); - - this.rolesRepository.update(ps.roleId, { - lastUsedAt: new Date(), - }); - - this.globalEventService.publishInternalEvent('userRoleUnassigned', roleAssignment); + await this.roleService.unassign(user.id, role.id); }); } } diff --git a/packages/backend/src/server/api/endpoints/admin/roles/users.ts b/packages/backend/src/server/api/endpoints/admin/roles/users.ts index bb016a8425..ec1e86fec9 100644 --- a/packages/backend/src/server/api/endpoints/admin/roles/users.ts +++ b/packages/backend/src/server/api/endpoints/admin/roles/users.ts @@ -1,4 +1,5 @@ import { Inject, Injectable } from '@nestjs/common'; +import { Brackets } from 'typeorm'; import type { RoleAssignmentsRepository, RolesRepository } from '@/models/index.js'; import { Endpoint } from '@/server/api/endpoint-base.js'; import { QueryService } from '@/core/QueryService.js'; @@ -56,6 +57,10 @@ export default class extends Endpoint { const query = this.queryService.makePaginationQuery(this.roleAssignmentsRepository.createQueryBuilder('assign'), ps.sinceId, ps.untilId) .andWhere('assign.roleId = :roleId', { roleId: role.id }) + .andWhere(new Brackets(qb => { qb + .where('assign.expiresAt IS NOT NULL') + .orWhere('assign.expiresAt > :now', { now: new Date() }); + })) .innerJoinAndSelect('assign.user', 'user'); const assigns = await query @@ -65,6 +70,7 @@ export default class extends Endpoint { return await Promise.all(assigns.map(async assign => ({ id: assign.id, user: await this.userEntityService.pack(assign.user!, me, { detail: true }), + expiresAt: assign.expiresAt, }))); }); } diff --git a/packages/backend/src/server/api/endpoints/roles/users.ts b/packages/backend/src/server/api/endpoints/roles/users.ts index 6e221b6c67..2a8684e6d7 100644 --- a/packages/backend/src/server/api/endpoints/roles/users.ts +++ b/packages/backend/src/server/api/endpoints/roles/users.ts @@ -1,4 +1,5 @@ import { Inject, Injectable } from '@nestjs/common'; +import { Brackets } from 'typeorm'; import type { RoleAssignmentsRepository, RolesRepository } from '@/models/index.js'; import { Endpoint } from '@/server/api/endpoint-base.js'; import { QueryService } from '@/core/QueryService.js'; @@ -56,6 +57,10 @@ export default class extends Endpoint { const query = this.queryService.makePaginationQuery(this.roleAssignmentsRepository.createQueryBuilder('assign'), ps.sinceId, ps.untilId) .andWhere('assign.roleId = :roleId', { roleId: role.id }) + .andWhere(new Brackets(qb => { qb + .where('assign.expiresAt IS NOT NULL') + .orWhere('assign.expiresAt > :now', { now: new Date() }); + })) .innerJoinAndSelect('assign.user', 'user'); const assigns = await query diff --git a/packages/backend/test/unit/RoleService.ts b/packages/backend/test/unit/RoleService.ts index 221f743d3a..6fe04274e6 100644 --- a/packages/backend/test/unit/RoleService.ts +++ b/packages/backend/test/unit/RoleService.ts @@ -3,16 +3,18 @@ process.env.NODE_ENV = 'test'; import { jest } from '@jest/globals'; import { ModuleMocker } from 'jest-mock'; import { Test } from '@nestjs/testing'; -import { DataSource } from 'typeorm'; +import * as lolex from '@sinonjs/fake-timers'; import rndstr from 'rndstr'; import { GlobalModule } from '@/GlobalModule.js'; import { RoleService } from '@/core/RoleService.js'; import type { Role, RolesRepository, RoleAssignmentsRepository, UsersRepository, User } from '@/models/index.js'; import { DI } from '@/di-symbols.js'; -import { CoreModule } from '@/core/CoreModule.js'; import { MetaService } from '@/core/MetaService.js'; import { genAid } from '@/misc/id/aid.js'; import { UserCacheService } from '@/core/UserCacheService.js'; +import { IdService } from '@/core/IdService.js'; +import { GlobalEventService } from '@/core/GlobalEventService.js'; +import { sleep } from '../utils.js'; import type { TestingModule } from '@nestjs/testing'; import type { MockFunctionMetadata } from 'jest-mock'; @@ -25,6 +27,7 @@ describe('RoleService', () => { let rolesRepository: RolesRepository; let roleAssignmentsRepository: RoleAssignmentsRepository; let metaService: jest.Mocked; + let clock: lolex.InstalledClock; function createUser(data: Partial = {}) { const un = rndstr('a-z0-9', 16); @@ -50,16 +53,12 @@ describe('RoleService', () => { .then(x => rolesRepository.findOneByOrFail(x.identifiers[0])); } - async function assign(roleId: Role['id'], userId: User['id']) { - await roleAssignmentsRepository.insert({ - id: genAid(new Date()), - createdAt: new Date(), - roleId, - userId, + beforeEach(async () => { + clock = lolex.install({ + now: new Date(), + shouldClearNativeTimers: true, }); - } - beforeEach(async () => { app = await Test.createTestingModule({ imports: [ GlobalModule, @@ -67,6 +66,8 @@ describe('RoleService', () => { providers: [ RoleService, UserCacheService, + IdService, + GlobalEventService, ], }) .useMocker((token) => { @@ -92,12 +93,15 @@ describe('RoleService', () => { }); afterEach(async () => { + clock.uninstall(); + await Promise.all([ app.get(DI.metasRepository).delete({}), usersRepository.delete({}), rolesRepository.delete({}), roleAssignmentsRepository.delete({}), ]); + await app.close(); }); @@ -115,7 +119,7 @@ describe('RoleService', () => { expect(result.canManageCustomEmojis).toBe(false); }); - test('instance default policies 2', async () => { + test('instance default policies 2', async () => { const user = await createUser(); metaService.fetch.mockResolvedValue({ policies: { @@ -128,7 +132,7 @@ describe('RoleService', () => { expect(result.canManageCustomEmojis).toBe(true); }); - test('with role', async () => { + test('with role', async () => { const user = await createUser(); const role = await createRole({ name: 'a', @@ -140,7 +144,7 @@ describe('RoleService', () => { }, }, }); - await assign(role.id, user.id); + await roleService.assign(user.id, role.id); metaService.fetch.mockResolvedValue({ policies: { canManageCustomEmojis: false, @@ -152,7 +156,7 @@ describe('RoleService', () => { expect(result.canManageCustomEmojis).toBe(true); }); - test('priority', async () => { + test('priority', async () => { const user = await createUser(); const role1 = await createRole({ name: 'role1', @@ -174,8 +178,8 @@ describe('RoleService', () => { }, }, }); - await assign(role1.id, user.id); - await assign(role2.id, user.id); + await roleService.assign(user.id, role1.id); + await roleService.assign(user.id, role2.id); metaService.fetch.mockResolvedValue({ policies: { driveCapacityMb: 50, @@ -187,7 +191,7 @@ describe('RoleService', () => { expect(result.driveCapacityMb).toBe(100); }); - test('conditional role', async () => { + test('conditional role', async () => { const user1 = await createUser({ createdAt: new Date(Date.now() - (1000 * 60 * 60 * 24 * 365)), }); @@ -228,5 +232,42 @@ describe('RoleService', () => { expect(user1Policies.canManageCustomEmojis).toBe(false); expect(user2Policies.canManageCustomEmojis).toBe(true); }); + + test('expired role', async () => { + const user = await createUser(); + const role = await createRole({ + name: 'a', + policies: { + canManageCustomEmojis: { + useDefault: false, + priority: 0, + value: true, + }, + }, + }); + await roleService.assign(user.id, role.id, new Date(Date.now() + (1000 * 60 * 60 * 24))); + metaService.fetch.mockResolvedValue({ + policies: { + canManageCustomEmojis: false, + }, + } as any); + + const result = await roleService.getUserPolicies(user.id); + expect(result.canManageCustomEmojis).toBe(true); + + clock.tick('25:00:00'); + + const resultAfter25h = await roleService.getUserPolicies(user.id); + expect(resultAfter25h.canManageCustomEmojis).toBe(false); + + await roleService.assign(user.id, role.id); + + // ストリーミング経由で反映されるまでちょっと待つ + clock.uninstall(); + await sleep(100); + + const resultAfter25hAgain = await roleService.getUserPolicies(user.id); + expect(resultAfter25hAgain.canManageCustomEmojis).toBe(true); + }); }); }); diff --git a/packages/backend/test/utils.ts b/packages/backend/test/utils.ts index 50988939aa..b813362893 100644 --- a/packages/backend/test/utils.ts +++ b/packages/backend/test/utils.ts @@ -1,320 +1,3 @@ -import * as fs from 'node:fs'; -import * as path from 'node:path'; -import { fileURLToPath } from 'node:url'; -import { dirname } from 'node:path'; -import * as childProcess from 'child_process'; -import * as http from 'node:http'; -import { SIGKILL } from 'constants'; -import WebSocket from 'ws'; -import fetch from 'node-fetch'; -import FormData from 'form-data'; -import { DataSource } from 'typeorm'; -import got, { RequestError } from 'got'; -import loadConfig from '../src/config/load.js'; -import { entities } from '@/postgres.js'; -import type * as misskey from 'misskey-js'; - -const _filename = fileURLToPath(import.meta.url); -const _dirname = dirname(_filename); - -const config = loadConfig(); -export const port = config.port; - -export const api = async (endpoint: string, params: any, me?: any) => { - endpoint = endpoint.replace(/^\//, ''); - - const auth = me ? { - i: me.token, - } : {}; - - try { - const res = await got(`http://localhost:${port}/api/${endpoint}`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(Object.assign(auth, params)), - retry: { - limit: 0, - }, - }); - - const status = res.statusCode; - const body = res.statusCode !== 204 ? await JSON.parse(res.body) : null; - - return { - status, - body, - }; - } catch (err: unknown) { - if (err instanceof RequestError && err.response) { - const status = err.response.statusCode; - const body = await JSON.parse(err.response.body as string); - - return { - status, - body, - }; - } else { - throw err; - } - } -}; - -export const request = async (path: string, params: any, me?: any): Promise<{ body: any, status: number }> => { - const auth = me ? { - i: me.token, - } : {}; - - const res = await fetch(`http://localhost:${port}/${path}`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify(Object.assign(auth, params)), - }); - - const status = res.status; - const body = res.status === 200 ? await res.json().catch() : null; - - return { - body, status, - }; -}; - -export const signup = async (params?: any): Promise => { - const q = Object.assign({ - username: 'test', - password: 'test', - }, params); - - const res = await api('signup', q); - - return res.body; -}; - -export const post = async (user: any, params?: misskey.Endpoints['notes/create']['req']): Promise => { - const q = Object.assign({ - text: 'test', - }, params); - - const res = await api('notes/create', q, user); - - return res.body ? res.body.createdNote : null; -}; - -export const react = async (user: any, note: any, reaction: string): Promise => { - await api('notes/reactions/create', { - noteId: note.id, - reaction: reaction, - }, user); -}; - -/** - * Upload file - * @param user User - * @param _path Optional, absolute path or relative from ./resources/ - */ -export const uploadFile = async (user: any, _path?: string): Promise => { - const absPath = _path == null ? `${_dirname}/resources/Lenna.jpg` : path.isAbsolute(_path) ? _path : `${_dirname}/resources/${_path}`; - - const formData = new FormData() as any; - formData.append('i', user.token); - formData.append('file', fs.createReadStream(absPath)); - formData.append('force', 'true'); - - const res = await got(`http://localhost:${port}/api/drive/files/create`, { - method: 'POST', - body: formData, - retry: { - limit: 0, - }, - }); - - const body = res.statusCode !== 204 ? await JSON.parse(res.body) : null; - - return body; -}; - -export const uploadUrl = async (user: any, url: string) => { - let file: any; - const marker = Math.random().toString(); - - const ws = await connectStream(user, 'main', (msg) => { - if (msg.type === 'urlUploadFinished' && msg.body.marker === marker) { - file = msg.body.file; - } - }); - - await api('drive/files/upload-from-url', { - url, - marker, - force: true, - }, user); - - await sleep(7000); - ws.close(); - - return file; -}; - -export function connectStream(user: any, channel: string, listener: (message: Record) => any, params?: any): Promise { - return new Promise((res, rej) => { - const ws = new WebSocket(`ws://localhost:${port}/streaming?i=${user.token}`); - - ws.on('open', () => { - ws.on('message', data => { - const msg = JSON.parse(data.toString()); - if (msg.type === 'channel' && msg.body.id === 'a') { - listener(msg.body); - } else if (msg.type === 'connected' && msg.body.id === 'a') { - res(ws); - } - }); - - ws.send(JSON.stringify({ - type: 'connect', - body: { - channel: channel, - id: 'a', - pong: true, - params: params, - }, - })); - }); - }); -} - -export const waitFire = async (user: any, channel: string, trgr: () => any, cond: (msg: Record) => boolean, params?: any) => { - return new Promise(async (res, rej) => { - let timer: NodeJS.Timeout; - - let ws: WebSocket; - try { - ws = await connectStream(user, channel, msg => { - if (cond(msg)) { - ws.close(); - if (timer) clearTimeout(timer); - res(true); - } - }, params); - } catch (e) { - rej(e); - } - - if (!ws!) return; - - timer = setTimeout(() => { - ws.close(); - res(false); - }, 3000); - - try { - await trgr(); - } catch (e) { - ws.close(); - if (timer) clearTimeout(timer); - rej(e); - } - }); -}; - -export const simpleGet = async (path: string, accept = '*/*'): Promise<{ status?: number, type?: string, location?: string }> => { - // node-fetchだと3xxを取れない - return await new Promise((resolve, reject) => { - const req = http.request(`http://localhost:${port}${path}`, { - headers: { - Accept: accept, - }, - }, res => { - if (res.statusCode! >= 400) { - reject(res); - } else { - resolve({ - status: res.statusCode, - type: res.headers['content-type'], - location: res.headers.location, - }); - } - }); - - req.end(); - }); -}; - -export function launchServer(callbackSpawnedProcess: (p: childProcess.ChildProcess) => void, moreProcess: () => Promise = async () => {}) { - return (done: (err?: Error) => any) => { - const p = childProcess.spawn('node', [_dirname + '/../index.js'], { - stdio: ['inherit', 'inherit', 'inherit', 'ipc'], - env: { NODE_ENV: 'test', PATH: process.env.PATH }, - }); - callbackSpawnedProcess(p); - p.on('message', message => { - if (message === 'ok') moreProcess().then(() => done()).catch(e => done(e)); - }); - }; -} - -export async function initTestDb(justBorrow = false, initEntities?: any[]) { - if (process.env.NODE_ENV !== 'test') throw 'NODE_ENV is not a test'; - - const db = new DataSource({ - type: 'postgres', - host: config.db.host, - port: config.db.port, - username: config.db.user, - password: config.db.pass, - database: config.db.db, - synchronize: true && !justBorrow, - dropSchema: true && !justBorrow, - entities: initEntities ?? entities, - }); - - await db.initialize(); - - return db; -} - -export function startServer(timeout = 60 * 1000): Promise { - return new Promise((res, rej) => { - const t = setTimeout(() => { - p.kill(SIGKILL); - rej('timeout to start'); - }, timeout); - - const p = childProcess.spawn('node', [_dirname + '/../built/index.js'], { - stdio: ['inherit', 'inherit', 'inherit', 'ipc'], - env: { NODE_ENV: 'test', PATH: process.env.PATH }, - }); - - p.on('error', e => rej(e)); - - p.on('message', message => { - if (message === 'ok') { - clearTimeout(t); - res(p); - } - }); - }); -} - -export function shutdownServer(p: childProcess.ChildProcess | undefined, timeout = 20 * 1000) { - if (p == null) return Promise.resolve('nop'); - return new Promise((res, rej) => { - const t = setTimeout(() => { - p.kill(SIGKILL); - res('force exit'); - }, timeout); - - p.once('exit', () => { - clearTimeout(t); - res('exited'); - }); - - p.kill(); - }); -} - export function sleep(msec: number) { return new Promise(res => { setTimeout(() => { diff --git a/packages/frontend/src/pages/admin/roles.role.vue b/packages/frontend/src/pages/admin/roles.role.vue index e7d57ad4f0..7951086bf1 100644 --- a/packages/frontend/src/pages/admin/roles.role.vue +++ b/packages/frontend/src/pages/admin/roles.role.vue @@ -34,6 +34,7 @@ + @@ -98,13 +99,37 @@ async function del() { router.push('/admin/roles'); } -function assign() { - os.selectUser({ +async function assign() { + const user = await os.selectUser({ includeSelf: true, - }).then(async (user) => { - await os.apiWithDialog('admin/roles/assign', { roleId: role.id, userId: user.id }); - role.users.push(user); }); + + const { canceled: canceled2, result: period } = await os.select({ + title: i18n.ts.period, + items: [{ + value: 'indefinitely', text: i18n.ts.indefinitely, + }, { + value: 'oneHour', text: i18n.ts.oneHour, + }, { + value: 'oneDay', text: i18n.ts.oneDay, + }, { + value: 'oneWeek', text: i18n.ts.oneWeek, + }, { + value: 'oneMonth', text: i18n.ts.oneMonth, + }], + default: 'indefinitely', + }); + if (canceled2) return; + + const expiresAt = period === 'indefinitely' ? null + : period === 'oneHour' ? Date.now() + (1000 * 60 * 60) + : period === 'oneDay' ? Date.now() + (1000 * 60 * 60 * 24) + : period === 'oneWeek' ? Date.now() + (1000 * 60 * 60 * 24 * 7) + : period === 'oneMonth' ? Date.now() + (1000 * 60 * 60 * 24 * 30) + : null; + + await os.apiWithDialog('admin/roles/assign', { roleId: role.id, userId: user.id, expiresAt }); + role.users.push(user); } async function unassign(user, ev) { @@ -119,6 +144,13 @@ async function unassign(user, ev) { }], ev.currentTarget ?? ev.target); } +async function showExpireInfo(assignment) { + os.alert({ + type: 'info', + text: assignment.expiresAt.toLocaleString(), + }); +} + const headerActions = $computed(() => []); const headerTabs = $computed(() => []); @@ -139,10 +171,15 @@ definePageMetadata(computed(() => ({ min-width: 0; } +.expiresAt, .unassign { width: 32px; height: 32px; margin-left: 8px; align-self: center; } + +.expiresAt + .unassign { + margin-left: 0; +} diff --git a/packages/frontend/src/pages/user-info.vue b/packages/frontend/src/pages/user-info.vue index 13a06286f6..373af193d7 100644 --- a/packages/frontend/src/pages/user-info.vue +++ b/packages/frontend/src/pages/user-info.vue @@ -337,7 +337,31 @@ async function assignRole() { }); if (canceled) return; - await os.apiWithDialog('admin/roles/assign', { roleId, userId: user.id }); + const { canceled: canceled2, result: period } = await os.select({ + title: i18n.ts.period, + items: [{ + value: 'indefinitely', text: i18n.ts.indefinitely, + }, { + value: 'oneHour', text: i18n.ts.oneHour, + }, { + value: 'oneDay', text: i18n.ts.oneDay, + }, { + value: 'oneWeek', text: i18n.ts.oneWeek, + }, { + value: 'oneMonth', text: i18n.ts.oneMonth, + }], + default: 'indefinitely', + }); + if (canceled2) return; + + const expiresAt = period === 'indefinitely' ? null + : period === 'oneHour' ? Date.now() + (1000 * 60 * 60) + : period === 'oneDay' ? Date.now() + (1000 * 60 * 60 * 24) + : period === 'oneWeek' ? Date.now() + (1000 * 60 * 60 * 24 * 7) + : period === 'oneMonth' ? Date.now() + (1000 * 60 * 60 * 24 * 30) + : null; + + await os.apiWithDialog('admin/roles/assign', { roleId, userId: user.id, expiresAt }); refreshUser(); } diff --git a/packages/frontend/src/scripts/get-user-menu.ts b/packages/frontend/src/scripts/get-user-menu.ts index 6c6baf8266..5170ca4c8c 100644 --- a/packages/frontend/src/scripts/get-user-menu.ts +++ b/packages/frontend/src/scripts/get-user-menu.ts @@ -143,8 +143,32 @@ export function getUserMenu(user: misskey.entities.UserDetailed, router: Router return roles.filter(r => r.target === 'manual').map(r => ({ text: r.name, - action: () => { - os.apiWithDialog('admin/roles/assign', { roleId: r.id, userId: user.id }); + action: async () => { + const { canceled, result: period } = await os.select({ + title: i18n.ts.period, + items: [{ + value: 'indefinitely', text: i18n.ts.indefinitely, + }, { + value: 'oneHour', text: i18n.ts.oneHour, + }, { + value: 'oneDay', text: i18n.ts.oneDay, + }, { + value: 'oneWeek', text: i18n.ts.oneWeek, + }, { + value: 'oneMonth', text: i18n.ts.oneMonth, + }], + default: 'indefinitely', + }); + if (canceled) return; + + const expiresAt = period === 'indefinitely' ? null + : period === 'oneHour' ? Date.now() + (1000 * 60 * 60) + : period === 'oneDay' ? Date.now() + (1000 * 60 * 60 * 24) + : period === 'oneWeek' ? Date.now() + (1000 * 60 * 60 * 24 * 7) + : period === 'oneMonth' ? Date.now() + (1000 * 60 * 60 * 24 * 30) + : null; + + os.apiWithDialog('admin/roles/assign', { roleId: r.id, userId: user.id, expiresAt }); }, })); }, -- cgit v1.2.3-freya From 6d82371449cc97f1ee8a7425b17ec536a3095640 Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Wed, 1 Mar 2023 07:24:09 +0100 Subject: fix(frontend): read KeyboardEvent.key instead of which/code (#10083) --- cypress/e2e/basic.cy.js | 17 +++++++++++++++-- packages/frontend/src/components/MkPostForm.vue | 10 +++++----- packages/frontend/src/scripts/hotkey.ts | 6 +++--- packages/frontend/src/scripts/keycode.ts | 15 --------------- 4 files changed, 23 insertions(+), 25 deletions(-) (limited to 'packages/frontend/src/scripts') diff --git a/cypress/e2e/basic.cy.js b/cypress/e2e/basic.cy.js index eb5195c4b2..fc3e6f35bc 100644 --- a/cypress/e2e/basic.cy.js +++ b/cypress/e2e/basic.cy.js @@ -17,7 +17,7 @@ describe('Before setup instance', () => { cy.visit('/'); cy.intercept('POST', '/api/admin/accounts/create').as('signup'); - + cy.get('[data-cy-admin-username] input').type('admin'); cy.get('[data-cy-admin-password] input').type('admin1234'); cy.get('[data-cy-admin-ok]').click(); @@ -112,7 +112,7 @@ describe('After user signup', () => { }); }); -describe('After user singed in', () => { +describe('After user signed in', () => { beforeEach(() => { cy.resetState(); @@ -141,6 +141,19 @@ describe('After user singed in', () => { cy.get('[data-cy-open-post-form-submit]').click(); cy.contains('Hello, Misskey!'); + }); + + it('open note form with hotkey', () => { + // Wait until the page loads + cy.get('[data-cy-open-post-form]').should('be.visible'); + // Use trigger() to give different `code` to test if hotkeys also work on non-QWERTY keyboards. + cy.document().trigger("keydown", { eventConstructor: 'KeyboardEvent', key: "n", code: "KeyL" }); + // See if the form is opened + cy.get('[data-cy-post-form-text]').should('be.visible'); + // Close it + cy.focused().trigger("keydown", { eventConstructor: 'KeyboardEvent', key: "Escape", code: "Escape" }); + // See if the form is closed + cy.get('[data-cy-post-form-text]').should('not.be.visible'); }); }); diff --git a/packages/frontend/src/components/MkPostForm.vue b/packages/frontend/src/components/MkPostForm.vue index f73eab5b86..2b3e2c8646 100644 --- a/packages/frontend/src/components/MkPostForm.vue +++ b/packages/frontend/src/components/MkPostForm.vue @@ -437,8 +437,8 @@ function clear() { } function onKeydown(ev: KeyboardEvent) { - if ((ev.which === 10 || ev.which === 13) && (ev.ctrlKey || ev.metaKey) && canPost) post(); - if (ev.which === 27) emit('esc'); + if (ev.key === 'Enter' && (ev.ctrlKey || ev.metaKey) && canPost) post(); + if (ev.key === 'Escape') emit('esc'); } function onCompositionUpdate(ev: CompositionEvent) { @@ -489,9 +489,9 @@ function onDragover(ev) { switch (ev.dataTransfer.effectAllowed) { case 'all': case 'uninitialized': - case 'copy': - case 'copyLink': - case 'copyMove': + case 'copy': + case 'copyLink': + case 'copyMove': ev.dataTransfer.dropEffect = 'copy'; break; case 'linkMove': diff --git a/packages/frontend/src/scripts/hotkey.ts b/packages/frontend/src/scripts/hotkey.ts index 4a0ded637d..b7238016c6 100644 --- a/packages/frontend/src/scripts/hotkey.ts +++ b/packages/frontend/src/scripts/hotkey.ts @@ -53,10 +53,10 @@ const parseKeymap = (keymap: Keymap) => Object.entries(keymap).map(([patterns, c return result; }); -const ignoreElemens = ['input', 'textarea']; +const ignoreElements = ['input', 'textarea']; function match(ev: KeyboardEvent, patterns: Action['patterns']): boolean { - const key = ev.code.toLowerCase(); + const key = ev.key.toLowerCase(); return patterns.some(pattern => pattern.which.includes(key) && pattern.ctrl === ev.ctrlKey && pattern.shift === ev.shiftKey && @@ -70,7 +70,7 @@ export const makeHotkey = (keymap: Keymap) => { return (ev: KeyboardEvent) => { if (document.activeElement) { - if (ignoreElemens.some(el => document.activeElement!.matches(el))) return; + if (ignoreElements.some(el => document.activeElement!.matches(el))) return; if (document.activeElement.attributes['contenteditable']) return; } diff --git a/packages/frontend/src/scripts/keycode.ts b/packages/frontend/src/scripts/keycode.ts index 69f6a82803..35813edbd5 100644 --- a/packages/frontend/src/scripts/keycode.ts +++ b/packages/frontend/src/scripts/keycode.ts @@ -16,18 +16,3 @@ export const aliases = { 'right': 'ArrowRight', 'plus': ['NumpadAdd', 'Semicolon'], }; - -/*! -* Programmatically add the following -*/ - -// lower case chars -for (let i = 97; i < 123; i++) { - const char = String.fromCharCode(i); - aliases[char] = `Key${char.toUpperCase()}`; -} - -// numbers -for (let i = 0; i < 10; i++) { - aliases[i] = [`Numpad${i}`, `Digit${i}`]; -} -- cgit v1.2.3-freya From 47b1b09b21d09d8cdc07265b9eb0a83dbd38e5b5 Mon Sep 17 00:00:00 2001 From: syuilo Date: Wed, 1 Mar 2023 17:22:17 +0900 Subject: enhance(client): add new sounds --- packages/frontend/assets/sounds/syuilo/new-aec-oct.mp3 | Bin 0 -> 27943 bytes packages/frontend/assets/sounds/syuilo/new-aec.mp3 | Bin 0 -> 27943 bytes packages/frontend/assets/sounds/syuilo/new-cea-oct.mp3 | Bin 0 -> 27943 bytes packages/frontend/assets/sounds/syuilo/new-cea.mp3 | Bin 0 -> 27943 bytes packages/frontend/assets/sounds/syuilo/new-eca-oct.mp3 | Bin 0 -> 27943 bytes packages/frontend/assets/sounds/syuilo/new-eca.mp3 | Bin 0 -> 27943 bytes packages/frontend/src/scripts/sound.ts | 6 ++++++ 7 files changed, 6 insertions(+) create mode 100644 packages/frontend/assets/sounds/syuilo/new-aec-oct.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-aec.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-cea-oct.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-cea.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-eca-oct.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-eca.mp3 (limited to 'packages/frontend/src/scripts') diff --git a/packages/frontend/assets/sounds/syuilo/new-aec-oct.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec-oct.mp3 new file mode 100644 index 0000000000..d66406a954 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-aec-oct.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-aec.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec.mp3 new file mode 100644 index 0000000000..054883e08f Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-aec.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-cea-oct.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea-oct.mp3 new file mode 100644 index 0000000000..24ccdf4486 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-cea-oct.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-cea.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea.mp3 new file mode 100644 index 0000000000..bd3c7d551b Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-cea.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-eca-oct.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca-oct.mp3 new file mode 100644 index 0000000000..17c71cb98e Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-eca-oct.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-eca.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca.mp3 new file mode 100644 index 0000000000..433da56cba Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-eca.mp3 differ diff --git a/packages/frontend/src/scripts/sound.ts b/packages/frontend/src/scripts/sound.ts index 9d1f603235..0c100440a2 100644 --- a/packages/frontend/src/scripts/sound.ts +++ b/packages/frontend/src/scripts/sound.ts @@ -4,6 +4,12 @@ const cache = new Map(); export const soundsTypes = [ null, + 'syuilo/new-eca', + 'syuilo/new-cea', + 'syuilo/new-aec', + 'syuilo/new-eca-oct', + 'syuilo/new-cea-oct', + 'syuilo/new-aec-oct', 'syuilo/up', 'syuilo/down', 'syuilo/pope1', -- cgit v1.2.3-freya From ea1cff499a5a40d24a671e0352d47234e318b64e Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 2 Mar 2023 08:36:15 +0900 Subject: update sounds --- .../frontend/assets/sounds/syuilo/new-aec-4va.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/new-aec-4vb.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/new-aec-8va.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/new-aec-8vb.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/new-aec-oct.mp3 | Bin 27943 -> 0 bytes packages/frontend/assets/sounds/syuilo/new-aec.mp3 | Bin 27943 -> 26880 bytes .../frontend/assets/sounds/syuilo/new-cea-4va.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/new-cea-4vb.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/new-cea-8va.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/new-cea-8vb.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/new-cea-oct.mp3 | Bin 27943 -> 0 bytes packages/frontend/assets/sounds/syuilo/new-cea.mp3 | Bin 27943 -> 26880 bytes .../frontend/assets/sounds/syuilo/new-eca-4va.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/new-eca-4vb.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/new-eca-8va.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/new-eca-8vb.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/new-eca-oct.mp3 | Bin 27943 -> 0 bytes packages/frontend/assets/sounds/syuilo/new-eca.mp3 | Bin 27943 -> 26880 bytes packages/frontend/src/scripts/sound.ts | 19 ++++++++++++++----- 19 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 packages/frontend/assets/sounds/syuilo/new-aec-4va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-aec-4vb.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-aec-8va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-aec-8vb.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-aec-oct.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-cea-4va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-cea-4vb.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-cea-8va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-cea-8vb.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-cea-oct.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-eca-4va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-eca-4vb.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-eca-8va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/new-eca-8vb.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-eca-oct.mp3 (limited to 'packages/frontend/src/scripts') diff --git a/packages/frontend/assets/sounds/syuilo/new-aec-4va.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec-4va.mp3 new file mode 100644 index 0000000000..0c5a4fb15b Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-aec-4va.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-aec-4vb.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec-4vb.mp3 new file mode 100644 index 0000000000..0842fe004b Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-aec-4vb.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-aec-8va.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec-8va.mp3 new file mode 100644 index 0000000000..9f2ed857d7 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-aec-8va.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-aec-8vb.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec-8vb.mp3 new file mode 100644 index 0000000000..59a355f563 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-aec-8vb.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-aec-oct.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec-oct.mp3 deleted file mode 100644 index d66406a954..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-aec-oct.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-aec.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec.mp3 index 054883e08f..cd4b7a50ac 100644 Binary files a/packages/frontend/assets/sounds/syuilo/new-aec.mp3 and b/packages/frontend/assets/sounds/syuilo/new-aec.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-cea-4va.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea-4va.mp3 new file mode 100644 index 0000000000..6e9fbacfeb Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-cea-4va.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-cea-4vb.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea-4vb.mp3 new file mode 100644 index 0000000000..dcb0b59da6 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-cea-4vb.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-cea-8va.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea-8va.mp3 new file mode 100644 index 0000000000..6fc6652809 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-cea-8va.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-cea-8vb.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea-8vb.mp3 new file mode 100644 index 0000000000..2df97a1a88 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-cea-8vb.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-cea-oct.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea-oct.mp3 deleted file mode 100644 index 24ccdf4486..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-cea-oct.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-cea.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea.mp3 index bd3c7d551b..16581990ea 100644 Binary files a/packages/frontend/assets/sounds/syuilo/new-cea.mp3 and b/packages/frontend/assets/sounds/syuilo/new-cea.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-eca-4va.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca-4va.mp3 new file mode 100644 index 0000000000..99f9361a31 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-eca-4va.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-eca-4vb.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca-4vb.mp3 new file mode 100644 index 0000000000..64cff5f2e7 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-eca-4vb.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-eca-8va.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca-8va.mp3 new file mode 100644 index 0000000000..2e39af1ede Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-eca-8va.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-eca-8vb.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca-8vb.mp3 new file mode 100644 index 0000000000..2a95ec4fea Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/new-eca-8vb.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-eca-oct.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca-oct.mp3 deleted file mode 100644 index 17c71cb98e..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-eca-oct.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-eca.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca.mp3 index 433da56cba..82969479dc 100644 Binary files a/packages/frontend/assets/sounds/syuilo/new-eca.mp3 and b/packages/frontend/assets/sounds/syuilo/new-eca.mp3 differ diff --git a/packages/frontend/src/scripts/sound.ts b/packages/frontend/src/scripts/sound.ts index 0c100440a2..e48a08ae39 100644 --- a/packages/frontend/src/scripts/sound.ts +++ b/packages/frontend/src/scripts/sound.ts @@ -4,12 +4,21 @@ const cache = new Map(); export const soundsTypes = [ null, - 'syuilo/new-eca', - 'syuilo/new-cea', + 'syuilo/new-aec-4va', + 'syuilo/new-aec-4vb', + 'syuilo/new-aec-8va', + 'syuilo/new-aec-8vb', 'syuilo/new-aec', - 'syuilo/new-eca-oct', - 'syuilo/new-cea-oct', - 'syuilo/new-aec-oct', + 'syuilo/new-cea-4va', + 'syuilo/new-cea-4vb', + 'syuilo/new-cea-8va', + 'syuilo/new-cea-8vb', + 'syuilo/new-cea', + 'syuilo/new-eca-4va', + 'syuilo/new-eca-4vb', + 'syuilo/new-eca-8va', + 'syuilo/new-eca-8vb', + 'syuilo/new-eca', 'syuilo/up', 'syuilo/down', 'syuilo/pope1', -- cgit v1.2.3-freya From ebd7b27075f78136c8a86f8835ed58380514f9f6 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 2 Mar 2023 18:40:55 +0900 Subject: clean up --- packages/frontend/src/components/global/MkPageHeader.vue | 2 +- packages/frontend/src/pages/settings/preferences-backups.vue | 1 - packages/frontend/src/pages/settings/statusbar.vue | 1 - packages/frontend/src/scripts/page-metadata.ts | 1 - 4 files changed, 1 insertion(+), 4 deletions(-) (limited to 'packages/frontend/src/scripts') diff --git a/packages/frontend/src/components/global/MkPageHeader.vue b/packages/frontend/src/components/global/MkPageHeader.vue index 589ca92d75..4d968db6a3 100644 --- a/packages/frontend/src/components/global/MkPageHeader.vue +++ b/packages/frontend/src/components/global/MkPageHeader.vue @@ -96,7 +96,7 @@ function onTabClick(): void { } const calcBg = () => { - const rawBg = metadata?.bg ?? 'var(--bg)'; + const rawBg = 'var(--bg)'; const tinyBg = tinycolor(rawBg.startsWith('var(') ? getComputedStyle(document.documentElement).getPropertyValue(rawBg.slice(4, -1)) : rawBg); tinyBg.setAlpha(0.85); bg.value = tinyBg.toRgbString(); diff --git a/packages/frontend/src/pages/settings/preferences-backups.vue b/packages/frontend/src/pages/settings/preferences-backups.vue index 83ce0e6c07..e3cf1aefb0 100644 --- a/packages/frontend/src/pages/settings/preferences-backups.vue +++ b/packages/frontend/src/pages/settings/preferences-backups.vue @@ -422,7 +422,6 @@ onUnmounted(() => { definePageMetadata(computed(() => ({ title: ts.preferencesBackups, icon: 'ti ti-device-floppy', - bg: 'var(--bg)', }))); diff --git a/packages/frontend/src/pages/settings/statusbar.vue b/packages/frontend/src/pages/settings/statusbar.vue index cb46858c5a..f5a090a63b 100644 --- a/packages/frontend/src/pages/settings/statusbar.vue +++ b/packages/frontend/src/pages/settings/statusbar.vue @@ -47,6 +47,5 @@ const headerTabs = $computed(() => []); definePageMetadata({ title: i18n.ts.statusbar, icon: 'ti ti-list', - bg: 'var(--bg)', }); diff --git a/packages/frontend/src/scripts/page-metadata.ts b/packages/frontend/src/scripts/page-metadata.ts index 0db8369f9d..8810e26960 100644 --- a/packages/frontend/src/scripts/page-metadata.ts +++ b/packages/frontend/src/scripts/page-metadata.ts @@ -10,7 +10,6 @@ export type PageMetadata = { icon?: string | null; avatar?: misskey.entities.User | null; userName?: misskey.entities.User | null; - bg?: string; }; export function definePageMetadata(metadata: PageMetadata | null | Ref | ComputedRef): void { -- cgit v1.2.3-freya From 5248395fc58227d48ef5e2196ed9679345f4dc50 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 3 Mar 2023 09:41:33 +0900 Subject: update sounds --- .../frontend/assets/sounds/syuilo/n-aec-4va.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/n-aec-4vb.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/n-aec-8va.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/n-aec-8vb.mp3 | Bin 0 -> 26880 bytes packages/frontend/assets/sounds/syuilo/n-aec.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/n-cea-4va.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/n-cea-4vb.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/n-cea-8va.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/n-cea-8vb.mp3 | Bin 0 -> 26880 bytes packages/frontend/assets/sounds/syuilo/n-cea.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/n-ea-4va.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/n-ea-4vb.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/n-ea-8va.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/n-ea-8vb.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/n-ea-harmony.mp3 | Bin 0 -> 26880 bytes packages/frontend/assets/sounds/syuilo/n-ea.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/n-eca-4va.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/n-eca-4vb.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/n-eca-8va.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/n-eca-8vb.mp3 | Bin 0 -> 26880 bytes packages/frontend/assets/sounds/syuilo/n-eca.mp3 | Bin 0 -> 26880 bytes .../frontend/assets/sounds/syuilo/new-aec-4va.mp3 | Bin 26880 -> 0 bytes .../frontend/assets/sounds/syuilo/new-aec-4vb.mp3 | Bin 26880 -> 0 bytes .../frontend/assets/sounds/syuilo/new-aec-8va.mp3 | Bin 26880 -> 0 bytes .../frontend/assets/sounds/syuilo/new-aec-8vb.mp3 | Bin 26880 -> 0 bytes packages/frontend/assets/sounds/syuilo/new-aec.mp3 | Bin 26880 -> 0 bytes .../frontend/assets/sounds/syuilo/new-cea-4va.mp3 | Bin 26880 -> 0 bytes .../frontend/assets/sounds/syuilo/new-cea-4vb.mp3 | Bin 26880 -> 0 bytes .../frontend/assets/sounds/syuilo/new-cea-8va.mp3 | Bin 26880 -> 0 bytes .../frontend/assets/sounds/syuilo/new-cea-8vb.mp3 | Bin 26880 -> 0 bytes packages/frontend/assets/sounds/syuilo/new-cea.mp3 | Bin 26880 -> 0 bytes .../frontend/assets/sounds/syuilo/new-eca-4va.mp3 | Bin 26880 -> 0 bytes .../frontend/assets/sounds/syuilo/new-eca-4vb.mp3 | Bin 26880 -> 0 bytes .../frontend/assets/sounds/syuilo/new-eca-8va.mp3 | Bin 26880 -> 0 bytes .../frontend/assets/sounds/syuilo/new-eca-8vb.mp3 | Bin 26880 -> 0 bytes packages/frontend/assets/sounds/syuilo/new-eca.mp3 | Bin 26880 -> 0 bytes packages/frontend/src/scripts/sound.ts | 36 ++++++++++++--------- packages/frontend/src/store.ts | 16 ++++----- 38 files changed, 29 insertions(+), 23 deletions(-) create mode 100644 packages/frontend/assets/sounds/syuilo/n-aec-4va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-aec-4vb.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-aec-8va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-aec-8vb.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-aec.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-cea-4va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-cea-4vb.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-cea-8va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-cea-8vb.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-cea.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-ea-4va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-ea-4vb.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-ea-8va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-ea-8vb.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-ea-harmony.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-ea.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-eca-4va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-eca-4vb.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-eca-8va.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-eca-8vb.mp3 create mode 100644 packages/frontend/assets/sounds/syuilo/n-eca.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-aec-4va.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-aec-4vb.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-aec-8va.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-aec-8vb.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-aec.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-cea-4va.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-cea-4vb.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-cea-8va.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-cea-8vb.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-cea.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-eca-4va.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-eca-4vb.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-eca-8va.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-eca-8vb.mp3 delete mode 100644 packages/frontend/assets/sounds/syuilo/new-eca.mp3 (limited to 'packages/frontend/src/scripts') diff --git a/packages/frontend/assets/sounds/syuilo/n-aec-4va.mp3 b/packages/frontend/assets/sounds/syuilo/n-aec-4va.mp3 new file mode 100644 index 0000000000..2ef7024beb Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-aec-4va.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-aec-4vb.mp3 b/packages/frontend/assets/sounds/syuilo/n-aec-4vb.mp3 new file mode 100644 index 0000000000..a8ad11287e Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-aec-4vb.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-aec-8va.mp3 b/packages/frontend/assets/sounds/syuilo/n-aec-8va.mp3 new file mode 100644 index 0000000000..8cc2ead028 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-aec-8va.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-aec-8vb.mp3 b/packages/frontend/assets/sounds/syuilo/n-aec-8vb.mp3 new file mode 100644 index 0000000000..59cbcaf917 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-aec-8vb.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-aec.mp3 b/packages/frontend/assets/sounds/syuilo/n-aec.mp3 new file mode 100644 index 0000000000..7aec0516e7 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-aec.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-cea-4va.mp3 b/packages/frontend/assets/sounds/syuilo/n-cea-4va.mp3 new file mode 100644 index 0000000000..98fe354d67 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-cea-4va.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-cea-4vb.mp3 b/packages/frontend/assets/sounds/syuilo/n-cea-4vb.mp3 new file mode 100644 index 0000000000..7b69b3410d Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-cea-4vb.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-cea-8va.mp3 b/packages/frontend/assets/sounds/syuilo/n-cea-8va.mp3 new file mode 100644 index 0000000000..44f2deee3d Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-cea-8va.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-cea-8vb.mp3 b/packages/frontend/assets/sounds/syuilo/n-cea-8vb.mp3 new file mode 100644 index 0000000000..1342a56f85 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-cea-8vb.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-cea.mp3 b/packages/frontend/assets/sounds/syuilo/n-cea.mp3 new file mode 100644 index 0000000000..88d641fd64 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-cea.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-ea-4va.mp3 b/packages/frontend/assets/sounds/syuilo/n-ea-4va.mp3 new file mode 100644 index 0000000000..468b82bc2c Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-ea-4va.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-ea-4vb.mp3 b/packages/frontend/assets/sounds/syuilo/n-ea-4vb.mp3 new file mode 100644 index 0000000000..3869e894d2 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-ea-4vb.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-ea-8va.mp3 b/packages/frontend/assets/sounds/syuilo/n-ea-8va.mp3 new file mode 100644 index 0000000000..f268b7ee8b Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-ea-8va.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-ea-8vb.mp3 b/packages/frontend/assets/sounds/syuilo/n-ea-8vb.mp3 new file mode 100644 index 0000000000..d6e895e67b Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-ea-8vb.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-ea-harmony.mp3 b/packages/frontend/assets/sounds/syuilo/n-ea-harmony.mp3 new file mode 100644 index 0000000000..8e055db91d Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-ea-harmony.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-ea.mp3 b/packages/frontend/assets/sounds/syuilo/n-ea.mp3 new file mode 100644 index 0000000000..c13d13247b Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-ea.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-eca-4va.mp3 b/packages/frontend/assets/sounds/syuilo/n-eca-4va.mp3 new file mode 100644 index 0000000000..06577d5431 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-eca-4va.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-eca-4vb.mp3 b/packages/frontend/assets/sounds/syuilo/n-eca-4vb.mp3 new file mode 100644 index 0000000000..1622033d6a Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-eca-4vb.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-eca-8va.mp3 b/packages/frontend/assets/sounds/syuilo/n-eca-8va.mp3 new file mode 100644 index 0000000000..a3a9f3a9fb Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-eca-8va.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-eca-8vb.mp3 b/packages/frontend/assets/sounds/syuilo/n-eca-8vb.mp3 new file mode 100644 index 0000000000..4efa848407 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-eca-8vb.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/n-eca.mp3 b/packages/frontend/assets/sounds/syuilo/n-eca.mp3 new file mode 100644 index 0000000000..1a3979cc61 Binary files /dev/null and b/packages/frontend/assets/sounds/syuilo/n-eca.mp3 differ diff --git a/packages/frontend/assets/sounds/syuilo/new-aec-4va.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec-4va.mp3 deleted file mode 100644 index 0c5a4fb15b..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-aec-4va.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-aec-4vb.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec-4vb.mp3 deleted file mode 100644 index 0842fe004b..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-aec-4vb.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-aec-8va.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec-8va.mp3 deleted file mode 100644 index 9f2ed857d7..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-aec-8va.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-aec-8vb.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec-8vb.mp3 deleted file mode 100644 index 59a355f563..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-aec-8vb.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-aec.mp3 b/packages/frontend/assets/sounds/syuilo/new-aec.mp3 deleted file mode 100644 index cd4b7a50ac..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-aec.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-cea-4va.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea-4va.mp3 deleted file mode 100644 index 6e9fbacfeb..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-cea-4va.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-cea-4vb.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea-4vb.mp3 deleted file mode 100644 index dcb0b59da6..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-cea-4vb.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-cea-8va.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea-8va.mp3 deleted file mode 100644 index 6fc6652809..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-cea-8va.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-cea-8vb.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea-8vb.mp3 deleted file mode 100644 index 2df97a1a88..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-cea-8vb.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-cea.mp3 b/packages/frontend/assets/sounds/syuilo/new-cea.mp3 deleted file mode 100644 index 16581990ea..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-cea.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-eca-4va.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca-4va.mp3 deleted file mode 100644 index 99f9361a31..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-eca-4va.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-eca-4vb.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca-4vb.mp3 deleted file mode 100644 index 64cff5f2e7..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-eca-4vb.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-eca-8va.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca-8va.mp3 deleted file mode 100644 index 2e39af1ede..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-eca-8va.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-eca-8vb.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca-8vb.mp3 deleted file mode 100644 index 2a95ec4fea..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-eca-8vb.mp3 and /dev/null differ diff --git a/packages/frontend/assets/sounds/syuilo/new-eca.mp3 b/packages/frontend/assets/sounds/syuilo/new-eca.mp3 deleted file mode 100644 index 82969479dc..0000000000 Binary files a/packages/frontend/assets/sounds/syuilo/new-eca.mp3 and /dev/null differ diff --git a/packages/frontend/src/scripts/sound.ts b/packages/frontend/src/scripts/sound.ts index e48a08ae39..b08982facb 100644 --- a/packages/frontend/src/scripts/sound.ts +++ b/packages/frontend/src/scripts/sound.ts @@ -4,21 +4,27 @@ const cache = new Map(); export const soundsTypes = [ null, - 'syuilo/new-aec-4va', - 'syuilo/new-aec-4vb', - 'syuilo/new-aec-8va', - 'syuilo/new-aec-8vb', - 'syuilo/new-aec', - 'syuilo/new-cea-4va', - 'syuilo/new-cea-4vb', - 'syuilo/new-cea-8va', - 'syuilo/new-cea-8vb', - 'syuilo/new-cea', - 'syuilo/new-eca-4va', - 'syuilo/new-eca-4vb', - 'syuilo/new-eca-8va', - 'syuilo/new-eca-8vb', - 'syuilo/new-eca', + 'syuilo/n-aec', + 'syuilo/n-aec-4va', + 'syuilo/n-aec-4vb', + 'syuilo/n-aec-8va', + 'syuilo/n-aec-8vb', + 'syuilo/n-cea', + 'syuilo/n-cea-4va', + 'syuilo/n-cea-4vb', + 'syuilo/n-cea-8va', + 'syuilo/n-cea-8vb', + 'syuilo/n-eca', + 'syuilo/n-eca-4va', + 'syuilo/n-eca-4vb', + 'syuilo/n-eca-8va', + 'syuilo/n-eca-8vb', + 'syuilo/n-ea', + 'syuilo/n-ea-4va', + 'syuilo/n-ea-4vb', + 'syuilo/n-ea-8va', + 'syuilo/n-ea-8vb', + 'syuilo/n-ea-harmony', 'syuilo/up', 'syuilo/down', 'syuilo/pope1', diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts index 14226468eb..a6ad1774ff 100644 --- a/packages/frontend/src/store.ts +++ b/packages/frontend/src/store.ts @@ -319,14 +319,14 @@ export class ColdDeviceStorage { syncDeviceDarkMode: true, plugins: [] as Plugin[], mediaVolume: 0.5, - sound_masterVolume: 0.3, - sound_note: { type: 'syuilo/down', volume: 1 }, - sound_noteMy: { type: 'syuilo/up', volume: 1 }, - sound_notification: { type: 'syuilo/pope2', volume: 1 }, - sound_chat: { type: 'syuilo/pope1', volume: 1 }, - sound_chatBg: { type: 'syuilo/waon', volume: 1 }, - sound_antenna: { type: 'syuilo/triple', volume: 1 }, - sound_channel: { type: 'syuilo/square-pico', volume: 1 }, + sound_masterVolume: 0.5, + sound_note: { type: 'syuilo/n-aec', volume: 0.5 }, + sound_noteMy: { type: 'syuilo/n-cea', volume: 0.5 }, + sound_notification: { type: 'syuilo/n-ea', volume: 0.5 }, + sound_chat: { type: 'syuilo/pope1', volume: 0.5 }, + sound_chatBg: { type: 'syuilo/waon', volume: 0.5 }, + sound_antenna: { type: 'syuilo/triple', volume: 0.5 }, + sound_channel: { type: 'syuilo/square-pico', volume: 0.5 }, }; public static watchers: Watcher[] = []; -- cgit v1.2.3-freya