1+ /*
2+ Copyright (C) 2025 Alexander Emanuelsson (alexemanuelol)
3+
4+ This program is free software: you can redistribute it and/or modify
5+ it under the terms of the GNU General Public License as published by
6+ the Free Software Foundation, either version 3 of the License, or
7+ (at your option) any later version.
8+
9+ This program is distributed in the hope that it will be useful,
10+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+ GNU General Public License for more details.
13+
14+ You should have received a copy of the GNU General Public License
15+ along with this program. If not, see <https://www.gnu.org/licenses/>.
16+
17+ https://github.com/alexemanuelol/rustplusplus
18+
19+ */
20+
21+ import * as rp from 'rustplus-ts' ;
22+
23+ import { RustPlusInstance } from '../managers/rustPlusManager' ;
24+ import { secondsToFullScale } from '../utils/timer' ;
25+ import * as constants from '../utils/constants' ;
26+
27+ export class RustPlusTeamInfoMember {
28+ public rpInstance : RustPlusInstance ;
29+ public appTeamInfoMember : rp . AppTeamInfo_Member ;
30+ public lastMovementDate : Date | null ;
31+ public wentOfflineDate : Date | null ;
32+ public wasAfk : boolean ;
33+
34+ constructor ( rpInstance : RustPlusInstance , appTeamInfoMember : rp . AppTeamInfo_Member ) {
35+ this . rpInstance = rpInstance ;
36+ this . appTeamInfoMember = appTeamInfoMember ;
37+ this . lastMovementDate = null ;
38+ this . wentOfflineDate = null ;
39+ this . wasAfk = false ;
40+ }
41+
42+ public updateTeamInfoMember ( appTeamInfoMember : rp . AppTeamInfo_Member ) {
43+ if ( this . isGoneOffline ( appTeamInfoMember ) ) {
44+ this . wentOfflineDate = new Date ( ) ;
45+ }
46+
47+ if ( this . isGoneOnline ( appTeamInfoMember ) ) {
48+ this . lastMovementDate = new Date ( ) ;
49+ this . wasAfk = false ;
50+ }
51+
52+ if ( this . isMoved ( appTeamInfoMember ) ) {
53+ this . lastMovementDate = new Date ( ) ;
54+ this . wasAfk = false ;
55+ }
56+ else {
57+ if ( ! this . appTeamInfoMember . isOnline && ! this . isGoneOnline ( appTeamInfoMember ) ) {
58+ this . wasAfk = false ;
59+ }
60+ }
61+
62+ this . appTeamInfoMember = appTeamInfoMember ;
63+ }
64+
65+ public isSteamIdChanged ( appTeamInfoMember : rp . AppTeamInfo_Member ) : boolean {
66+ return this . appTeamInfoMember . steamId !== appTeamInfoMember . steamId ;
67+ }
68+
69+ public isNameChanged ( appTeamInfoMember : rp . AppTeamInfo_Member ) : boolean {
70+ return this . appTeamInfoMember . name !== appTeamInfoMember . name ;
71+ }
72+
73+ public isXChanged ( appTeamInfoMember : rp . AppTeamInfo_Member ) : boolean {
74+ return this . appTeamInfoMember . x !== appTeamInfoMember . x ;
75+ }
76+
77+ public isYChanged ( appTeamInfoMember : rp . AppTeamInfo_Member ) : boolean {
78+ return this . appTeamInfoMember . y !== appTeamInfoMember . y ;
79+ }
80+
81+ public isOnlineChanged ( appTeamInfoMember : rp . AppTeamInfo_Member ) : boolean {
82+ return this . appTeamInfoMember . isOnline !== appTeamInfoMember . isOnline ;
83+ }
84+
85+ public isSpawnTimeChanged ( appTeamInfoMember : rp . AppTeamInfo_Member ) : boolean {
86+ return this . appTeamInfoMember . spawnTime !== appTeamInfoMember . spawnTime ;
87+ }
88+
89+ public isAliveChanged ( appTeamInfoMember : rp . AppTeamInfo_Member ) : boolean {
90+ return this . appTeamInfoMember . isAlive !== appTeamInfoMember . isAlive ;
91+ }
92+
93+ public isDeathTimeChanged ( appTeamInfoMember : rp . AppTeamInfo_Member ) : boolean {
94+ return this . appTeamInfoMember . deathTime !== appTeamInfoMember . deathTime ;
95+ }
96+
97+ /**
98+ * Other methods
99+ */
100+
101+ public isGoneOnline ( appTeamInfoMember : rp . AppTeamInfo_Member ) : boolean {
102+ return ( this . appTeamInfoMember . isOnline === false && appTeamInfoMember . isOnline === true ) ;
103+ }
104+
105+ public isGoneOffline ( appTeamInfoMember : rp . AppTeamInfo_Member ) : boolean {
106+ return ( this . appTeamInfoMember . isOnline === true && appTeamInfoMember . isOnline === false ) ;
107+ }
108+
109+ public isGoneAlive ( appTeamInfoMember : rp . AppTeamInfo_Member ) : boolean {
110+ return ( this . appTeamInfoMember . isAlive === false && appTeamInfoMember . isAlive === true ) ;
111+ }
112+
113+ public isGoneDead ( appTeamInfoMember : rp . AppTeamInfo_Member ) : boolean {
114+ return ( this . appTeamInfoMember . isAlive === true && appTeamInfoMember . isAlive === false ) ||
115+ this . isDeathTimeChanged ( appTeamInfoMember ) ;
116+ }
117+
118+ public isMoved ( appTeamInfoMember : rp . AppTeamInfo_Member ) : boolean {
119+ return ( this . isXChanged ( appTeamInfoMember ) || this . isYChanged ( appTeamInfoMember ) ) ;
120+ }
121+
122+ public isAfk ( ) : boolean {
123+ if ( this . lastMovementDate === null ) {
124+ return false ;
125+ }
126+
127+ return ( Date . now ( ) - this . lastMovementDate . getTime ( ) ) >= constants . AFK_TIME_SECONDS ;
128+ }
129+
130+ public isGoneAfk ( appTeamInfoMember : rp . AppTeamInfo_Member ) : boolean {
131+ return (
132+ ! this . wasAfk &&
133+ ! this . isMoved ( appTeamInfoMember ) &&
134+ this . appTeamInfoMember . isOnline ) ;
135+ }
136+
137+ public getAfkSeconds ( ) : number {
138+ if ( this . lastMovementDate === null ) {
139+ return 0 ;
140+ }
141+ return ( new Date ( ) . getTime ( ) - this . lastMovementDate . getTime ( ) ) / 1000 ;
142+ }
143+
144+ public getAfkTime ( ignore : string = '' ) : string {
145+ return secondsToFullScale ( this . getAfkSeconds ( ) , ignore ) ;
146+ }
147+
148+ public getAliveSeconds ( ) : number {
149+ if ( this . appTeamInfoMember . spawnTime === 0 ) return 0 ;
150+ return ( new Date ( ) . getTime ( ) - new Date ( this . appTeamInfoMember . spawnTime * 1000 ) . getTime ( ) ) / 1000 ;
151+ }
152+
153+ public getAliveTime ( ignore : string = '' ) : string {
154+ return secondsToFullScale ( this . getAliveSeconds ( ) , ignore ) ;
155+ }
156+
157+ public getDeathSeconds ( ) : number {
158+ if ( this . appTeamInfoMember . deathTime === 0 ) return 0 ;
159+ return ( new Date ( ) . getTime ( ) - new Date ( this . appTeamInfoMember . deathTime * 1000 ) . getTime ( ) ) / 1000 ;
160+ }
161+
162+ public getDeathTime ( ignore : string = '' ) : string {
163+ return secondsToFullScale ( this . getDeathSeconds ( ) , ignore ) ;
164+ }
165+
166+ public getOfflineTime ( ignore : string = '' ) : string | null {
167+ if ( this . wentOfflineDate === null ) return null ;
168+ const seconds = ( new Date ( ) . getTime ( ) - this . wentOfflineDate . getTime ( ) ) / 1000 ;
169+ return ( secondsToFullScale ( seconds , ignore ) ) ;
170+ }
171+ }
0 commit comments