/
player.ts
152 lines (131 loc) · 3.58 KB
/
player.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
import * as alt from 'alt-server';
import * as Athena from '@AthenaServer/api';
const sessionStorage: { [id: string]: { [key: string]: any } } = {};
declare global {
namespace AthenaSession {
export interface Player {
example: boolean;
}
}
}
/**
* Set data for a player's session
*
* This data is not persistent, and automatically clears on disconnect / player destroy
*
* #### Example
* ```ts
* declare global {
* namespace AthenaSession {
* export interface Player {
* myCustomValue: boolean;
* }
* }
* }
*
* Athena.session.player.set(somePlayer, 'myCustomValue', true);
* ```
*
* @param {alt.Player} player
* @param {keyof AthenaSession.Player} key The key you want to put the value under
* @param {AthenaSession.Player[K]} value The value you want to set
*/
export function set<K extends keyof AthenaSession.Player>(
player: alt.Player,
key: keyof AthenaSession.Player,
value: AthenaSession.Player[K],
) {
if (!player || !player.valid) {
return;
}
if (typeof sessionStorage[player.id] === 'undefined') {
sessionStorage[player.id] = {};
}
sessionStorage[player.id][key] = value;
}
/**
* Retrieve data from a player's session storage.
*
* @param {alt.Player} player
* @param {keyof AthenaSession.Player} key The value you want to get from the player.
* @returns {AthenaSession.Player[K]}
*/
export function get<K extends keyof AthenaSession.Player>(
player: alt.Player,
key: K,
): AthenaSession.Player[K] | undefined {
if (!player || !player.valid) {
return undefined;
}
if (typeof sessionStorage[player.id] === 'undefined') {
return undefined;
}
return sessionStorage[player.id][key];
}
/**
* Returns true, if it has any value set for a given key.
*
* @export
* @param {alt.Player} player
* @param {keyof AthenaSession.Player} key
*/
export function has(player: alt.Player, key: keyof AthenaSession.Player) {
if (!player || !player.valid) {
return false;
}
if (typeof sessionStorage[player.id] === 'undefined') {
return false;
}
return typeof sessionStorage[player.id][key] !== 'undefined' ? true : false;
}
/**
* Clear a key from the player.
*
* @export
* @param {alt.Player} player
* @param {string} key
*/
export function clearKey(player: alt.Player | number, key: keyof AthenaSession.Player) {
if (player instanceof alt.Player) {
if (!player || !player.valid) {
return;
}
player = player.id;
}
if (typeof sessionStorage[player] === 'undefined') {
return;
}
delete sessionStorage[player][key];
}
/**
* Clear all keys, and remove all data for a session.
*
* @export
* @param {alt.Player} player
*/
export function clearAll(player: alt.Player) {
if (!player || typeof player.id === 'undefined') {
return;
}
if (typeof sessionStorage[player.id] === 'undefined') {
return;
}
if (sessionStorage[player.id]['athena-document-character-data']) {
Athena.player.events.trigger(
'player-disconnected',
undefined,
sessionStorage[player.id]['athena-document-character-data'],
);
}
delete sessionStorage[player.id];
}
/**
* Get all player's that have a specific key.
*
* @export
* @param {string} key
*/
export function getAll<K extends keyof AthenaSession.Player>(key: K): Array<AthenaSession.Player[K]> {
return Object.values(sessionStorage).filter((x) => x[key]) as Array<AthenaSession.Player[K]>;
}
alt.on('playerDisconnect', clearAll);