Esempio n. 1
0
        private static async Task <TaskResult> DoTransaction(TransactionRequest request, VooperContext context)
        {
            if (!request.Force && request.Amount < 0)
            {
                return(new TaskResult(false, "Transaction must be positive."));
            }

            if (request.Amount == 0)
            {
                return(new TaskResult(false, "Transaction must have a value."));
            }

            if (request.FromAccount == request.ToAccount)
            {
                return(new TaskResult(false, $"An entity cannot send credits to itself."));
            }

            Entity fromUser = await Entity.FindAsync(request.FromAccount);

            Entity toUser = await Entity.FindAsync(request.ToAccount);

            if (fromUser == null)
            {
                return(new TaskResult(false, $"Failed to find sender {request.FromAccount}."));
            }
            if (toUser == null)
            {
                return(new TaskResult(false, $"Failed to find reciever {request.ToAccount}."));
            }

            if (!request.Force && fromUser.Credits < request.Amount)
            {
                return(new TaskResult(false, $"{fromUser.Name} cannot afford to send ¢{request.Amount}"));
            }

            GovControls govControls = await GovControls.GetCurrentAsync(context);

            Transaction trans = new Transaction()
            {
                ID       = Guid.NewGuid().ToString(),
                Credits  = request.Amount,
                FromUser = request.FromAccount,
                ToUser   = request.ToAccount,
                Details  = request.Detail,
                Time     = DateTime.Now
            };

            await context.Transactions.AddAsync(trans);

            fromUser.Credits -= request.Amount;
            toUser.Credits   += request.Amount;

            context.Update(fromUser);
            context.Update(toUser);

            await context.SaveChangesAsync();

            if (toUser.Id != VooperiaID)
            {
                if (request.Tax == ApplicableTax.None && toUser is Group && ((Group)toUser).Group_Category == Group.GroupTypes.Company)
                {
                    request.Tax = ApplicableTax.Corporate;
                }

                if (request.Tax == ApplicableTax.Payroll)
                {
                    decimal ntax = request.Amount * (govControls.PayrollTaxRate / 100.0m);

                    govControls.UBIAccount += ntax * (govControls.UBIBudgetPercent / 100.0m);

                    govControls.PayrollTaxRevenue += ntax;

                    RequestTransaction(new TransactionRequest(toUser.Id, VooperiaID, ntax, "Payroll Tax", ApplicableTax.None, true));
                }
                else if (request.Tax == ApplicableTax.Sales)
                {
                    decimal ntax = request.Amount * (govControls.SalesTaxRate / 100.0m);

                    govControls.UBIAccount += ntax * (govControls.UBIBudgetPercent / 100.0m);

                    govControls.SalesTaxRevenue += ntax;

                    RequestTransaction(new TransactionRequest(fromUser.Id, VooperiaID, ntax, "Sales Tax", ApplicableTax.None, true));
                }
                else if (request.Tax == ApplicableTax.Corporate)
                {
                    decimal ntax = request.Amount * (govControls.CorporateTaxRate / 100.0m);

                    govControls.UBIAccount += ntax * (govControls.UBIBudgetPercent / 100.0m);

                    govControls.CorporateTaxRevenue += ntax;

                    RequestTransaction(new TransactionRequest(toUser.Id, VooperiaID, ntax, "Corporate Tax", ApplicableTax.None, true));
                }
                else if (request.Tax == ApplicableTax.CapitalGains)
                {
                    decimal ntax = request.Amount * (govControls.CapitalGainsTaxRate / 100.0m);

                    govControls.UBIAccount += ntax * (govControls.UBIBudgetPercent / 100.0m);

                    govControls.CapitalGainsTaxRevenue += ntax;

                    RequestTransaction(new TransactionRequest(fromUser.Id, VooperiaID, ntax, "Capital Gains Tax", ApplicableTax.None, true));
                }
            }
            else
            {
                if (!request.Detail.Contains("Tax") && !request.Detail.Contains("Stock purchase"))
                {
                    govControls.SalesRevenue += request.Amount;
                    govControls.UBIAccount   += (request.Amount * (govControls.UBIBudgetPercent / 100.0m));
                }
            }

            context.GovControls.Update(govControls);
            await context.SaveChangesAsync();

            return(new TaskResult(true, $"Successfully sent ¢{request.Amount} to {toUser.Name}."));
        }
