PageRenderTime 67ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 0ms

/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
  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);
  891. }
  892. return results;
  893. }
  894. public Game GetGameById(int languageId, int gameId, Guid userId)
  895. {
  896. var dbGame = (from g in DataContext.Games
  897. where g.GameID == gameId
  898. select g).FirstOrDefault();
  899. var theme = DataContext.ThemeClientUserGroup
  900. .Where(c => c.ExternalID.ToLower() == dbGame.ThemeClientUserGroupExternalID.ToLower())
  901. .Select(c => c.Theme)
  902. .FirstOrDefault();
  903. var newGame = new Game()
  904. {
  905. Id = dbGame.GameID,
  906. ProductId = dbGame.ProductID,
  907. PercentCompleted = dbGame.IsAGameTemplate ? 0 : GetPercentCompleted(dbGame.GameID),
  908. IsResumed = true, //All set to true here. When new games are created from templates,
  909. //after receving the game from db this value is set to false to indicate a new game
  910. ThemeKey = theme == null ? string.Empty : theme.ThemeCode
  911. };
  912. newGame.GameSettings = GetGameSettings(dbGame);
  913. newGame.AvatarSettings = GetAvatarSettings(dbGame);
  914. newGame.PlayerTurnSettings = GetPlayerTurnSettings(dbGame);
  915. newGame.Players = new List<Player>(GetGamePlayers(dbGame.GameID));
  916. newGame.CardGroups = GetCardGroups(dbGame.GameID, languageId).ToList();
  917. newGame.Client = GetGameClient(userId);
  918. newGame.CourseCode = dbGame.ExternalID;
  919. SetGameHeaderCardTotals(newGame);
  920. return newGame;
  921. }
  922. private void SetGameHeaderCardTotals(GameHeader gameHeader)
  923. {
  924. var cardsequences = DataContext.GameCardSequences
  925. .Where(
  926. g =>
  927. g.GameCardGroupSequence.GameID == gameHeader.Id)
  928. .ToList();
  929. gameHeader.TotalCardsInGame = cardsequences.Count;
  930. gameHeader.TotalCardsViewed = cardsequences.Count(c => c.CardViewedInGame);
  931. }
  932. private int GetPercentCompleted(int gameId)
  933. {
  934. _log.Debug(@"Start Get percent game completed");
  935. var game = DataContext.Games.FirstOrDefault(g => g.GameID == gameId);
  936. if(game.GameCompletionDate.HasValue)
  937. {
  938. return 100;
  939. }
  940. var noAnswerCardTypes = new List<string>
  941. {
  942. Enum.GetName(typeof (CardType), CardType.RoundResultCard),
  943. Enum.GetName(typeof (CardType), CardType.ScoreboardCard),
  944. Enum.GetName(typeof (CardType), CardType.GameCompletedCard),
  945. Enum.GetName(typeof (CardType), CardType.AwardCard),
  946. Enum.GetName(typeof (CardType), CardType.CertificateCard),
  947. Enum.GetName(typeof (CardType), CardType.CompanyPolicyCard),
  948. Enum.GetName(typeof (CardType), CardType.LcdCategoryCard),
  949. Enum.GetName(typeof(CardType), CardType.GameIntroCard),
  950. Enum.GetName(typeof(CardType), CardType.LeadingQuestionCard),
  951. Enum.GetName(typeof(CardType), CardType.IntroSurveyCard),
  952. Enum.GetName(typeof(CardType), CardType.TransitionUpCard),
  953. Enum.GetName(typeof(CardType), CardType.TransitionDownCard),
  954. Enum.GetName(typeof(CardType), CardType.ThemeIntroCard)
  955. };
  956. var cardsequences = DataContext.GameCardSequences
  957. .Where(
  958. g =>
  959. g.GameCardGroupSequence.GameID == gameId)
  960. .ToList();
  961. var totalCardsViewedInGame = cardsequences.Count(c => c.CardViewedInGame);
  962. _log.DebugFormat(@"Cards Viewed = {0}", totalCardsViewedInGame);
  963. var results = DataContext.Results.Where(r => r.GameID == gameId).Select(r => r.CardID).ToList();
  964. var cardSequencesToAnswer = (DataContext.GameCardGroupSequences
  965. .Where(g => g.GameID == gameId)
  966. .SelectMany(g => g.GameCardSequences))
  967. .Where(c => c.IsAMandatoryCard && !noAnswerCardTypes.Contains(c.Card.Internal_CardType.Internal_CardTypeShortCode)).ToList();
  968. var totalCardsViewedNoAnswerRequired = cardsequences.Count(c => !cardSequencesToAnswer.Contains(c) && c.CardViewedInGame);
  969. var noAnsweredCards = (from c in cardSequencesToAnswer
  970. where results.Contains(c.CardID)
  971. select c).Count();
  972. var totalCardsForGameCompletion = cardsequences.Count;
  973. var percentCompleted = 0.00;
  974. if (totalCardsViewedInGame > 0)
  975. {
  976. percentCompleted = 100*
  977. ((Convert.ToDouble(totalCardsViewedNoAnswerRequired) + Convert.ToDouble(noAnsweredCards))/
  978. Convert.ToDouble(totalCardsForGameCompletion));
  979. }
  980. return Convert.ToInt32(percentCompleted);
  981. }
  982. public Client GetGameClient(Guid userId)
  983. {
  984. var dbClient = (from u in DataContext.User2Clients
  985. join c in DataContext.Clients on u.ClientID equals c.ClientID
  986. where u.UserID == userId && !c.IsADeletedRow && !u.IsADeletedRow
  987. select c).FirstOrDefault();
  988. if(dbClient == null)
  989. {
  990. return new Client();
  991. }
  992. return new Client
  993. {
  994. ClientLogoImageUrl = dbClient.ClientLogoImageURL,
  995. ClientCode = dbClient.ExternalID
  996. };
  997. }
  998. public bool UpdateScormPlayerDetails(Guid userId, string scormUserId, string firstname, string lastname, string email)
  999. {
  1000. var result = false;
  1001. var user = DataContext.Users.Where(u => u.UserId == userId).FirstOrDefault();
  1002. if (user != null)
  1003. {
  1004. using (var transaction = DataContext.Database.BeginTransaction())
  1005. {
  1006. try
  1007. {
  1008. user.UserFirstName = firstname;
  1009. user.UserLastName = lastname;
  1010. var loweredEmailAddress = email.ToLower();
  1011. user.UserPersonalEmail1 = loweredEmailAddress;
  1012. user.Email = loweredEmailAddress;
  1013. user.LoweredEmail = loweredEmailAddress;
  1014. user.LoweredUserName = loweredEmailAddress;
  1015. user.UserName = loweredEmailAddress;
  1016. user.ScormUserID = scormUserId;
  1017. user.LastModifiedOnDateTime = DateTime.Now;
  1018. user.UserID_LastModifiedBy = userId;
  1019. DataContext.SaveChanges();
  1020. transaction.Commit();
  1021. result = true;
  1022. }
  1023. catch (Exception)
  1024. {
  1025. transaction.Rollback();
  1026. throw;
  1027. }
  1028. }
  1029. }
  1030. return result;
  1031. }
  1032. public bool UpdatePlayerDetails(Guid userId, string firstname, string lastname)
  1033. {
  1034. var result = false;
  1035. var user = DataContext.Users.Where(u => u.UserId == userId).FirstOrDefault();
  1036. if (user != null)
  1037. {
  1038. using (var transaction = DataContext.Database.BeginTransaction())
  1039. {
  1040. try
  1041. {
  1042. user.UserFirstName = firstname;
  1043. user.UserLastName = lastname;
  1044. user.LastModifiedOnDateTime = DateTime.Now;
  1045. user.UserID_LastModifiedBy = userId;
  1046. DataContext.SaveChanges();
  1047. transaction.Commit();
  1048. result = true;
  1049. }
  1050. catch (Exception)
  1051. {
  1052. transaction.Rollback();
  1053. throw;
  1054. }
  1055. }
  1056. }
  1057. return result;
  1058. }
  1059. public bool UpdateAvatarDetails(Guid userId, string avatarName, string avatarMetaData)
  1060. {
  1061. var result = false;
  1062. var user = DataContext.Users.Where(u => u.UserId == userId).FirstOrDefault();
  1063. if (user != null)
  1064. {
  1065. using (var transaction = DataContext.Database.BeginTransaction())
  1066. {
  1067. try
  1068. {
  1069. user.PlayerAvatarName = avatarName;
  1070. user.PlayerAvatarData = avatarMetaData;
  1071. user.LastModifiedOnDateTime = DateTime.Now;
  1072. user.UserID_LastModifiedBy = userId;
  1073. DataContext.SaveChanges();
  1074. transaction.Commit();
  1075. result = true;
  1076. }
  1077. catch (Exception)
  1078. {
  1079. transaction.Rollback();
  1080. throw;
  1081. }
  1082. }
  1083. }
  1084. return result;
  1085. }
  1086. public bool ScormGameExists(string externalId)
  1087. {
  1088. var loweredExternalId = externalId.ToLower();
  1089. return
  1090. DataContext.Games.Any(
  1091. c => c.ExternalID.ToLower() == loweredExternalId && !c.GameID_Template.HasValue && !c.IsADeletedRow);
  1092. }
  1093. public bool UserExistsInThemeClientUserGroup(Guid userId, string themeClientUserGroupExternalId)
  1094. {
  1095. var loweredThemeCode = themeClientUserGroupExternalId.ToLower();
  1096. return DataContext
  1097. .User2ClientUserGroups
  1098. .Where(c => c.UserID == userId)
  1099. .SelectMany(c => c.ClientUserGroup.Themes)
  1100. .Any(c => c.ExternalID.ToLower() == loweredThemeCode);
  1101. }
  1102. public bool AddUserToThemeClientUserGroup(Guid userId, string themeClientUserGroupExternalId)
  1103. {
  1104. var added = false;
  1105. var loweredThemeCode = themeClientUserGroupExternalId.ToLower();
  1106. var themeClientUserGroup = DataContext
  1107. .ThemeClientUserGroup
  1108. .FirstOrDefault(c => c.ExternalID.ToLower() == loweredThemeCode);
  1109. var exists = UserExistsInThemeClientUserGroup(userId, loweredThemeCode);
  1110. if (themeClientUserGroup != null && !exists)
  1111. {
  1112. var adminAccountUserName = ConfigurationHelper.AdminAccountName.ToLower();
  1113. var adminUser = DataContext
  1114. .Users.FirstOrDefault(c => c.LoweredUserName == adminAccountUserName);
  1115. var clientUserGroup = DataContext.ClientUserGroups.FirstOrDefault(c => c.ClientUserGroupID == themeClientUserGroup.ClientUserGroupID);
  1116. using (var transaction = DataContext.Database.BeginTransaction())
  1117. {
  1118. try
  1119. {
  1120. var createdOn = DateTime.Now;
  1121. var mapping =
  1122. new User2ClientUserGroup()
  1123. {
  1124. ClientUserGroupID = themeClientUserGroup.ClientUserGroupID,
  1125. CreatedOnDateTime = createdOn,
  1126. LastModifiedOnDateTime = createdOn,
  1127. UserID = userId,
  1128. UserID_CreatedBy = adminUser.UserId,
  1129. UserID_LastModifiedBy = adminUser.UserId
  1130. };
  1131. if (clientUserGroup != null)
  1132. {
  1133. clientUserGroup.User2ClientUserGroups.Add(mapping);
  1134. }
  1135. added = true;
  1136. DataContext.SaveChanges();
  1137. transaction.Commit();
  1138. }
  1139. catch (Exception)
  1140. {
  1141. added = false;
  1142. transaction.Rollback();
  1143. throw;
  1144. }
  1145. }
  1146. }
  1147. return added;
  1148. }
  1149. public bool InviteUserToGame(Guid userId, int gameId, string externalId)
  1150. {
  1151. var invited =
  1152. DataContext
  1153. .GameInvites
  1154. .Any(c => c.GameID == gameId && c.UserID == userId && !c.IsADeletedRow);
  1155. if (!invited)
  1156. {
  1157. var adminAccountUserName = ConfigurationHelper.AdminAccountName.ToLower();
  1158. var adminUser = DataContext
  1159. .Users.FirstOrDefault(c => c.LoweredUserName == adminAccountUserName);
  1160. var game = DataContext.Games.FirstOrDefault(c => c.GameID == gameId);
  1161. using (var transaction = DataContext.Database.BeginTransaction())
  1162. {
  1163. try
  1164. {
  1165. var createdOn = DateTime.Now;
  1166. var invite =
  1167. new GameInvite()
  1168. {
  1169. EmailContent = "Scorm - automatic invite",
  1170. EmailSubject = "Scorm - automatic invite",
  1171. ThemeClientUserGroupExternalID = externalId,
  1172. GameID = gameId,
  1173. InviteDate = createdOn,
  1174. CreatedOnDateTime = createdOn,
  1175. LastModifiedOnDateTime = createdOn,
  1176. LastReminderDate = createdOn,
  1177. UserID = userId,
  1178. UserID_CreatedBy = adminUser.UserId,
  1179. UserID_LastModifiedBy = adminUser.UserId
  1180. };
  1181. game.GameInvite.Add(invite);
  1182. DataContext.SaveChanges();
  1183. transaction.Commit();
  1184. invited = true;
  1185. }
  1186. catch (Exception)
  1187. {
  1188. invited = false;
  1189. transaction.Rollback();
  1190. throw;
  1191. }
  1192. }
  1193. }
  1194. return invited;
  1195. }
  1196. #region Private Methods
  1197. #region Game
  1198. public GameHeader.GameSettingsInfo GetGameSettings(DataModel.SqlRepository.Game game)
  1199. {
  1200. return new GameHeader.GameSettingsInfo()
  1201. {
  1202. AllUsersMustFinishThisGameBy = game.AllUsersMustFinishThisGameByThisDate,
  1203. CanSkipTutorial = game.CanSkipTutorial,
  1204. CompletionDate = game.GameCompletionDate,
  1205. DefaultGameTimeInSeconds = game.DefaultGameTimeInSeconds,
  1206. GameConfigCanBeModifiedAcrossInstances = game.GameConfigCanBeModifiedAcrossInstances,
  1207. GameNowLockedDown = game.GameNowLockedDown,
  1208. GameTemplateNameForDashboard = game.GameTemplateNameForDashboard,
  1209. GameThemeData = game.GameThemeData,
  1210. HasBeenDownloaded = game.HasBeenDownloaded,
  1211. IsOnline = game.IsOnlineGame,
  1212. IsTemplate = game.IsAGameTemplate,
  1213. IsTimed = game.IsTimedGame,
  1214. NumberOfTimesRun = game.NumberOfTimesRun,
  1215. StartDate = game.GameStartDate,
  1216. UseCardTime = game.UseCardTime
  1217. };
  1218. }
  1219. Game.AvatarTurnSettingsInfo GetAvatarSettings(DataModel.SqlRepository.Game game)
  1220. {
  1221. return new Game.AvatarTurnSettingsInfo()
  1222. {
  1223. UseActualAnsweringTimes = game.UseActualAvatarAnsweringTimes,
  1224. UseActualName = game.UseActualAvatarNames,
  1225. UseHistoricAnswers = game.UseHistoricAvatarAnswers
  1226. };
  1227. }
  1228. Game.PlayerTurnSettingsInfo GetPlayerTurnSettings(DataModel.SqlRepository.Game game)
  1229. {
  1230. return new Game.PlayerTurnSettingsInfo()
  1231. {
  1232. BySequenceNoElseRandom = game.PlayerTurn_ByPlayerSequenceNoElseRandom,
  1233. RandomNoRepeatingUntilAllHavePlayed = game.PlayerTurn_RandomNoRepeatingUntilAllHavePlayed
  1234. };
  1235. }
  1236. #endregion
  1237. #region Cards
  1238. IEnumerable<CardGroup> GetCardGroups(int gameId, int languageId)
  1239. {
  1240. var dbCardGroups = DataContext.GameCardGroupSequences.Where(g => g.GameID == gameId).ToList();
  1241. var currentGameTemplateId = dbCardGroups.FirstOrDefault().Game.GameID_Template;
  1242. var avatarPlayers = dbCardGroups.FirstOrDefault().Game.GamePlayers.Where(g=>g.IsAvatar);
  1243. List<int> randomAvatarGameIds = new List<int>();
  1244. foreach (var avatarPlayer in avatarPlayers)
  1245. {
  1246. var games = DataContext.GamePlayers
  1247. .Where(gp => gp.UserID == avatarPlayer.UserID &&
  1248. gp.Game.GameID_Template == currentGameTemplateId &&
  1249. gp.Game.Results.Count > 0 &&
  1250. gp.GameID != gameId && !gp.IsAvatar && gp.Game.GameCompletionDate != null)
  1251. .Select(gp => gp.Game.GameID).ToList();
  1252. if(games.Count <=0)
  1253. {
  1254. continue;
  1255. }
  1256. var random = new Random();
  1257. int index = random.Next(0, games.Count - 1);
  1258. var avatarGameId = games[index];
  1259. randomAvatarGameIds.Add(avatarGameId);
  1260. }
  1261. var cards = GetCards(gameId, languageId, randomAvatarGameIds).ToList();
  1262. var cardGroups =
  1263. (from g in dbCardGroups
  1264. where g.GameID == gameId
  1265. select new CardGroup()
  1266. {
  1267. Id = g.GameCardGroupSequenceID,
  1268. CardGroupSequenceNo = g.CardGroupSequenceNo,
  1269. Cards = cards
  1270. .Where(c => c.CardGroupSequenceId == g.GameCardGroupSequenceID).OrderBy(
  1271. c => c.CardSequenceNo).ToList(),
  1272. IsMandatoryGroup = g.IsAMandatoryCardGroup
  1273. }).OrderBy(c => c.CardGroupSequenceNo).ToList();
  1274. return cardGroups;
  1275. }
  1276. IQueryable<Domain.Model.CardReferenceMaterial> GetReferenceMaterial(int cardId)
  1277. {
  1278. return from r in DataContext.CardReferenceMaterials
  1279. where r.CardID == cardId
  1280. select new Domain.Model.CardReferenceMaterial
  1281. {
  1282. //Url = r.CardReferenceMaterialUrl
  1283. };
  1284. }
  1285. #endregion
  1286. #region Players
  1287. Player GetPlayer(Guid userId)
  1288. {
  1289. return DataContext.Users
  1290. .Where(u => u.UserId == userId)
  1291. .Select(p => new Player
  1292. {
  1293. AvatarData = p.PlayerAvatarData,
  1294. AvatarGender = p.PlayerAvatarGender,
  1295. AvatarName = p.PlayerAvatarName,
  1296. HasViewedGameTutorial = false,
  1297. Id = p.UserId,
  1298. IsSimulated = false,
  1299. RealName = p.UserFirstName + " " + p.UserLastName,
  1300. PlayerFirstName = p.UserFirstName,
  1301. PlayerLastName = p.UserLastName
  1302. }).FirstOrDefault();
  1303. }
  1304. IQueryable<Player> GetGamePlayers(int gameId)
  1305. {
  1306. return (from p in DataContext.GamePlayers
  1307. join u in DataContext.Users on p.UserID equals u.UserId
  1308. where p.GameID == gameId
  1309. select
  1310. new Player
  1311. {
  1312. Id = p.UserID,
  1313. AvatarName = u.PlayerAvatarName,
  1314. AvatarData = u.PlayerAvatarData,
  1315. AvatarGender = u.PlayerAvatarGender,
  1316. HasViewedGameTutorial = u.HasViewedGameTutorial,
  1317. IsSimulated = p.IsAvatar,
  1318. RealName = u.UserFirstName + " " + u.UserLastName,
  1319. PlayerFirstName = u.UserFirstName,
  1320. PlayerLastName = u.UserLastName
  1321. }).Distinct().OrderBy(p => p.IsSimulated);
  1322. }
  1323. List<GamePlayer> GetRandomAvatarsForOnlineGame(int templateGameId, Guid excludeUserId)
  1324. {
  1325. var results = new List<GamePlayer>();
  1326. var avatarPlayers = (from gp in DataContext.GamePlayers
  1327. join g in DataContext.Games on gp.GameID equals g.GameID
  1328. where g.GameID_Template == templateGameId && gp.UserID != excludeUserId && g.GameCompletionDate != null
  1329. select gp)
  1330. .Distinct()
  1331. .OrderBy(a => Guid.NewGuid()); //used to create some randomness in order
  1332. var count = avatarPlayers.Count();
  1333. if(count <= 0)
  1334. {
  1335. return results;
  1336. }
  1337. while (results.Count <= count && results.Count < 3)
  1338. {
  1339. var index = new Random().Next(count); //used to create even more randomness
  1340. var tempPlayer = avatarPlayers.Skip(index).First();
  1341. var newPlayer = new GamePlayer()
  1342. {
  1343. UserID = tempPlayer.UserID,
  1344. IsAvatar = true
  1345. };
  1346. if(results.Any(p=> p.UserID == newPlayer.UserID))
  1347. {
  1348. continue;
  1349. }
  1350. results.Add
  1351. (
  1352. new GamePlayer()
  1353. {
  1354. UserID = tempPlayer.UserID,
  1355. }
  1356. );
  1357. }
  1358. return results;
  1359. }
  1360. #endregion
  1361. #endregion
  1362. }
  1363. }