diff --git a/migration/1651804009671-useRanking.ts b/migration/1651804009671-useRanking.ts new file mode 100644 index 0000000..59a7e7f --- /dev/null +++ b/migration/1651804009671-useRanking.ts @@ -0,0 +1,13 @@ +import {MigrationInterface, QueryRunner} from "typeorm"; + +export class useRanking1651804009671 implements MigrationInterface { + name = 'useRanking1651804009671' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "user" ADD "useRanking" boolean NOT NULL DEFAULT false`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "useRanking"`); + } +} diff --git a/src/backend/controllers/body/user-setting.ts b/src/backend/controllers/body/user-setting.ts index 7383e7d..759837c 100644 --- a/src/backend/controllers/body/user-setting.ts +++ b/src/backend/controllers/body/user-setting.ts @@ -19,4 +19,7 @@ export class UserSetting { @IsOptional() template?: string; + + @IsOptional() + useRanking?: boolean; } diff --git a/src/backend/controllers/session.ts b/src/backend/controllers/session.ts index eedb57b..92faca1 100644 --- a/src/backend/controllers/session.ts +++ b/src/backend/controllers/session.ts @@ -30,6 +30,7 @@ export class SessionController { if (setting.localOnly != null) s.localOnly = setting.localOnly; if (setting.remoteFollowersOnly != null) s.remoteFollowersOnly = setting.remoteFollowersOnly; if (setting.template !== undefined) s.template = setting.template; + if (setting.useRanking !== undefined) s.useRanking = setting.useRanking; if (Object.keys(s).length === 0) return; await updateUser(user.username, user.host, s); } diff --git a/src/backend/functions/ranking.ts b/src/backend/functions/ranking.ts index c24b10d..1c5a699 100644 --- a/src/backend/functions/ranking.ts +++ b/src/backend/functions/ranking.ts @@ -8,7 +8,9 @@ import { User } from '../models/entities/user'; */ export const getRanking = async (limit?: number | null): Promise => { const query = Users.createQueryBuilder('user') - .where('"user"."bannedFromRanking" IS NOT TRUE') + .where('"user"."useRanking" IS TRUE') + .andWhere('"user"."bannedFromRanking" IS NOT TRUE') + .andWhere('"user"."rating" <> \'NaN\'') .orderBy('"user".rating', 'DESC'); if (limit) { diff --git a/src/backend/models/entities/user.ts b/src/backend/models/entities/user.ts index 7b3a9bf..cba5eeb 100644 --- a/src/backend/models/entities/user.ts +++ b/src/backend/models/entities/user.ts @@ -93,6 +93,12 @@ export class User implements IUser { }) public rating: number; + @Column({ + type: 'boolean', + default: false, + }) + public useRanking: boolean; + @Column({ type: 'boolean', default: false, diff --git a/src/common/types/user.ts b/src/common/types/user.ts index 39d3a6f..bfe866b 100644 --- a/src/common/types/user.ts +++ b/src/common/types/user.ts @@ -20,5 +20,6 @@ export interface IUser { bannedFromRanking: boolean; isAdmin?: boolean; tokenVersion: number; + useRanking: boolean; } diff --git a/src/frontend/components/MisshaiPage.tsx b/src/frontend/components/MisshaiPage.tsx index 6ad929c..3f56cb5 100644 --- a/src/frontend/components/MisshaiPage.tsx +++ b/src/frontend/components/MisshaiPage.tsx @@ -35,6 +35,7 @@ type SettingDraftType = Partial>; type DraftReducer = React.Reducer>; @@ -57,6 +58,7 @@ export const MisshaiPage: React.VFC = () => { localOnly: data?.localOnly ?? false, remoteFollowersOnly: data?.remoteFollowersOnly ?? false, template: data?.template ?? null, + useRanking: data?.useRanking ?? false, }); const templateTextarea = useRef(null); @@ -98,6 +100,7 @@ export const MisshaiPage: React.VFC = () => { localOnly: data.localOnly, remoteFollowersOnly: data.remoteFollowersOnly, template: data.template, + useRanking: data.useRanking }); } }, [data]); @@ -245,7 +248,13 @@ export const MisshaiPage: React.VFC = () => {

{t('_missHai.ranking')}

- {limit && } + {limit && } +
diff --git a/src/frontend/langs/ja-JP.json b/src/frontend/langs/ja-JP.json index 3e56a3f..65693ae 100644 --- a/src/frontend/langs/ja-JP.json +++ b/src/frontend/langs/ja-JP.json @@ -38,7 +38,7 @@ "error": "エラー", "retry": "やり直す", "saved": "保存しました。", - "disclaimerForMisskeyHq": "Misskey Toolsは、Misskey HQの公式ツールではありません。", + "disclaimerForMisskeyHq": "Misskey Toolsは、Misskey Development Divisionの公式ツールではありません。", "translatedByTheCommunity": "Misskey Toolsはボランティアによって翻訳されています。", "helpTranslation": "翻訳に協力する", "announcements": "お知らせ", @@ -81,7 +81,8 @@ "dataDelta": "前日比", "rating": "レート", "order": "順位", - "showRanking": "ランキングを見る" + "showRanking": "ランキングを見る", + "useRanking": "ランキングに参加する" }, "_accounts": { "currentAccount": "現在ログインしているアカウント",