xy-server/game/mail/MailMgr.ts
2025-04-23 09:34:08 +08:00

104 lines
3.2 KiB
TypeScript

/**
* 邮件管理器
*/
import GameConf from "../../conf/GameConf";
import GameUtil from "../core/GameUtil";
import Launch from "../core/Launch";
import SKDataUtil from "../gear/SKDataUtil";
import Player from "../object/Player";
import { EMailState, MsgCode } from "../role/EEnum";
import DB from "../utils/DB";
import MailData from "./MailData";
export default class MailMgr {
static shared: MailMgr = new MailMgr();
timer: any;
system: MailData[] = [];
launch() {
if(!GameConf.mailEnabled){
return;
}
let self = this;
DB.getSystemMail(GameUtil.serverId, (error: any, rows: any[]) => {
if (error) {
throw new Error(`系统邮件:读档异常!`);
}
self.system = [];
for (let row of rows) {
let mail = new MailData();
mail.parseDB(row);
self.system.push(mail);
}
let className: string = self.constructor.name;
Launch.shared.complete(className);
});
}
// 加入系统邮件
addSystemMail(mailData: MailData) {
if(!GameConf.mailEnabled){
return;
}
mailData.server_id = GameUtil.serverId;
mailData.mail_id = GameUtil.nextId();
mailData.date = new Date();
let self = this;
this.saveMail(mailData, (code: MsgCode, msg: string) => {
if (code == MsgCode.SUCCESS) {
self.system.push(mailData);
}
});
}
// 获得指定邮件
getMailBy(mailId: number): MailData {
let result: MailData;
for (let mail of this.system) {
if (mail.mail_id == mailId) {
result = mail.clone();
break;
}
}
return result;
}
// 存档
saveMail(mailData: MailData, callback: (code: MsgCode, msg: string) => void) {
DB.saveSystemMail(mailData, callback);
}
// 登录玩家检查拉取邮件
check(player: Player, list: MailData[]): MailData[] {
let result: MailData[] = [];
let mailIds: number[] = [];
for (let mail of list) {
mailIds.push(mail.mail_id);
}
for (let target of this.system) {
// 系统邮件已删除或已领取跳过
if (target.state != EMailState.UN_GET) {
continue;
}
// 已拉取跳过
if (SKDataUtil.atRange(target.mail_id, mailIds)) {
continue;
}
// 如果是指定邀请码的玩家则领取
if (target.invite.length > 0) {
if (target.invite == player.invite) {
result.push(target.clone());
}
continue;
}
// 如果是指定玩家邮件则领取
if (target.role_id != 0) {
if (target.role_id == player.roleid) {
result.push(target.clone());
target.state = EMailState.GET;
}
continue;
}
// 全部玩家可领取
result.push(target.clone());
continue;
}
return result;
}
}