/// <summary> /// Populates an quest view model with information about a single quest /// </summary> /// <param name="id">The id of the quest</param> /// <param name="work">The Unit of Work for DB access. If null, one will be created</param> /// <returns>Info about a single quest</returns> public static QuestViewModel Populate(int id, UnitOfWork work = null) { if (work == null) { work = new UnitOfWork(); } bool currentUserEarned = false; DateTime?currentUserEarnedDate = null; if (WebSecurity.IsAuthenticated) { quest_instance instance = (from qi in work.EntityContext.quest_instance where qi.quest_id == id && qi.user_id == WebSecurity.CurrentUserId select qi).FirstOrDefault(); if (instance != null) { currentUserEarnedDate = instance.completed_date; currentUserEarned = true; } } // Base query bool isAuthenticated = WebSecurity.IsAuthenticated; int currentUserID = WebSecurity.CurrentUserId; bool tracking = isAuthenticated ? (from t in work.EntityContext.quest_tracking where t.user_id == currentUserID && t.quest_id == id select t).Any() : false; return((from qt in work.EntityContext.quest_template where qt.id == id select new QuestViewModel() { ID = qt.id, Title = qt.title, Image = qt.icon, Description = qt.description, Threshold = qt.threshold == null ? 0 : qt.threshold.Value, CreationDate = qt.created_date, UserCreated = qt.user_generated, Tracking = tracking, Author = new QuestAuthor() { ID = qt.creator.id, DisplayName = qt.creator.display_name, Image = qt.creator.image, IsPlayer = qt.creator.is_player }, State = qt.state, Achievements = from step in qt.quest_achievement_step select new AssociatedAchievement() { ID = step.achievement_id, Image = step.achievement_template.icon, Title = step.achievement_template.title }, CurrentUserEarnedDate = currentUserEarnedDate, CurrentUserHasEarned = currentUserEarned }).FirstOrDefault()); }
private void CompleteQuest(int questID, user userToCheck, int?achievementID, bool autoSave) { if (userToCheck.status != (int)JPPConstants.UserStatus.Active || !userToCheck.is_player) { return; } //Check if the quest exists and is active, and if an instance already exists quest_template questTemplate = _dbContext.quest_template.Find(questID); if (questTemplate.state == (int)JPPConstants.AchievementQuestStates.Retired || _dbContext.quest_instance.Any(qi => qi.quest_id == questTemplate.id && qi.user_id == userToCheck.id)) { return; } quest_instance newInstance = new quest_instance() { quest_id = questID, user_id = userToCheck.id, completed_date = DateTime.Now, comments_disabled = true }; _dbContext.quest_instance.Add(newInstance); _unitOfWork.SystemRepository.AddNotification( userToCheck.id, userToCheck.id, "You completed the quest [" + questTemplate.title + "]", questTemplate.icon, new UrlHelper(HttpContext.Current.Request.RequestContext).Action( "IndividualQuest", "Quests", new { id = questTemplate.id } ) + "#" + newInstance.id + "-1", false); LoggerModel logQuestUnlock = new LoggerModel() { Action = Logger.QuestInstanceLogType.QuestUnlocked.ToString(), UserID = userToCheck.id, IPAddress = HttpContext.Current.Request.UserHostAddress, TimeStamp = DateTime.Now, ID1 = questID, IDType1 = Logger.LogIDType.QuestTemplate.ToString(), ID2 = achievementID, IDType2 = Logger.LogIDType.AchievementTemplate.ToString(), Value1 = "ID2 represents the ID of the achievement that triggered the quest unlock" }; Logger.LogSingleEntry(logQuestUnlock, _dbContext); if (autoSave) { Save(); } }
/// <summary> /// Checks for completion of quests that have the specified achievement as a quest step /// </summary> /// <param name="achievementID">ID of the achievement</param> /// <param name="userID"></param> /// <param name="autoSave"></param> public void CheckAssociatedQuestCompletion(int achievementID, user userToCheck, List <achievement_instance> userAchievements, bool autoSave, bool achievementRevoked = false) { //Get a list of all the quests that have the passed in achievement as one of its steps List <quest_template> questTemplateList = (from t in _dbContext.quest_template join qs in _dbContext.quest_achievement_step on t.id equals qs.quest_id where qs.achievement_id == achievementID select t).ToList(); if (userAchievements == null) { userAchievements = _dbContext.achievement_instance.Where(ai => ai.user_id == userToCheck.id).ToList(); } foreach (quest_template questTemplate in questTemplateList) { var steps = (from a in _dbContext.quest_achievement_step where a.quest_id == questTemplate.id select a); // Get a count of achievement instances int instanceCount = (from a in userAchievements from s in steps where a.achievement_id == s.achievement_id select a).Count(); int threshold = questTemplate.threshold != null ? (int)questTemplate.threshold : steps.Count(); // Check the current instance count against the threshold if (instanceCount >= threshold) { CompleteQuest(questTemplate.id, userToCheck, achievementID, autoSave); } else { //Only try and revoke if an achievement was revoked from the player. If the quest was updated by and admin //and the player no longer meets the requirements, they still keep the quest. if (achievementRevoked) { quest_instance questInstance = _dbContext.quest_instance.SingleOrDefault(qi => qi.quest_id == questTemplate.id && qi.user_id == userToCheck.id); if (questInstance != null) { RevokeQuest(questInstance, achievementID, false); } } } } }
/// <summary> /// Helper for enabling or disabling comments on earnings /// </summary> /// <param name="earningID">The id of the earning</param> /// <param name="earningIsAchievement">Is this earning an achievement? If not, assume quest.</param> /// <param name="newState">The new state (true = DISABLED, false = ENABLED)</param> /// <returns>True if successful, false otherwise</returns> private Boolean EnableDisable(int earningID, bool earningIsAchievement, bool newState) { UnitOfWork work = new UnitOfWork(); // Get the instance, check the user and alter if (earningIsAchievement) { // Only instance owners or admins achievement_instance instance = work.EntityContext.achievement_instance.Find(earningID); if (instance.user_id != WebSecurity.CurrentUserId && !Roles.IsUserInRole(JPPConstants.Roles.FullAdmin)) { return(false); } // Already enabled? if (instance.comments_disabled == newState) { return(false); } instance.comments_disabled = newState; } else { // Only instance owners or admins quest_instance instance = work.EntityContext.quest_instance.Find(earningID); if (instance.user_id != WebSecurity.CurrentUserId && !Roles.IsUserInRole(JPPConstants.Roles.FullAdmin)) { return(false); } // Already enabled? if (instance.comments_disabled == newState) { return(false); } instance.comments_disabled = newState; } work.SaveChanges(); return(true); }
private void RevokeQuest(quest_instance questInstance, int achievementID, bool autoSave) { #region Log Quest Revoke LoggerModel logQuestRevoke = new LoggerModel() { Action = Logger.QuestInstanceLogType.QuestRevoked.ToString(), UserID = questInstance.user_id, IPAddress = HttpContext.Current.Request.UserHostAddress, TimeStamp = DateTime.Now, ID1 = questInstance.quest_id, IDType1 = Logger.LogIDType.QuestTemplate.ToString(), Value1 = "Achievement:" + achievementID + " was revoked.", }; Logger.LogSingleEntry(logQuestRevoke, _dbContext, false); #endregion _dbContext.quest_instance.Remove(questInstance); if (autoSave) { Save(); } }
/// <summary> /// Determines if the logged in user has access to the earning /// </summary> /// <param name="earningID">The ID of the earning</param> /// <param name="earningIsAchievement">Is the earning an achievement? If not, it's a quest</param> /// <param name="work">The DB access</param> /// <returns>True if the user can access, false otherwise</returns> private bool UserCanAccessEarning(int earningID, bool earningIsAchievement, UnitOfWork work, out user earningUser, out object earningTemplate) { // Set up out param earningUser = null; earningTemplate = null; // Assume invalid, then check bool valid = false; if (earningIsAchievement) { // Base query for achievements var q = from e in work.EntityContext.achievement_instance where e.id == earningID select e; // Can the user "see" this earning? var mine = from e in q where e.user_id == WebSecurity.CurrentUserId select e; var publicUsers = from e in q where e.user.privacy_settings != (int)JPPConstants.PrivacySettings.FriendsOnly select e; var friendOnlyFriends = from e in q join f in work.EntityContext.friend on e.user_id equals f.source_id where e.user.privacy_settings == (int)JPPConstants.PrivacySettings.FriendsOnly && f.destination_id == WebSecurity.CurrentUserId select e; // Concat the queries and see if we have anything achievement_instance instance = mine.Concat(publicUsers).Concat(friendOnlyFriends).FirstOrDefault(); if (instance != null) { valid = true; earningUser = instance.user; earningTemplate = instance.achievement_template; } } else { // Base query for quests var q = from e in work.EntityContext.quest_instance where e.id == earningID select e; // Check different scenarios var mine = from e in q where e.user_id == WebSecurity.CurrentUserId select e; var publicUsers = from e in q where e.user.privacy_settings != (int)JPPConstants.PrivacySettings.FriendsOnly select e; var friendOnlyFriends = from e in q join f in work.EntityContext.friend on e.user_id equals f.source_id where e.user.privacy_settings == (int)JPPConstants.PrivacySettings.FriendsOnly && f.destination_id == WebSecurity.CurrentUserId select e; // Concat the queries and see if we have anything quest_instance instance = mine.Concat(publicUsers).Concat(friendOnlyFriends).FirstOrDefault(); if (instance != null) { valid = true; earningUser = instance.user; earningTemplate = instance.quest_template; } } return(valid); }
private void RevokeQuest(quest_instance questInstance, int achievementID, bool autoSave) { #region Log Quest Revoke LoggerModel logQuestRevoke = new LoggerModel() { Action = Logger.QuestInstanceLogType.QuestRevoked.ToString(), UserID = questInstance.user_id, IPAddress = HttpContext.Current.Request.UserHostAddress, TimeStamp = DateTime.Now, ID1 = questInstance.quest_id, IDType1 = Logger.LogIDType.QuestTemplate.ToString(), Value1 = "Achievement:" + achievementID + " was revoked.", }; Logger.LogSingleEntry(logQuestRevoke, _dbContext, false); #endregion _dbContext.quest_instance.Remove(questInstance); if(autoSave) Save(); }
private void CompleteQuest(int questID, user userToCheck, int? achievementID, bool autoSave) { if (userToCheck.status != (int)JPPConstants.UserStatus.Active || !userToCheck.is_player) return; //Check if the quest exists and is active, and if an instance already exists quest_template questTemplate = _dbContext.quest_template.Find(questID); if (questTemplate.state == (int)JPPConstants.AchievementQuestStates.Retired || _dbContext.quest_instance.Any(qi => qi.quest_id == questTemplate.id && qi.user_id == userToCheck.id)) return; quest_instance newInstance = new quest_instance() { quest_id = questID, user_id = userToCheck.id, completed_date = DateTime.Now, comments_disabled = true }; _dbContext.quest_instance.Add(newInstance); _unitOfWork.SystemRepository.AddNotification( userToCheck.id, userToCheck.id, "You completed the quest [" + questTemplate.title + "]", questTemplate.icon, new UrlHelper(HttpContext.Current.Request.RequestContext).Action( "IndividualQuest", "Quests", new { id = questTemplate.id } ) + "#" + newInstance.id + "-1", false); LoggerModel logQuestUnlock = new LoggerModel() { Action = Logger.QuestInstanceLogType.QuestUnlocked.ToString(), UserID = userToCheck.id, IPAddress = HttpContext.Current.Request.UserHostAddress, TimeStamp = DateTime.Now, ID1 = questID, IDType1 = Logger.LogIDType.QuestTemplate.ToString(), ID2 = achievementID, IDType2 = Logger.LogIDType.AchievementTemplate.ToString(), Value1 = "ID2 represents the ID of the achievement that triggered the quest unlock" }; Logger.LogSingleEntry(logQuestUnlock, _dbContext); if (autoSave) Save(); }