summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/AchievementService.ts
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2023-01-21 13:14:55 +0900
committerGitHub <noreply@github.com>2023-01-21 13:14:55 +0900
commit65cd605b739ae0d213b3502308e9cd523d3e1ae7 (patch)
treefe446502a4af681db8319703a6b3c14c2c8e990e /packages/backend/src/core/AchievementService.ts
parentadd commands for build with swc (diff)
downloadmisskey-65cd605b739ae0d213b3502308e9cd523d3e1ae7.tar.gz
misskey-65cd605b739ae0d213b3502308e9cd523d3e1ae7.tar.bz2
misskey-65cd605b739ae0d213b3502308e9cd523d3e1ae7.zip
Achievements (#9665)
* wip * Update ja-JP.yml * wip * wip * Update MkAchievements.vue * wip * :art: * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip * wip
Diffstat (limited to 'packages/backend/src/core/AchievementService.ts')
-rw-r--r--packages/backend/src/core/AchievementService.ts114
1 files changed, 114 insertions, 0 deletions
diff --git a/packages/backend/src/core/AchievementService.ts b/packages/backend/src/core/AchievementService.ts
new file mode 100644
index 0000000000..4ed75308eb
--- /dev/null
+++ b/packages/backend/src/core/AchievementService.ts
@@ -0,0 +1,114 @@
+import { Inject, Injectable } from '@nestjs/common';
+import type { UserProfilesRepository, UsersRepository } from '@/models/index.js';
+import type { User } from '@/models/entities/User.js';
+import { DI } from '@/di-symbols.js';
+import { bindThis } from '@/decorators.js';
+import { CreateNotificationService } from '@/core/CreateNotificationService.js';
+
+const ACHIEVEMENT_TYPES = [
+ 'notes1',
+ 'notes10',
+ 'notes100',
+ 'notes500',
+ 'notes1000',
+ 'notes5000',
+ 'notes10000',
+ 'notes20000',
+ 'notes30000',
+ 'notes40000',
+ 'notes50000',
+ 'notes60000',
+ 'notes70000',
+ 'notes80000',
+ 'notes90000',
+ 'notes100000',
+ 'login3',
+ 'login7',
+ 'login15',
+ 'login30',
+ 'login60',
+ 'login100',
+ 'login200',
+ 'login300',
+ 'login400',
+ 'login500',
+ 'login600',
+ 'login700',
+ 'login800',
+ 'login900',
+ 'login1000',
+ 'passedSinceAccountCreated1',
+ 'passedSinceAccountCreated2',
+ 'passedSinceAccountCreated3',
+ 'loggedInOnBirthday',
+ 'noteClipped1',
+ 'noteFavorited1',
+ 'profileFilled',
+ 'markedAsCat',
+ 'following1',
+ 'following10',
+ 'following50',
+ 'following100',
+ 'following300',
+ 'followers1',
+ 'followers10',
+ 'followers50',
+ 'followers100',
+ 'followers300',
+ 'followers500',
+ 'followers1000',
+ 'collectAchievements30',
+ 'iLoveMisskey',
+ 'client30min',
+ 'noteDeletedWithin1min',
+ 'postedAtLateNight',
+ 'postedAt0min0sec',
+ 'selfQuote',
+ 'htl20npm',
+ 'driveFolderCircularReference',
+ 'reactWithoutRead',
+ 'clickedClickHere',
+ 'justPlainLucky',
+ 'setNameToSyuilo',
+ 'cookieClicked',
+ 'brainDiver',
+] as const;
+
+@Injectable()
+export class AchievementService {
+ constructor(
+ @Inject(DI.usersRepository)
+ private usersRepository: UsersRepository,
+
+ @Inject(DI.userProfilesRepository)
+ private userProfilesRepository: UserProfilesRepository,
+
+ private createNotificationService: CreateNotificationService,
+ ) {
+ }
+
+ @bindThis
+ public async create(
+ userId: User['id'],
+ type: string,
+ ): Promise<void> {
+ if (!ACHIEVEMENT_TYPES.includes(type)) return;
+
+ const date = Date.now();
+
+ const profile = await this.userProfilesRepository.findOneByOrFail({ userId: userId });
+
+ if (profile.achievements.some(a => a.name === type)) return;
+
+ await this.userProfilesRepository.update(userId, {
+ achievements: [...profile.achievements, {
+ name: type,
+ unlockedAt: date,
+ }],
+ });
+
+ this.createNotificationService.createNotification(userId, 'achievementEarned', {
+ achievement: type,
+ });
+ }
+}