S3PAccount.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:8k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //-----------------------------------------//
  2. //                                         //
  3. //  File : S3PAccount.cpp    //
  4. // Author : Yang Xiaodong            //
  5. // Modified : 8/29/2002                //
  6. //                                         //
  7. //-----------------------------------------//
  8. #pragma warning(disable: 4786)
  9. #include "S3PAccount.h"
  10. #include "S3PDBConVBC.h"
  11. #include "S3PResultVBC.h"
  12. #include "COMUtil.h"
  13. S3PAccount::S3PAccount()
  14. {
  15. }
  16. S3PAccount::~S3PAccount()
  17. {
  18. }
  19. DWORD GetGMID();
  20. int S3PAccount::ServerLogin(S3PDBConVBC* pConn, const char* strAccName, const char* strPassword, const DWORD Address, const short Port, const BYTE Mac[6], DWORD& nGameID)
  21. {
  22. nGameID = 0;
  23. int iRet = ACTION_FAILED;
  24. if (NULL == pConn)
  25. {
  26. return iRet;
  27. }
  28. char strSQL[MAX_PATH];
  29. sprintf(strSQL, "select cIP, iPort, iid, cMemo from ServerList where (cServerName = '%s') and (cPassword COLLATE Chinese_PRC_CS_AS = '%s')", strAccName, strPassword);
  30. S3PResultVBC* pResult = NULL;
  31. if (pConn->QuerySql(strSQL, &pResult))
  32. {
  33. if (pResult->num_rows() <= 0)
  34. iRet = E_ACCOUNT_OR_PASSWORD;
  35. else
  36. {
  37. iRet = E_ADDRESS_OR_PORT;
  38. if ((Address & 0x0000FFFF) == 0x0000a8c0)
  39. {
  40. _variant_t clientid = 0L;
  41. pResult->get_field_data(2, &clientid, sizeof(_variant_t));
  42. nGameID = clientid.lVal;
  43. iRet = ACTION_SUCCESS; //Local network not check ip
  44. }
  45. else
  46. {
  47. _variant_t vaddr;
  48. _variant_t vaMac;
  49. if (pResult->get_field_data(0, &vaddr, sizeof(_variant_t)) &&
  50. pResult->get_field_data(3, &vaMac, sizeof(_variant_t)) &&
  51. vaddr.vt == VT_BSTR && vaMac.vt == VT_BSTR)
  52. {
  53. DWORD addr = inet_addr((const char *)(_bstr_t)vaddr);
  54. char szmac[15];
  55. sprintf(szmac, "%02X%02X-%02X%02X-%02X%02X", Mac[0], Mac[1], Mac[2], Mac[3],Mac[4], Mac[5]);
  56. szmac[14] = 0;
  57. if (addr == Address &&
  58. strcmpi((const char *)(_bstr_t)vaMac, szmac) == 0)
  59. {
  60. _variant_t gameid = 0L;
  61. pResult->get_field_data(2, &gameid, sizeof(_variant_t));
  62. nGameID = gameid.lVal;
  63. iRet = ACTION_SUCCESS;
  64. }
  65. }
  66. }
  67. }
  68. }
  69. if (pResult)
  70. pResult->unuse();
  71. return iRet;
  72. }
  73. int S3PAccount::CheckAddress(S3PDBConVBC* pConn, const DWORD Address, const short Port)
  74. {
  75. int iRet = ACTION_FAILED;
  76. if (NULL == pConn)
  77. {
  78. return iRet;
  79. }
  80. if ((Address & 0x0000FFFF) == 0x0000a8c0)
  81. iRet = ACTION_SUCCESS; //Local network not check ip
  82. else
  83. {
  84. char strSQL[MAX_PATH];
  85. in_addr add;
  86. add.s_addr = Address;
  87. sprintf(strSQL, "select iid from ServerList where (cIP = '%s')", inet_ntoa(add));
  88. S3PResultVBC* pResult = NULL;
  89. if (pConn->QuerySql(strSQL, &pResult))
  90. {
  91. if (pResult->num_rows() <= 0)
  92. iRet = E_ADDRESS_OR_PORT;
  93. else
  94. iRet = ACTION_SUCCESS;
  95. }
  96. if (pResult)
  97. pResult->unuse();
  98. }
  99. return iRet;
  100. }
  101. int S3PAccount::ServerLogout(S3PDBConVBC* pConn, DWORD ClientID, BOOL bElapse)
  102. {
  103. int iRet = ACTION_FAILED;
  104. if (NULL == pConn)
  105. {
  106. return iRet;
  107. }
  108. iRet = ACTION_SUCCESS;
  109. return iRet;
  110. }
  111. int S3PAccount::GetAccountCount(S3PDBConVBC* pConn, DWORD nGameID, BOOL bOnline, DWORD& dwCount)
  112. {
  113. int iRet = ACTION_FAILED;
  114. if (NULL == pConn)
  115. {
  116. return iRet;
  117. }
  118. iRet = ACTION_SUCCESS;
  119. dwCount = 0;
  120. char strSQL[MAX_PATH];
  121. strSQL[0] = 0;
  122. std::string strwhere;
  123. if (bOnline)
  124. {
  125. strwhere = "where ";
  126. if (nGameID > 0)
  127. {
  128. sprintf(strSQL, "(iClientID = %d)", nGameID);
  129. }
  130. else
  131. {
  132. sprintf(strSQL, "(iClientID <> 0) and (iClientID is not null)");
  133. }
  134. }
  135. strwhere += strSQL;
  136. sprintf(strSQL, "select count(*) from Account_info %s", strwhere.c_str());
  137. S3PResultVBC* pResult = NULL;
  138. if (pConn->QuerySql(strSQL, &pResult))
  139. {
  140. if (pResult->num_rows() > 0)
  141. {
  142. _variant_t count = 0L;
  143. pResult->get_field_data(0, &count, sizeof(_variant_t));
  144. dwCount = count.lVal;
  145. }
  146. }
  147. if (pResult)
  148. pResult->unuse();
  149. return iRet;
  150. }
  151. int S3PAccount::GetAccountGameID(S3PDBConVBC* pConn, const char* strAccName, DWORD& ClientID)
  152. {
  153. int iRet = ACTION_FAILED;
  154. if (NULL == pConn)
  155. {
  156. return iRet;
  157. }
  158. char strSQL[MAX_PATH];
  159. sprintf(strSQL, "select iClientID from Account_info where (cAccName = '%s')", strAccName);
  160. S3PResultVBC* pResult = NULL;
  161. if (pConn->QuerySql(strSQL, &pResult))
  162. {
  163. if (pResult->num_rows() <= 0)
  164. iRet = E_ACCOUNT_OR_PASSWORD;
  165. else
  166. {
  167. _variant_t lID = 0L;
  168. pResult->get_field_data(0, &lID, sizeof(_variant_t));
  169. ClientID = lID.lVal;
  170. iRet = ACTION_SUCCESS;
  171. }
  172. }
  173. if (pResult)
  174. pResult->unuse();
  175. return iRet;
  176. }
  177. int S3PAccount::UnlockAccount(S3PDBConVBC* pConn, const char* strAccName)
  178. {
  179. int iRet = ACTION_FAILED;
  180. if (NULL == pConn)
  181. {
  182. return iRet;
  183. }
  184. char strSQL[MAX_PATH];
  185. sprintf(strSQL, "update Account_info set iClientID = 0 where (cAccName = '%s')", strAccName);
  186. S3PResultVBC* pResult = NULL;
  187. if (pConn->Do(strSQL))
  188. iRet = ACTION_SUCCESS;
  189. return iRet;
  190. }
  191. int S3PAccount::FreezeAccount(S3PDBConVBC* pConn, const char* strAccName)
  192. {
  193. int iRet = ACTION_FAILED;
  194. if (NULL == pConn)
  195. {
  196. return iRet;
  197. }
  198. char strSQL[MAX_PATH];
  199. sprintf(strSQL, "update Account_info set iClientID = %d where (cAccName = '%s')", GetGMID(), strAccName);
  200. S3PResultVBC* pResult = NULL;
  201. if (pConn->Do(strSQL))
  202. iRet = ACTION_SUCCESS;
  203. return iRet;
  204. }
  205. int S3PAccount::UnlockServer(S3PDBConVBC* pConn, unsigned long nGameID)
  206. {
  207. int iRet = ACTION_FAILED;
  208. if (NULL == pConn)
  209. {
  210. return iRet;
  211. }
  212. char strSQL[MAX_PATH];
  213. sprintf(strSQL, "update Account_info set iClientID = 0 where (iClientID = %d)", nGameID);
  214. S3PResultVBC* pResult = NULL;
  215. if (pConn->Do(strSQL))
  216. iRet = ACTION_SUCCESS;
  217. return iRet;
  218. }
  219. int S3PAccount::GetAccountsTime(S3PDBConVBC* pConn, DWORD ClientID, DWORD dwMinSecond, AccountTimeList& List)
  220. {
  221. int iRet = ACTION_FAILED;
  222. if (NULL == pConn)
  223. {
  224. return iRet;
  225. }
  226. char strSQL[MAX_PATH];
  227. sprintf(strSQL, "select datediff(second, getdate(), dEndDate), iLeftSecond, cAccName, datediff(second, getdate(), dLoginDate) from View_AccountMoney where (iClientID = %d) and (dLoginDate is not null)", ClientID);
  228. S3PResultVBC* pResult = NULL;
  229. if (pConn->QuerySql(strSQL, &pResult))
  230. {
  231. for (int iRow = 0; iRow < pResult->num_rows(); iRow++)
  232. {
  233. KAccountUserTimeInfo aReturn;
  234. aReturn.Size = sizeof(KAccountUserTimeInfo);
  235. aReturn.Type = AccountUserTimeInfo;
  236. aReturn.Operate = 0;
  237. _variant_t left = 0L;
  238. _variant_t diffDate;
  239. _variant_t accname;
  240. _variant_t usesencond;
  241. pResult->get_field_data(0, &diffDate, sizeof(_variant_t));
  242. pResult->get_field_data(1, &left, sizeof(_variant_t));
  243. pResult->get_field_data(2, &accname, sizeof(_variant_t));
  244. pResult->get_field_data(3, &usesencond, sizeof(_variant_t));
  245. long liLeft = left.lVal;
  246. if (diffDate.vt == VT_I4 && diffDate.lVal > 0) //包月有效
  247. {
  248. liLeft += diffDate.lVal;
  249. }
  250. else if (usesencond.vt == VT_I4 && usesencond.lVal < 0) //点卡扣点起作用了
  251. {
  252. liLeft += usesencond.lVal;
  253. }
  254. aReturn.nTime = max(0, liLeft);
  255. memcpy(aReturn.Account, (const char *)_bstr_t(accname.bstrVal, true), LOGIN_USER_ACCOUNT_MAX_LEN);
  256. aReturn.nReturn = ACTION_SUCCESS;
  257. if (aReturn.nTime <= dwMinSecond)
  258. List.push_back(aReturn);
  259. pResult->data_seek(1, S3PResultVBC::next);
  260. }
  261. iRet = ACTION_SUCCESS;
  262. }
  263. if (pResult)
  264. pResult->unuse();
  265. return iRet;
  266. }
  267. int S3PAccount::GetServerID(S3PDBConVBC* pConn, const char* strAccName, unsigned long& nGameID)
  268. {
  269. nGameID = 0;
  270. int iRet = ACTION_FAILED;
  271. if (NULL == pConn)
  272. {
  273. return iRet;
  274. }
  275. char strSQL[MAX_PATH];
  276. sprintf(strSQL, "select iid from ServerList where (cServerName = '%s')", strAccName);
  277. S3PResultVBC* pResult = NULL;
  278. if (pConn->QuerySql(strSQL, &pResult))
  279. {
  280. if (pResult->num_rows() <= 0)
  281. iRet = E_ACCOUNT_OR_PASSWORD;
  282. else
  283. {
  284. _variant_t clientid = 0L;
  285. pResult->get_field_data(0, &clientid, sizeof(_variant_t));
  286. nGameID = clientid.lVal;
  287. iRet = ACTION_SUCCESS; //Local network not check ip
  288. }
  289. }
  290. if (pResult)
  291. pResult->unuse();
  292. return iRet;
  293. }