Esempio n. 2
0
        public async void UpdateRanks()
        {
            Console.WriteLine("Doing rank job");

            using (VooperContext context = new VooperContext(DBOptions))
            {
                Group government = context.Groups.AsQueryable().FirstOrDefault(x => x.Name == "Vooperia");

                if (government == null)
                {
                    Console.WriteLine("Holy f**k something is wrong.");
                }

                leaderboard = context.Users.AsEnumerable().Where(u => u.Email != u.UserName).OrderByDescending(u => u.GetTotalXP()).ToList();

                List <SocketGuildUser> userList = new List <SocketGuildUser>();

                // Add connected users
                foreach (User userData in leaderboard)
                {
                    SocketGuildUser user = null;

                    if (userData.discord_id != null)
                    {
                        //user = server.Users.FirstOrDefault(x => x.Id == (ulong)userData.discord_id);
                        user = server.GetUser((ulong)userData.discord_id);
                    }

                    if (user != null)
                    {
                        // Clear roles if muted
                        if (userData.GetDiscordRoles().Any(r => r.Name == "Muted"))
                        {
                            if (user.Roles.Contains(spleenRole))
                            {
                                await user.RemoveRoleAsync(spleenRole);
                            }
                            if (user.Roles.Contains(crabRole))
                            {
                                await user.RemoveRoleAsync(crabRole);
                            }
                            if (user.Roles.Contains(gatyRole))
                            {
                                await user.RemoveRoleAsync(gatyRole);
                            }
                            if (user.Roles.Contains(corgiRole))
                            {
                                await user.RemoveRoleAsync(corgiRole);
                            }
                            if (user.Roles.Contains(oofRole))
                            {
                                await user.RemoveRoleAsync(oofRole);
                            }
                        }
                        else
                        {
                            userList.Add(user);
                        }
                    }
                }

                int counter = 0;

                int totalUsers = userList.Count;


                GovControls govControls = await GovControls.GetCurrentAsync(context);

                decimal UBITotal = govControls.UBIAccount;
                govControls.UBIAccount = 0;

                context.GovControls.Update(govControls);
                await context.SaveChangesAsync();


                int spleenUserCount = totalUsers / 100;
                int crabUserCount   = (totalUsers / 20) - spleenUserCount;
                int gatyUserCount   = (totalUsers / 10) - spleenUserCount - crabUserCount;
                int corgiUserCount  = (totalUsers / 4) - spleenUserCount - crabUserCount - gatyUserCount;
                int oofUserCount    = (totalUsers / 2) - spleenUserCount - crabUserCount - gatyUserCount - corgiUserCount;

                int unrankedCount = totalUsers - spleenUserCount - crabUserCount - gatyUserCount - corgiUserCount - oofUserCount;

                decimal spleenPay   = 0.0m;
                decimal crabPay     = 0.0m;
                decimal gatyPay     = 0.0m;
                decimal corgiPay    = 0.0m;
                decimal oofPay      = 0.0m;
                decimal unrankedPay = 0.0m;

                if (spleenUserCount > 0)
                {
                    spleenPay = (UBITotal * (govControls.SpleenPayPercent / 100.0m)) / spleenUserCount;
                }
                if (crabUserCount > 0)
                {
                    crabPay = (UBITotal * (govControls.CrabPayPercent / 100.0m)) / crabUserCount;
                }
                if (gatyUserCount > 0)
                {
                    gatyPay = (UBITotal * (govControls.GatyPayPercent / 100.0m)) / gatyUserCount;
                }
                if (corgiUserCount > 0)
                {
                    corgiPay = (UBITotal * (govControls.CorgiPayPercent / 100.0m)) / corgiUserCount;
                }
                if (oofUserCount > 0)
                {
                    oofPay = (UBITotal * (govControls.OofPayPercent / 100.0m)) / oofUserCount;
                }
                if (unrankedCount > 0)
                {
                    unrankedPay = (UBITotal * (govControls.UnrankedPayPercent / 100.0m)) / unrankedCount;
                }

                foreach (SocketGuildUser discordUser in userList)
                {
                    User webUser = context.Users.FirstOrDefault(u => u.discord_id == discordUser.Id);

                    // Update pfp in storage
                    webUser.Image_Url = webUser.GetPfpUrl();
                    context.Update(webUser);
                    await context.SaveChangesAsync();

                    bool hasSpleen = discordUser.Roles.Contains(spleenRole);
                    bool hasCrab   = discordUser.Roles.Contains(crabRole);
                    bool hasGaty   = discordUser.Roles.Contains(gatyRole);
                    bool hasCorgi  = discordUser.Roles.Contains(corgiRole);
                    bool hasOof    = discordUser.Roles.Contains(oofRole);

                    bool hasCitizen  = discordUser.Roles.Contains(patreonCitizen) || discordUser.Roles.Contains(youtubeCitizen);
                    bool hasSoldier  = discordUser.Roles.Contains(patreonSoldier);
                    bool hasLoyalist = discordUser.Roles.Contains(patreonLoyalist);
                    bool hasHero     = discordUser.Roles.Contains(patreonHero);
                    bool hasMadlad   = discordUser.Roles.Contains(patreonMadlad);

                    bool patron = hasCitizen || hasSoldier || hasLoyalist || hasHero || hasMadlad;

                    // Inactivity tax
                    if (Math.Abs(webUser.Discord_Last_Message_Time.Subtract(DateTime.UtcNow).TotalDays) > 14 && !patron)
                    {
                        decimal tax = webUser.Credits * (govControls.InactivityTaxRate / 100.0M);

                        TransactionRequest req = new TransactionRequest(webUser.Id, EconomyManager.VooperiaID, tax, "Inactivity Tax", ApplicableTax.None, true);

                        TaskResult result = await req.Execute();

                        if (result.Succeeded)
                        {
                            govControls.InactivityTaxRevenue += tax;

                            // Add to UBI
                            govControls.UBIAccount += tax * (govControls.UBIBudgetPercent / 100.0M);

                            context.GovControls.Update(govControls);

                            await context.SaveChangesAsync();
                        }

                        // Remove last role
                        if (hasSpleen)
                        {
                            await discordUser.RemoveRoleAsync(spleenRole);
                        }
                        if (hasCrab)
                        {
                            await discordUser.RemoveRoleAsync(crabRole);
                        }
                        if (hasGaty)
                        {
                            await discordUser.RemoveRoleAsync(gatyRole);
                        }
                        if (hasCorgi)
                        {
                            await discordUser.RemoveRoleAsync(corgiRole);
                        }
                        if (hasOof)
                        {
                            await discordUser.RemoveRoleAsync(oofRole);
                        }

                        continue;
                    }

                    // Set district
                    if (!String.IsNullOrWhiteSpace(webUser.district))
                    {
                        var oldDistrictRoles = discordUser.Roles.Where(x => x.Name.Contains("District") && !x.Name.Contains(webUser.district));

                        if (oldDistrictRoles.Count() > 0)
                        {
                            await discordUser.RemoveRolesAsync(oldDistrictRoles);
                        }

                        if (!discordUser.Roles.Any(x => x.Name == webUser.district + " District"))
                        {
                            await discordUser.AddRoleAsync(districtRoles[webUser.district + " District"]);
                        }
                    }

                    // Spleen rank
                    if (counter <= spleenUserCount)
                    {
                        // Add new role
                        if (!hasSpleen)
                        {
                            await discordUser.AddRoleAsync(spleenRole);
                        }

                        // Remove last role
                        if (hasCrab)
                        {
                            await discordUser.RemoveRoleAsync(crabRole);
                        }
                        if (hasGaty)
                        {
                            await discordUser.RemoveRoleAsync(gatyRole);
                        }
                        if (hasCorgi)
                        {
                            await discordUser.RemoveRoleAsync(corgiRole);
                        }
                        if (hasOof)
                        {
                            await discordUser.RemoveRoleAsync(oofRole);
                        }

                        if (webUser != null)
                        {
                            //TransactionRequest transaction = new TransactionRequest(webUser.economy_id, government.economy_id, 238827, "UBI Mistake Fix", ApplicableTax.None, true);
                            TransactionRequest transaction = new TransactionRequest(government.Id, webUser.Id, spleenPay, "UBI Payment", ApplicableTax.None, true);
                            EconomyManager.RequestTransaction(transaction);
                        }
                    }
                    // Crab rank
                    else if (counter <= spleenUserCount + crabUserCount)
                    {
                        // Add new role
                        if (!hasCrab)
                        {
                            await discordUser.AddRoleAsync(crabRole);
                        }

                        // Remove last role
                        if (hasSpleen)
                        {
                            await discordUser.RemoveRoleAsync(spleenRole);
                        }
                        if (hasGaty)
                        {
                            await discordUser.RemoveRoleAsync(gatyRole);
                        }
                        if (hasCorgi)
                        {
                            await discordUser.RemoveRoleAsync(corgiRole);
                        }
                        if (hasOof)
                        {
                            await discordUser.RemoveRoleAsync(oofRole);
                        }

                        if (webUser != null)
                        {
                            //TransactionRequest transaction = new TransactionRequest(webUser.economy_id, government.economy_id, 146267, "UBI Mistake Fix", ApplicableTax.None, true);
                            TransactionRequest transaction = new TransactionRequest(government.Id, webUser.Id, crabPay, "UBI Payment", ApplicableTax.None, true);
                            EconomyManager.RequestTransaction(transaction);
                        }
                    }
                    // Gaty rank
                    else if (counter <= spleenUserCount + crabUserCount + gatyUserCount)
                    {
                        // Add new role
                        if (!hasGaty)
                        {
                            await discordUser.AddRoleAsync(gatyRole);
                        }

                        // Remove last role
                        if (hasSpleen)
                        {
                            await discordUser.RemoveRoleAsync(spleenRole);
                        }
                        if (hasCrab)
                        {
                            await discordUser.RemoveRoleAsync(crabRole);
                        }
                        if (hasCorgi)
                        {
                            await discordUser.RemoveRoleAsync(corgiRole);
                        }
                        if (hasOof)
                        {
                            await discordUser.RemoveRoleAsync(oofRole);
                        }

                        if (webUser != null)
                        {
                            //TransactionRequest transaction = new TransactionRequest(webUser.economy_id, government.economy_id, 125698, "UBI Mistake Fix", ApplicableTax.None, true);
                            TransactionRequest transaction = new TransactionRequest(government.Id, webUser.Id, gatyPay, "UBI Payment", ApplicableTax.None, true);
                            EconomyManager.RequestTransaction(transaction);
                        }
                    }
                    // Corgi rank
                    else if (counter <= spleenUserCount + crabUserCount + gatyUserCount + corgiUserCount)
                    {
                        // Add new role
                        if (!hasCorgi)
                        {
                            await discordUser.AddRoleAsync(corgiRole);
                        }

                        // Remove last role
                        if (hasSpleen)
                        {
                            await discordUser.RemoveRoleAsync(spleenRole);
                        }
                        if (hasCrab)
                        {
                            await discordUser.RemoveRoleAsync(crabRole);
                        }
                        if (hasGaty)
                        {
                            await discordUser.RemoveRoleAsync(gatyRole);
                        }
                        if (hasOof)
                        {
                            await discordUser.RemoveRoleAsync(oofRole);
                        }

                        if (webUser != null)
                        {
                            //TransactionRequest transaction = new TransactionRequest(webUser.economy_id, government.economy_id, 110369, "UBI Mistake Fix", ApplicableTax.None, true);
                            TransactionRequest transaction = new TransactionRequest(government.Id, webUser.Id, corgiPay, "UBI Payment", ApplicableTax.None, true);
                            EconomyManager.RequestTransaction(transaction);
                        }
                    }
                    // Oof rank
                    else if (counter <= spleenUserCount + crabUserCount + gatyUserCount + corgiUserCount + oofUserCount)
                    {
                        // Add new role
                        if (!hasOof)
                        {
                            await discordUser.AddRoleAsync(oofRole);
                        }

                        // Remove last role
                        if (hasSpleen)
                        {
                            await discordUser.RemoveRoleAsync(spleenRole);
                        }
                        if (hasCrab)
                        {
                            await discordUser.RemoveRoleAsync(crabRole);
                        }
                        if (hasGaty)
                        {
                            await discordUser.RemoveRoleAsync(gatyRole);
                        }
                        if (hasCorgi)
                        {
                            await discordUser.RemoveRoleAsync(corgiRole);
                        }

                        if (webUser != null)
                        {
                            //TransactionRequest transaction = new TransactionRequest(webUser.economy_id, government.economy_id, 91085, "UBI Mistake Fix", ApplicableTax.None, true);
                            TransactionRequest transaction = new TransactionRequest(government.Id, webUser.Id, oofPay, "UBI Payment", ApplicableTax.None, true);
                            EconomyManager.RequestTransaction(transaction);
                        }
                    }
                    // Unranked
                    else
                    {
                        // Remove last role
                        if (hasSpleen)
                        {
                            await discordUser.RemoveRoleAsync(spleenRole);
                        }
                        if (hasCrab)
                        {
                            await discordUser.RemoveRoleAsync(crabRole);
                        }
                        if (hasGaty)
                        {
                            await discordUser.RemoveRoleAsync(gatyRole);
                        }
                        if (hasCorgi)
                        {
                            await discordUser.RemoveRoleAsync(corgiRole);
                        }
                        if (hasOof)
                        {
                            await discordUser.RemoveRoleAsync(oofRole);
                        }

                        if (webUser != null)
                        {
                            //TransactionRequest transaction = new TransactionRequest(webUser.economy_id, government.economy_id, 125698, "UBI Mistake Fix", ApplicableTax.None, true);
                            TransactionRequest transaction = new TransactionRequest(government.Id, webUser.Id, unrankedPay, "UBI Payment", ApplicableTax.None, true);
                            EconomyManager.RequestTransaction(transaction);
                        }
                    }

                    if (patron)
                    {
                        webUser = await context.Users.FindAsync(webUser.Id);

                        if (hasMadlad)
                        {
                            webUser.Credits += 500;
                        }
                        else if (hasHero)
                        {
                            webUser.Credits += 350;
                        }
                        else if (hasLoyalist)
                        {
                            webUser.Credits += 175;
                        }
                        else if (hasSoldier)
                        {
                            webUser.Credits += 60;
                        }
                        else if (hasCitizen)
                        {
                            webUser.Credits += 20;
                        }

                        context.Update(webUser);
                        await context.SaveChangesAsync();
                    }

                    counter++;
                }
            }


            Console.WriteLine("Finished rank system");
        }
