104 lines
2.9 KiB
TypeScript
104 lines
2.9 KiB
TypeScript
import ChannelBase from './channels/channelBase';
|
|
import ClientBase from './clients/clientBase';
|
|
import MHSClient from './clients/sites/mhsClient';
|
|
import MHSChannel from './channels/sites/mhsChannel';
|
|
|
|
var logger = require('./logger');
|
|
|
|
class ChannelManager {
|
|
channels: any = [];
|
|
|
|
constructor() {
|
|
// create default channel...
|
|
var channel: ChannelBase = new ChannelBase('default');
|
|
this.channels.push(channel);
|
|
}
|
|
|
|
createChannel(data: any) {
|
|
var channelExists: ChannelBase|MHSChannel|null = this.channelExists(data.channel);
|
|
var channel: ChannelBase|MHSChannel;
|
|
|
|
if (channelExists) {
|
|
channel = channelExists;
|
|
logger.accessLog.info(`Channel already exists: ${channel.id}`);
|
|
} else {
|
|
channel = this.createByChannelType(data);
|
|
this.channels.push(channel);
|
|
logger.accessLog.info(`Added channel to channel manager: ${channel.id}`);
|
|
}
|
|
|
|
return channel;
|
|
}
|
|
|
|
channelExists(channel_id: string) {
|
|
for (let channel of this.channels) {
|
|
if (channel.id == channel_id) {
|
|
return channel;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
addClientToChannel(client: ClientBase|MHSClient, channel_id: string) {
|
|
var channel: ChannelBase|MHSChannel|null = this.channelExists(channel_id);
|
|
|
|
if (channel) {
|
|
channel.addClient(client);
|
|
client.connectToChannel(channel);
|
|
return {'status': 'success'};
|
|
} else {
|
|
logger.accessLog.info(`channel with id ${channel_id} does not exist.`);
|
|
return {'status': 'notice', 'message': `channel with id ${channel_id} does not exist.`};
|
|
}
|
|
}
|
|
|
|
createByChannelType(data: any) {
|
|
try {
|
|
var Channel = require(`./channels/${data.client_type}s/${data.client}channel`);
|
|
logger.accessLog.info(`attempting to create channel of type ${data.client}, channel id: ${data.channel}...`);
|
|
return new Channel(data.channel);
|
|
} catch (e) {
|
|
logger.errorLog.info(e);
|
|
logger.accessLog.info(`creating base channel: ${data.channel}`);
|
|
return new ChannelBase(data.channel);
|
|
}
|
|
}
|
|
|
|
removeClientFromChannel(client_id: number, channel_id: string) {
|
|
var index: number = 0;
|
|
|
|
for (let channel of this.channels) {
|
|
if (channel.id == channel_id) {
|
|
this.channels.splice(index, 1);
|
|
if (channel.removeClient(client_id)) {
|
|
logger.accessLog.info(`client removed from channel - channel: ${channel_id}, client: ${client_id}`);
|
|
return true;
|
|
} else {
|
|
logger.errorLog.info(`client not removed from channel, or doesn't exist in channel - channel: ${channel_id}, client: ${client_id}`);
|
|
return false
|
|
}
|
|
}
|
|
|
|
index++;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
purgeEmptyChannels() {
|
|
var index = 0
|
|
|
|
for (let channel of this.channels) {
|
|
if (channel.clients.length == 0 && channel.id != 'default') {
|
|
this.channels.splice(index, 1);
|
|
logger.accessLog.info(`channel removed: ${channel.id}`);
|
|
}
|
|
|
|
index++;
|
|
}
|
|
}
|
|
};
|
|
|
|
export default ChannelManager;
|