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));
        }
예제 #2
0
        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));
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
                        }
                    }
                }
            }
        }
예제 #5
0
        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);
        }