Esempio n. 3
0
        public async Task <IActionResult> Edit(Group model)
        {
            if (!ModelState.IsValid)
            {
                return(View(model));
            }

            // Get current user
            User user = await _userManager.GetUserAsync(User);

            // Ensure user is logged in
            if (user == null)
            {
                StatusMessage = $"Error: Please log in!";
                return(RedirectToAction("Index", controllerName: "Home"));
            }

            Group lastmodel = await _context.Groups.FindAsync(model.Id);

            if (lastmodel == null)
            {
                StatusMessage = $"Error: Group {model.Name} does not exist!";
                return(RedirectToAction("Index", controllerName: "Home"));
            }

            //if (lastmodel.Name != model.Name)
            //{
            //    StatusMessage = $"Error: Name cannot be changed!";
            //    return RedirectToAction("Index", controllerName: "Home");
            //}

            if (model.Name != lastmodel.Name)
            {
                if (_context.Groups.Any(x => x.Name.ToLower() == model.Name.ToLower()))
                {
                    StatusMessage = $"Error: Name {model.Name} is already taken!";
                    return(RedirectToAction("Index", controllerName: "Home"));
                }
            }

            if (!await lastmodel.HasPermissionAsync(user, "edit"))
            {
                StatusMessage = $"Error: You don't have permission to edit {lastmodel.Name}!";
                return(RedirectToAction("Index", controllerName: "Home"));
            }

            if (lastmodel.Group_Category != model.Group_Category)
            {
                StatusMessage = $"Error: Category cannot be changed!";
                return(RedirectToAction("Index", controllerName: "Home"));
            }

            if (await lastmodel.HasPermissionAsync(user, "description"))
            {
                lastmodel.Description = model.Description;
            }
            if (lastmodel.Owner_Id == user.Id)
            {
                lastmodel.Name        = model.Name;
                lastmodel.Image_Url   = model.Image_Url;
                lastmodel.Open        = model.Open;
                lastmodel.District_Id = model.District_Id;
            }

            _context.Update(lastmodel);

            await _context.SaveChangesAsync();

            StatusMessage = $"Successfully edited {model.Name}!";

            return(RedirectToAction(nameof(View), new { groupid = model.Id }));
        }
