诸暨麻将添加redis
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

865 lines
22 KiB

  1. #include "StdAfx.h"
  2. #include "ServerUserManager.h"
  3. //////////////////////////////////////////////////////////////////////////////////
  4. //构造函数
  5. CServerUserItem::CServerUserItem()
  6. {
  7. //附加变量
  8. m_dwUserRight = 0L;
  9. m_dwMasterRight = 0L;
  10. //托管变量
  11. m_lTrusteeScore = 0L;
  12. m_lRestrictScore = 0L;
  13. m_lFrozenedScore = 0L;
  14. m_lFrozenedScore = 0L;
  15. //登录信息
  16. m_dwDBQuestID = 0L;
  17. m_dwLogonTime = 0L;
  18. m_dwInoutIndex = INVALID_DWORD;
  19. //客户类型
  20. m_bMobileUser = false;
  21. m_bAndroidUser = false;
  22. //组件接口
  23. m_pIServerUserItemSink = NULL;
  24. //系统属性
  25. m_wBindIndex = INVALID_WORD;
  26. m_dwClientAddr = INADDR_NONE;
  27. ZeroMemory(m_szMachineID, sizeof(m_szMachineID));
  28. //比赛信息
  29. m_dwSignUpTime = 0;
  30. m_cbSignUpStatus = 0;
  31. m_pMatchData = NULL;
  32. //辅助变量
  33. m_bTrusteeUser = false;
  34. m_bClientReady = false;
  35. m_bModifyScore = false;
  36. ZeroMemory(m_szLogonPass, sizeof(m_szLogonPass));
  37. //属性变量
  38. ZeroMemory(&m_UserInfo, sizeof(m_UserInfo));
  39. ZeroMemory(&m_UserRule, sizeof(m_UserRule));
  40. ZeroMemory(&m_ScoreFormer, sizeof(m_ScoreFormer));
  41. ZeroMemory(&m_UserProperty, sizeof(m_UserProperty));
  42. m_UserInfo.wTableID = INVALID_TABLE;
  43. m_UserInfo.wLastTableID = INVALID_TABLE;
  44. m_UserInfo.wChairID = INVALID_CHAIR;
  45. //记录信息
  46. ZeroMemory(&m_RecordInfo, sizeof(m_RecordInfo));
  47. ZeroMemory(&m_VariationInfo, sizeof(m_VariationInfo));
  48. //手机定义
  49. m_wMobileUserRule = 0;
  50. m_wMobileUserRule |= VIEW_MODE_PART;
  51. m_wMobileUserRule |= VIEW_INFO_LEVEL_1;
  52. m_wDeskPos = 0;
  53. m_wDeskCount = 1;
  54. m_szMachineType = DEVICE_TYPE_PC;
  55. return;
  56. }
  57. //析构函数
  58. CServerUserItem::~CServerUserItem()
  59. {
  60. }
  61. //接口查询
  62. VOID * CServerUserItem::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
  63. {
  64. QUERYINTERFACE(IServerUserItem, Guid, dwQueryVer);
  65. QUERYINTERFACE(IServerUserService, Guid, dwQueryVer);
  66. QUERYINTERFACE_IUNKNOWNEX(IServerUserItem, Guid, dwQueryVer);
  67. return NULL;
  68. }
  69. //用户胜率
  70. WORD CServerUserItem::GetUserWinRate()
  71. {
  72. //计算胜率
  73. DWORD dwPlayCount = GetUserPlayCount();
  74. if (dwPlayCount != 0L) return (WORD)(m_UserInfo.dwWinCount * 10000L / dwPlayCount);
  75. return 0;
  76. }
  77. //用户输率
  78. WORD CServerUserItem::GetUserLostRate()
  79. {
  80. //计算输率
  81. DWORD dwPlayCount = GetUserPlayCount();
  82. if (dwPlayCount != 0L) return (WORD)(m_UserInfo.dwLostCount * 10000L / dwPlayCount);
  83. return 0;
  84. }
  85. //用户和率
  86. WORD CServerUserItem::GetUserDrawRate()
  87. {
  88. //计算和率
  89. DWORD dwPlayCount = GetUserPlayCount();
  90. if (dwPlayCount != 0L) return (WORD)(m_UserInfo.dwDrawCount * 10000L / dwPlayCount);
  91. return 0;
  92. }
  93. //用户逃率
  94. WORD CServerUserItem::GetUserFleeRate()
  95. {
  96. //计算逃率
  97. DWORD dwPlayCount = GetUserPlayCount();
  98. if (dwPlayCount != 0L) return (WORD)(m_UserInfo.dwFleeCount * 10000L / dwPlayCount);
  99. return 0;
  100. }
  101. //对比帐号
  102. bool CServerUserItem::ContrastNickName(LPCTSTR pszNickName)
  103. {
  104. //效验参数
  105. ASSERT(pszNickName != NULL);
  106. if (pszNickName == NULL) return false;
  107. //长度对比
  108. INT nContrastLen = lstrlen(pszNickName);
  109. INT nSourceLen = lstrlen(m_UserInfo.szNickName);
  110. //字符对比
  111. if (nContrastLen != nSourceLen) return false;
  112. if (CompareString(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, pszNickName, nContrastLen, m_UserInfo.szNickName, nSourceLen) != CSTR_EQUAL) return false;
  113. return true;
  114. }
  115. //对比密码
  116. bool CServerUserItem::ContrastLogonPass(LPCTSTR pszPassword)
  117. {
  118. //效验参数
  119. ASSERT(pszPassword != NULL);
  120. if (pszPassword == NULL) return false;
  121. //长度对比
  122. INT nTargetLen = lstrlen(pszPassword);
  123. INT nSourceLen = lstrlen(m_szLogonPass);
  124. //密码对比
  125. if (nTargetLen != nSourceLen) return false;
  126. if (CompareString(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, pszPassword, nTargetLen, m_szLogonPass, nSourceLen) != CSTR_EQUAL) return false;
  127. return true;
  128. }
  129. //设置状态
  130. bool CServerUserItem::SetUserStatus(BYTE cbUserStatus, WORD wTableID, WORD wChairID, bool bSendState)
  131. {
  132. //效验状态
  133. ASSERT(m_UserInfo.dwUserID != 0L);
  134. if (m_UserInfo.dwUserID == 0L) return false;
  135. //记录信息
  136. WORD wOldTableID = m_UserInfo.wTableID;
  137. WORD wOldChairID = m_UserInfo.wChairID;
  138. //设置变量
  139. m_UserInfo.wTableID = wTableID;
  140. m_UserInfo.wChairID = wChairID;
  141. m_UserInfo.cbUserStatus = cbUserStatus;
  142. if (cbUserStatus == US_PLAYING || cbUserStatus == US_READY || cbUserStatus == US_SIT || cbUserStatus == US_PLAYINGWAIT)
  143. {
  144. m_UserInfo.wLastTableID = wTableID;
  145. }
  146. //发送状态
  147. ASSERT(m_pIServerUserItemSink != NULL);
  148. if (m_pIServerUserItemSink != NULL) m_pIServerUserItemSink->OnEventUserItemStatus(this, wOldTableID, wOldChairID, bSendState);
  149. return true;
  150. }
  151. //写入积分
  152. bool CServerUserItem::WriteUserTmpScoreRecord(SCORE lScore, BYTE cbScoreType, DWORD dwPlayTimeCount)
  153. {
  154. //效验状态
  155. ASSERT((m_UserInfo.dwUserID != 0L) && (cbScoreType != SCORE_TYPE_NULL));
  156. if ((m_UserInfo.dwUserID == 0L) || (cbScoreType == SCORE_TYPE_NULL)) return false;
  157. DWORD dwLostCount = 0;
  158. DWORD dwWinCount = 0;
  159. DWORD dwDrawCount = 0;
  160. DWORD dwFleeCount = 0;
  161. //修改胜负
  162. switch (cbScoreType)
  163. {
  164. case SCORE_TYPE_WIN: //胜局
  165. {
  166. dwWinCount++;
  167. break;
  168. }
  169. case SCORE_TYPE_LOSE: //输局
  170. {
  171. dwLostCount++;
  172. break;
  173. }
  174. case SCORE_TYPE_DRAW: //和局
  175. {
  176. dwDrawCount++;
  177. break;
  178. }
  179. case SCORE_TYPE_FLEE: //逃局
  180. {
  181. dwFleeCount++;
  182. break;
  183. }
  184. }
  185. }
  186. //写入积分
  187. bool CServerUserItem::WriteUserScore(SCORE lScore, SCORE lGrade, SCORE lRevenue, SCORE lIngot, BYTE cbScoreType, DWORD dwPlayTimeCount, DWORD dwWinExperience)
  188. {
  189. //效验状态
  190. ASSERT((m_UserInfo.dwUserID != 0L) && (cbScoreType != SCORE_TYPE_NULL));
  191. if ((m_UserInfo.dwUserID == 0L) || (cbScoreType == SCORE_TYPE_NULL)) return false;
  192. //修改胜负
  193. switch (cbScoreType)
  194. {
  195. case SCORE_TYPE_WIN: //胜局
  196. {
  197. m_UserInfo.dwWinCount++;
  198. m_RecordInfo.dwWinCount++;
  199. m_VariationInfo.dwWinCount++;
  200. break;
  201. }
  202. case SCORE_TYPE_LOSE: //输局
  203. {
  204. m_UserInfo.dwLostCount++;
  205. m_RecordInfo.dwLostCount++;
  206. m_VariationInfo.dwLostCount++;
  207. break;
  208. }
  209. case SCORE_TYPE_DRAW: //和局
  210. {
  211. m_UserInfo.dwDrawCount++;
  212. m_RecordInfo.dwDrawCount++;
  213. m_VariationInfo.dwDrawCount++;
  214. break;
  215. }
  216. case SCORE_TYPE_FLEE: //逃局
  217. {
  218. m_UserInfo.dwFleeCount++;
  219. m_RecordInfo.dwFleeCount++;
  220. m_VariationInfo.dwFleeCount++;
  221. break;
  222. }
  223. }
  224. //设置标志
  225. m_bModifyScore = true;
  226. //设置积分
  227. m_UserInfo.lScore += lScore;
  228. m_UserInfo.lGrade += lGrade;
  229. //m_UserInfo.lIngot+=lIngot;
  230. m_UserInfo.dwExperience += (dwPlayTimeCount + 59L) / 60L + dwWinExperience;
  231. //记录信息
  232. m_RecordInfo.lScore += lScore;
  233. m_RecordInfo.lGrade += lGrade;
  234. m_RecordInfo.lRevenue += lRevenue;
  235. //m_RecordInfo.lIngot+=lIngot;
  236. m_RecordInfo.dwPlayTimeCount += dwPlayTimeCount;
  237. m_RecordInfo.dwExperience += (dwPlayTimeCount + 59L) / 60L + dwWinExperience;
  238. //变更信息
  239. //m_VariationInfo.lIngot+=lIngot;
  240. m_VariationInfo.dwPlayTimeCount += dwPlayTimeCount;
  241. m_VariationInfo.dwExperience += (dwPlayTimeCount + 59L) / 60L + dwWinExperience;
  242. //分数变更
  243. m_VariationInfo.lScore += lScore;
  244. m_VariationInfo.lGrade += lGrade;
  245. m_VariationInfo.lRevenue += lRevenue;
  246. //托管积分
  247. if (m_lRestrictScore>0L)
  248. {
  249. //变量定义
  250. SCORE lTotalScore = m_UserInfo.lScore + m_lTrusteeScore;
  251. //托管调整
  252. if (lTotalScore>m_lRestrictScore)
  253. {
  254. m_UserInfo.lScore = m_lRestrictScore;
  255. m_lTrusteeScore = lTotalScore - m_lRestrictScore;
  256. }
  257. else
  258. {
  259. m_lTrusteeScore = 0L;
  260. m_UserInfo.lScore = lTotalScore;
  261. }
  262. }
  263. //发送状态
  264. ASSERT(m_pIServerUserItemSink != NULL);
  265. if (m_pIServerUserItemSink != NULL) m_pIServerUserItemSink->OnEventUserItemScore(this, SCORE_REASON_WRITE);
  266. return true;
  267. }
  268. //查询记录
  269. bool CServerUserItem::QueryRecordInfo(tagVariationInfo & RecordInfo)
  270. {
  271. //效验状态
  272. ASSERT(m_UserInfo.dwUserID != 0L);
  273. if (m_UserInfo.dwUserID == 0L) return false;
  274. //设置变量
  275. RecordInfo = m_RecordInfo;
  276. return true;
  277. }
  278. //提取变更
  279. bool CServerUserItem::DistillVariation(tagVariationInfo & VariationInfo)
  280. {
  281. //效验状态
  282. ASSERT(m_UserInfo.dwUserID != 0L);
  283. if (m_UserInfo.dwUserID == 0L) return false;
  284. //修改判断
  285. if (m_bModifyScore == true)
  286. {
  287. //设置变量
  288. VariationInfo = m_VariationInfo;
  289. }
  290. else
  291. {
  292. //设置变量
  293. ZeroMemory(&VariationInfo, sizeof(VariationInfo));
  294. }
  295. //还原变量
  296. m_bModifyScore = false;
  297. ZeroMemory(&m_VariationInfo, sizeof(m_VariationInfo));
  298. return true;
  299. }
  300. //冻结积分
  301. bool CServerUserItem::FrozenedUserScore(SCORE lScore)
  302. {
  303. //效验状态
  304. ASSERT(m_UserInfo.dwUserID != 0L);
  305. if (m_UserInfo.dwUserID == 0L) return false;
  306. //效验积分
  307. ASSERT((lScore >= 0L) && ((m_UserInfo.lScore + m_lTrusteeScore) >= lScore));
  308. if ((lScore<0L) || ((m_UserInfo.lScore + m_lTrusteeScore)<lScore)) return false;
  309. //设置变量
  310. m_lFrozenedScore += lScore;
  311. //设置用户
  312. if (m_lTrusteeScore<lScore)
  313. {
  314. //积分锁定
  315. lScore -= m_lTrusteeScore;
  316. m_UserInfo.lScore -= lScore;
  317. m_lTrusteeScore = 0L;
  318. }
  319. else
  320. {
  321. //托管锁定
  322. m_lTrusteeScore -= lScore;
  323. }
  324. return true;
  325. }
  326. //解冻积分
  327. bool CServerUserItem::UnFrozenedUserScore(SCORE lScore)
  328. {
  329. //效验状态
  330. ASSERT(m_UserInfo.dwUserID != 0L);
  331. if (m_UserInfo.dwUserID == 0L) return false;
  332. //效验积分
  333. ASSERT((lScore >= 0L) && (m_lFrozenedScore >= lScore));
  334. if ((lScore<0L) || (m_lFrozenedScore<lScore)) return false;
  335. //设置变量
  336. m_lFrozenedScore -= lScore;
  337. m_UserInfo.lScore += lScore;
  338. //托管积分
  339. if (m_lRestrictScore>0L)
  340. {
  341. //变量定义
  342. SCORE lTotalScore = m_UserInfo.lScore + m_lTrusteeScore;
  343. //托管调整
  344. if (lTotalScore>m_lRestrictScore)
  345. {
  346. m_UserInfo.lScore = m_lRestrictScore;
  347. m_lTrusteeScore = lTotalScore - m_lRestrictScore;
  348. }
  349. else
  350. {
  351. m_lTrusteeScore = 0L;
  352. m_UserInfo.lScore = lTotalScore;
  353. }
  354. }
  355. return true;
  356. }
  357. //修改信息
  358. bool CServerUserItem::ModifyUserProperty(SCORE lScore, LONG lLoveLiness)
  359. {
  360. //效验状态
  361. ASSERT(m_UserInfo.dwUserID != 0L);
  362. if (m_UserInfo.dwUserID == 0L) return false;
  363. //设置积分
  364. m_UserInfo.lScore += lScore;
  365. m_UserInfo.lLoveLiness += lLoveLiness;
  366. //记录信息
  367. m_RecordInfo.lScore += lScore;
  368. m_RecordInfo.lLoveLiness += lLoveLiness;
  369. //变更信息
  370. if (lLoveLiness != 0L)
  371. {
  372. m_bModifyScore = true;
  373. m_VariationInfo.lLoveLiness += lLoveLiness;
  374. }
  375. //托管积分
  376. if ((m_lRestrictScore>0L) && (lScore != 0L))
  377. {
  378. //变量定义
  379. SCORE lTotalScore = m_UserInfo.lScore + m_lTrusteeScore;
  380. //托管调整
  381. if (lTotalScore>m_lRestrictScore)
  382. {
  383. m_UserInfo.lScore = m_lRestrictScore;
  384. m_lTrusteeScore = lTotalScore - m_lRestrictScore;
  385. }
  386. else
  387. {
  388. m_lTrusteeScore = 0L;
  389. m_UserInfo.lScore = lTotalScore;
  390. }
  391. }
  392. //发送状态
  393. ASSERT(m_pIServerUserItemSink != NULL);
  394. if (m_pIServerUserItemSink != NULL) m_pIServerUserItemSink->OnEventUserItemScore(this, SCORE_REASON_PROPERTY);
  395. return true;
  396. }
  397. //解除绑定
  398. bool CServerUserItem::DetachBindStatus()
  399. {
  400. //效验状态
  401. //ASSERT(m_UserInfo.dwUserID != 0L);
  402. if (m_UserInfo.dwUserID == 0L) return false;
  403. //用户属性
  404. m_bClientReady = false;
  405. //连接属性
  406. m_wBindIndex = INVALID_WORD;
  407. return true;
  408. }
  409. //银行操作
  410. bool CServerUserItem::ModifyUserInsure(SCORE lScore, SCORE lInsure, SCORE lRevenue)
  411. {
  412. //平衡效验
  413. /*ASSERT((m_bAndroidUser==true)||(((lScore+lInsure+lRevenue)==0L)&&(lRevenue>=0L)));
  414. if ((m_bAndroidUser==false)&&(((lScore+lInsure+lRevenue)!=0L)||(lRevenue<0L))) return false;*/
  415. //效验状态
  416. /*ASSERT((m_UserInfo.dwUserID!=0L)&&((m_UserInfo.lScore+m_lTrusteeScore+lScore)>=0L));
  417. if ((m_UserInfo.dwUserID==0L)||((m_UserInfo.lScore+m_lTrusteeScore+lScore)<0L)) return false;*/
  418. //设置积分
  419. m_UserInfo.lScore += lScore;
  420. m_UserInfo.lInsure += lInsure;
  421. //记录信息
  422. m_RecordInfo.lScore += lScore;
  423. m_RecordInfo.lInsure += lInsure;
  424. m_RecordInfo.lRevenue += lRevenue;
  425. //托管积分
  426. if (m_lRestrictScore>0L)
  427. {
  428. //变量定义
  429. SCORE lTotalScore = m_UserInfo.lScore + m_lTrusteeScore;
  430. //托管调整
  431. if (lTotalScore>m_lRestrictScore)
  432. {
  433. m_UserInfo.lScore = m_lRestrictScore;
  434. m_lTrusteeScore = lTotalScore - m_lRestrictScore;
  435. }
  436. else
  437. {
  438. m_lTrusteeScore = 0L;
  439. m_UserInfo.lScore = lTotalScore;
  440. }
  441. }
  442. //发送状态
  443. ASSERT(m_pIServerUserItemSink != NULL);
  444. if (m_pIServerUserItemSink != NULL) m_pIServerUserItemSink->OnEventUserItemScore(this, SCORE_REASON_INSURE);
  445. return true;
  446. }
  447. //设置参数
  448. bool CServerUserItem::SetUserParameter(DWORD dwClientAddr, WORD wBindIndex, TCHAR szMachineID[LEN_MACHINE_ID],bool bAndroidUser, bool bClientReady)
  449. {
  450. //效验状态
  451. ASSERT(m_UserInfo.dwUserID != 0L);
  452. if (m_UserInfo.dwUserID == 0L) return false;
  453. //用户属性
  454. m_bAndroidUser = bAndroidUser;
  455. m_bClientReady = bClientReady;
  456. //连接属性
  457. m_wBindIndex = wBindIndex;
  458. m_dwClientAddr = dwClientAddr;
  459. lstrcpyn(m_szMachineID, szMachineID, CountArray(m_szMachineID));
  460. return true;
  461. }
  462. //修改权限
  463. VOID CServerUserItem::ModifyUserRight(DWORD dwAddRight, DWORD dwRemoveRight, BYTE cbRightKind)
  464. {
  465. //添加权限
  466. m_dwUserRight |= dwAddRight;
  467. //删除权限
  468. m_dwUserRight &= ~dwRemoveRight;
  469. //发送状态
  470. ASSERT(m_pIServerUserItemSink != NULL);
  471. if (m_pIServerUserItemSink != NULL) m_pIServerUserItemSink->OnEventUserItemRight(this, dwAddRight, dwRemoveRight, cbRightKind);
  472. return;
  473. }
  474. //重置数据
  475. VOID CServerUserItem::ResetUserItem()
  476. {
  477. //附加变量
  478. m_dwUserRight = 0L;
  479. m_dwMasterRight = 0L;
  480. //托管变量
  481. m_lTrusteeScore = 0L;
  482. m_lRestrictScore = 0L;
  483. m_lFrozenedScore = 0L;
  484. m_lFrozenedScore = 0L;
  485. //登录信息
  486. m_dwDBQuestID = 0L;
  487. m_dwLogonTime = 0L;
  488. m_dwInoutIndex = INVALID_DWORD;
  489. //系统属性
  490. m_wBindIndex = INVALID_WORD;
  491. m_dwClientAddr = INADDR_ANY;
  492. ZeroMemory(m_szMachineID, sizeof(m_szMachineID));
  493. //客户类型
  494. m_bMobileUser = false;
  495. m_bAndroidUser = false;
  496. //比赛信息
  497. m_dwSignUpTime = 0;
  498. m_cbSignUpStatus = 0;
  499. m_pMatchData = NULL;
  500. //辅助变量
  501. m_bTrusteeUser = false;
  502. m_bClientReady = false;
  503. m_bModifyScore = false;
  504. ZeroMemory(m_szLogonPass, sizeof(m_szLogonPass));
  505. //属性变量
  506. ZeroMemory(&m_UserInfo, sizeof(m_UserInfo));
  507. ZeroMemory(&m_UserRule, sizeof(m_UserRule));
  508. ZeroMemory(&m_ScoreFormer, sizeof(m_ScoreFormer));
  509. ZeroMemory(&m_UserProperty, sizeof(m_UserProperty));
  510. m_UserInfo.wTableID = INVALID_TABLE;
  511. m_UserInfo.wLastTableID = INVALID_TABLE;
  512. m_UserInfo.wChairID = INVALID_CHAIR;
  513. //记录信息
  514. ZeroMemory(&m_RecordInfo, sizeof(m_RecordInfo));
  515. ZeroMemory(&m_VariationInfo, sizeof(m_VariationInfo));
  516. //手机定义
  517. m_wMobileUserRule = 0;
  518. m_wMobileUserRule |= VIEW_MODE_PART;
  519. m_wMobileUserRule |= VIEW_INFO_LEVEL_1;
  520. m_wDeskPos = 0;
  521. m_wDeskCount = 1;
  522. m_szMachineType = DEVICE_TYPE_PC;
  523. //接口变量
  524. m_pIServerUserItemSink = NULL;
  525. return;
  526. }
  527. //////////////////////////////////////////////////////////////////////////////////
  528. //构造函数
  529. CServerUserManager::CServerUserManager()
  530. {
  531. //组件接口
  532. m_pIServerUserItemSink = NULL;
  533. //设置质数
  534. m_UserIDMap.InitHashTable(PRIME_SERVER_USER);
  535. return;
  536. }
  537. //析构函数
  538. CServerUserManager::~CServerUserManager()
  539. {
  540. //释放用户
  541. for (INT_PTR i = 0; i<m_UserItemStore.GetCount(); i++) m_UserItemStore[i]->Release();
  542. for (INT_PTR i = 0; i<m_UserItemArray.GetCount(); i++) m_UserItemArray[i]->Release();
  543. //删除数据
  544. m_UserIDMap.RemoveAll();
  545. m_UserItemStore.RemoveAll();
  546. m_UserItemArray.RemoveAll();
  547. return;
  548. }
  549. //接口查询
  550. VOID * CServerUserManager::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
  551. {
  552. QUERYINTERFACE(IServerUserManager, Guid, dwQueryVer);
  553. QUERYINTERFACE_IUNKNOWNEX(IServerUserManager, Guid, dwQueryVer);
  554. return NULL;
  555. }
  556. //设置接口
  557. bool CServerUserManager::SetServerUserItemSink(IUnknownEx * pIUnknownEx)
  558. {
  559. //设置接口
  560. if (pIUnknownEx != NULL)
  561. {
  562. //查询接口
  563. ASSERT(QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IServerUserItemSink) != NULL);
  564. m_pIServerUserItemSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IServerUserItemSink);
  565. //成功判断
  566. if (m_pIServerUserItemSink == NULL) return false;
  567. }
  568. else m_pIServerUserItemSink = NULL;
  569. return true;
  570. }
  571. //枚举用户
  572. IServerUserItem * CServerUserManager::EnumUserItem(WORD wEnumIndex)
  573. {
  574. if (wEnumIndex >= m_UserItemArray.GetCount()) return NULL;
  575. return m_UserItemArray[wEnumIndex];
  576. }
  577. //查找用户
  578. IServerUserItem * CServerUserManager::SearchUserItem(DWORD dwUserID)
  579. {
  580. return m_UserIDMap[dwUserID];
  581. }
  582. //机器人数
  583. DWORD CServerUserManager::GetAndroidCount()
  584. {
  585. //变量定义
  586. DWORD dwAndroidCount = 0;
  587. CServerUserItem * pServerUserItem = NULL;
  588. //搜索用户
  589. for (INT_PTR i = 0; i<m_UserItemArray.GetCount(); i++)
  590. {
  591. pServerUserItem = m_UserItemArray[i];
  592. if (pServerUserItem->IsAndroidUser() == true) dwAndroidCount++;
  593. }
  594. return dwAndroidCount;
  595. }
  596. //查找用户
  597. IServerUserItem * CServerUserManager::SearchUserItem(LPCTSTR pszNickName)
  598. {
  599. //变量定义
  600. CServerUserItem * pServerUserItem = NULL;
  601. //搜索用户
  602. for (INT_PTR i = 0; i<m_UserItemArray.GetCount(); i++)
  603. {
  604. pServerUserItem = m_UserItemArray[i];
  605. if (pServerUserItem->ContrastNickName(pszNickName) == true) return pServerUserItem;
  606. }
  607. return NULL;
  608. }
  609. //删除用户
  610. bool CServerUserManager::DeleteUserItem()
  611. {
  612. //存储对象
  613. m_UserItemStore.Append(m_UserItemArray);
  614. //删除对象
  615. m_UserIDMap.RemoveAll();
  616. m_UserItemArray.RemoveAll();
  617. return true;
  618. }
  619. //删除用户
  620. bool CServerUserManager::DeleteUserItem(IServerUserItem * pIServerUserItem)
  621. {
  622. //效验参数
  623. ASSERT((pIServerUserItem != NULL) && (pIServerUserItem->GetUserStatus() == US_NULL));
  624. if ((pIServerUserItem == NULL) || (pIServerUserItem->GetUserStatus() != US_NULL)) return false;
  625. //变量定义
  626. CServerUserItem * pTempUserItem = NULL;
  627. DWORD dwUserID = pIServerUserItem->GetUserID();
  628. //寻找对象
  629. for (INT_PTR i = 0; i<m_UserItemArray.GetCount(); i++)
  630. {
  631. //获取用户
  632. pTempUserItem = m_UserItemArray[i];
  633. if (pIServerUserItem != pTempUserItem) continue;
  634. //重置对象
  635. pTempUserItem->ResetUserItem();
  636. //删除对象
  637. m_UserItemArray.RemoveAt(i);
  638. m_UserIDMap.RemoveKey(dwUserID);
  639. m_UserItemStore.Add(pTempUserItem);
  640. return true;
  641. }
  642. //错误断言
  643. ASSERT(FALSE);
  644. return false;
  645. }
  646. //插入用户
  647. bool CServerUserManager::InsertUserItem(IServerUserItem * * pIServerUserResult, tagUserInfo & UserInfo, tagUserInfoPlus & UserInfoPlus)
  648. {
  649. //变量定义
  650. CServerUserItem * pServerUserItem = NULL;
  651. //获取指针
  652. if (m_UserItemStore.GetCount()>0)
  653. {
  654. INT_PTR nItemPostion = m_UserItemStore.GetCount() - 1;
  655. pServerUserItem = m_UserItemStore[nItemPostion];
  656. m_UserItemStore.RemoveAt(nItemPostion);
  657. //重置对象
  658. pServerUserItem->ResetUserItem();
  659. }
  660. else
  661. {
  662. try
  663. {
  664. pServerUserItem = new CServerUserItem;
  665. }
  666. catch (...)
  667. {
  668. ASSERT(FALSE);
  669. return false;
  670. }
  671. }
  672. //设置接口
  673. pServerUserItem->m_pIServerUserItemSink = m_pIServerUserItemSink;
  674. //原始变量
  675. pServerUserItem->m_ScoreFormer.lScore = UserInfo.lScore;
  676. //属性变量
  677. CopyMemory(&pServerUserItem->m_UserInfo, &UserInfo, sizeof(UserInfo));
  678. ZeroMemory(&pServerUserItem->m_RecordInfo, sizeof(pServerUserItem->m_RecordInfo));
  679. ZeroMemory(&pServerUserItem->m_VariationInfo, sizeof(pServerUserItem->m_VariationInfo));
  680. //登录信息
  681. pServerUserItem->m_dwLogonTime = UserInfoPlus.dwLogonTime;
  682. pServerUserItem->m_dwInoutIndex = UserInfoPlus.dwInoutIndex;
  683. //用户权限
  684. pServerUserItem->m_dwUserRight = UserInfoPlus.dwUserRight;
  685. pServerUserItem->m_dwMasterRight = UserInfoPlus.dwMasterRight;
  686. pServerUserItem->m_lRestrictScore = UserInfoPlus.lRestrictScore;
  687. //连接信息
  688. pServerUserItem->m_wBindIndex = UserInfoPlus.wBindIndex;
  689. pServerUserItem->m_dwClientAddr = UserInfoPlus.dwClientAddr;
  690. lstrcpyn(pServerUserItem->m_szMachineID, UserInfoPlus.szMachineID, CountArray(pServerUserItem->m_szMachineID));
  691. //辅助变量
  692. pServerUserItem->m_bClientReady = false;
  693. pServerUserItem->m_bModifyScore = false;
  694. pServerUserItem->m_bTrusteeUser = false;
  695. pServerUserItem->m_bMobileUser = UserInfoPlus.bMobileUser;
  696. pServerUserItem->m_bAndroidUser = UserInfoPlus.bAndroidUser;
  697. lstrcpyn(pServerUserItem->m_szLogonPass, UserInfoPlus.szPassword, CountArray(pServerUserItem->m_szLogonPass));
  698. //托管调整
  699. if ((UserInfoPlus.lRestrictScore>0L) && (UserInfo.lScore>UserInfoPlus.lRestrictScore))
  700. {
  701. pServerUserItem->m_UserInfo.lScore = UserInfoPlus.lRestrictScore;
  702. pServerUserItem->m_lTrusteeScore = UserInfo.lScore - UserInfoPlus.lRestrictScore;
  703. }
  704. //插入用户
  705. m_UserItemArray.Add(pServerUserItem);
  706. m_UserIDMap[UserInfo.dwUserID] = pServerUserItem;
  707. //设置变量
  708. *pIServerUserResult = pServerUserItem;
  709. return true;
  710. }
  711. //////////////////////////////////////////////////////////////////////////////////