Files
ZYZ/game-server/app/services/mailService.ts

190 lines
8.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
});//下发邮件,对应前端红点提示
}