diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2021-04-17 15:30:26 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2021-04-17 15:30:26 +0900 |
| commit | 68571d8f577e0a9eb8679e8dd30e11d8b1709340 (patch) | |
| tree | 623ad0865b76cdb8a4551042530655ef7c22c754 /src/models | |
| parent | Improve client (diff) | |
| download | sharkey-68571d8f577e0a9eb8679e8dd30e11d8b1709340.tar.gz sharkey-68571d8f577e0a9eb8679e8dd30e11d8b1709340.tar.bz2 sharkey-68571d8f577e0a9eb8679e8dd30e11d8b1709340.zip | |
Implement user online status
Resolve #7422
Fix #7424
Diffstat (limited to 'src/models')
| -rw-r--r-- | src/models/entities/user.ts | 11 | ||||
| -rw-r--r-- | src/models/repositories/user.ts | 14 |
2 files changed, 25 insertions, 0 deletions
diff --git a/src/models/entities/user.ts b/src/models/entities/user.ts index 91fbe35d94..060ec06b9a 100644 --- a/src/models/entities/user.ts +++ b/src/models/entities/user.ts @@ -26,6 +26,17 @@ export class User { }) public lastFetchedAt: Date | null; + @Index() + @Column('timestamp with time zone', { + nullable: true + }) + public lastActiveDate: Date | null; + + @Column('boolean', { + default: false, + }) + public hideOnlineStatus: boolean; + @Column('varchar', { length: 128, comment: 'The username of the User.' diff --git a/src/models/repositories/user.ts b/src/models/repositories/user.ts index a3b4c69f43..0d59ed2545 100644 --- a/src/models/repositories/user.ts +++ b/src/models/repositories/user.ts @@ -7,6 +7,7 @@ import { SchemaType } from '@/misc/schema'; import { awaitAll } from '../../prelude/await-all'; import { populateEmojis } from '@/misc/populate-emojis'; import { getAntennas } from '@/misc/antenna-cache'; +import { USER_ACTIVE_THRESHOLD, USER_ONLINE_THRESHOLD } from '@/const'; export type PackedUser = SchemaType<typeof packedUserSchema>; @@ -145,6 +146,17 @@ export class UserRepository extends Repository<User> { return count > 0; } + public getOnlineStatus(user: User): string { + if (user.hideOnlineStatus == null) return 'unknown'; + if (user.lastActiveDate == null) return 'unknown'; + const elapsed = Date.now() - user.lastActiveDate.getTime(); + return ( + elapsed < USER_ONLINE_THRESHOLD ? 'online' : + elapsed < USER_ACTIVE_THRESHOLD ? 'active' : + 'offline' + ); + } + public async pack( src: User['id'] | User, me?: { id: User['id'] } | null | undefined, @@ -192,6 +204,7 @@ export class UserRepository extends Repository<User> { themeColor: instance.themeColor, } : undefined) : undefined, emojis: populateEmojis(user.emojis, user.host), + onlineStatus: this.getOnlineStatus(user), ...(opts.detail ? { url: profile!.url, @@ -239,6 +252,7 @@ export class UserRepository extends Repository<User> { autoAcceptFollowed: profile!.autoAcceptFollowed, noCrawle: profile!.noCrawle, isExplorable: user.isExplorable, + hideOnlineStatus: user.hideOnlineStatus, hasUnreadSpecifiedNotes: NoteUnreads.count({ where: { userId: user.id, isSpecified: true }, take: 1 |