コード例 #1
0
        internal static async Task HandleEvent(SocketMessage message)
        {
            if (message.Channel is ITextChannel)
            {
                var matches = EmoteRegex.Matches(message.Content);

                if (matches.Count > 0)
                {
                    await using (var database = new BachuzContext())
                    {
                        foreach (Match match in matches)
                        {
                            var firstColonIndex  = match.Value.IndexOf(':');
                            var secondColonIndex = match.Value.IndexOf(':', firstColonIndex + 1);
                            var emoteId          = match.Value.Substring(secondColonIndex + 1);
                            emoteId = emoteId.Substring(0, emoteId.Length - 1);
                            var emote = await database.Emotes.FirstAsync(e => e.EmoteId == ulong.Parse(emoteId));

                            emote.Count += 1;
                            await database.SaveChangesAsync();
                        }
                    }
                }
            }
        }
コード例 #2
0
        internal static async Task HandleEvent(SocketUser user, SocketVoiceState before, SocketVoiceState after)
        {
            await using (var database = new BachuzContext())
            {
                var inUserTable = database.Users.AsQueryable().FirstOrDefault(item => item.UserId == user.Id);
                if (inUserTable == null)
                {
                    var dbUser = new Users
                    {
                        UserId        = user.Id,
                        Points        = 0,
                        LastUsedDaily = null
                    };
                    await database.Users.AddAsync(dbUser);

                    await database.SaveChangesAsync();
                }
            }

            if (before.VoiceChannel == null && after.VoiceChannel != null)
            {
                await HandleJoin(user, after);
            }
            else if (before.VoiceChannel != null && after.VoiceChannel == null)
            {
                await HandleLeave(user);
            }
            else if (before.VoiceChannel != null && (after.VoiceChannel != null && before.VoiceChannel.Id != after.VoiceChannel.Id))
            {
                await HandleLeave(user);
                await HandleJoin(user, after);
            }
        }
コード例 #3
0
        public async Task SetPrefix(string prefix)
        {
            if (prefix.Length > 6)
            {
                await ReplyAsync("Prefix cannot be longer than 6 characters.");

                return;
            }

            if (string.IsNullOrEmpty(prefix))
            {
                await ReplyAsync("Prefix cannot be empty");

                return;
            }

            Program.CustomPrefixes.AddOrUpdate(Context.Guild.Id, prefix, (key, oldValue) => prefix);
            await using (var database = new BachuzContext())
            {
                var guild = database.Guilds.AsQueryable().FirstOrDefault(item => item.GuildId == Context.Guild.Id);
                guild.CustomPrefix = prefix;
                await database.SaveChangesAsync();
            }

            await Context.Channel.SendMessageAsync($"Prefix has been set to: {prefix}").ConfigureAwait(false);
        }
コード例 #4
0
        internal static async Task HandleEvent(SocketGuild guild)
        {
            await using (var database = new BachuzContext())
            {
                Guilds newGuild = new Guilds
                {
                    GuildId = guild.Id
                };
                await database.Guilds.AddAsync(newGuild);

                var emotes = new List <Emotes>();

                foreach (var guildEmote in guild.Emotes)
                {
                    emotes.Add(new Emotes
                    {
                        EmoteId = guildEmote.Id,
                        Name    = guildEmote.Name,
                        Count   = 0,
                        GuildId = guild.Id,
                    });
                }

                await database.Emotes.AddRangeAsync(emotes);

                await database.SaveChangesAsync();
            }
        }
コード例 #5
0
 internal static async Task HandleEvent(SocketGuild guild)
 {
     await using (var database = new BachuzContext())
     {
         database.Remove(database.Guilds.Single(g => g.GuildId == guild.Id));
         await database.SaveChangesAsync();
     }
 }
