#include "StdAfx.h" #include "ServerUserManager.h" ////////////////////////////////////////////////////////////////////////////////// //构造函数 CServerUserItem::CServerUserItem() { //附加变量 m_dwUserRight = 0L; m_dwMasterRight = 0L; //托管变量 m_lTrusteeScore = 0L; m_lRestrictScore = 0L; m_lFrozenedScore = 0L; m_lFrozenedScore = 0L; //登录信息 m_dwDBQuestID = 0L; m_dwLogonTime = 0L; m_dwInoutIndex = INVALID_DWORD; //客户类型 m_bMobileUser = false; m_bAndroidUser = false; //组件接口 m_pIServerUserItemSink = NULL; //系统属性 m_wBindIndex = INVALID_WORD; m_dwClientAddr = INADDR_NONE; ZeroMemory(m_szMachineID, sizeof(m_szMachineID)); //比赛信息 m_dwSignUpTime = 0; m_cbSignUpStatus = 0; m_pMatchData = NULL; //辅助变量 m_bTrusteeUser = false; m_bClientReady = false; m_bModifyScore = false; ZeroMemory(m_szLogonPass, sizeof(m_szLogonPass)); //属性变量 ZeroMemory(&m_UserInfo, sizeof(m_UserInfo)); ZeroMemory(&m_UserRule, sizeof(m_UserRule)); ZeroMemory(&m_ScoreFormer, sizeof(m_ScoreFormer)); ZeroMemory(&m_UserProperty, sizeof(m_UserProperty)); m_UserInfo.wTableID = INVALID_TABLE; m_UserInfo.wLastTableID = INVALID_TABLE; m_UserInfo.wChairID = INVALID_CHAIR; //记录信息 ZeroMemory(&m_RecordInfo, sizeof(m_RecordInfo)); ZeroMemory(&m_VariationInfo, sizeof(m_VariationInfo)); //手机定义 m_wMobileUserRule = 0; m_wMobileUserRule |= VIEW_MODE_PART; m_wMobileUserRule |= VIEW_INFO_LEVEL_1; m_wDeskPos = 0; m_wDeskCount = 1; m_szMachineType = DEVICE_TYPE_PC; return; } //析构函数 CServerUserItem::~CServerUserItem() { } //接口查询 VOID * CServerUserItem::QueryInterface(REFGUID Guid, DWORD dwQueryVer) { QUERYINTERFACE(IServerUserItem, Guid, dwQueryVer); QUERYINTERFACE(IServerUserService, Guid, dwQueryVer); QUERYINTERFACE_IUNKNOWNEX(IServerUserItem, Guid, dwQueryVer); return NULL; } //用户胜率 WORD CServerUserItem::GetUserWinRate() { //计算胜率 DWORD dwPlayCount = GetUserPlayCount(); if (dwPlayCount != 0L) return (WORD)(m_UserInfo.dwWinCount * 10000L / dwPlayCount); return 0; } //用户输率 WORD CServerUserItem::GetUserLostRate() { //计算输率 DWORD dwPlayCount = GetUserPlayCount(); if (dwPlayCount != 0L) return (WORD)(m_UserInfo.dwLostCount * 10000L / dwPlayCount); return 0; } //用户和率 WORD CServerUserItem::GetUserDrawRate() { //计算和率 DWORD dwPlayCount = GetUserPlayCount(); if (dwPlayCount != 0L) return (WORD)(m_UserInfo.dwDrawCount * 10000L / dwPlayCount); return 0; } //用户逃率 WORD CServerUserItem::GetUserFleeRate() { //计算逃率 DWORD dwPlayCount = GetUserPlayCount(); if (dwPlayCount != 0L) return (WORD)(m_UserInfo.dwFleeCount * 10000L / dwPlayCount); return 0; } //对比帐号 bool CServerUserItem::ContrastNickName(LPCTSTR pszNickName) { //效验参数 ASSERT(pszNickName != NULL); if (pszNickName == NULL) return false; //长度对比 INT nContrastLen = lstrlen(pszNickName); INT nSourceLen = lstrlen(m_UserInfo.szNickName); //字符对比 if (nContrastLen != nSourceLen) return false; if (CompareString(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, pszNickName, nContrastLen, m_UserInfo.szNickName, nSourceLen) != CSTR_EQUAL) return false; return true; } //对比密码 bool CServerUserItem::ContrastLogonPass(LPCTSTR pszPassword) { //效验参数 ASSERT(pszPassword != NULL); if (pszPassword == NULL) return false; //长度对比 INT nTargetLen = lstrlen(pszPassword); INT nSourceLen = lstrlen(m_szLogonPass); //密码对比 if (nTargetLen != nSourceLen) return false; if (CompareString(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, pszPassword, nTargetLen, m_szLogonPass, nSourceLen) != CSTR_EQUAL) return false; return true; } //设置状态 bool CServerUserItem::SetUserStatus(BYTE cbUserStatus, WORD wTableID, WORD wChairID, bool bSendState) { //效验状态 ASSERT(m_UserInfo.dwUserID != 0L); if (m_UserInfo.dwUserID == 0L) return false; //记录信息 WORD wOldTableID = m_UserInfo.wTableID; WORD wOldChairID = m_UserInfo.wChairID; //设置变量 m_UserInfo.wTableID = wTableID; m_UserInfo.wChairID = wChairID; m_UserInfo.cbUserStatus = cbUserStatus; if (cbUserStatus == US_PLAYING || cbUserStatus == US_READY || cbUserStatus == US_SIT || cbUserStatus == US_PLAYINGWAIT) { m_UserInfo.wLastTableID = wTableID; } //发送状态 ASSERT(m_pIServerUserItemSink != NULL); if (m_pIServerUserItemSink != NULL) m_pIServerUserItemSink->OnEventUserItemStatus(this, wOldTableID, wOldChairID, bSendState); return true; } //写入积分 bool CServerUserItem::WriteUserTmpScoreRecord(SCORE lScore, BYTE cbScoreType, DWORD dwPlayTimeCount) { //效验状态 ASSERT((m_UserInfo.dwUserID != 0L) && (cbScoreType != SCORE_TYPE_NULL)); if ((m_UserInfo.dwUserID == 0L) || (cbScoreType == SCORE_TYPE_NULL)) return false; DWORD dwLostCount = 0; DWORD dwWinCount = 0; DWORD dwDrawCount = 0; DWORD dwFleeCount = 0; //修改胜负 switch (cbScoreType) { case SCORE_TYPE_WIN: //胜局 { dwWinCount++; break; } case SCORE_TYPE_LOSE: //输局 { dwLostCount++; break; } case SCORE_TYPE_DRAW: //和局 { dwDrawCount++; break; } case SCORE_TYPE_FLEE: //逃局 { dwFleeCount++; break; } } } //写入积分 bool CServerUserItem::WriteUserScore(SCORE lScore, SCORE lGrade, SCORE lRevenue, SCORE lIngot, BYTE cbScoreType, DWORD dwPlayTimeCount, DWORD dwWinExperience) { //效验状态 ASSERT((m_UserInfo.dwUserID != 0L) && (cbScoreType != SCORE_TYPE_NULL)); if ((m_UserInfo.dwUserID == 0L) || (cbScoreType == SCORE_TYPE_NULL)) return false; //修改胜负 switch (cbScoreType) { case SCORE_TYPE_WIN: //胜局 { m_UserInfo.dwWinCount++; m_RecordInfo.dwWinCount++; m_VariationInfo.dwWinCount++; break; } case SCORE_TYPE_LOSE: //输局 { m_UserInfo.dwLostCount++; m_RecordInfo.dwLostCount++; m_VariationInfo.dwLostCount++; break; } case SCORE_TYPE_DRAW: //和局 { m_UserInfo.dwDrawCount++; m_RecordInfo.dwDrawCount++; m_VariationInfo.dwDrawCount++; break; } case SCORE_TYPE_FLEE: //逃局 { m_UserInfo.dwFleeCount++; m_RecordInfo.dwFleeCount++; m_VariationInfo.dwFleeCount++; break; } } //设置标志 m_bModifyScore = true; //设置积分 m_UserInfo.lScore += lScore; m_UserInfo.lGrade += lGrade; //m_UserInfo.lIngot+=lIngot; m_UserInfo.dwExperience += (dwPlayTimeCount + 59L) / 60L + dwWinExperience; //记录信息 m_RecordInfo.lScore += lScore; m_RecordInfo.lGrade += lGrade; m_RecordInfo.lRevenue += lRevenue; //m_RecordInfo.lIngot+=lIngot; m_RecordInfo.dwPlayTimeCount += dwPlayTimeCount; m_RecordInfo.dwExperience += (dwPlayTimeCount + 59L) / 60L + dwWinExperience; //变更信息 //m_VariationInfo.lIngot+=lIngot; m_VariationInfo.dwPlayTimeCount += dwPlayTimeCount; m_VariationInfo.dwExperience += (dwPlayTimeCount + 59L) / 60L + dwWinExperience; //分数变更 m_VariationInfo.lScore += lScore; m_VariationInfo.lGrade += lGrade; m_VariationInfo.lRevenue += lRevenue; //托管积分 if (m_lRestrictScore>0L) { //变量定义 SCORE lTotalScore = m_UserInfo.lScore + m_lTrusteeScore; //托管调整 if (lTotalScore>m_lRestrictScore) { m_UserInfo.lScore = m_lRestrictScore; m_lTrusteeScore = lTotalScore - m_lRestrictScore; } else { m_lTrusteeScore = 0L; m_UserInfo.lScore = lTotalScore; } } //发送状态 ASSERT(m_pIServerUserItemSink != NULL); if (m_pIServerUserItemSink != NULL) m_pIServerUserItemSink->OnEventUserItemScore(this, SCORE_REASON_WRITE); return true; } //查询记录 bool CServerUserItem::QueryRecordInfo(tagVariationInfo & RecordInfo) { //效验状态 ASSERT(m_UserInfo.dwUserID != 0L); if (m_UserInfo.dwUserID == 0L) return false; //设置变量 RecordInfo = m_RecordInfo; return true; } //提取变更 bool CServerUserItem::DistillVariation(tagVariationInfo & VariationInfo) { //效验状态 ASSERT(m_UserInfo.dwUserID != 0L); if (m_UserInfo.dwUserID == 0L) return false; //修改判断 if (m_bModifyScore == true) { //设置变量 VariationInfo = m_VariationInfo; } else { //设置变量 ZeroMemory(&VariationInfo, sizeof(VariationInfo)); } //还原变量 m_bModifyScore = false; ZeroMemory(&m_VariationInfo, sizeof(m_VariationInfo)); return true; } //冻结积分 bool CServerUserItem::FrozenedUserScore(SCORE lScore) { //效验状态 ASSERT(m_UserInfo.dwUserID != 0L); if (m_UserInfo.dwUserID == 0L) return false; //效验积分 ASSERT((lScore >= 0L) && ((m_UserInfo.lScore + m_lTrusteeScore) >= lScore)); if ((lScore<0L) || ((m_UserInfo.lScore + m_lTrusteeScore)= 0L) && (m_lFrozenedScore >= lScore)); if ((lScore<0L) || (m_lFrozenedScore0L) { //变量定义 SCORE lTotalScore = m_UserInfo.lScore + m_lTrusteeScore; //托管调整 if (lTotalScore>m_lRestrictScore) { m_UserInfo.lScore = m_lRestrictScore; m_lTrusteeScore = lTotalScore - m_lRestrictScore; } else { m_lTrusteeScore = 0L; m_UserInfo.lScore = lTotalScore; } } return true; } //修改信息 bool CServerUserItem::ModifyUserProperty(SCORE lScore, LONG lLoveLiness) { //效验状态 ASSERT(m_UserInfo.dwUserID != 0L); if (m_UserInfo.dwUserID == 0L) return false; //设置积分 m_UserInfo.lScore += lScore; m_UserInfo.lLoveLiness += lLoveLiness; //记录信息 m_RecordInfo.lScore += lScore; m_RecordInfo.lLoveLiness += lLoveLiness; //变更信息 if (lLoveLiness != 0L) { m_bModifyScore = true; m_VariationInfo.lLoveLiness += lLoveLiness; } //托管积分 if ((m_lRestrictScore>0L) && (lScore != 0L)) { //变量定义 SCORE lTotalScore = m_UserInfo.lScore + m_lTrusteeScore; //托管调整 if (lTotalScore>m_lRestrictScore) { m_UserInfo.lScore = m_lRestrictScore; m_lTrusteeScore = lTotalScore - m_lRestrictScore; } else { m_lTrusteeScore = 0L; m_UserInfo.lScore = lTotalScore; } } //发送状态 ASSERT(m_pIServerUserItemSink != NULL); if (m_pIServerUserItemSink != NULL) m_pIServerUserItemSink->OnEventUserItemScore(this, SCORE_REASON_PROPERTY); return true; } //解除绑定 bool CServerUserItem::DetachBindStatus() { //效验状态 //ASSERT(m_UserInfo.dwUserID != 0L); if (m_UserInfo.dwUserID == 0L) return false; //用户属性 m_bClientReady = false; //连接属性 m_wBindIndex = INVALID_WORD; return true; } //银行操作 bool CServerUserItem::ModifyUserInsure(SCORE lScore, SCORE lInsure, SCORE lRevenue) { //平衡效验 /*ASSERT((m_bAndroidUser==true)||(((lScore+lInsure+lRevenue)==0L)&&(lRevenue>=0L))); if ((m_bAndroidUser==false)&&(((lScore+lInsure+lRevenue)!=0L)||(lRevenue<0L))) return false;*/ //效验状态 /*ASSERT((m_UserInfo.dwUserID!=0L)&&((m_UserInfo.lScore+m_lTrusteeScore+lScore)>=0L)); if ((m_UserInfo.dwUserID==0L)||((m_UserInfo.lScore+m_lTrusteeScore+lScore)<0L)) return false;*/ //设置积分 m_UserInfo.lScore += lScore; m_UserInfo.lInsure += lInsure; //记录信息 m_RecordInfo.lScore += lScore; m_RecordInfo.lInsure += lInsure; m_RecordInfo.lRevenue += lRevenue; //托管积分 if (m_lRestrictScore>0L) { //变量定义 SCORE lTotalScore = m_UserInfo.lScore + m_lTrusteeScore; //托管调整 if (lTotalScore>m_lRestrictScore) { m_UserInfo.lScore = m_lRestrictScore; m_lTrusteeScore = lTotalScore - m_lRestrictScore; } else { m_lTrusteeScore = 0L; m_UserInfo.lScore = lTotalScore; } } //发送状态 ASSERT(m_pIServerUserItemSink != NULL); if (m_pIServerUserItemSink != NULL) m_pIServerUserItemSink->OnEventUserItemScore(this, SCORE_REASON_INSURE); return true; } //设置参数 bool CServerUserItem::SetUserParameter(DWORD dwClientAddr, WORD wBindIndex, TCHAR szMachineID[LEN_MACHINE_ID],bool bAndroidUser, bool bClientReady) { //效验状态 ASSERT(m_UserInfo.dwUserID != 0L); if (m_UserInfo.dwUserID == 0L) return false; //用户属性 m_bAndroidUser = bAndroidUser; m_bClientReady = bClientReady; //连接属性 m_wBindIndex = wBindIndex; m_dwClientAddr = dwClientAddr; lstrcpyn(m_szMachineID, szMachineID, CountArray(m_szMachineID)); return true; } //修改权限 VOID CServerUserItem::ModifyUserRight(DWORD dwAddRight, DWORD dwRemoveRight, BYTE cbRightKind) { //添加权限 m_dwUserRight |= dwAddRight; //删除权限 m_dwUserRight &= ~dwRemoveRight; //发送状态 ASSERT(m_pIServerUserItemSink != NULL); if (m_pIServerUserItemSink != NULL) m_pIServerUserItemSink->OnEventUserItemRight(this, dwAddRight, dwRemoveRight, cbRightKind); return; } //重置数据 VOID CServerUserItem::ResetUserItem() { //附加变量 m_dwUserRight = 0L; m_dwMasterRight = 0L; //托管变量 m_lTrusteeScore = 0L; m_lRestrictScore = 0L; m_lFrozenedScore = 0L; m_lFrozenedScore = 0L; //登录信息 m_dwDBQuestID = 0L; m_dwLogonTime = 0L; m_dwInoutIndex = INVALID_DWORD; //系统属性 m_wBindIndex = INVALID_WORD; m_dwClientAddr = INADDR_ANY; ZeroMemory(m_szMachineID, sizeof(m_szMachineID)); //客户类型 m_bMobileUser = false; m_bAndroidUser = false; //比赛信息 m_dwSignUpTime = 0; m_cbSignUpStatus = 0; m_pMatchData = NULL; //辅助变量 m_bTrusteeUser = false; m_bClientReady = false; m_bModifyScore = false; ZeroMemory(m_szLogonPass, sizeof(m_szLogonPass)); //属性变量 ZeroMemory(&m_UserInfo, sizeof(m_UserInfo)); ZeroMemory(&m_UserRule, sizeof(m_UserRule)); ZeroMemory(&m_ScoreFormer, sizeof(m_ScoreFormer)); ZeroMemory(&m_UserProperty, sizeof(m_UserProperty)); m_UserInfo.wTableID = INVALID_TABLE; m_UserInfo.wLastTableID = INVALID_TABLE; m_UserInfo.wChairID = INVALID_CHAIR; //记录信息 ZeroMemory(&m_RecordInfo, sizeof(m_RecordInfo)); ZeroMemory(&m_VariationInfo, sizeof(m_VariationInfo)); //手机定义 m_wMobileUserRule = 0; m_wMobileUserRule |= VIEW_MODE_PART; m_wMobileUserRule |= VIEW_INFO_LEVEL_1; m_wDeskPos = 0; m_wDeskCount = 1; m_szMachineType = DEVICE_TYPE_PC; //接口变量 m_pIServerUserItemSink = NULL; return; } ////////////////////////////////////////////////////////////////////////////////// //构造函数 CServerUserManager::CServerUserManager() { //组件接口 m_pIServerUserItemSink = NULL; //设置质数 m_UserIDMap.InitHashTable(PRIME_SERVER_USER); return; } //析构函数 CServerUserManager::~CServerUserManager() { //释放用户 for (INT_PTR i = 0; iRelease(); for (INT_PTR i = 0; iRelease(); //删除数据 m_UserIDMap.RemoveAll(); m_UserItemStore.RemoveAll(); m_UserItemArray.RemoveAll(); return; } //接口查询 VOID * CServerUserManager::QueryInterface(REFGUID Guid, DWORD dwQueryVer) { QUERYINTERFACE(IServerUserManager, Guid, dwQueryVer); QUERYINTERFACE_IUNKNOWNEX(IServerUserManager, Guid, dwQueryVer); return NULL; } //设置接口 bool CServerUserManager::SetServerUserItemSink(IUnknownEx * pIUnknownEx) { //设置接口 if (pIUnknownEx != NULL) { //查询接口 ASSERT(QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IServerUserItemSink) != NULL); m_pIServerUserItemSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IServerUserItemSink); //成功判断 if (m_pIServerUserItemSink == NULL) return false; } else m_pIServerUserItemSink = NULL; return true; } //枚举用户 IServerUserItem * CServerUserManager::EnumUserItem(WORD wEnumIndex) { if (wEnumIndex >= m_UserItemArray.GetCount()) return NULL; return m_UserItemArray[wEnumIndex]; } //查找用户 IServerUserItem * CServerUserManager::SearchUserItem(DWORD dwUserID) { return m_UserIDMap[dwUserID]; } //机器人数 DWORD CServerUserManager::GetAndroidCount() { //变量定义 DWORD dwAndroidCount = 0; CServerUserItem * pServerUserItem = NULL; //搜索用户 for (INT_PTR i = 0; iIsAndroidUser() == true) dwAndroidCount++; } return dwAndroidCount; } //查找用户 IServerUserItem * CServerUserManager::SearchUserItem(LPCTSTR pszNickName) { //变量定义 CServerUserItem * pServerUserItem = NULL; //搜索用户 for (INT_PTR i = 0; iContrastNickName(pszNickName) == true) return pServerUserItem; } return NULL; } //删除用户 bool CServerUserManager::DeleteUserItem() { //存储对象 m_UserItemStore.Append(m_UserItemArray); //删除对象 m_UserIDMap.RemoveAll(); m_UserItemArray.RemoveAll(); return true; } //删除用户 bool CServerUserManager::DeleteUserItem(IServerUserItem * pIServerUserItem) { //效验参数 ASSERT((pIServerUserItem != NULL) && (pIServerUserItem->GetUserStatus() == US_NULL)); if ((pIServerUserItem == NULL) || (pIServerUserItem->GetUserStatus() != US_NULL)) return false; //变量定义 CServerUserItem * pTempUserItem = NULL; DWORD dwUserID = pIServerUserItem->GetUserID(); //寻找对象 for (INT_PTR i = 0; iResetUserItem(); //删除对象 m_UserItemArray.RemoveAt(i); m_UserIDMap.RemoveKey(dwUserID); m_UserItemStore.Add(pTempUserItem); return true; } //错误断言 ASSERT(FALSE); return false; } //插入用户 bool CServerUserManager::InsertUserItem(IServerUserItem * * pIServerUserResult, tagUserInfo & UserInfo, tagUserInfoPlus & UserInfoPlus) { //变量定义 CServerUserItem * pServerUserItem = NULL; //获取指针 if (m_UserItemStore.GetCount()>0) { INT_PTR nItemPostion = m_UserItemStore.GetCount() - 1; pServerUserItem = m_UserItemStore[nItemPostion]; m_UserItemStore.RemoveAt(nItemPostion); //重置对象 pServerUserItem->ResetUserItem(); } else { try { pServerUserItem = new CServerUserItem; } catch (...) { ASSERT(FALSE); return false; } } //设置接口 pServerUserItem->m_pIServerUserItemSink = m_pIServerUserItemSink; //原始变量 pServerUserItem->m_ScoreFormer.lScore = UserInfo.lScore; //属性变量 CopyMemory(&pServerUserItem->m_UserInfo, &UserInfo, sizeof(UserInfo)); ZeroMemory(&pServerUserItem->m_RecordInfo, sizeof(pServerUserItem->m_RecordInfo)); ZeroMemory(&pServerUserItem->m_VariationInfo, sizeof(pServerUserItem->m_VariationInfo)); //登录信息 pServerUserItem->m_dwLogonTime = UserInfoPlus.dwLogonTime; pServerUserItem->m_dwInoutIndex = UserInfoPlus.dwInoutIndex; //用户权限 pServerUserItem->m_dwUserRight = UserInfoPlus.dwUserRight; pServerUserItem->m_dwMasterRight = UserInfoPlus.dwMasterRight; pServerUserItem->m_lRestrictScore = UserInfoPlus.lRestrictScore; //连接信息 pServerUserItem->m_wBindIndex = UserInfoPlus.wBindIndex; pServerUserItem->m_dwClientAddr = UserInfoPlus.dwClientAddr; lstrcpyn(pServerUserItem->m_szMachineID, UserInfoPlus.szMachineID, CountArray(pServerUserItem->m_szMachineID)); //辅助变量 pServerUserItem->m_bClientReady = false; pServerUserItem->m_bModifyScore = false; pServerUserItem->m_bTrusteeUser = false; pServerUserItem->m_bMobileUser = UserInfoPlus.bMobileUser; pServerUserItem->m_bAndroidUser = UserInfoPlus.bAndroidUser; lstrcpyn(pServerUserItem->m_szLogonPass, UserInfoPlus.szPassword, CountArray(pServerUserItem->m_szLogonPass)); //托管调整 if ((UserInfoPlus.lRestrictScore>0L) && (UserInfo.lScore>UserInfoPlus.lRestrictScore)) { pServerUserItem->m_UserInfo.lScore = UserInfoPlus.lRestrictScore; pServerUserItem->m_lTrusteeScore = UserInfo.lScore - UserInfoPlus.lRestrictScore; } //插入用户 m_UserItemArray.Add(pServerUserItem); m_UserIDMap[UserInfo.dwUserID] = pServerUserItem; //设置变量 *pIServerUserResult = pServerUserItem; return true; } //////////////////////////////////////////////////////////////////////////////////