import { RewardInter, pushMail, mailData } from "../pubUtils/interface"; import { MailModel, MailType } from "../db/Mail"; import { getRedis } 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'; export async function sendMail(operate: number, toRoleId: string, sendName: string = '系统', params: string[] = [], goods: RewardInter[] = []) { let { content, time } = getContent(operate, params); if (!content) return; let mail = await MailModel.addMail({roleId: toRoleId, goods, sendName, mailId: JSON.stringify(operate), endTime: time + nowSeconds(), mailTemType: MAIL_TEM_TYPE.GAMEMAIL, params}); let key = 'login_roleId_' + toRoleId; let sid = await getRedis(key); if (!!sid) { pinus.app.channelService.pushMessageByUids('onMailsAdd', resResult(STATUS.SUCCESS, { mails:[{ id: mail._id, mailId: mail.mailId, goods, sendTime: mail.sendTime, endTime: mail.endTime, content, status: mail.status, mailType: MAIL_TYPE.SINGLEMAIL, sendName }]}), [{uid: toRoleId, sid}]); } } 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 } } export async function getMailContent(roleId: string, operate: number, params: string[], goods: RewardInter[], mails: MailType[], pushMessage: pushMail[], 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: nowSeconds(), mailTemType: MAIL_TEM_TYPE.GAMEMAIL, endTime: time + nowSeconds(), params }); mails.push(mail); let key = 'login_roleId_' + roleId; let sid = await getRedis(key); if (!!sid) { pushMessage.push({route: 'onMailsAdd', data:[{ id: mail._id, mailId: mail.mailId, goods, sendTime: mail.sendTime, endTime: mail.endTime, content, status: mail.status, mailType: MAIL_TYPE.SINGLEMAIL, sendName }], uids: [{ uid: roleId, sid }]}); } } 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.getMails.toServer('gm-server-1', updatedMailAt, serverId); let addGroupMails: GroupMailType[] = []; let addMails: MailType[] = []; let updateMails: mailData[] = []; let pushMails: mailData[] = []; gmMails.forEach(async function ({gmMailType, _id, sendRoles, endTime, content, goods, sendTime, sendName}) { if (gmMailType == GM_MAIL_TYPE.GROUPMAIL) { //群体邮件 let mail = await GroupMailModel.getMail(_id, MAIL_TEM_TYPE.GMTYPE); if (!mail) { const doc = new GroupMailModel(); const mail = Object.assign(doc.toJSON(), { mailId: _id, mailTemType: MAIL_TEM_TYPE.GMTYPE, sendRoles }); addGroupMails.push(mail); pushMails.push({ id: mail._id, mailId: _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, _id, MAIL_TEM_TYPE.GMTYPE); pushMails.push({ id: mail._id, mailId: _id, goods, sendTime, endTime, content, status: MAIL_STATUS.CREATE, mailType: MAIL_TYPE.GROUPMAIL, sendName }); } } } else if (gmMailType == GM_MAIL_TYPE.SERVER) { //游戏服邮件 let mail = await MailModel.getMail(roleId, _id, MAIL_TEM_TYPE.GMTYPE); if (!mail) { const doc = new MailModel(); const mail = Object.assign(doc.toJSON(), { mailId: _id, mailTemType: MAIL_TEM_TYPE.GMTYPE, roleId }); addMails.push(mail); pushMails.push({ id: mail._id, mailId: _id, goods, sendTime, endTime, content, status: mail.status, mailType: MAIL_TYPE.SINGLEMAIL, sendName }); } else { updateMails.push({ id: mail._id, mailId: _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(); } 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; }