コード例 #6
0
        internal static async Task HandleEvent(SocketGuild before, SocketGuild after)
        {
            if (before.Emotes.Count > after.Emotes.Count)
            {
                var removedEmote = before.Emotes.Except(after.Emotes).First();
                await using (var database = new BachuzContext())
                {
                    database.Remove(database.Emotes.Single(e => e.EmoteId == removedEmote.Id));
                    await database.SaveChangesAsync();
                }
            }
            else if (after.Emotes.Count > before.Emotes.Count)
            {
                var addedEmote = after.Emotes.Except(before.Emotes).First();

                await using (var database = new BachuzContext())
                {
                    Emotes newEmote = new Emotes
                    {
                        EmoteId = addedEmote.Id,
                        GuildId = after.Id,
                        Name    = addedEmote.Name,
                        Count   = 0
                    };

                    await database.Emotes.AddAsync(newEmote);

                    await database.SaveChangesAsync();
                }
            }
            else
            {
                // updates Emote name in database
                var updatedEmote =
                    (from emoteAfter in after.Emotes
                     let emoteBefore = before.Emotes
                                       .First(e => e.Id == emoteAfter.Id)
                                       where emoteAfter.Name != emoteBefore.Name
                                       select emoteAfter)
                    .FirstOrDefault();

                if (updatedEmote != null)
                {
                    await using (var database = new BachuzContext())
                    {
                        var emote = database.Emotes.First(e => e.EmoteId == updatedEmote.Id);
                        emote.Name = updatedEmote.Name;
                        await database.SaveChangesAsync();
                    }
                }
            }
        }
コード例 #7
0
        public async Task VoiceInfo(ResultType resultType = ResultType.General)
        {
            await using (var database = new BachuzContext())
            {
                if (resultType == ResultType.Detailed)
                {
                    var usersOnVoice = await database.UsersOnVoice.AsQueryable().Where(user => user.Guild.GuildId == Context.Guild.Id).OrderByDescending(user => user.Time).ToListAsync();

                    var sb = new StringBuilder();
                    sb.AppendLine("Time spend on voice channels in this server:");
                    foreach (var user in usersOnVoice)
                    {
                        sb.AppendLine($"<@{user.UserId}> <#{user.VoiceChannelId}> - {TimeSpan.FromSeconds(user.Time)}");
                    }

                    var chunks = Utilities.SplitMessage(sb.ToString());
                    foreach (var chunk in chunks)
                    {
                        await Context.Channel.SendMessageAsync(chunk,
                                                               allowedMentions : AllowedMentions.None)
                        .ConfigureAwait(false);
                    }
                }
                else if (resultType == ResultType.General)
                {
                    var usersOnVoice = await database.UsersOnVoice.AsQueryable()
                                       .Where(user => user.Guild.GuildId == Context.Guild.Id)
                                       .GroupBy(user => user.UserId)
                                       .Select(o => new { UserId = o.Key, Time = o.Sum(s => s.Time) })
                                       .OrderByDescending(user => user.Time)
                                       .ToListAsync();

                    var sb = new StringBuilder();
                    sb.AppendLine("Time spend on voice channels in this server:");
                    foreach (var user in usersOnVoice)
                    {
                        sb.AppendLine($"<@{user.UserId}> - {TimeSpan.FromSeconds(user.Time)}");
                    }
                    var chunks = Utilities.SplitMessage(sb.ToString());
                    foreach (var chunk in chunks)
                    {
                        await Context.Channel.SendMessageAsync(chunk,
                                                               allowedMentions : AllowedMentions.None)
                        .ConfigureAwait(false);
                    }
                }
            }
        }
コード例 #8
0
        public async Task VoiceInfo(SocketUser guildUser, ResultType resultType = ResultType.General)
        {
            await using (var database = new BachuzContext())
            {
                if (resultType == ResultType.General)
                {
                    var userData = database.UsersOnVoice.AsQueryable()
                                   .Where(user => user.Guild.GuildId == Context.Guild.Id && user.UserId == guildUser.Id)
                                   .GroupBy(user => user.UserId)
                                   .Select(o => new { UserId = o.Key, Time = o.Sum(s => s.Time) })
                                   .OrderByDescending(user => user.Time)
                                   .FirstOrDefault();


                    await Context.Channel.SendMessageAsync($"<@{userData.UserId}> total time on voice channels in this guild - {TimeSpan.FromSeconds(userData.Time)}",
                                                           allowedMentions : AllowedMentions.None)
                    .ConfigureAwait(false);
                }
                else
                {
                    var usersOnVoice = await database.UsersOnVoice.AsQueryable()
                                       .Where(user => user.Guild.GuildId == Context.Guild.Id && user.UserId == guildUser.Id)
                                       .OrderByDescending(user => user.Time)
                                       .ToListAsync();

                    var response = new StringBuilder();
                    foreach (var user in usersOnVoice)
                    {
                        response.AppendLine(
                            $"<@{user.UserId}> <#{user.VoiceChannelId}> - {TimeSpan.FromSeconds(user.Time)}");
                    }

                    var chunks = Utilities.SplitMessage(response.ToString());
                    foreach (var chunk in chunks)
                    {
                        await Context.Channel.SendMessageAsync(chunk,
                                                               allowedMentions : AllowedMentions.None)
                        .ConfigureAwait(false);
                    }
                }
            }
        }
