Home Reference Source Repository

src/database/usable-channel.js

'use babel';
'use strict';

import bot from '../';
import Util from '../util';

export default class UsableChannel {
	static loadDatabase() {
		this.serversMap = JSON.parse(bot.storage.getItem('allowed-channels'));
		if(!this.serversMap) this.serversMap = {};
	}

	static saveDatabase() {
		bot.logger.debug('Saving channels storage...', this.serversMap);
		bot.storage.setItem('allowed-channels', JSON.stringify(this.serversMap));
	}

	static save(channel) {
		if(!channel) throw new Error('A channel must be specified.');
		if(!this.serversMap) this.loadDatabase();
		if(!this.serversMap[channel.server.id]) this.serversMap[channel.server.id] = [];
		const serverChannels = this.serversMap[channel.server.id];

		if(!serverChannels.includes(channel.id)) {
			serverChannels.push(channel.id);
			bot.logger.info('Added new channel.', this.basicInfo(channel));
			this.saveDatabase();
			return true;
		} else {
			bot.logger.info('Not adding channel, because it already exists.', this.basicInfo(channel));
			return false;
		}
	}

	static delete(channel) {
		if(!channel) throw new Error('A channel must be specified.');
		if(!this.serversMap) this.loadDatabase();
		if(!this.serversMap[channel.server.id]) return false;
		const serverChannels = this.serversMap[channel.server.id];

		const roleIndex = serverChannels.findIndex(element => element === channel.id);
		if(roleIndex >= 0) {
			serverChannels.splice(roleIndex, 1);
			bot.logger.info('Deleted channel.', this.basicInfo(channel));
			this.saveDatabase();
			return true;
		} else {
			bot.logger.info('Not deleting channel, because it doesn\'t exist.', this.basicInfo(channel));
			return false;
		}
	}

	static clearServer(server) {
		if(!server) throw new Error('A server must be specified.');
		if(!this.serversMap) this.loadDatabase();
		delete this.serversMap[server.id];
		bot.logger.info('Cleared channels.', { server: server.name, serverID: server.id });
		this.saveDatabase();
	}

	static findInServer(server, searchString = null) {
		if(!server) throw new Error('A server must be specified.');
		if(!this.serversMap) this.loadDatabase();
		if(!this.serversMap[server.id]) return [];

		// Find all of the server's channels that match, and filter them to ones that are usable channels
		const channels = Util.search(server.channels.getAll('type', 'text'), searchString, { searchExact: false }).filter(channel => this.serversMap[server.id].includes(channel.id));
		return Util.search(channels, searchString, { searchInexact: false });
	}

	static serverHasAny(server) {
		if(!server) throw new Error('A server must be specified.');
		if(!this.serversMap) this.loadDatabase();
		return this.serversMap[server.id] && this.serversMap[server.id].length > 0;
	}

	static serverHas(server, channel) {
		if(!server || !channel) throw new Error('A server and channel must be specified.');
		if(!this.serversMap) this.loadDatabase();
		return this.serversMap[server.id] && this.serversMap[server.id].includes(channel.id);
	}

	static basicInfo(channel) {
		return { id: channel.id, name: channel.name, server: channel.server.name, serverID: channel.server.id };
	}
}