HomeController.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. using log4net;
  2. using LuckyCallWebCore.Source;
  3. using Microsoft.AspNetCore.Hosting;
  4. using Microsoft.AspNetCore.Http;
  5. using Microsoft.AspNetCore.Mvc;
  6. using Microsoft.Extensions.Configuration;
  7. using ServiceAPI;
  8. using System;
  9. using LuckyCallWebCore.Extensions;
  10. using LuckyCallWebCore.Models;
  11. using System.Threading.Tasks;
  12. using Mzb_LuckyCall.Resources;
  13. using System.ServiceModel;
  14. using System.ServiceModel.Channels;
  15. namespace LuckyCallWebCore.Controllers
  16. {
  17. public class HomeController : BaseController
  18. {
  19. private ILog log = LogManager.GetLogger("HomeController");
  20. ServiceAPI.WsLuckyCallClient wsClient = new ServiceAPI.WsLuckyCallClient();
  21. public HomeController(IConfiguration _configuration, IWebHostEnvironment hostEnvironment) : base(_configuration, hostEnvironment)
  22. {
  23. // init
  24. }
  25. public async Task<IActionResult> Index()
  26. {
  27. var account = await IdentifyMsisdn();
  28. if (account == "NOT_FOUND")
  29. {
  30. //return Redirect("/Home/Guide");
  31. return Redirect("/Home/Login");
  32. }
  33. if (account == null)
  34. {
  35. //return Redirect("/Home/NotSupport");
  36. return Redirect("/Home/Login");
  37. }
  38. ReloadUserInfo(account);
  39. SetWsClient(ref wsClient, account);
  40. using (new OperationContextScope(wsClient.InnerChannel))
  41. {
  42. // Add a HTTP Header to an outgoing request
  43. HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
  44. requestMessage.Headers["lang"] = getCurrentLang();
  45. OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
  46. response res = wsClient.wsGetListWinner(wsUser, wsPassword, null, "3", "1", "1", "-1", "-1");
  47. if (res.listWinner != null && res.listWinner.Length > 0)
  48. {
  49. var lastMonthWinner = res.listWinner[0];
  50. lastMonthWinner.msisdn = HiddenMsisdn(lastMonthWinner.msisdn);
  51. HttpContext.Session.SetComplexData("lastMonthWinner", lastMonthWinner);
  52. }
  53. }
  54. return await Task.Run(() => View());
  55. // return View();
  56. }
  57. public IActionResult Login()
  58. {
  59. return View();
  60. }
  61. public IActionResult Logout()
  62. {
  63. try
  64. {
  65. ClearCache();
  66. //return Redirect("mytel://home");
  67. return Redirect("/Home/Login");
  68. }
  69. catch (Exception ex)
  70. {
  71. log.Error("Exception " + ex);
  72. return Redirect("/Home/Error");
  73. }
  74. }
  75. [HttpPost]
  76. public IActionResult LogoutAction()
  77. {
  78. ClearCache();
  79. return Json(new
  80. {
  81. error = "0"
  82. });
  83. }
  84. public IActionResult NotSupport()
  85. {
  86. try
  87. {
  88. //ClearCache();
  89. return View();
  90. }
  91. catch (Exception ex)
  92. {
  93. log.Error("Exception " + ex);
  94. return Redirect("/Home/Error");
  95. }
  96. }
  97. private void ReloadUserInfo(String username)
  98. {
  99. // store session
  100. UserInfo userInfo = new UserInfo();
  101. userInfo.msisdn = username;
  102. userInfo.username = username;
  103. //userInfo.remain_spin = 3;
  104. SetWsClient(ref wsClient, username);
  105. // get sub info
  106. using (new OperationContextScope(wsClient.InnerChannel))
  107. {
  108. // Add a HTTP Header to an outgoing request
  109. HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
  110. requestMessage.Headers["lang"] = getCurrentLang();
  111. OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
  112. response resSub = wsClient.wsGetSubInfo(wsUser, wsPassword, username);
  113. userInfo.spinInfo = resSub.spinResult;
  114. userInfo.total_spin = userInfo.spinInfo.totalSpin;
  115. //
  116. if (resSub.listRegInfo != null && resSub.listRegInfo.Length > 0)
  117. {
  118. userInfo.regInfo = resSub.listRegInfo[0];
  119. userInfo.total_spin = userInfo.total_spin + userInfo.regInfo.remainQuestion;
  120. }
  121. // coin
  122. userInfo.userCoin = resSub.userCoin;
  123. // store
  124. HttpContext.Session.SetComplexData("userInfo", userInfo);
  125. }
  126. }
  127. public IActionResult LuckyDraw()
  128. {
  129. UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
  130. if (!CheckAuthToken() || userInfo == null)
  131. {
  132. return Redirect("mytel://home");
  133. }
  134. //if (userInfo.remain_spin == 0)
  135. //{
  136. // return Redirect("/Home/Prize");
  137. //}
  138. return View();
  139. }
  140. public async Task<IActionResult> UserPrize(String page)
  141. {
  142. String account = HttpContext.Session.GetString("account");
  143. UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
  144. if (!CheckAuthToken() || userInfo == null)
  145. {
  146. return Redirect("mytel://home");
  147. }
  148. // get user prize
  149. page = page ?? "1";
  150. String rowOnPage = configuration["pageSize"];
  151. SetWsClient(ref wsClient, account);
  152. using (new OperationContextScope(wsClient.InnerChannel))
  153. {
  154. // Add a HTTP Header to an outgoing request
  155. HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
  156. requestMessage.Headers["lang"] = getCurrentLang();
  157. OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
  158. response res = wsClient.wsGetListWinner(wsUser, wsPassword, userInfo.msisdn, "-1", page, rowOnPage, "-1", "1");
  159. // model
  160. LuckyWheelModel model = new LuckyWheelModel();
  161. model.page = page;
  162. model.pageSize = rowOnPage;
  163. model.totalPage = res.totalPage;
  164. model.listWinner = res.listWinner;
  165. return View(model);
  166. }
  167. }
  168. public async Task<IActionResult> WinnerList()
  169. {
  170. String account = HttpContext.Session.GetString("account");
  171. UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
  172. if (!CheckAuthToken() || userInfo == null)
  173. {
  174. return Redirect("mytel://home");
  175. }
  176. return await Task.Run(() => View());
  177. }
  178. [HttpPost]
  179. [ValidateAntiForgeryToken]
  180. public async Task<IActionResult> GetWinner(String page, String period)
  181. {
  182. String account = HttpContext.Session.GetString("account");
  183. UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
  184. if (!CheckAuthToken() || userInfo == null)
  185. {
  186. return Json(new
  187. {
  188. error = "-1",
  189. content = "Timeout",
  190. href = "mytel://home"
  191. });
  192. }
  193. // get user prize
  194. page = page ?? "1";
  195. String rowOnPage = configuration["pageSize"];
  196. SetWsClient(ref wsClient, account);
  197. using (new OperationContextScope(wsClient.InnerChannel))
  198. {
  199. // Add a HTTP Header to an outgoing request
  200. HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
  201. requestMessage.Headers["lang"] = getCurrentLang();
  202. OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
  203. response res = wsClient.wsGetListWinner(wsUser, wsPassword, null, period, page, rowOnPage, "-1", "-1");
  204. if (res.listWinner != null)
  205. {
  206. for (int i = 0; i < res.listWinner.Length; i++)
  207. {
  208. res.listWinner[i].msisdn = HiddenMsisdn(res.listWinner[i].msisdn);
  209. }
  210. }
  211. // model
  212. LuckyWheelModel model = new LuckyWheelModel();
  213. model.page = page;
  214. model.pageSize = rowOnPage;
  215. model.totalPage = res.totalPage;
  216. model.listWinner = res.listWinner;
  217. return PartialView("../Partial/_Winner", model);
  218. }
  219. }
  220. [HttpPost]
  221. [ValidateAntiForgeryToken]
  222. public IActionResult GetTopCoin()
  223. {
  224. String account = HttpContext.Session.GetString("account");
  225. UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
  226. if (!CheckAuthToken() || userInfo == null)
  227. {
  228. return Json(new
  229. {
  230. error = "-1",
  231. content = "Timeout",
  232. href = "mytel://home"
  233. });
  234. }
  235. // get user prize
  236. String rowOnPage = configuration["pageSize"];
  237. String size = "30";
  238. SetWsClient(ref wsClient, account);
  239. using (new OperationContextScope(wsClient.InnerChannel))
  240. {
  241. // Add a HTTP Header to an outgoing request
  242. HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
  243. requestMessage.Headers["lang"] = getCurrentLang();
  244. OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
  245. //
  246. response res = wsClient.wsGetTopCoin(wsUser, wsPassword, size);
  247. // model
  248. LuckyWheelModel model = new LuckyWheelModel();
  249. model.page = "1";
  250. model.pageSize = rowOnPage;
  251. if (res.listUserCoin != null)
  252. {
  253. model.totalPage = Convert.ToInt32(Math.Ceiling(res.listUserCoin.Length / decimal.Parse(rowOnPage)));
  254. for (int i = 0; i < res.listUserCoin.Length; i++)
  255. {
  256. res.listUserCoin[i].msisdn = HiddenMsisdn(res.listUserCoin[i].msisdn);
  257. }
  258. }
  259. model.listUserCoin = res.listUserCoin;
  260. response resRank = wsClient.wsGetUserRank(wsUser, wsPassword, userInfo.msisdn);
  261. model.userCoin = resRank.userCoin;
  262. return PartialView("../Partial/_TopCoin", model);
  263. }
  264. }
  265. public IActionResult Guide()
  266. {
  267. string currentLang = getCurrentLang();
  268. return View("Guide_" + currentLang);
  269. }
  270. public IActionResult Error()
  271. {
  272. return View();
  273. }
  274. [HttpPost]
  275. [ValidateAntiForgeryToken]
  276. public async Task<JsonResult> SpinAction()
  277. {
  278. String account = HttpContext.Session.GetString("account");
  279. UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
  280. if (!CheckAuthToken() || userInfo == null)
  281. {
  282. return Json(new
  283. {
  284. error = "-1",
  285. content = "Timeout",
  286. href = "mytel://home"
  287. });
  288. }
  289. if (userInfo.total_spin > 0)
  290. {
  291. SetWsClient(ref wsClient, account);
  292. using (new OperationContextScope(wsClient.InnerChannel))
  293. {
  294. // Add a HTTP Header to an outgoing request
  295. HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
  296. requestMessage.Headers["lang"] = getCurrentLang();
  297. OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
  298. response res = wsClient.wsDoSpin(wsUser, wsPassword, userInfo.msisdn, BaseController.channel);
  299. if (res.errorCode == "0")
  300. {
  301. // check prize add spin
  302. spinResultObj spinResult = res.spinResult;
  303. userInfo.spinInfo = spinResult;
  304. prizeObj prizeObj = MapPrize()[spinResult.prizeId];
  305. HttpContext.Session.SetComplexData("userInfo", userInfo);
  306. return Json(new
  307. {
  308. error = "0",
  309. content = res.content,
  310. prize = prizeObj,
  311. remainSpin = userInfo.spinInfo.remainSpin,
  312. totalSpin = userInfo.spinInfo.totalSpin,
  313. usedSpin = userInfo.spinInfo.usedSpin,
  314. totalCoin = userInfo.spinInfo.totalCoin,
  315. lastAction = prizeObj.actionCode
  316. });
  317. }
  318. else
  319. {
  320. return Json(new
  321. {
  322. error = res.errorCode,
  323. content = res.content
  324. });
  325. }
  326. }
  327. }
  328. else
  329. {
  330. return Json(new
  331. {
  332. error = "1",
  333. content = "Out of spin"
  334. });
  335. }
  336. }
  337. [HttpPost]
  338. [ValidateAntiForgeryToken]
  339. public async Task<JsonResult> RegisterOtp(String packageName)
  340. {
  341. String account = HttpContext.Session.GetString("account");
  342. UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
  343. if (!CheckAuthToken() || userInfo == null)
  344. {
  345. return Json(new
  346. {
  347. error = "-1",
  348. content = "Timeout",
  349. href = "mytel://home"
  350. });
  351. }
  352. SetWsClient(ref wsClient, account);
  353. using (new OperationContextScope(wsClient.InnerChannel))
  354. {
  355. // Add a HTTP Header to an outgoing request
  356. HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
  357. requestMessage.Headers["lang"] = getCurrentLang();
  358. OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
  359. response res = wsClient.wsRegisterSubOtp(wsUser, wsPassword, userInfo.msisdn, packageName, BaseController.channel);
  360. if (res.errorCode == "0" || res.errorCode == "100")
  361. {
  362. RequestOtp requestOtp = new RequestOtp();
  363. requestOtp.msisdn = userInfo.msisdn;
  364. requestOtp.packageName = packageName;
  365. requestOtp.requestId = res.resultCode;
  366. HttpContext.Session.SetComplexData("requestOtp", requestOtp);
  367. return Json(new
  368. {
  369. error = res.errorCode,
  370. content = res.content
  371. });
  372. }
  373. else
  374. {
  375. return Json(new
  376. {
  377. error = res.errorCode,
  378. content = res.content
  379. });
  380. }
  381. }
  382. }
  383. [HttpPost]
  384. [ValidateAntiForgeryToken]
  385. public async Task<JsonResult> RegisterConfirm(String otp)
  386. {
  387. String account = HttpContext.Session.GetString("account");
  388. UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
  389. RequestOtp requestOtp = HttpContext.Session.GetComplexData<RequestOtp>("requestOtp");
  390. if (!CheckAuthToken() || userInfo == null)
  391. {
  392. return Json(new
  393. {
  394. error = "-1",
  395. content = "Timeout",
  396. href = "mytel://home"
  397. });
  398. }
  399. SetWsClient(ref wsClient, account);
  400. using (new OperationContextScope(wsClient.InnerChannel))
  401. {
  402. // Add a HTTP Header to an outgoing request
  403. HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
  404. requestMessage.Headers["lang"] = getCurrentLang();
  405. OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
  406. response res = wsClient.wsRegisterSubConfirm(wsUser, wsPassword, userInfo.msisdn, requestOtp.packageName, requestOtp.requestId, otp, BaseController.channel);
  407. if (res.errorCode == "0")
  408. {
  409. return Json(new
  410. {
  411. error = "0",
  412. content = res.content
  413. });
  414. }
  415. else
  416. {
  417. return Json(new
  418. {
  419. error = res.errorCode,
  420. content = res.content
  421. });
  422. }
  423. }
  424. }
  425. [HttpPost]
  426. [ValidateAntiForgeryToken]
  427. public async Task<JsonResult> CancelConfirm(String packageName)
  428. {
  429. String account = HttpContext.Session.GetString("account");
  430. UserInfo userInfo = HttpContext.Session.GetComplexData<UserInfo>("userInfo");
  431. if (!CheckAuthToken() || userInfo == null)
  432. {
  433. return Json(new
  434. {
  435. error = "-1",
  436. content = "Timeout",
  437. href = "mytel://home"
  438. });
  439. }
  440. SetWsClient(ref wsClient, account);
  441. using (new OperationContextScope(wsClient.InnerChannel))
  442. {
  443. // Add a HTTP Header to an outgoing request
  444. HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
  445. requestMessage.Headers["lang"] = getCurrentLang();
  446. OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
  447. response res = wsClient.wsCancelSub(wsUser, wsPassword, account, packageName, channel);
  448. if (res.errorCode == "0")
  449. {
  450. return Json(new
  451. {
  452. error = res.errorCode,
  453. content = res.content
  454. });
  455. }
  456. else
  457. {
  458. return Json(new
  459. {
  460. error = res.errorCode,
  461. content = res.content
  462. });
  463. }
  464. }
  465. }
  466. [HttpPost]
  467. [ValidateAntiForgeryToken]
  468. public JsonResult LoginAction(String phoneNumber, string password)
  469. {
  470. String msisdn = validateMsisdn(phoneNumber);
  471. CheckSessionRes checkSession = CheckSessionValid(ActionSession.Login);
  472. if (checkSession.errorCode != "0")
  473. {
  474. return Json(new
  475. {
  476. error = checkSession.errorCode,
  477. content = checkSession.content,
  478. msisdn = msisdn.Substring(3)
  479. });
  480. }
  481. if (msisdn != "")
  482. {
  483. ServiceAPI.response subInfo = null;
  484. SetWsClient(ref wsClient, msisdn);
  485. using (new OperationContextScope(wsClient.InnerChannel))
  486. {
  487. // Add a HTTP Header to an outgoing request
  488. HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
  489. requestMessage.Headers["lang"] = getCurrentLang();
  490. OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
  491. ServiceAPI.response res = wsClient.wsLogin(wsUser, wsPassword, password, msisdn);
  492. if (res.errorCode == "0")
  493. {
  494. // login success --> store session
  495. CreateAuthToken(msisdn, null);
  496. ReloadUserInfo(msisdn);
  497. LoginSuccessAction();
  498. }
  499. else
  500. {
  501. LoginFailAction();
  502. }
  503. if (subInfo != null)
  504. {
  505. return Json(new
  506. {
  507. error = res.errorCode,
  508. content = res.content,
  509. msisdn = msisdn.Substring(3)
  510. });
  511. }
  512. else
  513. {
  514. return Json(new
  515. {
  516. error = res.errorCode,
  517. content = res.content,
  518. msisdn = msisdn.Substring(3)
  519. });
  520. }
  521. }
  522. }
  523. else
  524. {
  525. return Json(new
  526. {
  527. error = "-1",
  528. content = Lang.LoginFailed
  529. });
  530. }
  531. }
  532. [ValidateAntiForgeryToken]
  533. public JsonResult SignupAction(String phoneNumber, string captcharesponse)
  534. {
  535. //if (Check(captcharesponse) == false)
  536. //{
  537. // return Json(new
  538. // {
  539. // error = "16",
  540. // content = Lang.CaptchaInvalid
  541. // });
  542. //}
  543. CheckSessionRes checkSession = CheckSessionValid(ActionSession.SignUp);
  544. if (checkSession.errorCode != "0")
  545. {
  546. return Json(new
  547. {
  548. error = checkSession.errorCode,
  549. content = checkSession.content
  550. });
  551. }
  552. String msisdn = validateMsisdn(phoneNumber);
  553. if (msisdn != "")
  554. {
  555. SetWsClient(ref wsClient, msisdn);
  556. using (new OperationContextScope(wsClient.InnerChannel))
  557. {
  558. // Add a HTTP Header to an outgoing request
  559. HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
  560. requestMessage.Headers["lang"] = getCurrentLang();
  561. OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
  562. ServiceAPI.response res = wsClient.wsCreateAccount(wsUser, wsPassword, "", msisdn);
  563. if (res.errorCode == "0")
  564. {
  565. // signup success --> store session
  566. SetLastSignUp();
  567. CreateAuthToken(msisdn, null);
  568. ReloadUserInfo(msisdn);
  569. }
  570. return Json(new
  571. {
  572. error = res.errorCode,
  573. content = res.content,
  574. msisdn = msisdn.Substring(3)
  575. });
  576. }
  577. }
  578. else
  579. {
  580. return Json(new
  581. {
  582. error = "-1",
  583. content = Lang.InvalidMsisdn
  584. });
  585. }
  586. }
  587. [ValidateAntiForgeryToken]
  588. public JsonResult ResetPassword(String phoneNumber, string captcharesponse)
  589. {
  590. CheckSessionRes checkSession = CheckSessionValid(ActionSession.Resetpass);
  591. if (checkSession.errorCode != "0")
  592. {
  593. return Json(new
  594. {
  595. error = checkSession.errorCode,
  596. content = checkSession.content
  597. });
  598. }
  599. String msisdn = validateMsisdn(phoneNumber);
  600. if (msisdn != "")
  601. {
  602. SetWsClient(ref wsClient, msisdn);
  603. using (new OperationContextScope(wsClient.InnerChannel))
  604. {
  605. // Add a HTTP Header to an outgoing request
  606. HttpRequestMessageProperty requestMessage = new HttpRequestMessageProperty();
  607. requestMessage.Headers["lang"] = getCurrentLang();
  608. OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = requestMessage;
  609. ServiceAPI.response res = wsClient.wsResetPassword(wsUser, wsPassword, msisdn);
  610. SetLastResetPass();
  611. return Json(new
  612. {
  613. error = res.errorCode,
  614. content = res.content
  615. });
  616. }
  617. }
  618. else
  619. {
  620. return Json(new
  621. {
  622. error = "-1",
  623. content = Lang.InvalidMsisdn
  624. });
  625. }
  626. }
  627. }
  628. }