PageRenderTime 90ms CodeModel.GetById 47ms RepoModel.GetById 0ms app.codeStats 1ms

/src/Diversity.Data/DataAccess/SqlServer/SqlGameRepository.cs

https://bitbucket.org/symmetrateam/echallengeapi
C# | 1647 lines | 1341 code | 284 blank | 22 comment | 297 complexity | 99c3a5ea0647f9e640d042ab1c266323 MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data;
  4. using System.Data.Entity;
  5. using System.Data.Linq;
  6. using System.Diagnostics;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Runtime.Serialization;
  10. using System.Text;
  11. using System.Web.Configuration;
  12. using System.Xml;
  13. using System.Xml.Linq;
  14. using Diversity.Common;
  15. using Diversity.DataModel.SqlRepository;
  16. using Diversity.Common.Enumerations;
  17. using Diversity.Data.Utility;
  18. using Diversity.Domain.Model;
  19. using log4net;
  20. using Card = Diversity.Domain.Model.Card;
  21. using Client = Diversity.Domain.Model.Client;
  22. using Game = Diversity.Domain.Model.Game;
  23. using FlashAsset = Diversity.Domain.Model.FlashAsset;
  24. namespace Diversity.Data.DataAccess.SqlServer
  25. {
  26. public partial class SqlGameRepository : SqlRepository, IGameRepository
  27. {
  28. private static readonly ILog _log = LogManager.GetLogger((System.Reflection.MethodBase.GetCurrentMethod().DeclaringType));
  29. public Game GetGame(int gameId, int languageId, Guid userId)
  30. {
  31. var game = GetGameById(languageId, gameId, userId);
  32. return game;
  33. }
  34. public bool CanNewGameBePlayedByUser(int gameId, int languageId, Guid userId)
  35. {
  36. var dbGame = (from g in DataContext.Games
  37. where g.GameID == gameId
  38. select g).FirstOrDefault();
  39. if(dbGame == null)
  40. {
  41. return false;
  42. }
  43. if(dbGame.NumberOfTimesGameCanBePlayed == 0 ||
  44. (dbGame.GameID_Template.HasValue && GetGameIdForInProgressGame(gameId,userId).HasValue))
  45. {
  46. return true;
  47. }
  48. var gameCount = (from g in DataContext.Games
  49. where g.GameID_Template == gameId
  50. && g.UserID_CreatedBy == userId && !g.IsADeletedRow && !g.IsAnAuditRow
  51. select g).Count();
  52. return !(gameCount > dbGame.NumberOfTimesGameCanBePlayed);
  53. }
  54. public IQueryable<FlashAsset> GetFlashAssets(int languageId)
  55. {
  56. var assets = from f in DataContext.FlashAssets
  57. join l in DataContext.FlashAsset_Languages on f.FlashAssetID equals l.FlashAssetID
  58. where l.LanguageID == languageId
  59. select new
  60. {
  61. Name = f.Key,
  62. l.Value,
  63. Lcid = l.Language.LCID
  64. };
  65. var results = (from a in assets
  66. select new FlashAsset()
  67. {
  68. Name = a.Name,
  69. Value = a.Value,
  70. Lcid = a.Lcid
  71. });
  72. return results;
  73. }
  74. public int? GetGameIdForInProgressGame(int gameTemplateId, Guid userId)
  75. {
  76. var gamePlayer = DataContext.GamePlayers
  77. .FirstOrDefault
  78. (
  79. p =>
  80. p.UserID == userId && !p.IsAvatar && p.Game.GameID_Template == gameTemplateId &&
  81. p.Game.GameCompletionDate == null
  82. );
  83. if(gamePlayer == null)
  84. {
  85. return null;
  86. }
  87. return gamePlayer.GameID;
  88. }
  89. DataModel.SqlRepository.Game DuplicateGameFromTemplate(Game templateGame, Guid userId, int languageId, bool lockDownTemplate)
  90. {
  91. var currentDateTime = DateTime.Now;
  92. var duplicateGame = new DataModel.SqlRepository.Game();
  93. duplicateGame.UserID_CreatedBy = userId;
  94. duplicateGame.UserID_LastModifiedBy = userId;
  95. duplicateGame.CreatedOnDateTime = currentDateTime;
  96. duplicateGame.LastModifiedOnDateTime = currentDateTime;
  97. duplicateGame.GameID_Template = templateGame.Id;
  98. duplicateGame.IsOnlineGame = templateGame.GameSettings.IsOnline;
  99. duplicateGame.GameNowLockedDown = lockDownTemplate;
  100. duplicateGame.GameConfigCanBeModifiedAcrossInstances =
  101. templateGame.GameSettings.GameConfigCanBeModifiedAcrossInstances;
  102. duplicateGame.IsTimedGame = templateGame.GameSettings.IsTimed;
  103. duplicateGame.UseCardTime = templateGame.GameSettings.UseCardTime;
  104. duplicateGame.UseActualAvatarNames = templateGame.AvatarSettings.UseActualName;
  105. duplicateGame.UseHistoricAvatarAnswers = templateGame.AvatarSettings.UseHistoricAnswers;
  106. duplicateGame.UseActualAvatarAnsweringTimes = templateGame.AvatarSettings.UseActualAnsweringTimes;
  107. duplicateGame.AllUsersMustFinishThisGameByThisDate =
  108. templateGame.GameSettings.AllUsersMustFinishThisGameBy;
  109. duplicateGame.PlayerTurn_RandomNoRepeatingUntilAllHavePlayed =
  110. templateGame.PlayerTurnSettings.RandomNoRepeatingUntilAllHavePlayed;
  111. duplicateGame.PlayerTurn_ByPlayerSequenceNoElseRandom =
  112. templateGame.PlayerTurnSettings.BySequenceNoElseRandom;
  113. duplicateGame.DefaultGameTimeInSeconds = templateGame.GameSettings.DefaultGameTimeInSeconds;
  114. duplicateGame.GameThemeData = templateGame.GameSettings.GameThemeData;
  115. duplicateGame.CanSkipTutorial = templateGame.GameSettings.CanSkipTutorial;
  116. duplicateGame.GameTemplateNameForDashboard = templateGame.GameSettings.GameTemplateNameForDashboard;
  117. duplicateGame.ExternalID = templateGame.CourseCode;
  118. //set values here to create a new instance game
  119. duplicateGame.HasBeenDownloaded = true;
  120. duplicateGame.NumberOfTimesRun = 1;
  121. duplicateGame.GameStartDate = DateTime.Now;
  122. duplicateGame.IsAGameTemplate = false;
  123. duplicateGame.GameCompletionDate = null;
  124. duplicateGame.ProductID = templateGame.ProductId;
  125. //add the real game player to the game
  126. var gamePlayer = new GamePlayer();
  127. gamePlayer.CreatedOnDateTime = currentDateTime;
  128. gamePlayer.IsAvatar = false;
  129. gamePlayer.LastModifiedOnDateTime = currentDateTime;
  130. gamePlayer.UserID = userId;
  131. gamePlayer.UserID_CreatedBy = userId;
  132. gamePlayer.UserID_LastModifiedBy = userId;
  133. duplicateGame.GamePlayers.Add(gamePlayer);
  134. foreach (var cardGroup in templateGame.CardGroups)
  135. {
  136. var duplicateCardGroupSequence = new GameCardGroupSequence();
  137. duplicateCardGroupSequence.CardGroupSequenceNo = cardGroup.CardGroupSequenceNo;
  138. duplicateCardGroupSequence.GameID = duplicateGame.GameID;
  139. duplicateCardGroupSequence.IsAMandatoryCardGroup = cardGroup.IsMandatoryGroup;
  140. duplicateCardGroupSequence.CreatedOnDateTime = currentDateTime;
  141. duplicateCardGroupSequence.LastModifiedOnDateTime = currentDateTime;
  142. duplicateCardGroupSequence.UserID_CreatedBy = userId;
  143. duplicateCardGroupSequence.UserID_LastModifiedBy = userId;
  144. foreach (Card card in cardGroup.Cards)
  145. {
  146. var duplicateGameCardSequence = new GameCardSequence();
  147. duplicateGameCardSequence.CardID = card.Id;
  148. duplicateGameCardSequence.CardSequenceNo = card.CardSequenceNo;
  149. duplicateGameCardSequence.CardViewedInGame = false;
  150. duplicateGameCardSequence.CardViewedInGameOn = null;
  151. duplicateGameCardSequence.GameCardGroupSequenceID =
  152. duplicateCardGroupSequence.GameCardGroupSequenceID;
  153. duplicateGameCardSequence.IsAMandatoryCard = card.IsAMandatoryCard;
  154. duplicateGameCardSequence.UseLongVersion = card.UseLongVersion;
  155. duplicateGameCardSequence.CreatedOnDateTime = currentDateTime;
  156. duplicateGameCardSequence.LastModifiedOnDateTime = currentDateTime;
  157. duplicateGameCardSequence.UserID_CreatedBy = userId;
  158. duplicateGameCardSequence.UserID_LastModifiedBy = userId;
  159. duplicateCardGroupSequence.GameCardSequences.Add(duplicateGameCardSequence);
  160. }
  161. duplicateGame.GameCardGroupSequences.Add(duplicateCardGroupSequence);
  162. }
  163. return duplicateGame;
  164. }
  165. List<DataModel.SqlRepository.Game> GetSimulatedPlayerGames(Game templateGame, int languageId, bool lockDownTemplate)
  166. {
  167. var player1 =
  168. DataContext.Users.FirstOrDefault(u => u.LoweredUserName == ConfigurationHelper.SystemPlayer1.ToLower());
  169. var player1Game = DuplicateGameFromTemplate(templateGame, player1.UserId, languageId, lockDownTemplate);
  170. var player2 =
  171. DataContext.Users.FirstOrDefault(u => u.LoweredUserName == ConfigurationHelper.SystemPlayer2.ToLower());
  172. var player2Game = DuplicateGameFromTemplate(templateGame, player2.UserId, languageId, lockDownTemplate);
  173. var player3 =
  174. DataContext.Users.FirstOrDefault(u => u.LoweredUserName == ConfigurationHelper.SystemPlayer3.ToLower());
  175. var player3Game = DuplicateGameFromTemplate(templateGame, player3.UserId, languageId, lockDownTemplate);
  176. var results = new List<DataModel.SqlRepository.Game>();
  177. results.Add(player1Game);
  178. results.Add(player2Game);
  179. results.Add(player3Game);
  180. return results;
  181. }
  182. List<Result> GetSimulatedAnswersForGame(DataModel.SqlRepository.Game game, Guid lastModifiedByUserId)
  183. {
  184. var results = new List<Result>();
  185. var avatar = game.GamePlayers.FirstOrDefault();
  186. foreach(var cardSequence in game.GameCardGroupSequences.SelectMany(c=>c.GameCardSequences))
  187. {
  188. var card = DataContext.Cards.FirstOrDefault(c=>c.CardID == cardSequence.CardID);
  189. if(card.Internal_CardType.Internal_CardTypeShortCode.Equals(Enum.GetName(typeof(CardType), CardType.MultipleChoiceQuestionCard)) ||
  190. card.Internal_CardType.Internal_CardTypeShortCode.Equals(Enum.GetName(typeof(CardType), CardType.MultipleChoiceImageQuestionCard)) ||
  191. card.Internal_CardType.Internal_CardTypeShortCode.Equals(Enum.GetName(typeof(CardType), CardType.MultipleChoiceAuditStatementCard)) ||
  192. card.Internal_CardType.Internal_CardTypeShortCode.Equals(Enum.GetName(typeof(CardType), CardType.MultipleChoiceAuditStatementImageCard))
  193. )
  194. {
  195. var random = new Random();
  196. var answerNo = random.Next(1, card.QuestionCard.QuestionCard_GeneralAnswers.Count);
  197. var answers = card.QuestionCard.QuestionCard_GeneralAnswers.ToList();
  198. var timeToAnswer = card.CardMaxTimeToAnswerInSeconds > 0
  199. ? random.Next(1, card.CardMaxTimeToAnswerInSeconds)
  200. : 0;
  201. var playerResult = new MultipleChoicePlayerResult()
  202. {
  203. AnswerId = answers[answerNo].QuestionCard_GeneralAnswerID,
  204. PlayerId = avatar.UserID,
  205. TimeTakenToAnswerInSeconds = timeToAnswer
  206. };
  207. var xml = SerializeObject(playerResult);
  208. if(string.IsNullOrEmpty(xml))
  209. {
  210. continue;
  211. }
  212. var resultXml = XElement.Parse(xml);
  213. var currentDateTime = DateTime.Now;
  214. var result = new Result()
  215. {
  216. CardID = card.CardID,
  217. CreatedOnDateTime = currentDateTime,
  218. GameID = game.GameID,
  219. Internal_CardTypeID = card.Internal_CardTypeID,
  220. LastModifiedOnDateTime = currentDateTime,
  221. ResultType = resultXml.Name.LocalName,
  222. ResultXmlElement = resultXml,
  223. UserID_CreatedBy = lastModifiedByUserId,
  224. UserID_LastModifiedBy = lastModifiedByUserId
  225. };
  226. results.Add(result);
  227. }
  228. else if (card.Internal_CardType.Internal_CardTypeShortCode.Equals(Enum.GetName(typeof(CardType), CardType.MatchingListQuestionCard)))
  229. {
  230. var random = new Random();
  231. var answers = card.QuestionCard.QuestionCard_GeneralAnswers.ToList();
  232. var timeToAnswer = card.CardMaxTimeToAnswerInSeconds > 0
  233. ? random.Next(1, card.CardMaxTimeToAnswerInSeconds)
  234. : 0;
  235. var playerResult = new MatchingListPlayerResult()
  236. {
  237. PlayerId = avatar.UserID,
  238. TimeTakenToAnswerInSeconds = timeToAnswer,
  239. Results = new MatchingListPlayerResultAnswer[answers.Count]
  240. };
  241. int rhAnswerNo;
  242. int lhAnswerNo;
  243. for (int i = 0; i < playerResult.Results.Count; i++)
  244. {
  245. rhAnswerNo = random.Next(0, answers.Count);
  246. lhAnswerNo = random.Next(0, answers.Count);
  247. playerResult.Results[i] = new MatchingListPlayerResultAnswer()
  248. {
  249. AnswerSequenceNo = 0,
  250. RHAnswerId = answers[rhAnswerNo].QuestionCard_GeneralAnswerID,
  251. LHAnswerId = answers[lhAnswerNo].QuestionCard_GeneralAnswerID
  252. };
  253. }
  254. var xml = SerializeObject(playerResult);
  255. if (string.IsNullOrEmpty(xml))
  256. {
  257. continue;
  258. }
  259. var resultXml = XElement.Parse(xml);
  260. var currentDateTime = DateTime.Now;
  261. var result = new Result()
  262. {
  263. CardID = card.CardID,
  264. CreatedOnDateTime = currentDateTime,
  265. GameID = game.GameID,
  266. Internal_CardTypeID = card.Internal_CardTypeID,
  267. LastModifiedOnDateTime = currentDateTime,
  268. ResultType = resultXml.Name.LocalName,
  269. ResultXmlElement = resultXml,
  270. UserID_CreatedBy = lastModifiedByUserId,
  271. UserID_LastModifiedBy = lastModifiedByUserId
  272. };
  273. results.Add(result);
  274. }
  275. else if (card.Internal_CardType.Internal_CardTypeShortCode.Equals(Enum.GetName(typeof(CardType), CardType.MultipleCheckBoxQuestionCard)) ||
  276. card.Internal_CardType.Internal_CardTypeShortCode.Equals(Enum.GetName(typeof(CardType), CardType.MultipleCheckBoxImageQuestionCard)))
  277. {
  278. var random = new Random();
  279. var answers = card.QuestionCard.QuestionCard_GeneralAnswers.Where(c => c.IsCorrectAnswer).ToList();
  280. var timeToAnswer = card.CardMaxTimeToAnswerInSeconds > 0
  281. ? random.Next(1, card.CardMaxTimeToAnswerInSeconds)
  282. : 0;
  283. var playerResult = new MultipleCheckBoxPlayerResult()
  284. {
  285. PlayerId = avatar.UserID,
  286. TimeTakenToAnswerInSeconds = timeToAnswer,
  287. Results = new MultipleCheckBoxPlayerResultAnswer[answers.Count]
  288. };
  289. for (int i = 0; i < playerResult.Results.Count; i++)
  290. {
  291. var answerNo = random.Next(0, answers.Count);
  292. playerResult.Results[i] = new MultipleCheckBoxPlayerResultAnswer()
  293. {
  294. AnswerId = answers[answerNo].QuestionCard_GeneralAnswerID
  295. };
  296. }
  297. var xml = SerializeObject(playerResult);
  298. if (string.IsNullOrEmpty(xml))
  299. {
  300. continue;
  301. }
  302. var resultXml = XElement.Parse(xml);
  303. var currentDateTime = DateTime.Now;
  304. var result = new Result()
  305. {
  306. CardID = card.CardID,
  307. CreatedOnDateTime = currentDateTime,
  308. GameID = game.GameID,
  309. Internal_CardTypeID = card.Internal_CardTypeID,
  310. LastModifiedOnDateTime = currentDateTime,
  311. ResultType = resultXml.Name.LocalName,
  312. ResultXmlElement = resultXml,
  313. UserID_CreatedBy = lastModifiedByUserId,
  314. UserID_LastModifiedBy = lastModifiedByUserId
  315. };
  316. results.Add(result);
  317. }
  318. }
  319. return results;
  320. }
  321. static string SerializeObject<T>(T source)
  322. {
  323. using (var stream = new MemoryStream())
  324. {
  325. var serializer = new DataContractSerializer(typeof(T));
  326. serializer.WriteObject(stream, source);
  327. return System.Text.Encoding.UTF8.GetString(stream.ToArray());
  328. }
  329. }
  330. public Game CreateGameFromTemplateGame(Game templateGame, Guid userId, int languageId, bool lockDownTemplate)
  331. {
  332. //select random players for avatars
  333. var avatars = GetRandomAvatarsForOnlineGame(templateGame.Id, userId);
  334. //first check if there are any avatars available
  335. //if no avatars available for template game then the system
  336. //avatars need to be used to simulate playing the game
  337. var createdGameId = -1;
  338. var currentDateTime = DateTime.Now;
  339. using (var dataContext = new EChallengeDataContext())
  340. {
  341. var duplicateGame = DuplicateGameFromTemplate(templateGame, userId, languageId, lockDownTemplate);
  342. var gameInvite =
  343. dataContext.GameInvites.FirstOrDefault(c => c.UserID == userId && c.GameID == templateGame.Id);
  344. if (gameInvite != null)
  345. {
  346. duplicateGame.ThemeClientUserGroupExternalID = gameInvite.ThemeClientUserGroupExternalID;
  347. }
  348. dataContext.Games.Add(duplicateGame);
  349. if (avatars.Count <= 0)
  350. {
  351. var games = GetSimulatedPlayerGames(templateGame, languageId, lockDownTemplate);
  352. foreach (var game in games)
  353. {
  354. var currentPlayer = game.GamePlayers.FirstOrDefault();
  355. var player = new GamePlayer()
  356. {
  357. UserID = currentPlayer.UserID,
  358. IsAvatar = true
  359. };
  360. avatars.Add(player);
  361. foreach (var result in GetSimulatedAnswersForGame(game,userId))
  362. {
  363. result.GamePlayer = player;
  364. game.Results.Add(result);
  365. }
  366. game.GameCompletionDate = DateTime.Now;
  367. dataContext.Games.Add(game);
  368. }
  369. }
  370. var gamePlayer = duplicateGame.GamePlayers.FirstOrDefault();
  371. //now fill populate other information for avatars;
  372. foreach (var avatar in avatars)
  373. {
  374. avatar.IsAvatar = true;
  375. avatar.GameID = duplicateGame.GameID;
  376. avatar.CreatedOnDateTime = currentDateTime;
  377. avatar.UserID_CreatedBy = userId;
  378. avatar.LastModifiedOnDateTime = currentDateTime;
  379. avatar.UserID_LastModifiedBy = userId;
  380. }
  381. //generate random player sequences for avatar and player
  382. avatars.Add(gamePlayer);
  383. var shuffleAvatars = avatars.OrderBy(a => Guid.NewGuid()).ToList();
  384. for (var i = 0; i < shuffleAvatars.Count(); i++)
  385. {
  386. var player = shuffleAvatars[i];
  387. player.PlayerTurnSequenceNo = i + 1;
  388. }
  389. if (shuffleAvatars.Count > 0)
  390. {
  391. foreach (var shuffleAvatar in shuffleAvatars.Where(a => a.IsAvatar))
  392. {
  393. duplicateGame.GamePlayers.Add(shuffleAvatar);
  394. }
  395. var player = shuffleAvatars.FirstOrDefault(a => a.UserID == gamePlayer.UserID);
  396. gamePlayer.PlayerTurnSequenceNo = player.PlayerTurnSequenceNo;
  397. var list = duplicateGame.GamePlayers.ToList();
  398. }
  399. using (var transaction = dataContext.Database.BeginTransaction())
  400. {
  401. //as a new game is now based of the template game we need to lock down the template
  402. var currentTemplateGame = dataContext.Games.FirstOrDefault(g => g.GameID == templateGame.Id);
  403. currentTemplateGame.GameNowLockedDown = lockDownTemplate;
  404. try
  405. {
  406. dataContext.SaveChanges();
  407. transaction.Commit();
  408. createdGameId = duplicateGame.GameID;
  409. }
  410. catch (Exception)
  411. {
  412. transaction.Rollback();
  413. throw;
  414. }
  415. }
  416. }
  417. var createdGame = GetGame(createdGameId, languageId, userId);
  418. createdGame.IsResumed = false;
  419. return createdGame;
  420. }
  421. public bool SaveResult(Guid userId, int cardSequenceId, string resultType, XElement resultXml)
  422. {
  423. var saved = false;
  424. using (var dataContext = new EChallengeDataContext())
  425. {
  426. var cardSequence =
  427. dataContext.GameCardSequences.FirstOrDefault(s => s.GameCardSequenceID == cardSequenceId);
  428. if (cardSequence == null)
  429. {
  430. return false;
  431. }
  432. var cardId = cardSequence.CardID;
  433. var gameId = cardSequence.GameCardGroupSequence.GameID;
  434. if (dataContext.Results.Any(r => r.GameID == gameId && r.CardID == cardId))
  435. {
  436. var existingResult = dataContext.Results.FirstOrDefault(r => r.GameID == gameId && r.CardID == cardId);
  437. if(existingResult != null)
  438. {
  439. var cardType = GetCardTypeFromCardSequenceId(cardSequenceId);
  440. if (cardType != CardType.MultipleChoicePriorityFeedbackCard &&
  441. cardType != CardType.TextAreaPriorityFeedbackCard &&
  442. cardType != CardType.MultipleCheckBoxPriorityFeedbackCard)
  443. {
  444. dataContext.Results.Remove(existingResult);
  445. }
  446. else
  447. {
  448. var feedbackResult = Deserialize<VotingCardFeedbackResult>(existingResult.ResultXmlElement);
  449. if (feedbackResult != null)
  450. {
  451. var currentFeedbackResult = Deserialize<VotingCardFeedbackResult>(resultXml);
  452. if (currentFeedbackResult != null &&
  453. feedbackResult.AnswerId == currentFeedbackResult.AnswerId)
  454. {
  455. dataContext.Results.Remove(existingResult);
  456. }
  457. }
  458. }
  459. }
  460. }
  461. bool isUpdateOnly = false;
  462. var currentDateTime = DateTime.Now;
  463. cardSequence.LastModifiedOnDateTime = currentDateTime;
  464. cardSequence.UserID_LastModifiedBy = userId;
  465. cardSequence.CardViewedInGame = true;
  466. cardSequence.CardViewedInGameOn = currentDateTime;
  467. Result result = null;
  468. if (string.Compare(resultType, typeof(PlayerResult).Name, true) == 0)
  469. {
  470. isUpdateOnly = true;
  471. }
  472. else
  473. {
  474. var card = dataContext.Cards.FirstOrDefault(c => c.CardID == cardId);
  475. if (card == null)
  476. {
  477. return false;
  478. }
  479. var gamePlayer =
  480. dataContext.GamePlayers.FirstOrDefault(g => g.GameID == gameId && g.UserID == userId);
  481. if(gamePlayer == null)
  482. {
  483. throw new Exception(@"The result could no be saved as the Game Player could not be found for this game.");
  484. }
  485. result = new Result()
  486. {
  487. CardID = cardId,
  488. CreatedOnDateTime = currentDateTime,
  489. GameID = gameId,
  490. Internal_CardTypeID = card.Internal_CardTypeID,
  491. LastModifiedOnDateTime = currentDateTime,
  492. ResultType = resultType,
  493. ResultXmlElement = resultXml,
  494. UserID_CreatedBy = userId,
  495. UserID_LastModifiedBy = userId,
  496. GamePlayerID = gamePlayer.GamePlayerID
  497. };
  498. dataContext.Results.Add(result);
  499. }
  500. dataContext.SaveChanges();
  501. if(isUpdateOnly)
  502. {
  503. saved = true;
  504. }
  505. else
  506. {
  507. saved = result.ResultID > 0;
  508. }
  509. }
  510. return saved;
  511. }
  512. public bool SkipCard(Guid userId, int cardSequenceId)
  513. {
  514. var saved = false;
  515. using (var dataContext = new EChallengeDataContext())
  516. {
  517. var cardSequence =
  518. dataContext.GameCardSequences.FirstOrDefault(s => s.GameCardSequenceID == cardSequenceId);
  519. if (cardSequence == null)
  520. {
  521. return false;
  522. }
  523. var currentDateTime = DateTime.Now;
  524. cardSequence.LastModifiedOnDateTime = currentDateTime;
  525. cardSequence.UserID_LastModifiedBy = userId;
  526. cardSequence.CardViewedInGame = true;
  527. cardSequence.CardViewedInGameOn = currentDateTime;
  528. dataContext.SaveChanges();
  529. saved = true;
  530. }
  531. return saved;
  532. }
  533. public bool SetGameAsCompleted(Guid userId, int gameId)
  534. {
  535. var saved = false;
  536. using (var dataContext = new EChallengeDataContext())
  537. {
  538. var game =
  539. dataContext.Games.FirstOrDefault(s => s.GameID == gameId && s.UserID_CreatedBy == userId);
  540. if (game == null)
  541. {
  542. return false;
  543. }
  544. var currentDateTime = DateTime.Now;
  545. game.LastModifiedOnDateTime = currentDateTime;
  546. game.UserID_LastModifiedBy = userId;
  547. game.GameCompletionDate = DateTime.Now;
  548. var gameCompletedShortCode = Enum.GetName(typeof (CardType), CardType.GameCompletedCard);
  549. var gameCompletedCard = dataContext.GameCardSequences.FirstOrDefault(
  550. c =>
  551. c.Card.Internal_CardType.Internal_CardTypeShortCode ==
  552. gameCompletedShortCode && c.GameCardGroupSequence.GameID == gameId);
  553. if (gameCompletedCard != null)
  554. {
  555. gameCompletedCard.LastModifiedOnDateTime = currentDateTime;
  556. gameCompletedCard.UserID_LastModifiedBy = userId;
  557. gameCompletedCard.CardViewedInGame = true;
  558. gameCompletedCard.CardViewedInGameOn = game.GameCompletionDate;
  559. }
  560. dataContext.SaveChanges();
  561. saved = true;
  562. }
  563. return saved;
  564. }
  565. public bool HasUnansweredQuestions(int gameId)
  566. {
  567. var excludedCardTypes = new List<string>();
  568. excludedCardTypes.Add(Enum.GetName(typeof(CardType), CardType.AwardCard));
  569. excludedCardTypes.Add(Enum.GetName(typeof(CardType), CardType.CertificateCard));
  570. excludedCardTypes.Add(Enum.GetName(typeof(CardType), CardType.CompanyPolicyCard));
  571. excludedCardTypes.Add(Enum.GetName(typeof(CardType), CardType.GameIntroCard));
  572. excludedCardTypes.Add(Enum.GetName(typeof(CardType), CardType.GameCompletedCard));
  573. excludedCardTypes.Add(Enum.GetName(typeof(CardType), CardType.LeadingQuestionCard));
  574. excludedCardTypes.Add(Enum.GetName(typeof(CardType), CardType.LcdCategoryCard));
  575. excludedCardTypes.Add(Enum.GetName(typeof(CardType), CardType.IntroSurveyCard));
  576. excludedCardTypes.Add(Enum.GetName(typeof(CardType), CardType.RoundResultCard));
  577. excludedCardTypes.Add(Enum.GetName(typeof(CardType), CardType.ScoreboardCard));
  578. excludedCardTypes.Add(Enum.GetName(typeof(CardType), CardType.TransitionUpCard));
  579. excludedCardTypes.Add(Enum.GetName(typeof(CardType), CardType.TransitionDownCard));
  580. excludedCardTypes.Add(Enum.GetName(typeof(CardType), CardType.ThemeIntroCard));
  581. var cardsequences = DataContext.GameCardGroupSequences
  582. .Where(g => g.GameID == gameId)
  583. .SelectMany(g => g.GameCardSequences);
  584. _log.Debug(@"Start Has Unanswered Questions");
  585. var gameCompletedShortCode = Enum.GetName(typeof (CardType), CardType.GameCompletedCard);
  586. var noOfCardsRequiredToBeViewed = cardsequences.Where(
  587. c =>
  588. c.IsAMandatoryCard && c.Card.Internal_CardType.Internal_CardTypeShortCode != gameCompletedShortCode).Distinct().Count();
  589. _log.DebugFormat(@"Cards Required to be Viewed = {0}", noOfCardsRequiredToBeViewed);
  590. var noOfCardsViewInGame = cardsequences.Where(
  591. c => c.IsAMandatoryCard && c.CardViewedInGame && c.Card.Internal_CardType.Internal_CardTypeShortCode != gameCompletedShortCode).Distinct().Count();
  592. _log.DebugFormat(@"Cards Viewed = {0}", noOfCardsViewInGame);
  593. if(noOfCardsRequiredToBeViewed != noOfCardsViewInGame)
  594. {
  595. return true;
  596. }
  597. var noOfCardsRequiredToBeAnswered = cardsequences.Where(
  598. c =>
  599. //validate mandatory cards
  600. c.IsAMandatoryCard &&
  601. !excludedCardTypes.Contains(c.Card.Internal_CardType.Internal_CardTypeShortCode))
  602. .Distinct().Count();
  603. _log.DebugFormat(@"Cards Required to be Answered = {0}", noOfCardsRequiredToBeAnswered);
  604. var results = DataContext.Results.Where(r=>r.GameID == gameId).Select(r=>r.CardID);
  605. var cardSequencesToAnswer =(DataContext.GameCardGroupSequences
  606. .Where(g => g.GameID == gameId)
  607. .SelectMany(g => g.GameCardSequences))
  608. .Where(c=>c.IsAMandatoryCard && !excludedCardTypes.Contains(c.Card.Internal_CardType.Internal_CardTypeShortCode));
  609. var noOfCardsAnswered = (from c in cardSequencesToAnswer
  610. where results.Contains(c.CardID)
  611. select c).Count();
  612. _log.DebugFormat(@"Cards Answered = {0}", noOfCardsAnswered);
  613. //var noOfCardsAnswered = (from grp in DataContext.GameCardGroupSequences
  614. // from cs in grp.GameCardSequences
  615. // where grp.GameID == gameId && cs.IsAMandatoryCard && !excludedCardTypes.Contains(cs.Card.Internal_CardType.Internal_CardTypeShortCode)
  616. // && results.Contains(cs.CardID)
  617. // select cs).Count();
  618. if(noOfCardsAnswered == noOfCardsRequiredToBeAnswered)
  619. {
  620. return false;
  621. }
  622. return true;
  623. }
  624. public bool IncrementGameRunCount(int gameId, Guid userId)
  625. {
  626. var saved = false;
  627. using (var dataContext = new EChallengeDataContext())
  628. {
  629. var game =
  630. dataContext.Games.FirstOrDefault(s => s.GameID == gameId && s.UserID_CreatedBy == userId);
  631. if (game == null)
  632. {
  633. return false;
  634. }
  635. var currentDateTime = DateTime.Now;
  636. game.LastModifiedOnDateTime = currentDateTime;
  637. game.UserID_LastModifiedBy = userId;
  638. var numberOfTimesRun = game.NumberOfTimesRun;
  639. numberOfTimesRun++;
  640. game.NumberOfTimesRun = numberOfTimesRun;
  641. dataContext.SaveChanges();
  642. saved = true;
  643. }
  644. return saved;
  645. }
  646. public CardType GetCardTypeFromCardSequenceId(int cardSequenceId)
  647. {
  648. var cardSequence = DataContext.GameCardSequences.FirstOrDefault(s => s.GameCardSequenceID == cardSequenceId);
  649. if(cardSequence == null)
  650. {
  651. return CardType.Unknown;
  652. }
  653. return GetCardType(cardSequence.CardID);
  654. }
  655. public CardType GetCardType(int cardId)
  656. {
  657. var card = DataContext.Cards.FirstOrDefault(c => c.CardID == cardId);
  658. if (card == null)
  659. {
  660. return CardType.Unknown;
  661. }
  662. var result = CardType.Unknown;
  663. if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.ArrangeSequenceQuestionCard))
  664. {
  665. result = CardType.ArrangeSequenceQuestionCard;
  666. }
  667. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.FillInTheBlankQuestionCard))
  668. {
  669. result = CardType.FillInTheBlankQuestionCard;
  670. }
  671. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.MatchingListQuestionCard))
  672. {
  673. result = CardType.MatchingListQuestionCard;
  674. }
  675. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.NumericQuestionCard))
  676. {
  677. result = CardType.NumericQuestionCard;
  678. }
  679. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.PotLuckQuestionCard))
  680. {
  681. result = CardType.PotLuckQuestionCard;
  682. }
  683. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.MultipleChoiceQuestionCard))
  684. {
  685. result = CardType.MultipleChoiceQuestionCard;
  686. }
  687. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.MultipleChoiceImageQuestionCard))
  688. {
  689. result = CardType.MultipleChoiceImageQuestionCard;
  690. }
  691. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.MultipleCheckBoxQuestionCard))
  692. {
  693. result = CardType.MultipleCheckBoxQuestionCard;
  694. }
  695. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.LcdCategoryCard))
  696. {
  697. result = CardType.LcdCategoryCard;
  698. }
  699. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.MultipleChoiceAuditStatementCard))
  700. {
  701. result = CardType.MultipleChoiceAuditStatementCard;
  702. }
  703. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.MultipleChoiceAuditStatementImageCard))
  704. {
  705. result = CardType.MultipleChoiceAuditStatementImageCard;
  706. }
  707. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.CompanyPolicyCard))
  708. {
  709. result = CardType.CompanyPolicyCard;
  710. }
  711. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.LeadingQuestionCard))
  712. {
  713. result = CardType.LeadingQuestionCard;
  714. }
  715. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.TransitionUpCard))
  716. {
  717. result = CardType.TransitionUpCard;
  718. }
  719. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.TransitionDownCard))
  720. {
  721. result = CardType.TransitionDownCard;
  722. }
  723. else if(card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.GameCompletedCard))
  724. {
  725. result = CardType.GameCompletedCard;
  726. }
  727. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.MultipleChoiceSurveyCard))
  728. {
  729. result = CardType.MultipleChoiceSurveyCard;
  730. }
  731. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.MultipleCheckBoxSurveyCard))
  732. {
  733. result = CardType.MultipleCheckBoxSurveyCard;
  734. }
  735. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.MultipleCheckBoxPriorityFeedbackCard))
  736. {
  737. result = CardType.MultipleCheckBoxPriorityFeedbackCard;
  738. }
  739. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.MultipleChoicePriorityFeedbackCard))
  740. {
  741. result = CardType.MultipleChoicePriorityFeedbackCard;
  742. }
  743. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.TextAreaPriorityFeedbackCard))
  744. {
  745. result = CardType.TextAreaPriorityFeedbackCard;
  746. }
  747. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.PriorityIssueVotingCard))
  748. {
  749. result = CardType.PriorityIssueVotingCard;
  750. }
  751. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.TextAreaSurveyCard))
  752. {
  753. result = CardType.TextAreaSurveyCard;
  754. }
  755. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.TextBoxSurveyCard))
  756. {
  757. result = CardType.TextBoxSurveyCard;
  758. }
  759. else if(card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.TextAreaPersonalActionPlanCard))
  760. {
  761. result = CardType.TextAreaPersonalActionPlanCard;
  762. }
  763. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.TextBoxPersonalActionPlanCard))
  764. {
  765. result = CardType.TextBoxPersonalActionPlanCard;
  766. }
  767. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.MultipleChoicePersonalActionPlanCard))
  768. {
  769. result = CardType.MultipleChoicePersonalActionPlanCard;
  770. }
  771. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.MultipleCheckboxPersonalActionPlanCard))
  772. {
  773. result = CardType.MultipleCheckboxPersonalActionPlanCard;
  774. }
  775. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.ScoreboardCard))
  776. {
  777. result = CardType.ScoreboardCard;
  778. }
  779. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.RoundResultCard))
  780. {
  781. result = CardType.RoundResultCard;
  782. }
  783. else if(card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.IntroSurveyCard))
  784. {
  785. result = CardType.IntroSurveyCard;
  786. }
  787. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.GameIntroCard))
  788. {
  789. result = CardType.GameIntroCard;
  790. }
  791. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.ThemeIntroCard))
  792. {
  793. result = CardType.ThemeIntroCard;
  794. }
  795. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.MatchingListQuestionCard))
  796. {
  797. result = CardType.MatchingListQuestionCard;
  798. }
  799. else if (card.Internal_CardType.Internal_CardTypeShortCode == Enum.GetName(typeof(CardType), CardType.BranchingCard))
  800. {
  801. result = CardType.BranchingCard;
  802. }
  803. return result;
  804. }
  805. public Dashboard GetDashboard(Guid userId, int languageId)
  806. {
  807. return
  808. new Dashboard()
  809. {
  810. Games = GetGamesForDashboard(userId, languageId).ToList(),
  811. Player = GetPlayer(userId)
  812. };
  813. }
  814. IEnumerable<GameTemplateInstance> GetGamesForDashboard(Guid userId, int languageId)
  815. {
  816. var dbGames = from g in DataContext.Games
  817. join i in DataContext.GameInvites on g.GameID equals i.GameID
  818. where g.IsAGameTemplate && i.UserID == userId
  819. select new
  820. {
  821. Id = g.GameID,
  822. game = g,
  823. NumberOfTimesGameCanBePlayed = g.NumberOfTimesGameCanBePlayed.HasValue ? g.NumberOfTimesGameCanBePlayed.Value : 1
  824. };
  825. var games = new List<GameTemplateInstance>();
  826. foreach (var dbGame in dbGames)
  827. {
  828. var game = new GameTemplateInstance()
  829. {
  830. Id = dbGame.Id,
  831. GameSettings = GetGameSettings(dbGame.game),
  832. Games = GetGameInstancesForTemplate(dbGame.Id, userId),
  833. NumberOfTimesGameCanBePlayed = dbGame.NumberOfTimesGameCanBePlayed
  834. };
  835. games.Add(game);
  836. }
  837. return games;
  838. }
  839. List<GameInstance> GetGameInstancesForTemplate(int gameTemplateId, Guid userId)
  840. {
  841. var results = (from g in DataContext.Games
  842. join p in DataContext.GamePlayers on g.GameID equals p.GameID
  843. where g.GameID_Template == gameTemplateId && !g.IsAGameTemplate
  844. && p.UserID == userId && g.UserID_CreatedBy == userId
  845. // Use UserID_CreatedBy above as a user will only be able to create his own game instances.
  846. // This also prevents bringing up games in other peoples dashboard as the UserID may be used
  847. // as a simulated player in another game and so checking the player UserID only is not sufficient
  848. select new
  849. {
  850. Id = g.GameID,
  851. game = g,
  852. ProductId = g.ProductID,
  853. }).Distinct().ToList();
  854. var gameInstances = new List<GameInstance>();
  855. foreach (var result in results)
  856. {
  857. var gameInstance = new GameInstance()
  858. {
  859. Id = result.Id,
  860. GameSettings = GetGameSettings(result.game),
  861. ProductId = result.ProductId,
  862. PercentCompleted = GetPercentCompleted(result.Id)
  863. };
  864. SetGameHeaderCardTotals(gameInstance);
  865. gameInstances.Add(gameInstance);
  866. }
  867. return gameInstances;
  868. }
  869. public IQueryable<Game> GetGames(int languageId)
  870. {
  871. var games = from g in DataContext.Games
  872. select g;
  873. var results = (from g in games
  874. select new Game()
  875. {
  876. Id = g.GameID,
  877. ProductId = g.ProductID,
  878. GameSettings = GetGameSettings(g),
  879. AvatarSettings = GetAvatarSettings(g),
  880. PlayerTurnSettings = GetPlayerTurnSettings(g),
  881. Players = new List<Player>(GetGamePlayers(g.GameID)),
  882. CardGroups = GetCardGroups(g.GameID, languageId).ToList(),
  883. PercentCompleted = g.IsAGameTemplate ? 0 : GetPercentCompleted(g.GameID),
  884. IsResumed = true
  885. //All set to true here. When new games are created from templates,
  886. //after receving the game from db this value is set to false to indicate a new game
  887. });
  888. foreach (var result in results)
  889. {
  890. SetGameHeaderCardTotals(result);

Large files files are truncated, but you can click here to view the full file