Skip to content

Commit 1eb56dd

Browse files
committed
Add user data exporting
1 parent 6d41ae0 commit 1eb56dd

File tree

6 files changed

+150
-0
lines changed

6 files changed

+150
-0
lines changed

src/Dogey.Core/Data/Models/Guild.cs

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System.Collections.Generic;
2+
3+
namespace Dogey
4+
{
5+
public class Guild
6+
{
7+
public ulong Id { get; set; }
8+
public string StringPrefix { get; set; }
9+
public bool AllowMentionPrefix { get; set; } = true;
10+
11+
public List<GuildUser> Users { get; set; }
12+
}
13+
}
+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace Dogey
2+
{
3+
public class GuildUser
4+
{
5+
public ulong GuildId { get; set; }
6+
public ulong UserId { get; set; }
7+
public bool IsBlocked { get; set; }
8+
9+
public Guild Guild { get; set; }
10+
public User User { get; set; }
11+
}
12+
}

src/Dogey.Core/Data/Models/User.cs

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System.Collections.Generic;
2+
3+
namespace Dogey
4+
{
5+
public class User
6+
{
7+
public ulong Id { get; set; }
8+
public string Locale { get; set; }
9+
10+
public List<GuildUser> Guilds { get; set; }
11+
}
12+
}

src/Dogey.Core/Data/RootDatabase.cs

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using Microsoft.EntityFrameworkCore;
2+
using System;
3+
using System.IO;
4+
5+
namespace Dogey
6+
{
7+
public class RootDatabase : DbContext
8+
{
9+
public DbSet<User> Users { get; set; }
10+
public DbSet<GuildUser> GuildUsers { get; set; }
11+
public DbSet<Guild> Guilds { get; set; }
12+
13+
public RootDatabase()
14+
{
15+
Database.EnsureCreated();
16+
}
17+
18+
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
19+
{
20+
string baseDir = Path.Combine(AppContext.BaseDirectory, "common/data");
21+
if (!Directory.Exists(baseDir))
22+
Directory.CreateDirectory(baseDir);
23+
24+
string datadir = Path.Combine(baseDir, "root.sqlite.db");
25+
optionsBuilder.UseSqlite($"Filename={datadir}");
26+
}
27+
28+
protected override void OnModelCreating(ModelBuilder modelBuilder)
29+
{
30+
modelBuilder.Entity<User>()
31+
.HasKey(x => x.Id);
32+
modelBuilder.Entity<User>()
33+
.HasMany(x => x.Guilds)
34+
.WithOne(x => x.User);
35+
36+
modelBuilder.Entity<GuildUser>()
37+
.HasKey(x => new { x.GuildId, x.UserId });
38+
modelBuilder.Entity<GuildUser>()
39+
.HasOne(x => x.Guild)
40+
.WithMany(x => x.Users);
41+
42+
modelBuilder.Entity<Guild>()
43+
.HasKey(x => x.Id);
44+
modelBuilder.Entity<Guild>()
45+
.HasMany(x => x.Users)
46+
.WithOne(x => x.Guild);
47+
}
48+
}
49+
}

src/Dogey.Core/Dogey.Core.csproj

+5
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
<ItemGroup>
99
<PackageReference Include="Colorful.Console" Version="1.2.10" />
1010
<PackageReference Include="Discord.Net" Version="2.2.0-dev-20200331.2" />
11+
<PackageReference Include="FormatWith" Version="2.2.1" />
12+
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.3" />
1113
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="3.1.3" />
1214
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.1.3" />
1315
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.3" />
@@ -33,6 +35,9 @@
3335
<None Update="common\locale\zh-CN.yml">
3436
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
3537
</None>
38+
<None Update="common\permissions.yml">
39+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
40+
</None>
3641
</ItemGroup>
3742

3843
</Project>

src/Dogey/Commands/GDPRModule.cs

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using Discord;
2+
using Discord.Commands;
3+
using Dogey.Services;
4+
using Microsoft.EntityFrameworkCore;
5+
using Newtonsoft.Json;
6+
using System;
7+
using System.IO;
8+
using System.Linq;
9+
using System.Threading.Tasks;
10+
11+
namespace Dogey.Commands
12+
{
13+
public class GDPRModule : DogeyModuleBase
14+
{
15+
private readonly RootDatabase _db;
16+
private User _currentUser;
17+
18+
public GDPRModule(LocaleService locale, RootDatabase db) : base(locale)
19+
{
20+
_db = db;
21+
}
22+
23+
protected override void BeforeExecute(CommandInfo command)
24+
{
25+
_currentUser = _db.Users.SingleOrDefault(x => x.Id == Context.User.Id);
26+
}
27+
28+
[Command("exportuser")]
29+
public async Task ExportUserDataAsync()
30+
{
31+
var user = await _db.Users.Include(x => x.Guilds).SingleOrDefaultAsync(x => x.Id == Context.User.Id);
32+
if (user == null)
33+
{
34+
await ReplyAsync(_locale.GetString("gdpr:user_data_null", Context.User, _currentUser.Locale));
35+
return;
36+
}
37+
38+
var directory = Path.Combine(AppContext.BaseDirectory, $"common/temp");
39+
if (!Directory.Exists(directory))
40+
Directory.CreateDirectory(directory);
41+
42+
var filePath = Path.Combine(directory, $"{Context.User.Id}-data.json");
43+
using (var file = File.CreateText(filePath))
44+
{
45+
var serializer = new JsonSerializer()
46+
{
47+
Formatting = Formatting.Indented,
48+
NullValueHandling = NullValueHandling.Ignore,
49+
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
50+
};
51+
serializer.Serialize(file, user);
52+
}
53+
54+
await Context.User.SendFileAsync(filePath);
55+
await ReplyAsync(_locale.GetString("gdpr:user_data_get", Context.User, _currentUser.Locale));
56+
File.Delete(filePath);
57+
}
58+
}
59+
}

0 commit comments

Comments
 (0)