From ee49699abddaa05b5dd790a515019ec4e86bf0cc Mon Sep 17 00:00:00 2001 From: luying Date: Sat, 15 May 2021 11:41:41 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=A7=E6=83=85=E5=BC=B9=E5=B9=95=EF=BC=9A?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servers/role/handler/barrageHandler.ts | 50 +++++++++++++++++++ shared/db/ScriptBarrage.ts | 40 +++++++++++++++ shared/domain/roleField/barrage.ts | 22 ++++++++ 3 files changed, 112 insertions(+) create mode 100644 game-server/app/servers/role/handler/barrageHandler.ts create mode 100644 shared/db/ScriptBarrage.ts create mode 100644 shared/domain/roleField/barrage.ts diff --git a/game-server/app/servers/role/handler/barrageHandler.ts b/game-server/app/servers/role/handler/barrageHandler.ts new file mode 100644 index 000000000..cab45f580 --- /dev/null +++ b/game-server/app/servers/role/handler/barrageHandler.ts @@ -0,0 +1,50 @@ +import { Application, BackendSession } from "pinus"; +import { ScriptBarrageModel } from "../../../db/ScriptBarrage"; +import { BarrageReturn } from '../../../domain/roleField/barrage'; +import { resResult, getRandEelm } from "../../../pubUtils/util"; +import { STATUS } from "../../../consts"; + +export default function(app: Application) { + return new BarrageHandler(app); +} + +export class BarrageHandler { + constructor(private app: Application) { + } + + public async sendBarrage(msg: { warId: number, rid: string, index: string, content: string }, session: BackendSession) { + const roleId: string = session.get('roleId'); + const { warId, rid, index, content } = msg; + const result = await ScriptBarrageModel.createBarrage(roleId, warId, rid, index, content); + let barrageList: BarrageReturn[] = []; + let bs = new BarrageReturn(result); + barrageList.push(bs); + return resResult(STATUS.SUCCESS, { barrageList }); + } + + public async getBarrageList(msg: {rid: string}, session: BackendSession) { + // const roleId: string = session.get('roleId'); + const { rid } = msg; + const result = await ScriptBarrageModel.getBarrageList(rid, 1000); + const perMax = 10, max = 50; // 每个对话最大数量,每个剧本最大数量 + let map = new Map(); // index => BarrageReturn[] + for(let barrage of result) { + let { index } = barrage; + if(!map.has(index)) { + map.set(index, []); + } + map.get(index).push(new BarrageReturn(barrage)); + } + let ratio = result.length > max? max/result.length: 1; + + let barrageList: BarrageReturn[] = []; + for(let [_, barrages] of map) { + let count = Math.ceil(barrages.length * ratio); + if(count > perMax) count = perMax; + + let curBarrages = getRandEelm(barrages, count); + barrageList = barrageList.concat(curBarrages); + } + return resResult(STATUS.SUCCESS, { barrageList }); + } +} \ No newline at end of file diff --git a/shared/db/ScriptBarrage.ts b/shared/db/ScriptBarrage.ts new file mode 100644 index 000000000..eb6e05d1b --- /dev/null +++ b/shared/db/ScriptBarrage.ts @@ -0,0 +1,40 @@ +import BaseModel from './BaseModel'; +import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose'; +import { genCode } from '../pubUtils/util'; + +/** + * 派遣任务记录表 + */ +@index({ roleId: 1, type: 1 }) + +export default class ScriptBarrage extends BaseModel { + @prop({ required: true }) + code: string; // 弹幕唯一标识 + @prop({ required: true }) + roleId: string; // 角色 id + @prop({ required: true }) + warId: number; // 关卡id + @prop({ required: true }) + rid: string; // 剧本id + @prop({ required: true }) + index: string; // 对话索引 + @prop({ required: true }) + content: string; // 弹幕内容 + + + public static async createBarrage(roleId: string, warId: number, rid: string, index: string, content: string) { + const code = genCode(10); + let result: ScriptBarrageType = await ScriptBarrageModel.findOneAndUpdate({ code }, { $setOnInsert: { roleId, warId, rid, index, content } }, { new: true, upsert: true }).lean(); + return result; + } + + public static async getBarrageList(rid: string, limit: number) { + let result: ScriptBarrageType[] = await ScriptBarrageModel.find({ rid }, { _id: 0 }).limit(limit).sort({ index: 1, createdAt: -1 }).lean(); + return result; + } + +} + +export const ScriptBarrageModel = getModelForClass(ScriptBarrage); + +export interface ScriptBarrageType extends Pick, keyof ScriptBarrage>{}; \ No newline at end of file diff --git a/shared/domain/roleField/barrage.ts b/shared/domain/roleField/barrage.ts new file mode 100644 index 000000000..3732591d5 --- /dev/null +++ b/shared/domain/roleField/barrage.ts @@ -0,0 +1,22 @@ +import { ScriptBarrageType } from '../../db/ScriptBarrage'; +import { getSeconds } from '../../pubUtils/timeUtil'; + +export class BarrageReturn { + code: string; // code + warId: number; // 关卡id + rid: string; // 剧本id + index: string; // 对话索引id + content: string; // 弹幕内容 + createTime: number; // 发送时间 + + constructor(barrage: ScriptBarrageType) { + if(barrage) { + this.code = barrage.code; + this.warId = barrage.warId; + this.rid = barrage.rid; + this.index = barrage.index; + this.content = barrage.content; + this.createTime = getSeconds(barrage.createdAt); + } + } +} \ No newline at end of file