Convert Presence to TS
Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
parent
a94c899c0a
commit
9cfc075d68
1 changed files with 31 additions and 29 deletions
|
@ -19,30 +19,34 @@ limitations under the License.
|
||||||
import {MatrixClientPeg} from "./MatrixClientPeg";
|
import {MatrixClientPeg} from "./MatrixClientPeg";
|
||||||
import dis from "./dispatcher/dispatcher";
|
import dis from "./dispatcher/dispatcher";
|
||||||
import Timer from './utils/Timer';
|
import Timer from './utils/Timer';
|
||||||
|
import {ActionPayload} from "./dispatcher/payloads";
|
||||||
|
|
||||||
// Time in ms after that a user is considered as unavailable/away
|
// Time in ms after that a user is considered as unavailable/away
|
||||||
const UNAVAILABLE_TIME_MS = 3 * 60 * 1000; // 3 mins
|
const UNAVAILABLE_TIME_MS = 3 * 60 * 1000; // 3 mins
|
||||||
const PRESENCE_STATES = ["online", "offline", "unavailable"];
|
|
||||||
|
enum State {
|
||||||
|
Online = "online",
|
||||||
|
Offline = "offline",
|
||||||
|
Unavailable = "unavailable",
|
||||||
|
}
|
||||||
|
|
||||||
class Presence {
|
class Presence {
|
||||||
constructor() {
|
private unavailableTimer: Timer = null;
|
||||||
this._activitySignal = null;
|
private dispatcherRef: string = null;
|
||||||
this._unavailableTimer = null;
|
private state: State = null;
|
||||||
this._onAction = this._onAction.bind(this);
|
|
||||||
this._dispatcherRef = null;
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Start listening the user activity to evaluate his presence state.
|
* Start listening the user activity to evaluate his presence state.
|
||||||
* Any state change will be sent to the homeserver.
|
* Any state change will be sent to the homeserver.
|
||||||
*/
|
*/
|
||||||
async start() {
|
public async start() {
|
||||||
this._unavailableTimer = new Timer(UNAVAILABLE_TIME_MS);
|
this.unavailableTimer = new Timer(UNAVAILABLE_TIME_MS);
|
||||||
// the user_activity_start action starts the timer
|
// the user_activity_start action starts the timer
|
||||||
this._dispatcherRef = dis.register(this._onAction);
|
this.dispatcherRef = dis.register(this.onAction);
|
||||||
while (this._unavailableTimer) {
|
while (this.unavailableTimer) {
|
||||||
try {
|
try {
|
||||||
await this._unavailableTimer.finished();
|
await this.unavailableTimer.finished();
|
||||||
this.setState("unavailable");
|
this.setState(State.Unavailable);
|
||||||
} catch (e) { /* aborted, stop got called */ }
|
} catch (e) { /* aborted, stop got called */ }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -50,14 +54,14 @@ class Presence {
|
||||||
/**
|
/**
|
||||||
* Stop tracking user activity
|
* Stop tracking user activity
|
||||||
*/
|
*/
|
||||||
stop() {
|
public stop() {
|
||||||
if (this._dispatcherRef) {
|
if (this.dispatcherRef) {
|
||||||
dis.unregister(this._dispatcherRef);
|
dis.unregister(this.dispatcherRef);
|
||||||
this._dispatcherRef = null;
|
this.dispatcherRef = null;
|
||||||
}
|
}
|
||||||
if (this._unavailableTimer) {
|
if (this.unavailableTimer) {
|
||||||
this._unavailableTimer.abort();
|
this.unavailableTimer.abort();
|
||||||
this._unavailableTimer = null;
|
this.unavailableTimer = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,14 +69,14 @@ class Presence {
|
||||||
* Get the current presence state.
|
* Get the current presence state.
|
||||||
* @returns {string} the presence state (see PRESENCE enum)
|
* @returns {string} the presence state (see PRESENCE enum)
|
||||||
*/
|
*/
|
||||||
getState() {
|
public getState() {
|
||||||
return this.state;
|
return this.state;
|
||||||
}
|
}
|
||||||
|
|
||||||
_onAction(payload) {
|
private onAction = (payload: ActionPayload) => {
|
||||||
if (payload.action === 'user_activity') {
|
if (payload.action === 'user_activity') {
|
||||||
this.setState("online");
|
this.setState(State.Online);
|
||||||
this._unavailableTimer.restart();
|
this.unavailableTimer.restart();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,13 +85,11 @@ class Presence {
|
||||||
* If the state has changed, the homeserver will be notified.
|
* If the state has changed, the homeserver will be notified.
|
||||||
* @param {string} newState the new presence state (see PRESENCE enum)
|
* @param {string} newState the new presence state (see PRESENCE enum)
|
||||||
*/
|
*/
|
||||||
async setState(newState) {
|
private async setState(newState: State) {
|
||||||
if (newState === this.state) {
|
if (newState === this.state) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (PRESENCE_STATES.indexOf(newState) === -1) {
|
|
||||||
throw new Error("Bad presence state: " + newState);
|
|
||||||
}
|
|
||||||
const oldState = this.state;
|
const oldState = this.state;
|
||||||
this.state = newState;
|
this.state = newState;
|
||||||
|
|
Loading…
Reference in a new issue