UNPKG

gamecloud

Version:
1,212 lines (1,058 loc) 34.7 kB
let facade = require('../../../../Facade') let {EntityType, IndexType, AllyPower, InviteType, AllyNewsType, ReturnCode} = facade.const let BaseEntity = facade.BaseEntity let {ally} = require('../table/ally') /** * 分页显示联盟排行时,每页显示的条目数量 */ const MAX_WROLD_RANK_NUM_PAGE = 10; /** * 联盟配置信息 */ const AllyConfig = { GetAllyByLevel: ($_lv) => { AllyConfig.InitData(); if(!!AllyConfig.$configList[$_lv]){ return AllyConfig.$configList[$_lv]; } return {'lv': 1, 'member': 15}; }, GetAllyByExp: ($exp) => { AllyConfig.InitData(); let $ret = {'lv': 1, 'member': 15}; for(let $key in AllyConfig.$configList){ let $value = AllyConfig.$configList[$key]; if($exp < $value['exp']){ break; } $ret = $value; } return $ret; }, /** * 入盟冷却时间 */ $joinAllyCD: 3600, $configList: null, InitData: () => { if(AllyConfig.$configList == null){ AllyConfig.$configList = { 1: {'lv': 1, 'exp': 1000, 'member': 15}, 2: {'lv': 2, 'exp': 5000, 'member': 20}, 3: {'lv': 3, 'exp': 10000, 'member': 25}, 4: {'lv': 4, 'exp': 20000, 'member': 30}, 5: {'lv': 5, 'exp': 20000000, 'member': 50}, }; } } } class AllyRank { constructor(){ this.aid = 0; this.Name = ''; this.slogan = ''; this.level = 0; this.member = 0; this.maxMember = 0; this.battle = 0; this.Relation = 0; // 0 Ro_Normal } } /** * 联盟成员类 */ class AllyMember { constructor() { this.uid = 0; //用户ID this.AllyHonor = 0; //联盟军功 this.HeadShip = 0; //0盟主 1长老 2护法 3普通成员 this.AttackCD = facade.util.now(); //上一次攻击后产生的CD时间戳 this.Battle = 0; //玩家等级 } /** * 审核权限 * @param $_exec * @return bool */ CanExecute($_exec) { if(this.HeadShip == 0){ return true; } switch($_exec) { case AllyPower.ap_Kick: case AllyPower.ap_Join: return this.HeadShip <= 1; } return false; } } /** * 联盟类 */ class BaseAllyObject extends BaseEntity { /** * 构造函数 * @param {ally} orm * @param {CoreOfBase} core */ constructor(orm, core) { super(orm, core); //region 成员属性 this.MemberList = {};//盟友列表 array of AllyMember this.MemberSortList = [];//盟友排序列表 array of &AllyMember this.MemberReqList = {};//入盟申请列表,按照提交顺序排列,最多10个,不提供分页算法 array of &BaseUserInfo this.level = 0; this.MaxMember = 0;//联盟最大人数 //endregion } //region 联盟申请相关 //* 关于申请和邀请 //* 1、用户申请入盟,入盟请求加入AllyObject.Users,同时加入该用户IUser.Invite中,用户事后可以取消加盟请求,此时也要从上述两处地方删除记录 //* 2、盟主根据AllyObject.Users中的申请信息,批准用户加盟,批准信息通过交互消息发送给用户,用户登录时删除邀请、将自身加入联盟 //* 3、盟主邀请用户加入时,加盟邀请通过交互消息发送给用户,在该用户登录时写入自身IUser.Invite中。用户同意后直接将自身加入联盟 //* 4、如果是主动加盟,则立即清除IUser.Invite中所有消息,如果是被动加盟则通过发送交互消息,待用户登录后再清除IUser.Invite /** * 获取第三方对本联盟的申请列表 * @return array */ ReqGetList() { let $ret = {}; for(let $key in this.MemberReqList){ let $value = this.MemberReqList[$key]; $ret[$value.uid] = $value; } return $ret; } Save(){ if(this.dirty){ this.dirty = false; this.orm.save().then(e=>{}); } } /** * 提交入盟申请 * @param IUser $bi * @return int */ ReqSubmit($bi){ if(!$bi){ return ReturnCode.UserNotExist; }; if(this.isFull() || Object.keys(this.MemberReqList).length >= 10){ return ReturnCode.MemberFull; }; //成功添加申请 $bi.getInviteMgr().Set(InviteType.AllyReq, this.aid);//将邀请写入用户自身Invite字段 //写入联盟的入盟申请列表 let $am = new AllyMember(); $am.uid = $bi['id']; this.MemberReqList[$am.uid] = $am; this['Users'] = this.GetUserStr(); //设置脏数据标志 this.dirty = true; return ReturnCode.Success; } get aid(){ return this.orm.id; } /** * 批准入盟申请 */ ReqAllow($oper, $uid) { if(this.aid <= 0){ return ReturnCode.AllyNotExist; } if(this.isFull()){ return ReturnCode.MemberFull; } if(!!this.MemberList[$uid]){ return ReturnCode.Success;//已经是成员了 } if(($oper['id'] == $uid) && ($oper['id'] == this['uid'])){//创建联盟时执行的特殊操作 } else{ //是否存在之前提交的申请 if(!this.MemberReqList[$uid]){ return ReturnCode.MemberReqNotExist; } //提交者是否拥有合适的权限 if(!this.MemberList[$oper['id']] || !this.MemberList[$oper['id']].CanExecute(AllyPower.ap_Join)){ return ReturnCode.PowerLimit; } } //删除邀请记录 delete this.MemberReqList[$uid]; //更新成员字符串,因为删除了邀请记录需要保存 this['Users'] = this.GetUserStr(); //设置脏数据标志 this.dirty = true; this.core.notifyEvent('ally.reqAllow', {aid:this.aid, src:$oper['id'], dst:$uid}); //返回成功码 return ReturnCode.Success; } /** * 收到同意加盟的交互消息,将自己加入联盟中,同时清除申请信息 * @param int $operId * @param IUser $user */ ReqAllowAccepted($operId, $user) { //删除请求记录 $user.getInviteMgr().Clear(InviteType.AllyReq, this.aid); if($user.aid > 0){//已经添加了联盟,不能再添加了 return ReturnCode.HasAlly; } if(this.isFull()){//联盟已满 return ReturnCode.MemberFull; } //设置联盟ID $user.aid = this.aid; //添加为成员 let $am = new AllyMember(); $am.uid = $user['id']; if($am.uid == this.uid){ $am.HeadShip = 0;//添加的是盟主 } else{ $am.HeadShip = 3;//新加入的普通会员 } $am.Battle = $user['rank'];//设置成员战力 2015.12.8 liub this.MemberList[$user['id']] = $am; this.MemberSortList.push(this.MemberList[$user['id']]); if(this.MemberSortList.length > 1){//如果是盟主初创联盟时,不产生入盟事件 //添加联盟新闻 this.AddNewsWithType(AllyNewsType.MemberEnter, $operId + ',' + $user['id']);//构造事件参数列表 } //重新计算平均战斗力 this.SetAllyBattle(); //更新成员字符串 this['Users'] = this.GetUserStr(); //设置脏数据标志 this.dirty = true; return ReturnCode.Success; } /** * 盟主拒绝请求 * @param int $simId * @return int */ ReqDeny($simId){ //删除之前的入盟邀请 delete this.MemberReqList[$simId]; this['Users'] = this.GetUserStr(); //设置待更新标志 this.dirty = true; return ReturnCode.Success; } /** * 发起者取消请求 * @param IUser $user */ ReqCancel($user){ $user.getInviteMgr().Clear(InviteType.AllyReq, this.data['aid']); //删除邀请 //删除之前的入盟邀请 unset(this.MemberReqList[$user['id']]); this['Users'] = this.GetUserStr(); //设置待更新标志 this.dirty = true; return ReturnCode.Success; } //endregion /** * 获取联盟列表总页数 * @return int */ GetPagesOfMember(){ return Math.ceil(this.MemberSortList.length * 1.0 / MAX_WROLD_RANK_NUM_PAGE); } /** * 盟友捐献的能源,盟主利用此能源升级王国 * @return mixed */ GetEnergy(){ return this['Energy']; } SetEnergy($value){ this['Energy'] = $value; } /** * 盟主设定的、加入所需要的战力等级 */ get BattleGrade(){ return this.orm['BattleGrade']; } set BattleGrade($value){ this.orm['BattleGrade'] = $value; } get Users(){ return this.orm['Users']; } set Users($value){ this.orm['Users'] = $value; } /** * 生成用户列表序列化串 * @return string */ GetUserStr() { let $ret = ''; for(let $key in this.MemberList){ let $value = this.MemberList[$key]; if($ret != ''){ $ret += '|'; } $ret += `${$value.uid},${$value.AllyHonor},1`; } for(let $key in this.MemberReqList){ let $value = this.MemberReqList[$key]; if($ret != ''){ $ret += '|'; } $ret += "{$value->uid},0,0"; } return $ret; } //获取入盟最低战力值 GetAllyBattle(){ return this.BattleGrade * 0.7; } //重新计算联盟战力 SetAllyBattle(){ this.dirty = true; this.BattleGrade = 0; if(Object.keys(this.MemberList).length > 0){ for(let $key in this.MemberList){ let $value = this.MemberList[$key]; this.BattleGrade += $value.Battle; } this.BattleGrade = (this.BattleGrade / Object.keys(this.MemberList).length) | 0; } return this.BattleGrade; } /** * 联盟等级,初始1级,联盟成员数量上限 = 15 + 联盟等级×5 * @return int */ Getlevel() { return this.level; } /** * 设置联盟等级,同时设置相关数据 */ Setlevel($_lv){ let $curLv = AllyConfig.GetAllyByLevel($_lv); if($curLv){ this.level = $curLv['lv']; this.MaxMember = $curLv['member']; } } /** * 对外口号, string[MAX_SLOGAN] * @return mixed */ get sloganOuter(){ return this.orm['sloganOuter']; } set sloganOuter($value){ this.orm['sloganOuter'] = $value; } /** * 对内口号 * @return mixed */ get sloganInner(){ return this.orm['sloganInner']; } set sloganInner($value){ this.orm['sloganInner'] = $value; } /** * 联盟名称 */ get Name(){ return this.orm['Name']; } set Name($value){ this.orm['Name'] = $value; this.dirty = true; } /** * 联盟经验,盟友获得军功的同时,贡献联盟经验 * @return int */ get experience() { return this.orm['experience']; } /** * @param int $experience */ set experience($experience) { this.orm['experience'] = $experience; } /** * 盟主ID * @return mixed */ get uid() { return this.orm['uid']; } set uid($value){ this.orm['uid'] = $value; return this.orm['uid']; } /** * 设置联盟个性化设定 * @param $_set */ Set($_set){ this['aSetting'] = this['aSetting'] | $_set; this.dirty = true; } //复位某个变更标志位 AllySetting Unset($_set){ this['aSetting'] = this['aSetting'] & ~$_set; } /* * 检查指定标志位(可联合) * @_set: AllySetting */ Check($_set) { return ((this['aSetting'] & $_set) == $_set); } GetLeader() { return this.core.GetObject(EntityType.User, this.orm['uid']); //获取缓存对象 } CheckBattle($_battle){ return $_battle >= this.GetAllyBattle(); } //获取联盟当前成员的军功之和,最小不小于传入的军功值 GetAllyHonorTotal($_honor) { let $ret = 0; if(Object.keys(this.MemberList).length > 0){ for(let $key in this.MemberList){ let $value = this.MemberList[$key]; $ret += $value.AllyHonor; } } return Math.max($_honor, $ret); } /** * 删除联盟对象 */ Terminate(){ //向所有人群发联盟解散消息 for(let $value of this.GetAllMember()){ this.core.notifyEvent('ally.terminated', {aid:this.aid, dst:$value.uid}); } } //捐献 Donate($_uid, $_energy) { //给联盟加能源 this.Energy += Math.min(1000000000, $_energy); //将能源转化成军功 $_rate = 100; $_exp = $_energy * 1.0 / $_rate; //添加联盟军功 this.AddAllyHonor($_uid, $_exp); //添加联盟新闻:×盟友捐献×能源 this.AddNewsWithType(AllyNewsType.Donate, "$_uid,$_energy"); } onUpdate(){ this.core.notifyEvent('ally.update', {id:this.aid}); } refreshBonusTime($_kid, $obtain){ for(let $key in this.MemberList){ let $value = this.MemberList[$key]; if($obtain){ $value.BonusTimeStamp[$_kid] = facade.util.now(); } else{ delete $value.BonusTimeStamp[$_kid]; } } } //修改联盟设定 成功返回修改后的设定 ChangeSetting($_uid, $_set){ let $am = this.GetMember($_uid); if(!$am || !$am.CanExecute(AllyPower.ap_Setting)){ return ReturnCode.PowerLimit; } this['aSetting'] = $_set; if(this.Check(AllySetting.AS_Auto)){ //如果改为自动收人的话,之前的单子全部自动处理 for(let $key in this.MemberReqList){ let $value = this.MemberReqList[$key]; this.ReqAllow(this.GetLeader(), $value.uid); } } //设置待更新标志 this.dirty = true; return this['aSetting']; } isFull() { return Object.keys(this.MemberList).length >= this.MaxMember; } /** * 插入新闻 * @param {*} $_type 类型 * @param {*} $_temp 内容 */ AddNewsWithType($_type, $_temp) { this.core.notifyEvent('ally.addNews', {aid:this.aid, type:$_type, value:$_temp}); } /** * 禅让盟主 * @param $_oper * @param $_uid * @return int */ ChangeLeader($_oper, $_uid){ if(this.aid <= 0){ return ReturnCode.AllyNotExist; } if($_oper != this.uid){ return ReturnCode.PowerLimit; } if(!this.MemberList[$_uid] || !(this.MemberList[$_oper])){ return ReturnCode.UserNotExist; } //修改联盟盟主信息 this.Setuid($_uid); this.MemberList[$_uid].HeadShip = 0; this.MemberList[$_oper].HeadShip = 3; this.RefreshHeadShip(); //添加禅让新闻 this.AddNewsWithType(AllyNewsType.LeaderChange, "$_oper,$_uid"); return ReturnCode.Success; } /** * 根据用户ID,返回对应的联盟成员对象 * @param {AllyMember} */ GetMember($_uid) { if(!!this.MemberList[$_uid]){ return this.MemberList[$_uid]; } else{ return null; } } //返回全部用户集合 GetAllMember(){ return this.MemberSortList; } //获取指定用户在联盟的排名 GetUserRank($_uid) { $idx = 1; for(let $value of this.MemberSortList){ if($value.uid == $_uid){ break; } $idx++; } return $idx; } /** * 重新排定盟友职务,不检测盟主合法性,适合日常检查 */ RefreshHeadShip(){ //重新排定盟友职务 let $reqNewLeader = false; let $user = this.core.GetObject(EntityType.User, this.uid); if (!$user) { this.DelMember(null, this.uid); $reqNewLeader = true;//盟主数据非法,换掉 } else { if (!this.MemberList[this.uid]) { if (this.MemberSortList.length == 1) {//只有一个人,直接指定 $fm = reset(this.MemberSortList); this.Setuid($fm.uid); } else { $reqNewLeader = true;//盟主不是盟员,换掉 } } let $diff = facade.util.now() - parseInt($user['refreshTime']); if ($diff > 3600 * 24 * 7) { $reqNewLeader = true;//盟主七天未上线,换掉 } } if (Object.keys(this.MemberList).length == 0) {//没人的盟 return; } if (Object.keys(this.MemberList).length == 1) {//只有一个人,不要换了 $reqNewLeader = false; } this.RefreshHeadShipWithParam($reqNewLeader); } /** * 重新排定盟友职务,视需要检测盟主合法性。特例:从数据库载入时强制跳过盟主合法性检测,避免载入数据时产生数据库写操作 * @param $reqNewLeader */ RefreshHeadShipWithParam($reqNewLeader){ this.MemberSortList.sort(); //SortAllyMemberRank //修改了军功,此处重新排下序 let $idx = 1; for(let $value of this.MemberSortList){ if($idx <= 2){ if($reqNewLeader){ if($value.uid != this.uid){ //添加禅让新闻 this.AddNewsWithType(AllyNewsType.LeaderChange, this.uid + ',' + $value.uid); this.uid = $value.uid;//任命新的盟主 //设置待存储标志 this.dirty = true; $value.HeadShip = 0; $reqNewLeader = false; } else{ $value.HeadShip = 1; } } else{ if($value.uid != this.uid){ $value.HeadShip = 1; } else{ $value.HeadShip = 0; } } } else if($idx <= 6){ if($value.uid != this.uid){ $value.HeadShip = 2; } else{ $value.HeadShip = 0; } } else{ if($value.uid != this.uid){ $value.HeadShip = 3; } else{ $value.HeadShip = 0; } } $idx++; } this.MemberSortList.sort(); //SortAllyMemberRank //再次排序,考虑了职务高低 } /** * 获取联盟排名信息 * @param int $_user * @return AllyRank */ GetAllyRankInfo($user) { let $rm = new AllyRank(); $rm.aid = this.aid; $rm.Name = this.Name; //不在列表信息请求中发送slogan,增加发送联盟等级,这样可以将包的尺寸缩小到550字节以内,而之前超过2K //$rm->slogan = this.sloganOuter; $rm.level = this.level; $rm.member = Object.keys(this.MemberList).length; $rm.maxMember = this.MaxMember; if(this.Check(AllySetting.AS_Battle)){ $rm.battle = this.GetAllyBattle(); } $rm.Relation = 0; //0 Ro_Normal if($user['aid'] <= 0){ //Relation: 4申请中 5邀请你 if($user.getInviteMgr().hasInvite(InviteType.AllyInvite, this.aid)){ $rm.Relation = AllyRelationEnum.Ro_BeReqMember; } else if($user.getInviteMgr().hasInvite(InviteType.AllyReq, this.aid)){ $rm.Relation = AllyRelationEnum.Ro_ReqMember; } } return $rm; } /** * 取指定页面成员列表,_page基于0 * @param int $_page * @param int $_uid * @param array(AllyMember) $list * @return int */ GetPageOfMemberWithUid($_page, $_uid, $list) { if($_page == -1){ //取我所在的页面 $sid = this.GetUserRank($_uid); $_page = Math.ceil($sid / MAX_WROLD_RANK_NUM_PAGE) - 1; } $_page = Math.max(0, Math.min($_page, Math.ceil(this.MemberSortList.length / MAX_WROLD_RANK_NUM_PAGE) - 1)); let $idx = -1; for(let $value of this.MemberSortList){ $idx++; if($idx < $_page*10){continue;}; if($idx > ($_page+1)*10){break;}; $list[$idx+1] = $value; } return $_page; } /** * 为联盟增加经验,由盟友获取军功时附加获得 * @param int $_uid * @param int $_exp */ AddAllyHonor($_uid, $_exp) { if($_exp <= 0 || $_exp > 5000){ return;//数据非法 } if(!this.MemberList[$_uid]){ return; } let $itor = this.MemberList[$_uid]; //给个人加军功 $itor.AllyHonor = Math.min(100000000, $itor.AllyHonor + $_exp); //给联盟加经验 this.experience = Math.min(200000000, this.experience + $_exp); //保存联盟数据 this.dirty = true; //根据配置表计算联盟等级 let $_oldLevel = this.level;//保存旧有等级数据 $curLv = AllyConfig.GetAllyByExp(this.experience); //AllyBaseInfoConfig if($curLv){ this.Setlevel($curLv['lv']); } if(this.level > $_oldLevel){ //添加联盟新闻 this.AddNewsWithType(AllyNewsType.AllyUpgrade, this.level); } //重新排定盟友职务 this.RefreshHeadShip(); } /** * 删除成员 * @param IUser $oper * @param int $uid * @return int */ DelMember($oper, $uid) { if(this.aid <= 0){ return ReturnCode.AllyNotExist; } if(!this.MemberList[$uid]){ //不是成员,看看有没有入盟申请 if(!this.MemberReqList[$uid]) { return ReturnCode.DataNotExist; } //删除之前的入盟邀请 delete this.MemberReqList[$uid]; //设置待更新标志 this.dirty = true; return ReturnCode.Success; } else{ if($uid == this.uid){//盟主不能退盟 return ReturnCode.PowerLimit; }; if($oper != null && $oper['id'] != $uid){//为null表示系统删除,不需要验证权限;操作员和盟员ID一致,表示自己退出,也不需要验证 if(!this.MemberList[$oper['id']] || !this.MemberList[$oper['id']].CanExecute(AllyPower.ap_Kick)){ return ReturnCode.PowerLimit; }; }; for(let $value of this.MemberSortList) { if($value.uid == $uid){ delete this.MemberSortList[$key]; //从成员排序列表中删除 break;//php即使修改了循环相关变量,也能继续循环而不报错 } } //从成员列表中删除 delete this.MemberList[$uid]; if(!!$oper){ if($oper.id == $uid){//自己退盟,立即修改联盟ID $oper.aid = 0; } else{ this.core.notifyEvent('ally.kicked', {aid:this.aid, src:$oper['id'], dst:$uid}); } if($oper['id'] == $uid){//添加盟员退盟新闻 this.AddNewsWithType(AllyNewsType.MemberLeave, $uid); } else{//添加踢出盟员新闻 this.AddNewsWithType(AllyNewsType.MemberKick, `${$oper['id']}, ${$uid}`); } } //重新计算平均战斗力 this.SetAllyBattle(); this['Users'] = this.GetUserStr(); //设置待更新标志 this.dirty = true; return ReturnCode.Success; } } /** * 根据数据库序列化串,反向生成盟友列表 * @param string $events */ AnaUserStr($events) { this.MemberSortList = []; this.MemberList = {}; if ($events != null && $events != '') { let $_events = $events.split('|'); for(let $itor of $_events){ let $_tempEvent = $itor.split(','); if ($_tempEvent.length >=3) { let $st = parseInt($_tempEvent[2]); if($st == 1){ //正式会员 let $am = new AllyMember(); $am.uid = parseInt($_tempEvent[0]); $am.AllyHonor = parseInt($_tempEvent[1]); $am.HeadShip = 3;//默认都是普通成员 this.MemberList[$am.uid] = $am; this.MemberSortList.push(this.MemberList[$am.uid]); } else if($st == 0){//申请中 let $am = new AllyMember(); $am.uid = parseInt($_tempEvent[0]); $am.AllyHonor = parseInt($_tempEvent[1]); $am.HeadShip = 3;//默认都是普通成员 this.MemberReqList[$am.uid] = $am; } } } //刷新下盟友的职务. this.RefreshHeadShip(); this.SetAllyBattle(); //实时计算下战力 //End. } } //#region 加盟邀请管理函数 /** * 邀请玩家加入 * @param IUser $src * @param IUser $dst * @return int */ static InviteSubmit($src, $dstId) { if($src['aid'] <= 0){ return ReturnCode.AllyNotExist; } let $ao = $src.core.GetObject(EntityType.Ally, $src['aid']); if(!$ao){ return ReturnCode.AllyNotExist; } let $am = $ao.GetMember($src['id']); if(!$am || !$am.CanExecute(AllyPower.ap_Join)){ return ReturnCode.PowerLimit; } //发出交互类异步事件 $src.core.notifyEvent('ally.invite', {aid:$ao['aid'], src:$src.id, dst:$dstId}); return ReturnCode.Success; } /** * 拒绝入盟邀请 * @param IUser $user * @param int $_aid */ static InviteCancel($user, $_aid){ $user.getInviteMgr().Clear(InviteType.AllyInvite, $_aid); } //接受某联盟的加盟邀请 static InviteAccept($uo, $_aid) { $ret = ReturnCode.Success; if(false == $uo.getInviteMgr().hasInvite(InviteType.AllyInvite, $_aid)){ $ret = ReturnCode.DataNotExist; } else{ let $ao = $uo.core.GetObject(EntityType.Ally, $_aid); //入盟邀请处理流程:先模拟入盟申请、再自动批准,在后续流程中读取批准消息并处理 $ret = $ao.ReqSubmit($uo); if($ret == ReturnCode.Success){ $ret = $ao.ReqAllow($ao.GetLeader(), $uo['id']); } if(!$ao){ $ret = ReturnCode.AllyNotExist; } } //删除之前的入盟邀请 $uo.getInviteMgr().Clear(InviteType.AllyInvite, $_aid); return $ret; } //#endregion //#region 联盟管理 - 成立及解散 /** * 解散联盟 0成功 Supper == true表示强制解散 * @param IUser $user * @param bool $Supper * @return int */ static AllyTerminate($user, $Supper = false) { let $ret = ReturnCode.Success; if($user['aid'] == 0){ return ReturnCode.HasNoAlly; } let $ao = $user.core.GetObject(EntityType.Ally, $user['aid']); if(!$ao){ return ReturnCode.AllyNotExist; }; if(!$Supper){ let $am = $ao.GetMember($user['id']); if(!$am || !$am.CanExecute(AllyPower.ap_Terminate)){ $ret = ReturnCode.PowerLimit; }; } if($ret == ReturnCode.Success){ $ao.Terminate(); //删除联盟新闻 $user.core.notifyEvent('ally.clearNews', {aid:$ao['aid']}); //从缓存和数据库中删除联盟数据 $ao.Remove(); }; return $ret; } /** * 创建联盟, 返回结果码 * @param {UserEntity} $uo * @return int */ static async AllyCreate($uo) { if($uo['aid'] > 0){ return ReturnCode.HasAlly; } let $ao = await $uo.core.GetMapping(EntityType.Ally).Create($uo.id, $uo.openid); $ao.ReqSubmit($uo); $ao.ReqAllow($uo, $uo['id']); if(!$ao){ return ReturnCode.paramError; } else{ //添加联盟新闻 $ao.AddNewsWithType(AllyNewsType.AllyCreate, $uo['id']); } return ReturnCode.Success; } //#endregion //#region 联盟管理 - 信息修改 /** * 修改联盟名称 * @param int $_uid * @param $name * @param int $oper * @return int */ ChangeName($_uid, $name, $oper) { let $am = this.GetMember($_uid); if(!$am || !$am.CanExecute(AllyPower.ap_Setting)){ return ReturnCode.PowerLimit; } switch($oper){ case 0: { this.Name = $name; } break; case 1://对外 { this.sloganOuter = $name; } break; case 2://对内 { this.sloganInner = $name; } break; } this.dirty = true; return ReturnCode.Success; } //#endregion //#region 集合功能 /** * 索引值 */ IndexOf(type){ switch(type){ case IndexType.Foreign: return this.orm.uid; default: return this.orm.id; } } /** * 使用Mapping映射类时的配置参数 */ static get mapParams(){ return { model: ally, //对应数据库单表的ORM封装 entity: this, //实体对象,在model之上做了多种业务封装 etype: EntityType.Ally, //实体类型 }; } /** * 创建时的回调函数 */ static async onCreate(mysql, uid, name) { let self = this; try{ let it = await ally(mysql).findCreateFind({ where:{ uid:uid, }, defaults: self.getDefaultValue(uid, name), }); return it[0]; } catch(e){ console.error(e); return null; } } /** * 进行字典映射时的回调函数 * @param {ally} record */ static onMapping(record, core) { let ao = new core.entities.AllyObject(record, core); if(record._options.isNewRecord){//新创建的记录 ao.isNewbie = true; ao.aSetting = 0; ao.experience = 0; ao.Energy = 0; ao.BattleGrade = 0; ao.Name = ''; ao.sloganOuter = ''; ao.sloganInner = ''; ao.Users = ''; ao.experience = 0; } else{//已有的记录 ao.isNewbie = false; } let $curLv = AllyConfig.GetAllyByExp(ao.experience); if(!!$curLv){ ao.Setlevel($curLv['lv']); }; ao.AnaUserStr(record.Users);//载入盟友列表 return ao; } /** * 载入用户信息时的回调函数 * @param {*} mysql * @param {*} callback */ static async onLoad(mysql, callback){ try { let ret = await ally(mysql).findAll(); ret.map(it=>{ callback(it); }); } catch(e) {} } /** * 填充新用户默认注册信息 * @param {*} userName * @param {*} domain * @param {*} openid */ static getDefaultValue(uid, name){ return { uid:uid, name:name, }; } //#endregion } exports = module.exports = BaseAllyObject;