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); } }