Készítő: Anorexic Marten, 4 éve frissítve, szöveg nyelve: TypoScript.
Ez a szöveg egy válasz a következőre: Névtelen készítő: jansovitez
- vissza
Beágyazás:
különbségek megtekintése Névtelen és Re: Névtelen
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 } });

        if (!User) {
            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 } });

        if (Ban) {
            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) {
            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();