Esempio n. 4
0
        public static void Client_OnMessageReceived(object sender, OnMessageReceivedArgs e)
        {
            Console.WriteLine($"Caught Twitch message {e.ChatMessage.Message}");

            string[] args = e.ChatMessage.Message.ToLower().Split(' ');

            if (args[0] == "!golive" && e.ChatMessage.DisplayName == "SpikeViper")
            {
                VoopAI.twitchClient.SendMessage(e.ChatMessage.Channel, "Message tracking enabled!");
                streaming = true;
            }

            if (args[0] == "!stoplive" && e.ChatMessage.DisplayName == "SpikeViper")
            {
                VoopAI.twitchClient.SendMessage(e.ChatMessage.Channel, "Message tracking disabled!");
                streaming = false;
            }

            if (args[0] == "!connectsite")
            {
                Console.WriteLine($"Detected connect site command!");

                if (args.Length < 2)
                {
                    VoopAI.twitchClient.SendMessage(e.ChatMessage.Channel, "Please include your key!");
                    Console.WriteLine($"Key was not included!");
                    return;
                }

                int key = -1;

                bool success = int.TryParse(args[1], out key);

                if (success)
                {
                    Console.WriteLine($"Parsed key {key}");

                    using (VooperContext context = new VooperContext(VoopAI.DBOptions))
                    {
                        var webUser = context.Users.FirstOrDefault(u => u.Id == VoopAI.service._connectionHandler.GetUserFromKey(key));
                        Console.WriteLine($"Got user");

                        if (webUser != null)
                        {
                            Console.WriteLine($"Found webuser {webUser.UserName}");

                            webUser.twitch_id = e.ChatMessage.DisplayName;

                            context.Update(webUser);
                            Console.WriteLine($"Updating context");
                            try
                            {
                                context.SaveChanges();
                            }
                            catch (System.Exception ex)
                            {
                                Console.WriteLine(ex.StackTrace);
                            }
                            Console.WriteLine($"Saving changes");
                            VoopAI.service._connectionHandler.RemoveKey(key);
                            Console.WriteLine($"Removing key");

                            VoopAI.twitchClient.SendMessage(e.ChatMessage.Channel, $"Successfully linked {e.ChatMessage.DisplayName}!");
                            Console.WriteLine($"Successfully linked twitch {e.ChatMessage.DisplayName}!");
                        }
                        else
                        {
                            VoopAI.twitchClient.SendMessage(e.ChatMessage.Channel, "Unable to find user who generated this key.");
                            Console.WriteLine($"Unable to find web user trying to connect {e.ChatMessage.DisplayName}!");
                            return;
                        }
                    }
                }
                else
                {
                    VoopAI.twitchClient.SendMessage(e.ChatMessage.Channel, "Unable to read your key.");
                    Console.WriteLine("Failed to read key!");
                }
            }

            if (!streaming)
            {
                return;
            }

            using (VooperContext context = new VooperContext(VoopAI.DBOptions))
            {
                User user = context.Users.FirstOrDefault(u => u.twitch_id == e.ChatMessage.DisplayName);

                if (user != null)
                {
                    user.twitch_messages++;

                    if (user.twitch_last_message_minute != DateTime.Now.Minute)
                    {
                        user.twitch_message_xp++;
                        user.twitch_last_message_minute = DateTime.Now.Minute;
                    }

                    context.Update(user);
                    context.SaveChanges();
                }
            }
        }