123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376 |
- <?php
- namespace loyalsoft;
- //define("GUILDAPPLYCAPACITY", 99); # 公会申请记录的容量限制
- //define("CREATECODINGTIME", 86400); # 退出公会开除会员后有24小时冷却时间, 不能加入其他公会
- //define("GUILDIDBASE", 100000); # 公会ID开始增长的基础值
- //define("GUILDMAXJOURNALCOUNT", 80); # 公会日志最多存80条记录
- //define("ACCUSESUCCEEDNUM", 3); # 弹劾会长成功人数
- //define("ACCUSEFAILNUM", 2); # 弹劾会长失败人数
- //define("GUILDCUPSCOREREFUSE", 86400); # 公会积分刷新时间间隔
- #
- //// 获取公会列表,PS根据等级排序
- //define("SQLSELECTGUILDBYLEVEL", "SELECT * FROM `tab_guild` where `zoneid`=%d ORDER BY `cupScore` DESC,`createts` LIMIT %s,20;");
- //// 查询公会总数量
- //define("SELECTGUILDCOUNT", "SELECT COUNT(`id`) FROM `tab_guild` where `zoneid`=%d ;");
- //// 通过名称模糊查询公会
- //define("SQLSELECTGUILDBYNAME", "SELECT * FROM `tab_guild` WHERE `zoneid`=%d and (`guildId`=%d OR `name` like '%s') LIMIT 10;");
- //// 通过guildid查询公会
- //define("SQLSELECTGUILDBYGUILDID", "SELECT * FROM `tab_guild` WHERE `zoneid`=%d and `guildId`=%d ;");
- //// 检查公会名称是否已存在 =: 各区也不能重名
- //define("SQLCHECKISNAMEEXIST", "SELECT `id` FROM `tab_guild` WHERE `name`='%s' ");
- //// 创建公会
- //define("SQLCREATEGUILD", "INSERT INTO `tab_guild` (`guildId`, `name`, `createts`,`declare`,`membercount`, `chairman_id`, `chairman_name`,`guild_img`,`zoneid`,`cupScore`,`enableQuickIn`,`condition`) VALUES (%d, '%s',%d, '%s', %d,'%s','%s','%s', %d, %d,%d,'%s'); ");
- //// 更新公会成员数量
- //define("SQLUPDATEGUILDMEMBERCOUNT", "UPDATE `tab_guild` SET `membercount`=%d WHERE `guildId`=%d and `zoneid`=%d ;");
- //// 更新公会的公告/宗旨 徽章
- //define("SQLUPDATEGUILDDECLARE", "UPDATE `tab_guild` SET `declare`='%s',`guild_img`='%s',`enableQuickIn`=%d,`condition`='%s' where `guildId`=%d and `zoneid`=%d;");
- //// 解散公会
- //define("SQLDISSMISS", "DELETE FROM `tab_guild` WHERE `guildId`=%d and `zoneid`=%d; ");
- //// 更新公会会长id name
- //define("SQLUPDATECHAIRMAN", "UPDATE `tab_guild` SET `chairman_id`='%s',`chairman_name`='%s' WHERE `guildId`=%d and `zoneid`=%d ;");
- //// 更新公会积分
- //define("SQLUPDATEGUILDCUPSTORE", "UPDATE `tab_guild` SET `cupScore`=%d WHERE `guildId`=%d and `zoneid`=%d ;");
- /**
- * 公会模块
- */
- class GuildProc {
- /**
- * 表名
- */
- const tabGuild = 'tab_guild';
- /**
- * 创建公会的冷却时间
- */
- const create_codingTime = 86400;
- /**
- * 逻辑分发
- * 所有的Proc中必须有这样一个方法
- */
- static function procMain() {
- switch (req()->cmd) {
- case CmdCode::cmd_guild_getUserGuildInfo: # 7000 查询自己的公会
- return self::GetUserGuildInfo();
- case CmdCode::cmd_guild_getList: # 7001 查公会列表 公会浏览 列表以cupScore依据 从多到少排列 暂未开放
- return self::GetGuildList();
- // case CmdCode::cmd_guild_refuseGuildCupScore: # 7002 每日一次刷新公会积分
- // return self::refuseGuildCupScore();
- case CmdCode::cmd_guild_searchGuildByID: # 7003 通过id搜索公会
- return self::SearchByGuildID();
- case CmdCode::cmd_guild_create: # 7004 创建公会
- return self::CreateGuild();
- // case CmdCode:: cmd_guild_apply: # 7005 申请加入
- // return self::ApplyForGuild($req);
- case CmdCode::cmd_guild_QuickIn: # 7006 一键加入
- return self::QuickIn();
- // case CmdCode::cmd_guild_GetGuildInfo: # 7007 请求本公会数据
- // return self::GetGuildInfo($req);
- // case CmdCode::cmd_guild_modifyDeclare: # 7008 编辑
- // return self::ModifyDeclare($req);
- // // case CmdCode::cmd_guild_chairmanQuit: # 7009 会长退会
- // // return self::chairmanQuit($req);
- // case CmdCode::cmd_guild_fireMember: # 7010 开除
- // return self::FireMember($req);
- // case CmdCode::cmd_guild_approve: # 7011 审批 申请
- // return self:: Approve($req);
- // case CmdCode::cmd_guild_setPriceChairman: # 7013 设置 会员 干部 副会长
- // return self::SetViceChairman($req);
- case CmdCode::cmd_guild_getGuildMembers: # 7014 获取成员信息
- return self::GetGuildMembers();
- // <editor-fold defaultstate="collapsed" desc=" 注释掉">
- // case CmdCode::cmd_guild_quit: # 7016 退会
- // return self::QuitGuild($req);
- // case CmdCode::cmd_guild_InitiateAccuse: # 7017 发起弹劾
- // return self::InitiateAccuseChairMan($req);
- // case CmdCode::cmd_guild_Accuse: # 7018 同意弹劾
- // return self::ApproveAccuseChairMan($req);
- // case CmdCode::cmd_guild_ChairmanCancelAccuse: # 7019 会长取消本次弹劾
- // return self::CancelAccuse($req);
- // case CmdCode::cmd_guild_ApplyUserIntro: # 7020 申请者玩家简介
- // return self::ApplyUserIntro($req);
- // #捐献
- // case CmdCode::cmd_guild_requestDonate: # 7021 请求捐献
- // return self::requestDonate($req);
- // case CmdCode::cmd_guild_donate: # 7022 捐献
- // return self::Donate($req);
- // case CmdCode::cmd_guild_donateInfoRefresh: # 7023 到捐献时间后 刷新
- // return self::donateInfoRefresh($req);
- // #礼包
- // case CmdCode::cmd_guild_buyDonateGift: # 7024 购买捐献度礼包
- // return self::buyDonateGift($req);
- // case CmdCode::cmd_guild_buyGuildCashGift: # 7025 购买公会钻石礼包 弃用
- // return self::buyGuildCashGift($req);
- // #公会公告 邮件 会长 副会长有权限
- // case CmdCode::cmd_guild_announcement: # 7026 公告
- // return self::announcement($req);
- // case CmdCode::cmd_guild_noticeMail: # 7027 公会邮件
- // return self::noticeMail($req);
- // #公会战 未开启状态
- // case CmdCode::cmd_guild_vsFightInvite: #7028 邀请战斗
- // return self::vsFightInvite($req);
- // case CmdCode::cmd_guild_cancelInvite: #7029 取消邀请战斗
- // return self::cancelInvite($req);
- // case CmdCode::cmd_guild_fight: #7030 接受并战斗
- // return self::fight($req);
- // </editor-fold>
- default:
- return Err(ErrCode::cmd_err);
- }
- }
- // <editor-fold defaultstate="collapsed" desc="公会基础操作">
- /**
- * [7000]查询自己的公会信息
- * 玩家打开公会的时候第一步就是这个,如果没有数据,就显示公会列表吧。
- */
- static function GetUserGuildInfo() {
- $uid = req()->uid;
- $zoneid = req()->zoneid;
- $userGuildInfo = self:: getMemUserGuildInfo($uid, $zoneid); # 取玩家公会信息
- self::updateUserGuildInfo($userGuildInfo, $uid, $zoneid); # 回写玩家公会数据
- return Resp::ok($userGuildInfo);
- }
- /**
- * [7001]获取公会列表,
- */
- static function GetGuildList() {
- $zoneid = req()->zoneid;
- $page = intval(req()->paras[0]); # 起始页索引编号
- $startIndex = ($page - 1) * 20; # 换算成index(按照1页20条计算)
- if ($startIndex < 0) { # 防御: 避免出现 小于0的索引值
- $startIndex = 0;
- }
- $memList = self::getGuildListCache($page, $zoneid); # 取缓存
- if (empty($memList) || $memList->ts < now()) {
- $memList = self::UpdateGuildListCache($zoneid, $startIndex, $page); # 更新并返回缓存的公会列表
- }
- $result = array(# # 返回值
- "totalcount" => $memList->count, # # 有多少个公会 分页用
- "table" => $memList->table # # 该页的公会信息
- );
- return Resp::ok($result);
- }
- /**
- * [7003] 通过公会ID进行搜索
- */
- static function SearchByGuildID() {
- $zoneid = req()->zoneid;
- $keywords = req()->paras[0]; // 搜索 关键字
- $sqlret = daoInst()->select()->from(self::tabGuild)
- ->where("`zoneid`=$zoneid and (`guildId`='$keywords' OR `name` like '%$keywords%')")
- ->limit(10)->fetchAll();
- return Resp::ok(array(
- "guildInfo" => $sqlret,
- ));
- }
- /**
- * [7004]创建公会
- */
- static function CreateGuild() {
- $base = ctx()->base();
- $zoneid = req()->zoneid;
- $uid = req()->uid; // fromoid
- //客户端参数解析
- list($guildName, $declare, $guild_img, $applyType) = req()->paras; # 公会名称, 宗旨, 徽章, 允许加入类型
- // $gcfg = glc(); # 全局变量
- $userGuildInfo = self:: getMemUserGuildInfo($uid, $zoneid); # 取玩家公会信息
- my_Assert($userGuildInfo->guildId <= 0, ErrCode::err_guild_userhasbeenaguildmember); # 防御: 已经加入公会
- $n = daoInst()->select()->from(self::tabGuild)->where(" `name` ='$guildName' ")->count(); # 检查公会名称是否已存在
- my_Assert($n <= 0, ErrCode::err_guild_nameexists); # 防御: 公会名称已存在
- my_Assert(!empty($guildName), ErrCode::err_guild_nameEmputy); # 防御: 参数公会名称为空
- my_Assert(!empty($guild_img), ErrCode::err_guild_imgEmputy); # 防御: 参数公会图标为空
- // my_Assert($base->Consume_Gold($gcfg->Guild_Found_CostGold), ErrCode::err_msg_goldnotenough); # 扣除金币
- $guildInfo = Data_Guild::NewGuildInit($uid, $base->name, $guildName); # 创建公会MEM数据体,
- $userGuildInfo->Clear(); # 创建/重置玩家公会信息
- $userGuildInfo->guildId = $guildInfo->guildId;
- $userGuildInfo->position = 'Chairman';
- $userGuildInfo->guildName = $guildInfo->name;
- if (GAME_ONLINE) {
- $userGuildInfo->create_coding = now(self::create_codingTime); # 设置冷却时间. Ps, 24小时内不准再创建公会.
- }
- // Mysql 插入公会记录
- $data = array(
- 'guildId' => intval($guildInfo->guildId),
- 'name' => $guildName,
- 'createts' => $guildInfo->createts,
- 'declare' => $declare,
- 'membercount' => count($guildInfo->members),
- 'chairman_id' => $uid,
- 'chairman_name' => $base->name,
- 'guild_img' => $guild_img,
- 'zoneid' => $zoneid,
- 'cupScore' => 0,
- 'level' => 1,
- 'enableQuickIn' => $guildInfo->enableQuickIn,
- 'condition' => ''
- );
- daoInst()->insert(self::tabGuild)->data($data)->exec();
- self::updateUserGuildInfo($userGuildInfo, $uid, $zoneid); # 回写玩家公会数据
- $guildInfo->updateDataFull(MemKey_Guild::getGuildInfo_hash($guildInfo->guildId, $zoneid)); # 保存公会数据
- UserProc::updateUserInfo();
- return Resp::ok($guildInfo); # 设置成功返回值
- }
- /**
- * [7014] 获取公会成员信息
- */
- static function GetGuildMembers() {
- $zoneID = req()->zoneid;
- $guildId = req()->paras[0]; # 公会ID
- $guildInfo = self::getMemGuildInfo($guildId, $zoneID); # 取公会信息
- my_Assert(isset($guildInfo), ErrCode::err_guild_guildinfono); # 找不到公会
- $memberArr = array();
- foreach ($guildInfo->members as $mboid) {
- $memberInfo = self::getMemUserGuildInfo($mboid, $zoneID);
- $base = UserProc::getUserGame($zoneID, $mboid)->base();
- $memberInfo->name = $base->name; # 刷新下昵称
- $memberInfo->level = $base->level; # 刷新下等级
- // $memberInfo->fightPower = self::initFightTeamInfo($mem, $mboid, $zoneID);
- // $memberInfo->uid = $mboid;
- $memberInfo->img = $base->img; # 刷新下头像
- $memberInfo->imgBorderId = $base->imgBorderId; # 刷新下头像框
- $memberInfo->lastLogin = $base->lastLogin; # 成员最后登陆时间
- unset($memberInfo->appliedguildlist);
- unset($memberInfo->appliedguildRecord);
- $memberArr[] = $memberInfo;
- }
- // $chairmanInfo = UserProc::getUserInfo($mem, $zoneID, $guildInfo->chairman_id);
- // $guildInfo->chairmanLastLogin = $chairmanInfo->game->lastLogin;
- return Resp::ok(array(
- "guildInfo" => $guildInfo,
- "member" => $memberArr,
- ));
- }
- /**
- * [7006] 一键加入公会
- */
- static function QuickIn() {
- $mem = gMem();
- $zoneid = req()->zoneid;
- $uid = req()->uid; # fromoid
- $guildId = req()->paras[0]; # 公会ID
- $userGuildInfo = self:: getMemUserGuildInfo($uid, $zoneid); # 取玩家公会信息
- my_Assert(0 == $userGuildInfo->guildId, ErrCode::err_guild_userhasbeenaguildmember); # 防御: 玩家已经加入某个公会
- my_Assert($userGuildInfo->create_coding <= now(), ErrCode::err_guild_dissmisscodingtime); # 防御: 冷却中
- $guildInfo = self::getMemGuildInfo($guildId, $zoneid); # 公会信息
- my_Assert(isset($guildInfo), ErrCode::err_guild_guildinfono); # 找不到公会
- my_Assert(!$guildInfo->checkmemberfull(), ErrCode::err_guild_memberfull); # 公会已满 Ps.公会成员数量 20~60
- my_Assert(0 == $guildInfo->enableQuickIn, ErrCode::err_guild_quickinclosed); # 公会未开启一键加入功能(0 开放加入,1 需审批,2 不允许加入)
- // 直接跳过审批流程
- $guildInfo->members[] = $uid; # 添加成员
- $userGuildInfo->Clear(); # 玩家数据清零
- $userGuildInfo->guildId = $guildId;
- $userGuildInfo->guildName = empty($guildInfo->name) ? "" : $guildInfo->name;
- $userGuildInfo->appliedguildlist = array(); # 清空玩家申请记录
- $userGuildInfo->joints = now();
- $userGuildInfo->position = 'Member';
- $guildInfo->updateGuildMemberCount(); # 同步更新一下数据库中公会成员数量
- $guildInfo->updateDataFull(MemKey_Guild::getGuildInfo_hash($guildInfo->guildId, $zoneid)); # 回写公会数据
- self::updateUserGuildInfo($userGuildInfo, $uid, $zoneid); # 回写玩家公会数据
- return Resp::ok($userGuildInfo); # 设置成功返回值
- }
- // </editor-fold>
- // <editor-fold defaultstate="collapsed" desc="公会封装函数集合">
- /**
- * 读Redis中玩家公会信息
- * @param int $uid
- * @param int $zoneid
- * @return Data_UserGuild
- */
- static function getMemUserGuildInfo($uid, $zoneid) {
- $ret = new Data_UserGuild();
- $ret->readDataFromMem(MemKey_Guild::getUserGuildInfo_hash($uid, $zoneid));
- return $ret;
- }
- /**
- * 回写玩家公会信息
- * @param Data_UserGuild $userGuildInfo
- * @param int $uid
- * @param int $zoneid
- */
- static function updateUserGuildInfo($userGuildInfo, $uid, $zoneid) {
- $memkey = MemKey_Guild::getUserGuildInfo_hash($uid, $zoneid);
- $userGuildInfo->updateDataFull($memkey); # 回写玩家公会数据
- }
- /**
- * 取指定guildid的公会数据
- * @param int $guildId
- * @param int $zoneid
- * @return Data_Guild/null
- */
- static function getMemGuildInfo($guildId, $zoneid) {
- $ret = new Data_Guild();
- return $ret->readDataFromMem(MemKey_Guild::getGuildInfo_hash($guildId, $zoneid));
- }
- /**
- * 获取公会列表缓存信息 ok
- * @param type $page
- * @param type $zoneid
- * @return {"count":0,"ts":0,"table":[]}
- */
- static function getGuildListCache($page, $zoneid) {
- return gMem()->get(MemKey_Guild::guildListCache($page, $zoneid));
- }
- /**
- * 更新并返回缓存的公会列表
- * @param type $zoneid
- * @param type $startIndex
- * @param type $page
- * @return type
- */
- static function UpdateGuildListCache($zoneid, $startIndex, $page) {
- $dbret = daoInst()->select()->from(self::tabGuild)
- ->where('zoneid')->eq($zoneid)
- ->limit("$startIndex ,20")
- ->fetchAll();
- $count = daoInst()->select()->from(self::tabGuild)->where('zoneid')->eq($zoneid)->count();
- $memList = ObjectInit();
- $memList->ts = now(3); # 设置为3秒好了,如果体验差,再缩短一下
- $memList->table = $dbret;
- $memList->count = $count;
- gMem()->set(MemKey_Guild::guildListCache($page, $zoneid), $memList); # 更新缓存的公会列表
- return $memList;
- }
- /**
- * 判断玩家是否公会会长
- * @param type $uid
- * @param type $guildInfo
- * @return boolean
- */
- static function isGuildChairman($uid, $guildInfo) {
- return $guildInfo->chairman_id == $uid;
- }
- // </editor-fold>
- }
|