discord-client/webpack/init/channels.js

190 lines
4.1 KiB
JavaScript

/* (1) Initialisation
---------------------------------------------------------*/
/* (1) Init @channel object */
gs.set('channel', {});
/* (2) Set default active channel */
gs.get.channel.current = null;
/* (3) Initialize list */
gs.get.channel.list = [
{ id: -1, link: 'me', label: 'My data', sub: '0 online', icon: 'group', local: [] },
{ id: -2, link: null, label: 'add', sub: null, icon: 'add', local: [], add: 1 }
];
/* (4) Initialize vue-router channel navigation */
gs.get.channel.nav = function(){};
/* (5) Initialize adding fetched channel */
gs.get.channel.dump = function(){};
/* (6) Initialize accessor for channel data */
gs.get.channel.get = function(){};
/* (7) Initialize room loader */
gs.get.channel.open = function(){};
/* (2) Channel navigation
*
* @channel_id<int> Channel id (NULL uses get())
*
* @return status<boolean> Whether the navigation has been successful
*
---------------------------------------------------------*/
gs.get.channel.nav = function(channel_id=null){
/* (1) Get channel data */
var channel = this.get(channel_id);
/* (2) Abort if same channel */
// if( gs.get.router.history.current.params.link === channel.link )
// return false;
/* (3) Navigate vue-router */
gs.get.router.push(`/channel/${channel.link}`);
/* (4) Update active element */
this.current = channel.id;
/* (5) Log channel */
console.log(`[channel.current] ${channel.link} (${channel.label})`);
return true;
};
/* (3) Dump/Update channel data
*
* @channels<array> Channels data
*
* @return udpated<boolean> Whether channels have been updated
*
---------------------------------------------------------*/
gs.get.channel.dump = function(channels){
/* (1) Check @channels type */
if( !(channels instanceof Array) )
return false;
/* (2) Store LAST item */
let last_item = this.list.pop();
/* (3) Clear list (except FIRST) */
this.list.splice(1);
/* (4) Apply new channels */
for(let c of channels)
this.list.push(c);
/* (5) Restore LAST */
this.list.push(last_item);
return true;
};
/* (4) Get channel data
*
* @channel_id<int> Channel ID
* NULL: current channel || from URL (and set current)
*
* @return channel<array> Channel data
*
---------------------------------------------------------*/
gs.get.channel.get = function(channel_id=null){
if( channel_id === null ){
/* (1) Get @current channel
---------------------------------------------------------*/
/* (1) If @current is set */
if( !isNaN(this.current) ){
/* (2) Return matching id in list */
for( let c of this.list ){
if( c.id === this.current )
return c; // exit point
}
}
/* (2) Get from URL
---------------------------------------------------------*/
/* (1) If vue-router has @link param */
if( gs.get.router.history.current.params.link ){
/* (2) Extract @link */
let link = gs.get.router.history.current.params.link;
/* (3) Return matching link in list */
for( let c of this.list ){
if( c.link === link ){
this.current = c.id; // set @current
return c; // exit point
}
}
}
}
/* (3) Get channel data
---------------------------------------------------------*/
/* (1) Return channel matching id */
for( let c of this.list )
if( c.id === channel_id )
return c; // exit point
/* (2) Return default: if ID not found */
this.current = this.list[0].id;
return this.list[0];
}
/* (5) Open a room
*
* @type<String> Room type (text, voice, video)
* @id<int> Room id
*
---------------------------------------------------------*/
gs.get.channel.open = function(type=null, id=null){
let error = function(type){ this.get().room[type].active = null; }.bind(this, type);
/* (1) Get current channel */
let channel = this.get();
/* (2) Manage invalid @type */
if( typeof type !== 'string' || !channel.room.hasOwnProperty(type) )
return false;
/* (3) Exit if invalid @id */
let room = channel.room[type].list[id];
if( !room )
return false;
/* (4) Close last room */
/* (5) Open new room */
/* (6) Update @active room */
channel.room[type].active = id;
console.log(`open(${type}, ${id})`, channel.id);
};