GuildProc.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. <?php
  2. namespace loyalsoft;
  3. //define("GUILDAPPLYCAPACITY", 99); # 公会申请记录的容量限制
  4. //define("CREATECODINGTIME", 86400); # 退出公会开除会员后有24小时冷却时间, 不能加入其他公会
  5. //define("GUILDIDBASE", 100000); # 公会ID开始增长的基础值
  6. //define("GUILDMAXJOURNALCOUNT", 80); # 公会日志最多存80条记录
  7. //define("ACCUSESUCCEEDNUM", 3); # 弹劾会长成功人数
  8. //define("ACCUSEFAILNUM", 2); # 弹劾会长失败人数
  9. //define("GUILDCUPSCOREREFUSE", 86400); # 公会积分刷新时间间隔
  10. #
  11. //// 获取公会列表,PS根据等级排序
  12. //define("SQLSELECTGUILDBYLEVEL", "SELECT * FROM `tab_guild` where `zoneid`=%d ORDER BY `cupScore` DESC,`createts` LIMIT %s,20;");
  13. //// 查询公会总数量
  14. //define("SELECTGUILDCOUNT", "SELECT COUNT(`id`) FROM `tab_guild` where `zoneid`=%d ;");
  15. //// 通过名称模糊查询公会
  16. //define("SQLSELECTGUILDBYNAME", "SELECT * FROM `tab_guild` WHERE `zoneid`=%d and (`guildId`=%d OR `name` like '%s') LIMIT 10;");
  17. //// 通过guildid查询公会
  18. //define("SQLSELECTGUILDBYGUILDID", "SELECT * FROM `tab_guild` WHERE `zoneid`=%d and `guildId`=%d ;");
  19. //// 检查公会名称是否已存在 =: 各区也不能重名
  20. //define("SQLCHECKISNAMEEXIST", "SELECT `id` FROM `tab_guild` WHERE `name`='%s' ");
  21. //// 创建公会
  22. //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'); ");
  23. //// 更新公会成员数量
  24. //define("SQLUPDATEGUILDMEMBERCOUNT", "UPDATE `tab_guild` SET `membercount`=%d WHERE `guildId`=%d and `zoneid`=%d ;");
  25. //// 更新公会的公告/宗旨 徽章
  26. //define("SQLUPDATEGUILDDECLARE", "UPDATE `tab_guild` SET `declare`='%s',`guild_img`='%s',`enableQuickIn`=%d,`condition`='%s' where `guildId`=%d and `zoneid`=%d;");
  27. //// 解散公会
  28. //define("SQLDISSMISS", "DELETE FROM `tab_guild` WHERE `guildId`=%d and `zoneid`=%d; ");
  29. //// 更新公会会长id name
  30. //define("SQLUPDATECHAIRMAN", "UPDATE `tab_guild` SET `chairman_id`='%s',`chairman_name`='%s' WHERE `guildId`=%d and `zoneid`=%d ;");
  31. //// 更新公会积分
  32. //define("SQLUPDATEGUILDCUPSTORE", "UPDATE `tab_guild` SET `cupScore`=%d WHERE `guildId`=%d and `zoneid`=%d ;");
  33. /**
  34. * 公会模块
  35. */
  36. class GuildProc {
  37. /**
  38. * 表名
  39. */
  40. const tabGuild = 'tab_guild';
  41. /**
  42. * 创建公会的冷却时间
  43. */
  44. const create_codingTime = 86400;
  45. /**
  46. * 逻辑分发
  47. * 所有的Proc中必须有这样一个方法
  48. */
  49. static function procMain() {
  50. switch (req()->cmd) {
  51. case CmdCode::cmd_guild_getUserGuildInfo: # 7000 查询自己的公会
  52. return self::GetUserGuildInfo();
  53. case CmdCode::cmd_guild_getList: # 7001 查公会列表 公会浏览 列表以cupScore依据 从多到少排列 暂未开放
  54. return self::GetGuildList();
  55. // case CmdCode::cmd_guild_refuseGuildCupScore: # 7002 每日一次刷新公会积分
  56. // return self::refuseGuildCupScore();
  57. case CmdCode::cmd_guild_searchGuildByID: # 7003 通过id搜索公会
  58. return self::SearchByGuildID();
  59. case CmdCode::cmd_guild_create: # 7004 创建公会
  60. return self::CreateGuild();
  61. // case CmdCode:: cmd_guild_apply: # 7005 申请加入
  62. // return self::ApplyForGuild($req);
  63. case CmdCode::cmd_guild_QuickIn: # 7006 一键加入
  64. return self::QuickIn();
  65. // case CmdCode::cmd_guild_GetGuildInfo: # 7007 请求本公会数据
  66. // return self::GetGuildInfo($req);
  67. // case CmdCode::cmd_guild_modifyDeclare: # 7008 编辑
  68. // return self::ModifyDeclare($req);
  69. // // case CmdCode::cmd_guild_chairmanQuit: # 7009 会长退会
  70. // // return self::chairmanQuit($req);
  71. // case CmdCode::cmd_guild_fireMember: # 7010 开除
  72. // return self::FireMember($req);
  73. // case CmdCode::cmd_guild_approve: # 7011 审批 申请
  74. // return self:: Approve($req);
  75. // case CmdCode::cmd_guild_setPriceChairman: # 7013 设置 会员 干部 副会长
  76. // return self::SetViceChairman($req);
  77. case CmdCode::cmd_guild_getGuildMembers: # 7014 获取成员信息
  78. return self::GetGuildMembers();
  79. // <editor-fold defaultstate="collapsed" desc=" 注释掉">
  80. // case CmdCode::cmd_guild_quit: # 7016 退会
  81. // return self::QuitGuild($req);
  82. // case CmdCode::cmd_guild_InitiateAccuse: # 7017 发起弹劾
  83. // return self::InitiateAccuseChairMan($req);
  84. // case CmdCode::cmd_guild_Accuse: # 7018 同意弹劾
  85. // return self::ApproveAccuseChairMan($req);
  86. // case CmdCode::cmd_guild_ChairmanCancelAccuse: # 7019 会长取消本次弹劾
  87. // return self::CancelAccuse($req);
  88. // case CmdCode::cmd_guild_ApplyUserIntro: # 7020 申请者玩家简介
  89. // return self::ApplyUserIntro($req);
  90. // #捐献
  91. // case CmdCode::cmd_guild_requestDonate: # 7021 请求捐献
  92. // return self::requestDonate($req);
  93. // case CmdCode::cmd_guild_donate: # 7022 捐献
  94. // return self::Donate($req);
  95. // case CmdCode::cmd_guild_donateInfoRefresh: # 7023 到捐献时间后 刷新
  96. // return self::donateInfoRefresh($req);
  97. // #礼包
  98. // case CmdCode::cmd_guild_buyDonateGift: # 7024 购买捐献度礼包
  99. // return self::buyDonateGift($req);
  100. // case CmdCode::cmd_guild_buyGuildCashGift: # 7025 购买公会钻石礼包 弃用
  101. // return self::buyGuildCashGift($req);
  102. // #公会公告 邮件 会长 副会长有权限
  103. // case CmdCode::cmd_guild_announcement: # 7026 公告
  104. // return self::announcement($req);
  105. // case CmdCode::cmd_guild_noticeMail: # 7027 公会邮件
  106. // return self::noticeMail($req);
  107. // #公会战 未开启状态
  108. // case CmdCode::cmd_guild_vsFightInvite: #7028 邀请战斗
  109. // return self::vsFightInvite($req);
  110. // case CmdCode::cmd_guild_cancelInvite: #7029 取消邀请战斗
  111. // return self::cancelInvite($req);
  112. // case CmdCode::cmd_guild_fight: #7030 接受并战斗
  113. // return self::fight($req);
  114. // </editor-fold>
  115. default:
  116. return Err(ErrCode::cmd_err);
  117. }
  118. }
  119. // <editor-fold defaultstate="collapsed" desc="公会基础操作">
  120. /**
  121. * [7000]查询自己的公会信息
  122. * 玩家打开公会的时候第一步就是这个,如果没有数据,就显示公会列表吧。
  123. */
  124. static function GetUserGuildInfo() {
  125. $uid = req()->uid;
  126. $zoneid = req()->zoneid;
  127. $userGuildInfo = self:: getMemUserGuildInfo($uid, $zoneid); # 取玩家公会信息
  128. self::updateUserGuildInfo($userGuildInfo, $uid, $zoneid); # 回写玩家公会数据
  129. return Resp::ok($userGuildInfo);
  130. }
  131. /**
  132. * [7001]获取公会列表,
  133. */
  134. static function GetGuildList() {
  135. $zoneid = req()->zoneid;
  136. $page = intval(req()->paras[0]); # 起始页索引编号
  137. $startIndex = ($page - 1) * 20; # 换算成index(按照1页20条计算)
  138. if ($startIndex < 0) { # 防御: 避免出现 小于0的索引值
  139. $startIndex = 0;
  140. }
  141. $memList = self::getGuildListCache($page, $zoneid); # 取缓存
  142. if (empty($memList) || $memList->ts < now()) {
  143. $memList = self::UpdateGuildListCache($zoneid, $startIndex, $page); # 更新并返回缓存的公会列表
  144. }
  145. $result = array(# # 返回值
  146. "totalcount" => $memList->count, # # 有多少个公会 分页用
  147. "table" => $memList->table # # 该页的公会信息
  148. );
  149. return Resp::ok($result);
  150. }
  151. /**
  152. * [7003] 通过公会ID进行搜索
  153. */
  154. static function SearchByGuildID() {
  155. $zoneid = req()->zoneid;
  156. $keywords = req()->paras[0]; // 搜索 关键字
  157. $sqlret = daoInst()->select()->from(self::tabGuild)
  158. ->where("`zoneid`=$zoneid and (`guildId`='$keywords' OR `name` like '%$keywords%')")
  159. ->limit(10)->fetchAll();
  160. return Resp::ok(array(
  161. "guildInfo" => $sqlret,
  162. ));
  163. }
  164. /**
  165. * [7004]创建公会
  166. */
  167. static function CreateGuild() {
  168. $base = ctx()->base();
  169. $zoneid = req()->zoneid;
  170. $uid = req()->uid; // fromoid
  171. //客户端参数解析
  172. list($guildName, $declare, $guild_img, $applyType) = req()->paras; # 公会名称, 宗旨, 徽章, 允许加入类型
  173. // $gcfg = glc(); # 全局变量
  174. $userGuildInfo = self:: getMemUserGuildInfo($uid, $zoneid); # 取玩家公会信息
  175. my_Assert($userGuildInfo->guildId <= 0, ErrCode::err_guild_userhasbeenaguildmember); # 防御: 已经加入公会
  176. $n = daoInst()->select()->from(self::tabGuild)->where(" `name` ='$guildName' ")->count(); # 检查公会名称是否已存在
  177. my_Assert($n <= 0, ErrCode::err_guild_nameexists); # 防御: 公会名称已存在
  178. my_Assert(!empty($guildName), ErrCode::err_guild_nameEmputy); # 防御: 参数公会名称为空
  179. my_Assert(!empty($guild_img), ErrCode::err_guild_imgEmputy); # 防御: 参数公会图标为空
  180. // my_Assert($base->Consume_Gold($gcfg->Guild_Found_CostGold), ErrCode::err_msg_goldnotenough); # 扣除金币
  181. $guildInfo = Data_Guild::NewGuildInit($uid, $base->name, $guildName); # 创建公会MEM数据体,
  182. $userGuildInfo->Clear(); # 创建/重置玩家公会信息
  183. $userGuildInfo->guildId = $guildInfo->guildId;
  184. $userGuildInfo->position = 'Chairman';
  185. $userGuildInfo->guildName = $guildInfo->name;
  186. if (GAME_ONLINE) {
  187. $userGuildInfo->create_coding = now(self::create_codingTime); # 设置冷却时间. Ps, 24小时内不准再创建公会.
  188. }
  189. // Mysql 插入公会记录
  190. $data = array(
  191. 'guildId' => intval($guildInfo->guildId),
  192. 'name' => $guildName,
  193. 'createts' => $guildInfo->createts,
  194. 'declare' => $declare,
  195. 'membercount' => count($guildInfo->members),
  196. 'chairman_id' => $uid,
  197. 'chairman_name' => $base->name,
  198. 'guild_img' => $guild_img,
  199. 'zoneid' => $zoneid,
  200. 'cupScore' => 0,
  201. 'level' => 1,
  202. 'enableQuickIn' => $guildInfo->enableQuickIn,
  203. 'condition' => ''
  204. );
  205. daoInst()->insert(self::tabGuild)->data($data)->exec();
  206. self::updateUserGuildInfo($userGuildInfo, $uid, $zoneid); # 回写玩家公会数据
  207. $guildInfo->updateDataFull(MemKey_Guild::getGuildInfo_hash($guildInfo->guildId, $zoneid)); # 保存公会数据
  208. UserProc::updateUserInfo();
  209. return Resp::ok($guildInfo); # 设置成功返回值
  210. }
  211. /**
  212. * [7014] 获取公会成员信息
  213. */
  214. static function GetGuildMembers() {
  215. $zoneID = req()->zoneid;
  216. $guildId = req()->paras[0]; # 公会ID
  217. $guildInfo = self::getMemGuildInfo($guildId, $zoneID); # 取公会信息
  218. my_Assert(isset($guildInfo), ErrCode::err_guild_guildinfono); # 找不到公会
  219. $memberArr = array();
  220. foreach ($guildInfo->members as $mboid) {
  221. $memberInfo = self::getMemUserGuildInfo($mboid, $zoneID);
  222. $base = UserProc::getUserGame($zoneID, $mboid)->base();
  223. $memberInfo->name = $base->name; # 刷新下昵称
  224. $memberInfo->level = $base->level; # 刷新下等级
  225. // $memberInfo->fightPower = self::initFightTeamInfo($mem, $mboid, $zoneID);
  226. // $memberInfo->uid = $mboid;
  227. $memberInfo->img = $base->img; # 刷新下头像
  228. $memberInfo->imgBorderId = $base->imgBorderId; # 刷新下头像框
  229. $memberInfo->lastLogin = $base->lastLogin; # 成员最后登陆时间
  230. unset($memberInfo->appliedguildlist);
  231. unset($memberInfo->appliedguildRecord);
  232. $memberArr[] = $memberInfo;
  233. }
  234. // $chairmanInfo = UserProc::getUserInfo($mem, $zoneID, $guildInfo->chairman_id);
  235. // $guildInfo->chairmanLastLogin = $chairmanInfo->game->lastLogin;
  236. return Resp::ok(array(
  237. "guildInfo" => $guildInfo,
  238. "member" => $memberArr,
  239. ));
  240. }
  241. /**
  242. * [7006] 一键加入公会
  243. */
  244. static function QuickIn() {
  245. $mem = gMem();
  246. $zoneid = req()->zoneid;
  247. $uid = req()->uid; # fromoid
  248. $guildId = req()->paras[0]; # 公会ID
  249. $userGuildInfo = self:: getMemUserGuildInfo($uid, $zoneid); # 取玩家公会信息
  250. my_Assert(0 == $userGuildInfo->guildId, ErrCode::err_guild_userhasbeenaguildmember); # 防御: 玩家已经加入某个公会
  251. my_Assert($userGuildInfo->create_coding <= now(), ErrCode::err_guild_dissmisscodingtime); # 防御: 冷却中
  252. $guildInfo = self::getMemGuildInfo($guildId, $zoneid); # 公会信息
  253. my_Assert(isset($guildInfo), ErrCode::err_guild_guildinfono); # 找不到公会
  254. my_Assert(!$guildInfo->checkmemberfull(), ErrCode::err_guild_memberfull); # 公会已满 Ps.公会成员数量 20~60
  255. my_Assert(0 == $guildInfo->enableQuickIn, ErrCode::err_guild_quickinclosed); # 公会未开启一键加入功能(0 开放加入,1 需审批,2 不允许加入)
  256. // 直接跳过审批流程
  257. $guildInfo->members[] = $uid; # 添加成员
  258. $userGuildInfo->Clear(); # 玩家数据清零
  259. $userGuildInfo->guildId = $guildId;
  260. $userGuildInfo->guildName = empty($guildInfo->name) ? "" : $guildInfo->name;
  261. $userGuildInfo->appliedguildlist = array(); # 清空玩家申请记录
  262. $userGuildInfo->joints = now();
  263. $userGuildInfo->position = 'Member';
  264. $guildInfo->updateGuildMemberCount(); # 同步更新一下数据库中公会成员数量
  265. $guildInfo->updateDataFull(MemKey_Guild::getGuildInfo_hash($guildInfo->guildId, $zoneid)); # 回写公会数据
  266. self::updateUserGuildInfo($userGuildInfo, $uid, $zoneid); # 回写玩家公会数据
  267. return Resp::ok($userGuildInfo); # 设置成功返回值
  268. }
  269. // </editor-fold>
  270. // <editor-fold defaultstate="collapsed" desc="公会封装函数集合">
  271. /**
  272. * 读Redis中玩家公会信息
  273. * @param int $uid
  274. * @param int $zoneid
  275. * @return Data_UserGuild
  276. */
  277. static function getMemUserGuildInfo($uid, $zoneid) {
  278. $ret = new Data_UserGuild();
  279. $ret->readDataFromMem(MemKey_Guild::getUserGuildInfo_hash($uid, $zoneid));
  280. return $ret;
  281. }
  282. /**
  283. * 回写玩家公会信息
  284. * @param Data_UserGuild $userGuildInfo
  285. * @param int $uid
  286. * @param int $zoneid
  287. */
  288. static function updateUserGuildInfo($userGuildInfo, $uid, $zoneid) {
  289. $memkey = MemKey_Guild::getUserGuildInfo_hash($uid, $zoneid);
  290. $userGuildInfo->updateDataFull($memkey); # 回写玩家公会数据
  291. }
  292. /**
  293. * 取指定guildid的公会数据
  294. * @param int $guildId
  295. * @param int $zoneid
  296. * @return Data_Guild/null
  297. */
  298. static function getMemGuildInfo($guildId, $zoneid) {
  299. $ret = new Data_Guild();
  300. return $ret->readDataFromMem(MemKey_Guild::getGuildInfo_hash($guildId, $zoneid));
  301. }
  302. /**
  303. * 获取公会列表缓存信息 ok
  304. * @param type $page
  305. * @param type $zoneid
  306. * @return {"count":0,"ts":0,"table":[]}
  307. */
  308. static function getGuildListCache($page, $zoneid) {
  309. return gMem()->get(MemKey_Guild::guildListCache($page, $zoneid));
  310. }
  311. /**
  312. * 更新并返回缓存的公会列表
  313. * @param type $zoneid
  314. * @param type $startIndex
  315. * @param type $page
  316. * @return type
  317. */
  318. static function UpdateGuildListCache($zoneid, $startIndex, $page) {
  319. $dbret = daoInst()->select()->from(self::tabGuild)
  320. ->where('zoneid')->eq($zoneid)
  321. ->limit("$startIndex ,20")
  322. ->fetchAll();
  323. $count = daoInst()->select()->from(self::tabGuild)->where('zoneid')->eq($zoneid)->count();
  324. $memList = ObjectInit();
  325. $memList->ts = now(3); # 设置为3秒好了,如果体验差,再缩短一下
  326. $memList->table = $dbret;
  327. $memList->count = $count;
  328. gMem()->set(MemKey_Guild::guildListCache($page, $zoneid), $memList); # 更新缓存的公会列表
  329. return $memList;
  330. }
  331. /**
  332. * 判断玩家是否公会会长
  333. * @param type $uid
  334. * @param type $guildInfo
  335. * @return boolean
  336. */
  337. static function isGuildChairman($uid, $guildInfo) {
  338. return $guildInfo->chairman_id == $uid;
  339. }
  340. // </editor-fold>
  341. }