summaryrefslogtreecommitdiff
path: root/src/models
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-04-17 15:30:26 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2021-04-17 15:30:26 +0900
commit68571d8f577e0a9eb8679e8dd30e11d8b1709340 (patch)
tree623ad0865b76cdb8a4551042530655ef7c22c754 /src/models
parentImprove client (diff)
downloadsharkey-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.ts11
-rw-r--r--src/models/repositories/user.ts14
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