コード例 #1
0
 internal async Task HandleUserJoin(SocketGuildUser user)
 {
     using (var ctx = new DataContext())
     {
         var dbServer     = ctx.DiscordServers.SingleOrDefault(x => x.ServerId == (long)user.Guild.Id);
         var dbServerUser = dbServer.Users.FirstOrDefault(x => x.User.UserId == (long)user.Id);
         if (dbServerUser == null)
         {
             var dbUser = ctx.DiscordUsers.FirstOrDefault(x => x.UserId == (long)user.Id);
             if (dbUser == null)
             {
                 ctx.DiscordUsers.Add(dbUser = new DiscordUser {
                     UserId = (long)user.Id
                 });
             }
             dbServer.Users.Add(dbServerUser = new DiscordServerUser {
                 User = dbUser
             });
         }
         dbServerUser.Nickname           = user.Nickname;
         dbServerUser.Roles              = dbServer.Roles.Where(x => user.Roles.Any(r => (long)r.Id == x.RoleId)).ToList();
         dbServerUser.User.Username      = user.Username;
         dbServerUser.User.Discriminator = user.DiscriminatorValue;
         await ctx.SaveChangesAsync();
     }
 }
コード例 #2
0
ファイル: UserHandler.cs プロジェクト: Nensec/FRTools
        public static async Task SyncServer(SocketGuild guild, SocketCommandContext context = null)
        {
            Console.WriteLine($"Started sync for {guild.Name}");
            await guild.DownloadUsersAsync();

            using (var ctx = new DataContext())
            {
                var dbServer = ctx.DiscordServers.FirstOrDefault(x => x.ServerId == (long)guild.Id);
                if (dbServer == null)
                {
                    ctx.DiscordServers.Add(dbServer = new DiscordServer());
                    dbServer.ServerId = (long)guild.Id;
                }
                dbServer.Name = guild.Name;

                if (guild.IconUrl != null)
                {
                    using (var client = new WebClient())
                    {
                        var iconData = client.DownloadData(guild.IconUrl);
                        dbServer.IconBase64 = Convert.ToBase64String(iconData);
                    }
                }
                ctx.SaveChanges();
            }

            using (var ctx = new DataContext())
            {
                var dbServer = ctx.DiscordServers.Include(x => x.Roles).FirstOrDefault(x => x.ServerId == (long)guild.Id);

                foreach (var existingRole in dbServer.Roles.ToList())
                {
                    if (!guild.Roles.Any(x => (long)x.Id == existingRole.RoleId))
                    {
                        ctx.DiscordRoles.Remove(existingRole);
                    }
                }

                foreach (var role in guild.Roles)
                {
                    var dbRole = dbServer.Roles.FirstOrDefault(x => x.RoleId == (long)role.Id);
                    if (dbRole == null)
                    {
                        dbServer.Roles.Add(dbRole = new DiscordRole());
                        dbRole.RoleId             = (long)role.Id;
                    }
                    dbRole.Name  = role.Name;
                    dbRole.Color = role.Color.RawValue.ToString();
                    dbRole.DiscordPermissions = (long)role.Permissions.RawValue;
                }
                var msg = $"Saving roles.. {ctx.ChangeTracker.Entries().Where(x => x.State == EntityState.Added).Count()} new roles, {ctx.ChangeTracker.Entries().Where(x => x.State == EntityState.Deleted).Count()} deleted roles, {ctx.ChangeTracker.Entries().Where(x => x.State == EntityState.Modified).Count()} changed roles. Server has {dbServer.Roles.Count()} roles total.";
                if (context != null)
                {
                    await context.Channel.SendMessageAsync(msg);
                }
                Console.WriteLine(msg);
                ctx.SaveChanges();
            }

            using (var ctx = new DataContext())
            {
                var dbServer = ctx.DiscordServers.Include(x => x.Channels).FirstOrDefault(x => x.ServerId == (long)guild.Id);

                foreach (var existingChannel in dbServer.Channels.ToList())
                {
                    if (!guild.Channels.Any(x => (long)x.Id == existingChannel.ChannelId))
                    {
                        ctx.DiscordChannels.Remove(existingChannel);
                    }
                }

                foreach (var channel in guild.Channels)
                {
                    var dbChannel = dbServer.Channels.FirstOrDefault(x => x.ChannelId == (long)channel.Id);
                    if (dbChannel == null)
                    {
                        dbServer.Channels.Add(dbChannel = new DiscordChannel());
                        dbChannel.ChannelId             = (long)channel.Id;
                    }
                    dbChannel.ChannelType = channel is ITextChannel ? DiscordChannelType.Text : channel is IVoiceChannel ? DiscordChannelType.Voice : channel is ICategoryChannel ? DiscordChannelType.Category : DiscordChannelType.Other;
                    dbChannel.Name        = channel.Name;
                }
                var msg = $"Saving channels.. {ctx.ChangeTracker.Entries().Where(x => x.State == EntityState.Added).Count()} new channels, {ctx.ChangeTracker.Entries().Where(x => x.State == EntityState.Deleted).Count()} deleted channels, {ctx.ChangeTracker.Entries().Where(x => x.State == EntityState.Modified).Count()} changed channels. Server has {dbServer.Channels.Count()} channels total.";
                if (context != null)
                {
                    await context.Channel.SendMessageAsync(msg);
                }
                Console.WriteLine(msg);
                ctx.SaveChanges();
            }

            using (var ctx = new DataContext())
            {
                var dbServer = ctx.DiscordServers.Include(x => x.Users).FirstOrDefault(x => x.ServerId == (long)guild.Id);

                foreach (var user in guild.Users)
                {
                    var dbServerUser = dbServer.Users.FirstOrDefault(x => x.User.UserId == (long)user.Id);
                    if (dbServerUser == null)
                    {
                        var dbUser = ctx.DiscordUsers.FirstOrDefault(x => x.UserId == (long)user.Id);
                        if (dbUser == null)
                        {
                            ctx.DiscordUsers.Add(dbUser = new DiscordUser {
                                UserId = (long)user.Id
                            });
                        }
                        dbServer.Users.Add(dbServerUser = new DiscordServerUser {
                            User = dbUser
                        });
                    }
                    dbServerUser.Nickname = user.Nickname;
                    dbServerUser.Roles.Clear();
                    dbServerUser.Roles              = dbServer.Roles.Where(x => user.Roles.Any(r => (long)r.Id == x.RoleId)).ToList();
                    dbServerUser.User.Username      = user.Username;
                    dbServerUser.User.Discriminator = user.DiscriminatorValue;
                    dbServerUser.IsOwner            = guild.OwnerId == user.Id;
                }

                var msg = $"Saving users.. {ctx.ChangeTracker.Entries().Where(x => x.State == EntityState.Added).Count()} new users, {ctx.ChangeTracker.Entries().Where(x => x.State == EntityState.Deleted).Count()} deleted users, {ctx.ChangeTracker.Entries().Where(x => x.State == EntityState.Modified).Count()} changed users. Server has {dbServer.Users.Count()} users total.";
                if (context != null)
                {
                    await context.Channel.SendMessageAsync(msg);
                }
                Console.WriteLine(msg);
                ctx.SaveChanges();
            }
            Console.WriteLine($"Completed sync for {guild.Name}");
        }