discord-client/webpack/page/noauth/login.js

149 lines
3.0 KiB
JavaScript
Raw Normal View History

2018-03-25 11:59:33 +00:00
/* (1) Initialise
---------------------------------------------------------*/
/* (1) Default data structure */
gs.set('login', {
// fields
username: {
model: '',
timeout: '',
error: '',
validate: (_username) => /^[a-z0-9_-]{3,20}$/i.test(_username)
},
2018-03-25 11:59:33 +00:00
password: {
model: '',
timeout: '',
error: '',
validate: (_password) => /^[^<>\/\\]{8,50}$/.test(_password)
},
// functions
func: {
print_err(_field, _message, _duration){},
login(){},
forgot_pass(){},
press_enter(){}
2018-03-25 11:59:33 +00:00
}
});
/* (2) Manage error messages
*
* @_field<String> Field to print errors to
* @_message<String> Error message to print
* @_duration<int> Durations (sec) for the message to be displayed
*
---------------------------------------------------------*/
gs.get.login.func.print_err = function(_field, _message='error', _duration=null){
/* (1) Fail: invalid _field */
if( typeof _field !== 'string' || this[_field] == null )
return false;
/* (2) Fail: invalid _message */
if( typeof _message !== 'string' )
return false;
/* (3) Fail: invalid _message */
if( isNaN(_duration) )
return false;
/* (4) Clear timeout if exists */
!isNaN(this[_field].err_to) && clearTimeout(this[_field].err_to);
/* (5) Display error */
this[_field].error = _message;
/* (6) No timeout if _duration if null */
if( _duration === null )
return true;
/* (7) Setup Timeout */
this[_field].err_to = setTimeout( function(){
this.error = '';
}.bind(this[_field]), _duration*1000);
return true;
}.bind(gs.get.login);
/* (3) Login attempt
*
---------------------------------------------------------*/
gs.get.login.func.login = function(){
/* (1) Cache fields' values */
let username = this.username.model;
let password = this.password.model;
/* (2) Manage errors */
let errors = false;
// username error
if( !this.username.validate(username) ){
errors = true;
this.func.print_err('username', '3 characters are required: letters, numbers, dot');
2018-03-25 11:59:33 +00:00
}else
this.func.print_err('username', '', 0);
// password error
if( !this.password.validate(password) ){
errors = true;
this.func.print_err('password', '8 characters are required');
2018-03-25 11:59:33 +00:00
}else
this.func.print_err('password', '', 0);
// if errors -> fail
if( errors )
return false;
/* (3) API bindings */
2018-03-27 14:34:30 +00:00
api.call('GET /user/token', {}, function(rs){
2018-03-27 12:52:14 +00:00
2018-03-25 11:59:33 +00:00
// manage error
if( rs.error !== 0 || rs.token == null ){
this.func.print_err('username', 'Invalid combination');
this.func.print_err('password', 'Invalid combination');
return;
}
// store TOKEN + user data
auth.token = rs.token;
auth.user = {
uid: null, // todo
username: username
};
2018-03-25 11:59:33 +00:00
document.location = '';
}.bind(this), encodeURI(`${username}:${password}`));
2018-03-25 11:59:33 +00:00
}.bind(gs.get.login);
/* (4) Manage pressing on enter
*
---------------------------------------------------------*/
gs.get.login.func.press_enter = function(e){
// if enter -> launch login
if( e.keyCode === 13 )
this.func.login();
2018-03-25 11:59:33 +00:00
}.bind(gs.get.login);