discord-client/webpack/lib/channel-controller.js

230 lines
4.5 KiB
JavaScript
Raw Normal View History

export default class ChannelController{
2018-03-22 13:57:03 +00:00
/* (1) Construct default attributes
*
---------------------------------------------------------*/
constructor(){
/* (1) Set default active channel */
this.current = null;
/* (2) Initialize channel list */
this.list = [];
/* (3) Current channel buffer */
this._buffer = {};
2018-03-22 13:57:03 +00:00
}
/* (2) Channel navigation
*
* @channel_id<int> Channel id (NULL uses get())
*
* @return status<boolean> Whether the navigation has been successful
*
---------------------------------------------------------*/
nav(channel_id=null){
2018-03-22 13:57:03 +00:00
console.log(`channel.nav(${channel_id})`);
/* (1) Get channel data */
var channel = this.get(channel_id);
2018-03-27 16:21:02 +00:00
/* (2) Navigate vue-router */
2018-03-22 13:57:03 +00:00
gs.get.router.push(`/channel/${channel.link}`);
/* (3) Update current id */
2018-03-22 13:57:03 +00:00
this.current = channel.id;
/* (4) Update buffer */
this._buffer = {};
for( let c of this.list )
if( c.id === this.current )
this._buffer = c;
/* (5) Load rooms */
gs.get.room.fetch();
/* (6) Log channel */
2018-03-22 13:57:03 +00:00
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
*
---------------------------------------------------------*/
dump(channels){
console.log(`channel.dump([${channels instanceof Array?channels.length:0}])`);
/* (1) Check @channels type */
if( !(channels instanceof Array) )
return false;
/* (2) Clear list () */
this.list.splice(0);
2018-03-22 13:57:03 +00:00
/* (3) Apply new channels */
for(let c of channels){
2018-03-22 13:57:03 +00:00
// add 'users' field (will be filled by GET channel/cid)
c.users = [];
2018-03-22 13:57:03 +00:00
this.list.push(c);
2018-03-22 13:57:03 +00:00
}
2018-03-27 16:21:02 +00:00
2018-03-22 13:57:03 +00:00
return true;
}
/* (4) Get channel data
*
* @channel_id<int> Channel ID
* NULL: current channel || from URL (and set current)
*
* @return channel<array> Channel data
*
---------------------------------------------------------*/
get(channel_id=null){
// console.log(`channel.get(${channel_id})`);
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];
}
2018-03-27 16:21:02 +00:00
/* (6) Fetch channel data
2018-03-22 13:57:03 +00:00
*
2018-03-27 16:21:02 +00:00
---------------------------------------------------------*/
fetch(){
api.call('GET /channel', {}, function(rs){
/* (1) Check errors */
if( rs.error !== 0 || rs.channels == null )
return;
/* (2) Dump data */
this.dump(rs.channels);
/* (3) Find if @link matches */
var redirect_id = null;
for( let c of this.list ){
if( c.link === window.initial_link ){
redirect_id = c.id;
break;
}
}
/* (4) Emulate navigatation from URL */
console.log(`[restore.channel] ${redirect_id}`);
this.nav(redirect_id);
}.bind(this), auth.token);
}
/* (7) Create a new channel
2018-03-22 13:57:03 +00:00
*
2018-03-27 16:21:02 +00:00
* @name<String> channel name
* @link<String> channel URI link
*
* @return created<bool> Whether the channel has been created
2018-03-22 13:57:03 +00:00
*
---------------------------------------------------------*/
2018-03-27 16:21:02 +00:00
create(name=null, link=null){
2018-03-22 13:57:03 +00:00
2018-03-27 16:21:02 +00:00
/* (1) Manage invalid @link */
if( typeof link !== 'string' )
2018-03-22 13:57:03 +00:00
return false;
2018-03-27 16:21:02 +00:00
/* (2) Manage invalid @name */
if( typeof name !== 'string' )
2018-03-27 16:21:02 +00:00
return false;
/* (3) Try to create room in API */
api.call('POST /channel', { link: link, name: name }, function(rs){
/* (1) Hide popup */
gs.get.popup.hide();
/* (2) Manage error */
2018-03-27 16:21:02 +00:00
if( rs.error !== 0 || rs.cid == null )
return false;
/* (3) Reload channel list */
2018-03-27 16:21:02 +00:00
this.fetch();
2018-03-22 13:57:03 +00:00
}.bind(this), auth.token);
2018-03-22 13:57:03 +00:00
return true;
}
}