Esempio n. 1
0
        public static int ServerExp(this User user, Server server)
        {
            if (server.ServerExp?.Count() != null || server.ServerExp?.Count() != 0)
            {
                try
                {
                    return(server.ServerExp?.First(x => x?.UserId == user.UserId)?.Exp ?? 0);
                }
                catch (InvalidOperationException)
                {
                    var exp = new ServerExp
                    {
                        ServerId  = server.ServerId,
                        UserId    = user.UserId,
                        Exp       = 0,
                        LatestExp = 0,
                        User      = user
                    };

                    if (server.ServerExp != null && server.ServerExp.Any(x => x.UserId == exp.UserId))
                    {
                        DatabaseQueries.InsertOrReplaceAsync(exp);
                    }

                    ConsoleLogger.LogAsync($"User {user.UserId} in {server.ServerId} was not present " +
                                           $"in the guild's ServerExp list when attempting to load this value. " +
                                           $"They have now been added into the database under the ServerExp table.", LogLvl.DEBUG);

                    return(0);
                }
            }

            return(0);
        }
Esempio n. 2
0
        /// <summary>
        /// Returns a <see cref="Tuple"/> containing two integers. The first is the user's Xp Rank in the <see cref="Server"/>
        /// passed to this method. The second is how many users have Xp in the <see cref="Server"/>.
        /// </summary>
        /// <param name="user"></param>
        /// <param name="server"></param>
        /// <returns></returns>
        public static (int, int) GetServerXpRank(this User user, Server server)
        {
            ServerExp exp  = server.ServerExp.FirstOrDefault(x => x.UserId == user.UserId);
            int       rank = server.ServerExp.OrderByDescending(x => x.Exp).ToList().IndexOf(exp);

            return(rank + 1, server.ServerExp.Count());
        }
        private static async Task <bool> CanGetExperience(IReadOnlyCollection <ServerExp> serverExp, Server server, User user)
        {
            ServerExp match = serverExp?.FirstOrDefault(x => x?.UserId == user?.UserId);

            if (match != null)
            {
                double twoMinutesAgo = DateTime.Now.AddSeconds(-120).ToOADate();

                // ReSharper disable PossibleNullReferenceException
                return(twoMinutesAgo >= serverExp.FirstOrDefault(x => x.UserId == user.UserId).LatestExp);
                // ReSharper restore PossibleNullReferenceException
            }

            await DatabaseQueries.InsertAsync(new ServerExp
            {
                Exp       = 0,
                LatestExp = 0,
                ServerId  = server.ServerId,
                UserId    = user.UserId
            });

            return(true);
        }
