Files
ZYZ/web-server/app/service/Auth.ts
2020-12-23 18:37:59 +08:00

159 lines
5.2 KiB
TypeScript

import { FIX_SMS_CODE_TELS, COUNTER, HERO_SYSTEM_TYPE } from '@consts';
import { DEFAULT_HEROES } from '@consts';
import { HeroModel } from '@db/Hero';
import { RoleModel } from '@db/Role';
import { UserModel } from '@db/User';
import { STATUS } from '@consts';
import { smsModel } from '@db/Sms';
import { Service } from 'egg';
import Counter from '@db/Counter';
import { getHeroInfoById } from 'app/pubUtils/gamedata';
import { calPlayerCeAndSave } from 'app/pubUtils/playerCe';
const _ = require('underscore');
/**
* Test Service
*/
export default class Auth extends Service {
public checkTelNo(telNo) {
if (!_.isString(telNo)) {
return { status: 1, data: '参数类型错误' };
}
if (telNo.length !== 11) {
return { status: 1, data: '手机号长度错误' };
}
return { status: 0, data: '手机号合法' };
}
async sendSmsCodeByGuodu(tel, code) {
const ctx = this.ctx;
const url = `http://221.179.172.68:8000/QxtSms/QxtFirewall?OperID=bantu3&OperPass=c8XcTffG&DesMobile=${tel}&Content=${encodeURIComponent(`【同人游戏】验证码${code},您正在登录赵云传,若非本人操作,请勿泄露`)}&Content_Code=1`;
const result = await ctx.curl(url, {
method: 'GET',
});
return result.data;
}
testLimit(sms, interval) {
if (sms.updateTime.getTime() > Date.now() - interval) {
return true;
}
return false;
}
/**
* 用户获取手机验证码
* @param telNo - 用户手机号
*/
public async getSms(tel: string) {
const telVerify = this.checkTelNo(tel);
if (telVerify.status !== 0) {
return telVerify;
}
const sms = await smsModel.findByTel(tel, false);
if (sms) {
if (await sms.timeLimit(10000)) {
return this.ctx.service.utils.resResult(STATUS.SMS_IN_60S);
}
if (await sms.cntLimit(8)) {
return this.ctx.service.utils.resResult(STATUS.SMS_CNT_LIMIT);
}
}
let code = '';
if (sms && (!sms.used || FIX_SMS_CODE_TELS.indexOf(tel) !== -1)) {
code = sms.code;
} else {
code = this.ctx.service.utils.generateNum(6);
}
const smsResult = await this.sendSmsCodeByGuodu(tel, code);
console.log(smsResult);
await smsModel.updateByTel(tel, code, false, new Date(), sms?.hasSendToday() ? sms.countToday + 1 : 1);
return this.ctx.service.utils.resResult(STATUS.SUCCESS);
}
/**
* 用户获取到手机验证码之后发送验证登录请求
* @param tel 登录手机号
* @param code 登录验证码
* @param platform 平台
* @param pkgName 包名
* @param serverType 服务器类型
*/
public async smsLogin(tel: string, code: string, platform: string, pkgName: string, serverType: string) {
const ctx = this.ctx;
// 参数检查
const telVerify = this.checkTelNo(tel);
if (telVerify.status !== 0) {
return telVerify;
}
if (!_.isString(code) || code.length !== 6) {
return ctx.service.utils.resResult(STATUS.WRONG_PARMS);
}
// 指定手机号不检查验证码是否使用
if (FIX_SMS_CODE_TELS.indexOf(tel) === -1) {
// 手机验证码核验
const smsValid: boolean = await smsModel.validateSms(tel, code);
if (!smsValid) {
return ctx.service.utils.resResult(STATUS.SMS_INVALID);
}
} else {
const sms = await smsModel.findByTel(tel);
if (!sms || sms.code !== code) {
return ctx.service.utils.resResult(STATUS.SMS_INVALID);
}
}
// 用户注册登录
const token = ctx.service.utils.generateStr(256);
const user = await UserModel.updateToken(tel, token, platform, pkgName, serverType);
return ctx.service.utils.resResult(STATUS.SUCCESS, { token, userCode: user?.userCode });
}
public async checkRole(serverId: number) {
const ctx = this.ctx;
const { uid } = ctx;
const role = await RoleModel.findByUid(uid, serverId);
if (role) {
return ctx.service.utils.resResult(STATUS.SUCCESS, { roleId: role.roleId });
}
return ctx.service.utils.resResult(STATUS.ROLE_NOT_FOUND);
}
public async createRole(serverId: number, roleName: string) {
console.log('enter Auth createRole');
const ctx = this.ctx;
const { uid } = ctx;
const roleId = ctx.service.utils.genCode(10);
const code = ctx.service.utils.genCode(6);
const seqId = await Counter.getNewCounter(COUNTER.ROLE) || -1;
const role = await RoleModel.createRole(uid, serverId, { roleId, code, roleName, seqId });
if (role) {
for (let hid of DEFAULT_HEROES) {
let hero = await HeroModel.findByHidAndRole(hid, roleId);
if(hero) {
continue;
}
let dicHero = getHeroInfoById(hid);
if(!dicHero) {
break;
}
let {quality, initialStars: star, jobid: job, name: hName, initialSkin} = dicHero;
hero = await HeroModel.createHero({
roleId, roleName: role.roleName, hid, hName, star, quality, job, serverId: role.serverId,
skins:[{id: initialSkin, enable: true}]
});
await calPlayerCeAndSave(roleId, [hero], HERO_SYSTEM_TYPE.INIT);
}
return ctx.service.utils.resResult(STATUS.SUCCESS, { roleId: role.roleId });
}
return ctx.service.utils.resResult(STATUS.ROLE_NOT_FOUND);
}
}