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"); }
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"); }
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); }
// 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)); } }
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); }
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(); }
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(); }