import { RewardInter, pushMail, mailData } from "../pubUtils/interface"; import { MailModel, MailType } from "../db/Mail"; import { getRoleOnlineInfo } from "./redisService"; import { pinus } from "pinus"; import { gameData } from "../pubUtils/data"; import { nowSeconds } from '../pubUtils/timeUtil'; import { STATUS } from '../consts/statusCode'; import { resResult } from '../pubUtils/util'; import { GroupMailModel, GroupMailType } from "../db/GroupMail"; import { findWhere } from "underscore"; import { MAIL_TYPE, MAIL_TEM_TYPE, GM_MAIL_TYPE, MAIL_STATUS } from "../consts/constModules/mailConst"; import { DATA_NAME } from '../consts/dataName'; import { lockData } from './redLockService'; /** * 下发邮件 * @param operate * @param toRoleId * @param sendName * @param params * @param goods * @param sendTime */ export async function sendMail(operate: number, toRoleId: string, sendName: string = '系统', params: string[] = [], goods: RewardInter[] = [], sendTime: number = nowSeconds()) { let { content, time } = getContent(operate, params); if (!content) return; let mail = await MailModel.addMail({roleId: toRoleId, sendTime, goods, sendName, mailId: JSON.stringify(operate), endTime: time + nowSeconds(), mailTemType: MAIL_TEM_TYPE.GAMEMAIL, params}); let hisOnlineInfo = await getRoleOnlineInfo(toRoleId); if(hisOnlineInfo.isOnline) { let sid = hisOnlineInfo.sid; if (!!sid) {//下发邮件,对应前端红点提示 pinus.app.channelService.pushMessageByUids('onMailsAdd', resResult(STATUS.SUCCESS, { mails:[{ id: mail._id, goods, sendTime: mail.sendTime, endTime: mail.endTime, content, status: mail.status, mailType: MAIL_TYPE.SINGLEMAIL, sendName }]}), [{uid: toRoleId, sid}]); } } } /** * 封装玩家的邮件内容 * @param operate * @param params */ export function getContent(operate: number, params: string[]) { let mail = gameData.mail.get(operate); if (!mail) return {}; let { content, time } = mail; content = content||'%d'; for(let p of params) { content = content.replace(/%d/, p); } return { content, time } } /** * 封装获得邮件的下发信息,以及需要添加的邮件信息 * @param roleId * @param operate * @param params * @param goods * @param mails * @param pushMessage * @param sendTime * @param sendName */ export async function getMailContent(roleId: string, operate: number, params: string[], goods: RewardInter[], mails: MailType[], pushMessage: pushMail[], sendTime?:number, sendName: string = '系统') { const doc = new MailModel(); let { content, time } = getContent(operate, params); if (!content) return; const mail = Object.assign(doc.toJSON(), { roleId, goods, sendName, mailId: operate, sendTime: sendTime||nowSeconds(), mailTemType: MAIL_TEM_TYPE.GAMEMAIL, endTime: time + nowSeconds(), params }); mails.push(mail); let hisOnlineInfo = await getRoleOnlineInfo(roleId); if(hisOnlineInfo.isOnline) { let sid = hisOnlineInfo.sid; if (!!sid) { pushMessage.push({route: 'onMailsAdd', data:[{ id: mail._id, goods, sendTime: mail.sendTime, endTime: mail.endTime, content, status: mail.status, mailType: MAIL_TYPE.SINGLEMAIL, sendName }], uids: [{ uid: roleId, sid }]}); } } } /** * 检查上次刷新过后至今 gm后台是否有新邮件下发给玩家 * @param roleId * @param sid * @param serverId * @param updatedMailAt */ export async function refreshMails(roleId: string, sid: string, serverId: number, updatedMailAt: number) { let res:any = await lockData(serverId, DATA_NAME.GAMEMAIL, roleId);//加锁 let gmMails = await pinus.app.rpc.gm.gmRemote.getMailsByTime.toServer('gm-server-1', updatedMailAt, serverId); let addGroupMails: GroupMailType[] = []; let addMails: MailType[] = []; let updateMails: mailData[] = []; let pushMails: mailData[] = []; for (let { gmMailType, id: mailId, sendRoles, endTime, content, goods, sendTime, sendName } of gmMails) { if (gmMailType == GM_MAIL_TYPE.GROUPMAIL) { //检查gm群体邮件是否需要加入 let mail = await GroupMailModel.getMail(mailId, MAIL_TEM_TYPE.GMTYPE); if (!mail) { const doc = new GroupMailModel(); const mail = Object.assign(doc.toJSON(), { mailId, mailTemType: MAIL_TEM_TYPE.GMTYPE, sendRoles, sendName }); addGroupMails.push(mail); pushMails.push({ id: mail._id, goods, sendTime, endTime, content, status: mail.status, mailType: MAIL_TYPE.GROUPMAIL, sendName }); } else { let { sendRoles } = mail; let sendRole = findWhere(sendRoles, {roleId}); if (!sendRole) { await GroupMailModel.pushRoleMail(roleId, mailId, MAIL_TEM_TYPE.GMTYPE); pushMails.push({ id: mail._id, goods, sendTime, endTime, content, status: MAIL_STATUS.CREATE, mailType: MAIL_TYPE.GROUPMAIL, sendName }); } } } else if (gmMailType == GM_MAIL_TYPE.SERVER) { //检查gm服邮件是否需要加入 let mail = await MailModel.getMail(roleId, mailId, MAIL_TEM_TYPE.GMTYPE); if (!mail) { const doc = new MailModel(); const mail = Object.assign(doc.toJSON(), { mailId, mailTemType: MAIL_TEM_TYPE.GMTYPE, roleId, sendName }); addMails.push(mail); pushMails.push({ id: mail._id, goods, sendTime, endTime, content, status: mail.status, mailType: MAIL_TYPE.SINGLEMAIL, sendName }); } else { //若加入过,可能修改过奖励内容等信息,更新一下邮件的内容 updateMails.push({ id: mail._id, goods, sendTime, endTime, content, status: mail.status, mailType: MAIL_TYPE.SINGLEMAIL, sendName }) } } } if (!!updateMails.length) {//下发邮件修改推送 pinus.app.channelService.pushMessageByUids('onMailsUpdate', resResult(STATUS.SUCCESS, { mails: updateMails }), [{uid: roleId, sid}]); } if (!!addGroupMails.length) { await GroupMailModel.addGroupMails(addGroupMails); } if (!!addMails.length) { await MailModel.addMails(addMails); } if (!!pushMails.length) { pinus.app.channelService.pushMessageByUids('onMailsAdd', resResult(STATUS.SUCCESS, { mails: pushMails}), [{uid: roleId, sid}]);//下发邮件,对应前端红点提示 }//下发邮件,对应前端红点提示 res.releaseCallback(); return nowSeconds(); } /** * 获取邮件信息,gm邮件需要从gm-server-1缓存中读取 * @param roleId * @param serverId */ export async function getMails(roleId: string, serverId: number) { let mails = await MailModel.getMailsByRoleId(roleId)||[]; let groupMails = await GroupMailModel.getGroupMailsByRoleId(roleId)||[]; let list: mailData[] = await pinus.app.rpc.gm.gmRemote.getMailInfos.toServer('gm-server-1', roleId, serverId, mails, groupMails); return list; } /** * 下发gm邮件的群体邮件 * @param mails */ export async function sendRolesMails(mails) { let addGroupMails: GroupMailType[] = []; let pushMessage: pushMail[] = []; for (let { gmMailType, id: mailId, sendRoles, endTime, content, goods, sendTime, sendName } of mails) { let uids = []; if (endTime < nowSeconds()|| sendTime > nowSeconds()) continue; if (gmMailType != GM_MAIL_TYPE.GROUPMAIL) //不是群体邮件说明是全服邮件,不进行下发 return; let mail = await GroupMailModel.getMail(mailId, MAIL_TEM_TYPE.GMTYPE); if (!mail) { const doc = new GroupMailModel(); mail = Object.assign(doc.toJSON(), { mailId, mailTemType: MAIL_TEM_TYPE.GMTYPE, sendRoles, sendName }); addGroupMails.push(mail); } else { return; } for (let { roleId } of sendRoles) { let hisOnlineInfo = await getRoleOnlineInfo(roleId); if(hisOnlineInfo.isOnline && hisOnlineInfo.sid) { uids.push({sid: hisOnlineInfo.sid, uid: roleId}); } } pushMessage.push({route: 'onMailsAdd', data:[{ id: mail._id, goods, sendTime: mail.sendTime, endTime: mail.endTime, content, status: MAIL_STATUS.CREATE, mailType: MAIL_TYPE.SINGLEMAIL, sendName }], uids}); } if (!!addGroupMails.length) { await GroupMailModel.addGroupMails(addGroupMails); } pushMessage.forEach( message=> { pinus.app.channelService.pushMessageByUids('onMailsAdd', resResult(STATUS.SUCCESS, { mails: message.data }), message.uids); });//下发邮件,对应前端红点提示 }