コード例 #9
0
        public async Task MainAsync(string[] args)
        {
            _config = BuildConfig();

            await using (var database = new BachuzContext())
            {
                foreach (var guild in database.Guilds.AsQueryable().Select(item => item))
                {
                    if (!string.IsNullOrEmpty(guild.CustomPrefix))
                    {
                        CustomPrefixes.TryAdd(Convert.ToUInt64(guild.GuildId), guild.CustomPrefix);
                    }
                }
            }

            await using var services = ConfigureServices();
            var client = services.GetRequiredService <DiscordSocketClient>();

            client.Log += LogAsync;
            services.GetRequiredService <CommandService>().Log += LogAsync;
            await client.LoginAsync(TokenType.Bot, _config["token"]);

            await client.StartAsync();

            await services.GetRequiredService <CommandHandlingService>().InstallCommandsAsync();

            client.JoinedGuild           += JoinedGuild.HandleEvent;
            client.LeftGuild             += LeftGuild.HandleEvent;
            client.GuildUpdated          += GuildUpdated.HandleEvent;
            client.MessageReceived       += MessageReceived.HandleEvent;
            client.UserVoiceStateUpdated += UserVoiceStateUpdated.HandleEvent;
            client.Ready += () =>
            {
                client.SetActivityAsync(new Game($"Default prefix: {_config["prefix"]}"));
                return(Task.CompletedTask);
            };

            await CreateHostBuilder(args).Build().RunAsync();

            await Task.Delay(-1);
        }
コード例 #10
0
        public async Task EmotesInfo()
        {
            await using (var database = new BachuzContext())
            {
                var emotes = await database.Emotes.AsQueryable().Where(emote => emote.Guild.GuildId == Context.Guild.Id).OrderByDescending(emote => emote.Count).ToListAsync();

                var sb = new StringBuilder();
                sb.AppendLine("Emotes usage in this server:");
                foreach (var emote in emotes)
                {
                    sb.AppendLine($"<:{emote.Name}:{emote.EmoteId}> - {emote.Count}");
                }
                var chunks = Utilities.SplitMessage(sb.ToString());
                foreach (var chunk in chunks)
                {
                    await Context.Channel.SendMessageAsync(chunk,
                                                           allowedMentions : AllowedMentions.None)
                    .ConfigureAwait(false);
                }
            }
        }
コード例 #11
0
        private static async Task HandleLeave(SocketUser user)
        {
            VoicechatMonitoringService.UsersOnVoiceChannels.TryRemove(user.Id, out var leavingUser);
            if (leavingUser != null)
            {
                var timeOnVoice = Convert.ToInt32((DateTime.Now - leavingUser.JoinTime).TotalSeconds);
                await using (var database = new BachuzContext())
                {
                    var voiceUser = database.UsersOnVoice
                                    .AsQueryable()
                                    .Select(item => item)
                                    .FirstOrDefault(item =>
                                                    item.GuildId == leavingUser.GuildId &&
                                                    item.UserId == leavingUser.UserId &&
                                                    item.VoiceChannelId == leavingUser.VoiceChannelId
                                                    );

                    if (voiceUser == null)
                    {
                        var userOnVoice = new UsersOnVoice
                        {
                            UserId         = leavingUser.UserId,
                            VoiceChannelId = leavingUser.VoiceChannelId,
                            GuildId        = leavingUser.GuildId,
                            Time           = timeOnVoice
                        };
                        await database.UsersOnVoice.AddAsync(userOnVoice);

                        await database.SaveChangesAsync();
                    }
                    else
                    {
                        voiceUser.Time += timeOnVoice;
                        await database.SaveChangesAsync();
                    }
                }
            }
        }