@tf2pickup-org/mumble-client
Version:
A simple bot for managing mumble servers
53 lines • 1.77 kB
JavaScript
import { UserRemove, UserState } from '@tf2pickup-org/mumble-protocol';
import { filterPacket } from './rxjs-operators/filter-packet.js';
import { User } from './user.js';
export class UserManager {
client;
_users = new Map();
constructor(client) {
this.client = client;
this.client.on('socketConnect', (socket) => {
this._users.clear();
socket.packet.pipe(filterPacket(UserState)).subscribe(userState => {
this.syncUser(userState);
});
socket.packet.pipe(filterPacket(UserRemove)).subscribe(userRemove => {
this.removeUser(userRemove);
});
});
}
bySession(session) {
return this._users.get(session);
}
byName(name) {
return Array.from(this._users.values()).find(u => u.name === name);
}
findAll(predicate) {
return Array.from(this._users.values()).filter(predicate);
}
syncUser(userState) {
if (userState.session === undefined) {
return;
}
let user = this.bySession(userState.session);
if (!user) {
user = new User(this.client, userState);
this._users.set(user.session, user);
this.client.emit('userCreate', user);
}
else {
const changes = user.syncState(userState);
if (Object.keys(changes).length > 0) {
this.client.emit('userUpdate', user, changes);
}
}
}
removeUser(userRemove) {
const user = this.bySession(userRemove.session);
if (user) {
this._users.delete(userRemove.session);
this.client.emit('userRemove', user);
}
}
}
//# sourceMappingURL=user-manager.js.map