import * as alt from 'alt-server';
import * as yup from 'yup';
import bcrypt from 'bcryptjs';
const { genSalt, hash } = bcrypt;
import { ServerCallback } from '../helpers/Callback';
import { Positions } from '../config/Positions';
// DTO
import { UserEntity } from '../entities/User';
import { BanEntity } from '../entities/Ban';
import { EVENTS } from '../../shared/enums/Events';
import { setLocalMeta } from '../helpers/Player/Meta';
import { randomPositionAround } from '../../shared/utility/Vector';
import { ADMIN_PERMISSIONS } from '../../shared/enums/Admin';
const AuthLoginSchema = yup.object().shape({
username: yup.string().required().min(4).max(16),
password: yup.string().required().min(6).max(32),
});
const AuthRegistrationSchema = yup.object().shape({
username: yup.string().required().min(4).max(16),
password: yup.string().required().min(6).max(32),
});
interface LoginCredentials {
username: string;
password: string;
}
interface RegisterCredentials {
username: string;
password: string;
email: string;
}
export class Auth {
constructor() {
new ServerCallback(EVENTS.AUTH_LOGIN, this.onLogin, AuthLoginSchema);
new ServerCallback(EVENTS.AUTH_REGISTER, this.onRegister, AuthRegistrationSchema);
}
private async onLogin(player: alt.Player, done, { username, password }: LoginCredentials) {
const User = await UserEntity.findOne({ where: { username } });
done({
success: false,
error: 'user_not_found',
});
return;
}
const hashedPassword = await hash(password, User.salt);
if (User
.password
!= hashedPassword
) {
done({ success: false, error: 'incorrect_password' });
return;
}
if (User
.socialId
!= player
.socialID
) {
done({ success: false, error: 'socialid_mismatch' });
return;
}
const Ban = await BanEntity.findOne({ where: { username, socialId: player.socialID } });
player.kick(
`You have been banned by ${Ban.admin}!\nReason: ${Ban.reason}\nBan date:${Ban.ban_date}\nExpiration date: ${Ban.expire_date}`
);
return;
}
player.setMeta('logged', true);
player.setSyncedMeta('logged', true);
setLocalMeta(player, 'inQueue', false);
player.setMeta('admin', ADMIN_PERMISSIONS[User.admin]);
player.setSyncedMeta('admin', ADMIN_PERMISSIONS[User.admin]);
setLocalMeta(player, 'stats', User.stats);
setLocalMeta(player, 'skins', User.skins);
setLocalMeta(player, 'vehicles', User.vehicles);
setLocalMeta(player, 'weapons', User.weapons);
const { x, y, z } = randomPositionAround(Positions.LOBBY_POSITION, 10);
const lobbySkin = Object.keys(User.skins.runner).find((x) => User.skins.runner[x] === true);
player.model = lobbySkin;
player.spawn(x, y, z, 0);
player.maxHealth = 200;
done({ success: true });
}
private async onRegister(player: alt.Player, done, { username, password, email }: RegisterCredentials) {
const HasUser = await UserEntity.findOne({ where: { username, socialId: player.socialID, email } });
if (HasUser
.username
== username
) done
({ success
: false, error
: 'username_already_taken'
});
if (HasUser
.email
== email
) done
({ success
: false, error
: 'email_already_associated_with_account'
});
if (HasUser
.socialId
== player
.socialID
)
done({ success: false, error: 'socialid_already_associated_with_account' });
return;
}
const salt = await genSalt(6),
hashedPassword = await hash(password, salt);
UserEntity.insert({
username,
password: hashedPassword,
salt,
socialId: player.socialID,
email,
})
.then((result) => done({ success: true }))
.catch((error) => {
console.log(error);
done({ success: false, error: 'idk' });
});
}
}
new Auth();