邮件:修改邮件逻辑
This commit is contained in:
@@ -1,190 +1,206 @@
|
||||
import { RewardInter, pushMail, mailData } from "../pubUtils/interface";
|
||||
import { MailModel, MailType } from "../db/Mail";
|
||||
import { GroupMailModel, GroupMailType } from "../db/GroupMail";
|
||||
import { ServerMailModel, ServerMailType } from '../db/ServerMail';
|
||||
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';
|
||||
import { GM_MAIL_TYPE, MAIL_STATUS, MAIL_TYPE, SEND_NAME } from "../consts";
|
||||
import { MailParam } from '../domain/roleField/mail';
|
||||
import { GMMailType, GMMailModel } from "../db/GMMail";
|
||||
import { getGuildChannelSid, getWorldChannelSid } from "./chatChannelService";
|
||||
|
||||
/**
|
||||
* 下发邮件
|
||||
* @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
|
||||
* 获取邮件信息
|
||||
* @param {String} roleId 玩家id
|
||||
* @param {Number} serverId 服务器id
|
||||
*/
|
||||
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);
|
||||
let mails = await MailModel.findByRoleId(roleId)||[];
|
||||
let groupMails = await GroupMailModel.findByRoleId(roleId)||[];
|
||||
let serverMails = await ServerMailModel.findByRoleId(roleId, serverId)||[];
|
||||
|
||||
let list = getMailInfos(roleId, mails, groupMails, serverMails);
|
||||
list.sort((a, b) => a.sendTime - b.sendTime);
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* 下发gm邮件的群体邮件
|
||||
* @param mails
|
||||
* 根据数据库数据,生成返回数据
|
||||
* @param {String} roleId 玩家id
|
||||
* @param {MailType[]} mails 单人邮件
|
||||
* @param {GroupMailType[]} groupMails 多人邮件
|
||||
* @param {ServerMailType[]} serverMails 全服邮件
|
||||
*/
|
||||
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;
|
||||
function getMailInfos(roleId: string, mails: MailType[], groupMails: GroupMailType[], serverMails: ServerMailType[]) {
|
||||
let list: MailParam[] = []; // 结果
|
||||
for(let mail of mails) {
|
||||
list.push(new MailParam( GM_MAIL_TYPE.SINGLE, mail, roleId));
|
||||
}
|
||||
for(let mail of groupMails) {
|
||||
list.push(new MailParam(GM_MAIL_TYPE.GROUP, mail, roleId));
|
||||
}
|
||||
for(let mail of serverMails) {
|
||||
list.push(new MailParam(GM_MAIL_TYPE.SERVER, mail, roleId));
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
export async function sendMailByContent(contentId: MAIL_TYPE, hisRoleId: string, params: { sendName?: string, endTime?: number, params?: string[], goods?: RewardInter[], notPush?: boolean }) {
|
||||
let f = new SendMailFun();
|
||||
f.setWithContentId(contentId, params);
|
||||
await f.sendToUsers(GM_MAIL_TYPE.SINGLE, [hisRoleId]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送邮件方法类
|
||||
*/
|
||||
export class SendMailFun {
|
||||
private mailType: GM_MAIL_TYPE = GM_MAIL_TYPE.SINGLE; // 邮件类型 1-单人 2-多人 3-全服
|
||||
private contentId: MAIL_TYPE = MAIL_TYPE.SEND_MAIL; // 0-读GmMail,1以上读dicMail
|
||||
private params: string[] = [];
|
||||
private sendName: string = SEND_NAME;
|
||||
private gmmail: GMMailType;
|
||||
private hasGoods: boolean = false; // 是否内含奖励
|
||||
private goods: RewardInter[] = []; // 发送的奖励
|
||||
private sendTime: number;
|
||||
private endTime: number;
|
||||
private notPush: boolean = false;
|
||||
|
||||
// 从dicMail读取数据
|
||||
public setWithContentId(contentId: MAIL_TYPE, params: { sendName?: string, endTime?: number, params?: string[], goods?: RewardInter[] }) {
|
||||
let dicMail = gameData.mail.get(contentId);
|
||||
this.contentId = contentId;
|
||||
this.sendTime = nowSeconds();
|
||||
this.endTime = this.sendTime + dicMail?.time||0;
|
||||
this.setParam({ ...params });
|
||||
}
|
||||
|
||||
// 从GMMail表读取数据
|
||||
public async setWithGmMail(gmmailId: string) {
|
||||
let gmmail = await GMMailModel.getGmMailById(gmmailId);
|
||||
if(gmmail) {
|
||||
this.gmmail = gmmail;
|
||||
this.sendTime = gmmail.sendTime;
|
||||
this.endTime = gmmail.endTime;
|
||||
this.setParam({ ...gmmail });
|
||||
}
|
||||
for (let { roleId } of sendRoles) {
|
||||
let hisOnlineInfo = await getRoleOnlineInfo(roleId);
|
||||
if(hisOnlineInfo.isOnline && hisOnlineInfo.sid) {
|
||||
uids.push({sid: hisOnlineInfo.sid, uid: roleId});
|
||||
}
|
||||
|
||||
private setParam(params: { sendName?: string, endTime?: number, params?: string[], goods?: RewardInter[], content?: string }) {
|
||||
if(params.sendName) this.sendName = params.sendName;
|
||||
if(params.endTime) this.endTime = params.endTime;
|
||||
if(params.content) {
|
||||
this.params.push(params.content);
|
||||
}
|
||||
if(params.params) this.params = params.params;
|
||||
if(params.goods) {
|
||||
this.hasGoods = params.goods.length > 0;
|
||||
this.goods = params.goods;
|
||||
}
|
||||
}
|
||||
|
||||
private getCreateMailParams() {
|
||||
return {
|
||||
contentId: this.contentId,
|
||||
mail: this.gmmail?._id,
|
||||
sendTime: this.sendTime,
|
||||
endTime: this.endTime,
|
||||
params: this.params,
|
||||
goods: this.goods,
|
||||
sendName: this.sendName,
|
||||
hasGoods: this.hasGoods
|
||||
}
|
||||
}
|
||||
|
||||
// 生成单人邮件
|
||||
private async createSingleMails(roleIds: string[]) {
|
||||
let mails = new Map<string, MailParam>();
|
||||
for(let roleId of roleIds) {
|
||||
let originMail = await MailModel.addMail({ roleId, ...this.getCreateMailParams() });
|
||||
let mail = new MailParam(this.mailType, originMail);
|
||||
mails.set(roleId, mail);
|
||||
}
|
||||
|
||||
return mails;
|
||||
}
|
||||
|
||||
// 生成多人邮件
|
||||
private async createGroupMails(roleIds: string[]) {
|
||||
let roleStatus = roleIds.map(roleId => {
|
||||
return { roleId, status: MAIL_STATUS.CREATE }
|
||||
})
|
||||
let originMail = await GroupMailModel.addMail({ roleStatus, ...this.getCreateMailParams() });
|
||||
return new MailParam(this.mailType, originMail);
|
||||
}
|
||||
|
||||
// 生成全服邮件
|
||||
private async createServerMails(serverIds: number[]) {
|
||||
let mails = new Map<number, MailParam>();
|
||||
for(let serverId of serverIds) {
|
||||
let originMail = await ServerMailModel.addMail({ serverId, ...this.getCreateMailParams() });
|
||||
mails.set(serverId, new MailParam(this.mailType, originMail));
|
||||
}
|
||||
return mails
|
||||
}
|
||||
|
||||
// 向某几个玩家推送
|
||||
public async sendToUsers(mailType: GM_MAIL_TYPE.SINGLE|GM_MAIL_TYPE.GROUP,roleIds: string[], myRoleId?: string, mySid?: string) {
|
||||
this.mailType = mailType;
|
||||
let uids: { uid: string, sid: string }[] = []
|
||||
for(let roleId of roleIds) {
|
||||
let sid = '';
|
||||
if(roleId == myRoleId) {
|
||||
sid = mySid;
|
||||
} else {
|
||||
let hisOnlineInfo = await getRoleOnlineInfo(roleId);
|
||||
if(hisOnlineInfo.isOnline) {
|
||||
sid = hisOnlineInfo.sid;
|
||||
}
|
||||
}
|
||||
if(sid) {
|
||||
uids.push({ uid: roleId, sid });
|
||||
}
|
||||
}
|
||||
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 (uids.length > 0) {//下发邮件,对应前端红点提示
|
||||
if(mailType == GM_MAIL_TYPE.SINGLE) {
|
||||
let mails = await this.createSingleMails(roleIds);
|
||||
for(let { uid, sid } of uids) {
|
||||
let mail = mails.get(uid);
|
||||
if(mail && !this.notPush) pinus.app.channelService.pushMessageByUids('onMailsAdd', resResult(STATUS.SUCCESS, { mails: [mail] }), [{ uid, sid }]);
|
||||
}
|
||||
} else if (mailType == GM_MAIL_TYPE.GROUP) {
|
||||
let mail = await this.createGroupMails(roleIds);
|
||||
if(!this.notPush) pinus.app.channelService.pushMessageByUids('onMailsAdd', resResult(STATUS.SUCCESS, { mails: [mail] }), uids);
|
||||
} else { // mailType错误
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (!!addGroupMails.length) {
|
||||
await GroupMailModel.addGroupMails(addGroupMails);
|
||||
|
||||
// 向军团推送
|
||||
public async sendToGuild(guildCode: string, members: string[]) {
|
||||
this.mailType = GM_MAIL_TYPE.GROUP;
|
||||
let mails = await this.createGroupMails(members);
|
||||
let chatSid = await getGuildChannelSid(guildCode);
|
||||
if(!this.notPush) pinus.app.rpc.chat.guildRemote.sendMailToGuild.toServer(chatSid, guildCode, 'onMailsAdd', { mails });
|
||||
}
|
||||
|
||||
// 向全服推送
|
||||
public async sendToServer(serverIds: number[]) {
|
||||
this.mailType = GM_MAIL_TYPE.SERVER;
|
||||
let mails = await this.createServerMails(serverIds);
|
||||
for(let serverId of serverIds) {
|
||||
let mail = mails.get(serverId);
|
||||
if(mail && !this.notPush) {
|
||||
let chatSid = await getWorldChannelSid(serverId);
|
||||
pinus.app.rpc.chat.chatRemote.sendMail.toServer(chatSid, serverId, 'onMailsAdd', { mails: [mail] });
|
||||
}
|
||||
}
|
||||
}
|
||||
pushMessage.forEach( message=> {
|
||||
pinus.app.channelService.pushMessageByUids('onMailsAdd', resResult(STATUS.SUCCESS, { mails: message.data }), message.uids);
|
||||
});//下发邮件,对应前端红点提示
|
||||
}
|
||||
Reference in New Issue
Block a user