private User AdjustCurrency(UserDataViewModel user, Guid currencyID, [FromBody] AdjustCurrency currencyUpdate) { if (!ChannelSession.Settings.Currencies.ContainsKey(currencyID)) { throw new HttpResponseException(HttpStatusCode.NotFound); } if (currencyUpdate == null) { throw new HttpResponseException(HttpStatusCode.BadRequest); } UserCurrencyViewModel currency = ChannelSession.Settings.Currencies[currencyID]; if (currencyUpdate.Amount < 0) { int quantityToRemove = currencyUpdate.Amount * -1; if (!user.HasCurrencyAmount(currency, quantityToRemove)) { // If the request is to remove currency, but user doesn't have enough, fail throw new HttpResponseException(HttpStatusCode.Forbidden); } user.SubtractCurrencyAmount(currency, quantityToRemove); } else if (currencyUpdate.Amount > 0) { user.AddCurrencyAmount(currency, currencyUpdate.Amount); } return(UserFromUserDataViewModel(user)); }
private User AdjustCurrency(UserDataViewModel user, Guid currencyID, [FromBody] AdjustCurrency currencyUpdate) { if (!ChannelSession.Settings.Currencies.ContainsKey(currencyID)) { var resp = new HttpResponseMessage(HttpStatusCode.NotFound) { Content = new ObjectContent <Error>(new Error { Message = $"Unable to find currency: {currencyID.ToString()}." }, new JsonMediaTypeFormatter(), "application/json"), ReasonPhrase = "Currency ID not found" }; throw new HttpResponseException(resp); } if (currencyUpdate == null) { var resp = new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new ObjectContent <Error>(new Error { Message = "Unable to parse currency adjustment from POST body." }, new JsonMediaTypeFormatter(), "application/json"), ReasonPhrase = "Invalid POST Body" }; throw new HttpResponseException(resp); } UserCurrencyViewModel currency = ChannelSession.Settings.Currencies[currencyID]; if (currencyUpdate.Amount < 0) { int quantityToRemove = currencyUpdate.Amount * -1; if (!user.HasCurrencyAmount(currency, quantityToRemove)) { var resp = new HttpResponseMessage(HttpStatusCode.Forbidden) { Content = new ObjectContent <Error>(new Error { Message = "User does not have enough currency to remove" }, new JsonMediaTypeFormatter(), "application/json"), ReasonPhrase = "Not Enough Currency" }; throw new HttpResponseException(resp); } user.SubtractCurrencyAmount(currency, quantityToRemove); } else if (currencyUpdate.Amount > 0) { user.AddCurrencyAmount(currency, currencyUpdate.Amount); } return(UserFromUserDataViewModel(user)); }
public IEnumerable <User> BulkGive(Guid currencyID, [FromBody] IEnumerable <GiveUserCurrency> giveDatas) { if (!ChannelSession.Settings.Currencies.ContainsKey(currencyID)) { var resp = new HttpResponseMessage(HttpStatusCode.NotFound) { Content = new ObjectContent <Error>(new Error { Message = $"Unable to find currency: {currencyID.ToString()}." }, new JsonMediaTypeFormatter(), "application/json"), ReasonPhrase = "Currency ID not found" }; throw new HttpResponseException(resp); } if (giveDatas == null) { var resp = new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new ObjectContent <Error>(new Error { Message = $"Unable to parse array of give data from POST body." }, new JsonMediaTypeFormatter(), "application/json"), ReasonPhrase = "Invalid POST Body" }; throw new HttpResponseException(resp); } UserCurrencyViewModel currency = ChannelSession.Settings.Currencies[currencyID]; List <User> users = new List <User>(); foreach (var giveData in giveDatas) { UserDataViewModel user = null; if (uint.TryParse(giveData.UsernameOrID, out uint userID)) { user = ChannelSession.Settings.UserData[userID]; } if (user == null) { user = ChannelSession.Settings.UserData.Values.FirstOrDefault(u => u.UserName.Equals(giveData.UsernameOrID, StringComparison.InvariantCultureIgnoreCase)); } if (user != null && giveData.Amount > 0) { user.AddCurrencyAmount(currency, giveData.Amount); users.Add(UserController.UserFromUserDataViewModel(user)); } } return(users); }
public async Task RemoveDuplicateUsers() { if (ChannelSession.Connection != null) { var duplicateGroups = this.UserData.Values.GroupBy(u => u.UserName).Where(g => g.Count() > 1); foreach (var duplicateGroup in duplicateGroups) { UserModel onlineUser = null; if (!string.IsNullOrEmpty(duplicateGroup.Key)) { onlineUser = await ChannelSession.Connection.GetUser(duplicateGroup.Key); } if (onlineUser != null) { List <UserDataViewModel> dupeUsers = new List <UserDataViewModel>(duplicateGroup); if (dupeUsers.Count > 0) { UserDataViewModel solidUser = dupeUsers.FirstOrDefault(u => u.ID == onlineUser.id); if (solidUser != null) { dupeUsers.Remove(solidUser); foreach (UserDataViewModel dupeUser in dupeUsers) { solidUser.ViewingMinutes += dupeUser.ViewingMinutes; foreach (var kvp in dupeUser.CurrencyAmounts) { solidUser.AddCurrencyAmount(kvp.Key, kvp.Value.Amount); } } foreach (UserDataViewModel dupeUser in dupeUsers) { this.UserData.Remove(dupeUser.ID); } } } } else { foreach (var dupeUser in duplicateGroup) { this.UserData.Remove(dupeUser.ID); } } } } }
public IEnumerable <User> BulkGive(Guid currencyID, [FromBody] IEnumerable <GiveUserCurrency> giveDatas) { if (!ChannelSession.Settings.Currencies.ContainsKey(currencyID)) { throw new HttpResponseException(HttpStatusCode.NotFound); } if (giveDatas == null) { throw new HttpResponseException(HttpStatusCode.BadRequest); } UserCurrencyViewModel currency = ChannelSession.Settings.Currencies[currencyID]; List <User> users = new List <User>(); foreach (var giveData in giveDatas) { UserDataViewModel user = null; if (uint.TryParse(giveData.UsernameOrID, out uint userID)) { user = ChannelSession.Settings.UserData[userID]; } if (user == null) { user = ChannelSession.Settings.UserData.Values.FirstOrDefault(u => u.UserName.Equals(giveData.UsernameOrID, StringComparison.InvariantCultureIgnoreCase)); } if (user != null && giveData.Amount > 0) { user.AddCurrencyAmount(currency, giveData.Amount); users.Add(UserController.UserFromUserDataViewModel(user)); } } return(users); }