Esempio n. 4
0
        public async Task Command()
        {
            User user = await DatabaseQueries.GetOrCreateUserAsync(Context.User.Id);

            Server server = await DatabaseQueries.GetOrCreateServerAsync(Context.Guild.Id);

            int       userExp       = user.Experience;
            ServerExp userServerExp = await user.GetServerExp(Context.Guild.Id);

            int globalRank = (await user.GetGlobalXpRankAsync()).Item1;
            int serverRank = user.GetServerXpRank(server).Item1;

            var dSb = new StringBuilder();

            dSb.AppendLine(Context.User.Mention);
            dSb.AppendLine($"Global Exp: `{userExp:N0}` | Rank: `{globalRank:N0}`");
            dSb.AppendLine($"{Context.Guild.Name} Exp: `{userServerExp.Exp:N0}` | Rank: `{serverRank:N0}`");
            var embed = new KaguyaEmbedBuilder
            {
                Description = dSb.ToString()
            };

            await SendEmbedAsync(embed);
        }
        public static async Task TryAddExp(User user, Server server, ICommandContext context)
        {
            List <ServerExp> specificExps = await DatabaseQueries.GetAllForServerAsync <ServerExp>(server.ServerId);

            var userExpObj = new ServerExp();

            // If the user can receive exp, give them between 5 and 8.
            if (!await CanGetExperience(specificExps, server, user))
            {
                return;
            }

            if (user.IsBlacklisted || server.IsBlacklisted)
            {
                return;
            }

            SocketTextChannel levelAnnouncementChannel;

            if (server.LogLevelAnnouncements != 0)
            {
                levelAnnouncementChannel = await context.Guild.GetTextChannelAsync(server.LogLevelAnnouncements) as SocketTextChannel;
            }
            else
            {
                levelAnnouncementChannel = context.Channel as SocketTextChannel;
            }

            var r   = new Random();
            int exp = r.Next(5, 8);

            if (server.ServerExp != null)
            {
                userExpObj = server.ServerExp.FirstOrDefault(x => x.UserId == user.UserId);
            }
            else
            {
                userExpObj = new ServerExp
                {
                    ServerId  = server.ServerId,
                    UserId    = user.UserId,
                    Exp       = 0,
                    LatestExp = 0
                };
            }

            var expObject = new ServerExp
            {
                ServerId  = server.ServerId,
                UserId    = user.UserId,
                Exp       = userExpObj?.Exp ?? 0,
                LatestExp = 0
            };

            double oldLevel = ReturnLevel(server, user);

            expObject.Exp      += exp;
            expObject.LatestExp = DateTime.Now.ToOADate();
            await DatabaseQueries.InsertOrReplaceAsync(expObject);

            // We update server again below because we have to refresh the serverExp list.

            server = await DatabaseQueries.GetOrCreateServerAsync(server.ServerId);

            double newLevel = ReturnLevel(server, user);
            await ConsoleLogger.LogAsync(
                $"[Server Exp]: User {user.UserId}] has received {exp} exp. [Guild: {server.ServerId}] " +
                $"Total Exp: {expObject.Exp:N0}]", LogLvl.TRACE);

            if (HasLeveledUp((int)oldLevel, (int)newLevel))
            {
                await ConsoleLogger.LogAsync(
                    $"[Server Exp]: [Server {server.ServerId} | User {user.UserId}] has leveled up! [Level: {(int) newLevel} | Experience: {GetExpForUser(server, user)}]",
                    LogLvl.INFO);

                // Don't send announcement if the channel is blacklisted.
                if (server.BlackListedChannels.Any(x => x.ChannelId == context.Channel.Id))
                {
                    return;
                }

                if (!server.LevelAnnouncementsEnabled)
                {
                    return;
                }

                var    xp       = new XpImage();
                Stream xpStream = await xp.GenerateXpImageStream(user, (SocketGuildUser)context.User, server);

                if (xpStream != null)
                {
                    if (user.ExpChatNotificationType == ExpType.SERVER || user.ExpChatNotificationType == ExpType.BOTH)
                    {
                        if (levelAnnouncementChannel != null)
                        {
                            await levelAnnouncementChannel.SendFileAsync(xpStream, $"Kaguya_Xp_LevelUp.png", "");
                        }
                        else
                        {
                            await context.Channel.SendFileAsync(xpStream, $"Kaguya_Xp_LevelUp.png", "");
                        }
                    }

                    if (user.ExpDmNotificationType == ExpType.SERVER || user.ExpDmNotificationType == ExpType.BOTH)
                    {
                        await context.User.SendFileAsync(xpStream, $"Kaguya_Xp_LevelUp.png", "");
                    }
                }

                // Server level-up reward stuffs.

                List <ServerRoleReward> serverRoleRewards = server.RoleRewards.ToList();
                if (serverRoleRewards.Count > 0)
                {
                    foreach (ServerRoleReward item in serverRoleRewards)
                    {
                        if (user.ServerLevel(server).Rounded(RoundDirection.DOWN) == item.Level)
                        {
                            IRole targetRole = context.Guild.Roles.First(x => x.Id == item.RoleId);
                            // ReSharper disable PossibleNullReferenceException
                            await(context.User as SocketGuildUser).AddRoleAsync(targetRole);
                            await ConsoleLogger.LogAsync($"User {user.UserId} received level-up role reward in guild " +
                                                         $"{server.ServerId}. Role Name: {targetRole.Name}", LogLvl.DEBUG);

                            // ReSharper restore PossibleNullReferenceException
                        }
                    }
                }
            }
        }