Пример #1
0
        private async Task ClientOnReady()
        {
            try
            {
                await using var dbContext = new MetalBotContext();
                // Uncomment with db changes
                // await dbContext.Database.EnsureDeletedAsync();
                await dbContext.Database.EnsureCreatedAsync();

                var firstSetup = !dbContext.DiscordGuilds.Any();
                await CreateOrUpdateGuilds(dbContext);

                await dbContext.SaveChangesAsync();

                if (firstSetup)
                {
                    foreach (var discordGuild in await dbContext.DiscordGuilds.AsAsyncEnumerable().ToListAsync())
                    {
                        var clientGuild = _client.Guilds.First(cg => (long)cg.Id == discordGuild.IdExternal);
                        await clientGuild.SystemChannel.SendMessageAsync(clientGuild.Owner.Mention + " please run !setup to set up the database");
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }

            // _tarkoofRole = _metalsDictatorship.Roles.First(c => c.Name.ToLower() == "tarkoof");
        }
Пример #2
0
        public async Task SetupGuild()
        {
            var messages = new List <IUserMessage>()
            {
                Context.Message
            };

            var adminChannel = await GetMentionedChannel("Admin", messages);

            if (adminChannel == null)
            {
                adminChannel = await HandleNoChannelExists("Admin", messages);

                if (adminChannel != null)
                {
                    var everyone = Context.Guild.EveryoneRole;
                    await adminChannel.AddPermissionOverwriteAsync(everyone, OverwritePermissions.DenyAll(adminChannel));
                }
            }

            var rolesChannel = await GetMentionedChannel("Roles", messages) ?? await HandleNoChannelExists("Roles", messages);

            var rulesChannel = await GetMentionedChannel("Rules", messages) ?? await HandleNoChannelExists("Rules", messages);

            try
            {
                await using var dbContext = new MetalBotContext();
                var discordGuild = await dbContext.DiscordGuilds.AsQueryable().FirstAsync();

                discordGuild.AdminChannel = adminChannel == null ? discordGuild.AdminChannel : new DiscordChannel(adminChannel);
                discordGuild.RolesChannel = rolesChannel == null ? discordGuild.RolesChannel : new DiscordChannel(rolesChannel);
                discordGuild.RulesChannel = rulesChannel == null ? discordGuild.RulesChannel : new DiscordChannel(rulesChannel);
                if (discordGuild.Owner == null || discordGuild.Owner.IdExternal != (long)Context.Guild.OwnerId)
                {
                    discordGuild.Owner = dbContext.DiscordUsers.First(du => du.IdExternal == (long)Context.Guild.OwnerId);
                }

                dbContext.DiscordGuilds.Update(discordGuild);
                await dbContext.SaveChangesAsync();
            }
            catch (Exception e)
            {
                await ReplyAsync($"Error setting up server");

                Console.WriteLine(e);
                _loggingService.Error($"Error setting up guild with Id: {Context.Guild.Id}");
                return;
            }
            finally
            {
                await((SocketTextChannel)Context.Channel).DeleteMessagesAsync(messages);
            }

            await ReplyAndDeleteAsync($"Server set up successfully");
        }
Пример #3
0
        private async Task <bool> IsRolesChannel(MetalBotContext metalBotContext)
        {
            var currentDbGuild = await metalBotContext.DiscordGuilds.FindAsync(Context.Guild.Id);

            if (currentDbGuild.RulesChannel == null)
            {
                return(false);
            }

            return(Context.Channel.Id == (ulong)currentDbGuild.RulesChannel.IdExternal);
        }
Пример #4
0
        // private async Task HandleCommandAsync(SocketMessage messageParam)
        // {
        //     // Don't process the command if it was a system message
        //     var message = messageParam as SocketUserMessage;
        //     if (message == null) return;
        //
        //     // Create a number to track where the prefix ends and the command begins
        //     int argPos = 0;
        //
        //     // Determine if the message is a command based on the prefix and make sure no bots trigger commands
        //     if (!(message.HasCharPrefix('!', ref argPos) ||
        //           message.HasMentionPrefix(_client.CurrentUser, ref argPos)) ||
        //         message.Author.IsBot)
        //         return;
        //
        //     // Create a WebSocket-based command context based on the message
        //     var context = new SocketCommandContext(_client, message);
        //
        //     // Execute the command with the command context we just
        //     // created, along with the service provider for precondition checks.
        //     await _commands.ExecuteAsync(
        //         context: context,
        //         argPos: argPos,
        //         services: null);
        // }

        private async Task CreateOrUpdateGuilds(MetalBotContext dbContext)
        {
            var socketGuilds = _client.Guilds.ToList();
            var dbGuilds     = await AsyncEnumerable.ToListAsync(dbContext.DiscordGuilds);

            for (var i = dbGuilds.Count - 1; i >= 0; i--)
            {
                var dbGuild     = dbGuilds[i];
                var socketGuild = socketGuilds.FirstOrDefault(dg => (long)dg.Id == dbGuild.IdExternal);

                if (socketGuild == null)
                {
                    dbContext.DiscordGuilds.Remove(dbGuild);
                }
                else
                {
                    await CreateOrUpdateGuildUsers(dbContext, socketGuild);
                    await CreateOrUpdateGuildChannels(dbContext, socketGuild);

                    var guildUsers = await dbContext.DiscordUsers.AsQueryable().Where(du => socketGuild.Users.Select(sgu => (long)sgu.Id).Contains(du.IdExternal)).ToListAsync();

                    var guildChannels = await dbContext.DiscordChannels.AsQueryable().Where(du => socketGuild.Channels.Select(sgc => (long)sgc.Id).Contains(du.IdExternal)).ToListAsync();

                    dbGuild.Name           = socketGuild.Name;
                    dbGuild.Description    = socketGuild.Description;
                    dbGuild.DefaultChannel = socketGuild.DefaultChannel == null ? null : guildChannels.First(dc => dc.IdExternal == (long)socketGuild.DefaultChannel.Id);
                    dbGuild.EmbedChannel   = socketGuild.EmbedChannel == null ? null : guildChannels.First(dc => dc.IdExternal == (long)socketGuild.EmbedChannel.Id);
                    dbGuild.SystemChannel  = socketGuild.SystemChannel == null ? null : guildChannels.First(dc => dc.IdExternal == (long)socketGuild.SystemChannel.Id);
                    if (socketGuild.OwnerId > 0)
                    {
                        dbGuild.Owner = dbContext.DiscordUsers.First(du => du.IdExternal == (long)socketGuild.OwnerId);
                    }

                    dbGuild.DiscordUsers = guildUsers;

                    dbContext.DiscordGuilds.Update(dbGuild);

                    socketGuilds.Remove(socketGuild);
                }
            }

            foreach (var socketGuild in socketGuilds)
            {
                await CreateOrUpdateGuildUsers(dbContext, socketGuild);
                await CreateOrUpdateGuildChannels(dbContext, socketGuild);

                var discordUsers = await dbContext.DiscordUsers.AsQueryable().Where(du => socketGuild.Users.Select(sgu => (long)sgu.Id).Contains(du.IdExternal)).ToListAsync();

                var discordChannels = await dbContext.DiscordChannels.AsQueryable().Where(du => socketGuild.Channels.Select(sgc => (long)sgc.Id).Contains(du.IdExternal)).ToListAsync();

                await dbContext.DiscordGuilds.AddAsync(new DiscordGuild(socketGuild, discordUsers, discordChannels));
            }
        }
Пример #5
0
        public static async Task <SocketTextChannel> GetRolesChannel(SocketGuild socketGuild)
        {
            var rolesChannel = _rolesChannel;

            if (rolesChannel == null)
            {
                await using var dbContext = new MetalBotContext();
                var dbGuild = dbContext.DiscordGuilds.First(dg => dg.IdExternal == (long)socketGuild.Id);
                if (dbGuild.RulesChannel != null)
                {
                    rolesChannel  = (SocketTextChannel)socketGuild.Channels.FirstOrDefault(sgc => (long)sgc.Id == dbGuild.RolesChannel.IdExternal);
                    _rolesChannel = rolesChannel;
                }
            }

            return(rolesChannel);
        }
Пример #6
0
        private async Task CreateOrUpdateGuildUsers(MetalBotContext dbContext, SocketGuild socketGuild)
        {
            var socketUsers = socketGuild.Users.ToList();
            var dbUsers     = await dbContext.DiscordUsers.AsQueryable()
                              .Where(du => socketUsers.Select(su => (long)su.Id).Contains(du.IdExternal)).ToListAsync();

            for (var i = dbUsers.Count - 1; i >= 0; i--)
            {
                var dbUser     = dbUsers[i];
                var socketUser = socketUsers.FirstOrDefault(dg => (long)dg.Id == dbUser.IdExternal);

                if (socketUser == null)
                {
                    // Remove link between user and guild
                    dbUser.RemoveGuild(socketGuild.Id);
                }
                else
                {
                    // dbUser.DiscordGuilds.Remove(dbUser.DiscordGuilds.FirstOrDefault(dg => dg.IdExternal == socketGuild.Id));
                    dbUser.Username  = socketUser.Username;
                    dbUser.Mention   = socketUser.Mention;
                    dbUser.IsBot     = socketUser.IsBot;
                    dbUser.IsWebhook = socketUser.IsWebhook;

                    dbContext.DiscordUsers.Update(dbUser);
                    socketUsers.Remove(socketUser);
                }
            }

            foreach (var socketUser in socketUsers)
            {
                await dbContext.DiscordUsers.AddAsync(new DiscordUser(socketUser));
            }

            await dbContext.SaveChangesAsync();
        }
Пример #7
0
        private async Task CreateOrUpdateGuildChannels(MetalBotContext dbContext, SocketGuild socketGuild)
        {
            var socketChannels = socketGuild.Channels.ToList();
            var dbChannels     = await dbContext.DiscordChannels.AsQueryable()
                                 .Where(dc => socketChannels.Select(sc => (long)sc.Id).Contains(dc.IdExternal)).ToListAsync();

            for (var i = dbChannels.Count - 1; i >= 0; i--)
            {
                var dbChannel     = dbChannels[i];
                var socketChannel = socketChannels.FirstOrDefault(dg => (long)dg.Id == dbChannel.IdExternal);

                if (socketChannel == null)
                {
                    dbContext.DiscordChannels.Remove(dbChannel);
                }
                else
                {
                    var dbUsers = await dbContext.DiscordUsers.AsQueryable().Where(du => socketChannel.Users.Select(scu => (long)scu.Id).Contains(du.IdExternal)).ToListAsync();

                    dbChannel.Name         = socketChannel.Name;
                    dbChannel.Position     = socketChannel.Position;
                    dbChannel.CreatedAt    = socketChannel.CreatedAt;
                    dbChannel.DiscordUsers = dbUsers;

                    dbContext.DiscordChannels.Update(dbChannel);
                    socketChannels.Remove(socketChannel);
                }
            }

            foreach (var socketChannel in socketChannels)
            {
                await dbContext.DiscordChannels.AddAsync(new DiscordChannel(socketChannel));
            }

            await dbContext.SaveChangesAsync();
        }