Architecture refactor (#63)

This commit is contained in:
Alexey Golub
2018-06-25 01:59:15 +03:00
committed by GitHub
parent d958f613a3
commit 481991bd00
52 changed files with 1484 additions and 1846 deletions

View File

@@ -1,10 +1,12 @@
namespace DiscordChatExporter.Core.Models
{
// https://discordapp.com/developers/docs/resources/channel#attachment-object
public class Attachment
{
public string Id { get; }
public AttachmentType Type { get; }
public bool IsImage { get; }
public string Url { get; }
@@ -12,13 +14,15 @@
public long FileSize { get; }
public Attachment(string id, AttachmentType type, string url, string fileName, long fileSize)
public Attachment(string id, bool isImage, string url, string fileName, long fileSize)
{
Id = id;
Type = type;
IsImage = isImage;
Url = url;
FileName = fileName;
FileSize = fileSize;
}
public override string ToString() => FileName;
}
}

View File

@@ -1,8 +0,0 @@
namespace DiscordChatExporter.Core.Models
{
public enum AttachmentType
{
Other,
Image
}
}

View File

@@ -1,5 +1,7 @@
namespace DiscordChatExporter.Core.Models
{
// https://discordapp.com/developers/docs/resources/channel#channel-object
public partial class Channel
{
public string Id { get; }
@@ -21,17 +23,12 @@
Type = type;
}
public override string ToString()
{
return Name;
}
public override string ToString() => Name;
}
public partial class Channel
{
public static Channel CreateDeletedChannel(string id)
{
return new Channel(id, null, "deleted-channel", null, ChannelType.GuildTextChat);
}
public static Channel CreateDeletedChannel(string id) =>
new Channel(id, null, "deleted-channel", null, ChannelType.GuildTextChat);
}
}

View File

@@ -1,24 +0,0 @@
using System.Collections.Generic;
namespace DiscordChatExporter.Core.Models
{
public class ChannelChatLog
{
public Guild Guild { get; }
public Channel Channel { get; }
public IReadOnlyList<MessageGroup> MessageGroups { get; }
public int TotalMessageCount { get; }
public ChannelChatLog(Guild guild, Channel channel, IReadOnlyList<MessageGroup> messageGroups,
int totalMessageCount)
{
Guild = guild;
Channel = channel;
MessageGroups = messageGroups;
TotalMessageCount = totalMessageCount;
}
}
}

View File

@@ -1,5 +1,7 @@
namespace DiscordChatExporter.Core.Models
{
// https://discordapp.com/developers/docs/resources/channel#channel-object-channel-types
public enum ChannelType
{
GuildTextChat,

View File

@@ -0,0 +1,29 @@
using System.Collections.Generic;
using System.Linq;
namespace DiscordChatExporter.Core.Models
{
public class ChatLog
{
public Guild Guild { get; }
public Channel Channel { get; }
public IReadOnlyList<MessageGroup> MessageGroups { get; }
public int TotalMessageCount => MessageGroups.Sum(g => g.Messages.Count);
public Mentionables Mentionables { get; }
public ChatLog(Guild guild, Channel channel, IReadOnlyList<MessageGroup> messageGroups,
Mentionables mentionables)
{
Guild = guild;
Channel = channel;
MessageGroups = messageGroups;
Mentionables = mentionables;
}
public override string ToString() => $"{Guild.Name} | {Channel.Name}";
}
}

View File

@@ -2,72 +2,47 @@ using System;
using System.Collections.Generic;
using System.Drawing;
// https://discordapp.com/developers/docs/resources/channel#embed-object
namespace DiscordChatExporter.Core.Models
{
public class Embed : IMentionable
// https://discordapp.com/developers/docs/resources/channel#embed-object
public class Embed
{
public string Title { get; }
public string Type { get; }
public string Description { get; }
public string Url { get; }
public DateTime? TimeStamp { get; }
public DateTime? Timestamp { get; }
public Color? Color { get; }
public EmbedFooter Footer { get; }
public EmbedImage Image { get; }
public EmbedImage Thumbnail { get; }
public EmbedVideo Video { get; }
public EmbedProvider Provider { get; }
public Color Color { get; }
public EmbedAuthor Author { get; }
public string Description { get; }
public IReadOnlyList<EmbedField> Fields { get; }
public List<User> MentionedUsers { get; }
public EmbedImage Thumbnail { get; }
public List<Role> MentionedRoles { get; }
public EmbedImage Image { get; }
public List<Channel> MentionedChannels { get; }
public EmbedFooter Footer { get; }
public Embed(string title, string type, string description,
string url, DateTime? timeStamp, Color? color,
EmbedFooter footer, EmbedImage image, EmbedImage thumbnail,
EmbedVideo video, EmbedProvider provider, EmbedAuthor author,
List<EmbedField> fields, List<User> mentionedUsers,
List<Role> mentionedRoles, List<Channel> mentionedChannels)
public Embed(string title, string url, DateTime? timestamp, Color color, EmbedAuthor author, string description,
IReadOnlyList<EmbedField> fields, EmbedImage thumbnail, EmbedImage image, EmbedFooter footer)
{
Title = title;
Type = type;
Description = description;
Url = url;
TimeStamp = timeStamp;
Timestamp = timestamp;
Color = color;
Footer = footer;
Image = image;
Thumbnail = thumbnail;
Video = video;
Provider = provider;
Author = author;
Description = description;
Fields = fields;
MentionedUsers = mentionedUsers;
MentionedRoles = mentionedRoles;
MentionedChannels = mentionedChannels;
Thumbnail = thumbnail;
Image = image;
Footer = footer;
}
public override string ToString()
{
return Description;
}
public override string ToString() => Title;
}
}

View File

@@ -1,10 +1,7 @@
using System;
using System.Collections.Generic;
// https://discordapp.com/developers/docs/resources/channel#embed-object-embed-author-structure
namespace DiscordChatExporter.Core.Models
{
// https://discordapp.com/developers/docs/resources/channel#embed-object-embed-author-structure
public class EmbedAuthor
{
public string Name { get; }
@@ -13,19 +10,13 @@ namespace DiscordChatExporter.Core.Models
public string IconUrl { get; }
public string ProxyIconUrl { get; }
public EmbedAuthor(string name, string url, string iconUrl, string proxyIconUrl)
public EmbedAuthor(string name, string url, string iconUrl)
{
Name = name;
Url = url;
IconUrl = iconUrl;
ProxyIconUrl = proxyIconUrl;
}
public override string ToString()
{
return Name;
}
public override string ToString() => Name;
}
}

View File

@@ -1,23 +1,22 @@
using System;
using System.Collections.Generic;
// https://discordapp.com/developers/docs/resources/channel#embed-object-embed-field-structure
namespace DiscordChatExporter.Core.Models
{
// https://discordapp.com/developers/docs/resources/channel#embed-object-embed-field-structure
public class EmbedField
{
public string Name { get; }
public string Value { get; }
public bool? Inline { get; }
public bool IsInline { get; }
public EmbedField(string name, string value, bool? inline)
public EmbedField(string name, string value, bool isInline)
{
Name = name;
Value = value;
Inline = inline;
IsInline = isInline;
}
public override string ToString() => $"{Name} | {Value}";
}
}

View File

@@ -1,28 +1,19 @@
using System;
using System.Collections.Generic;
// https://discordapp.com/developers/docs/resources/channel#embed-object-embed-footer-structure
namespace DiscordChatExporter.Core.Models
{
// https://discordapp.com/developers/docs/resources/channel#embed-object-embed-footer-structure
public class EmbedFooter
{
public string Text { get; }
public string IconUrl { get; }
public string ProxyIconUrl { get; }
public EmbedFooter(string text, string iconUrl, string proxyIconUrl)
public EmbedFooter(string text, string iconUrl)
{
Text = text;
IconUrl = iconUrl;
ProxyIconUrl = proxyIconUrl;
}
public override string ToString()
{
return Text;
}
public override string ToString() => Text;
}
}

View File

@@ -1,24 +1,18 @@
using System;
using System.Collections.Generic;
// https://discordapp.com/developers/docs/resources/channel#embed-object-embed-image-structure
namespace DiscordChatExporter.Core.Models
{
// https://discordapp.com/developers/docs/resources/channel#embed-object-embed-image-structure
public class EmbedImage
{
public string Url { get; }
public string ProxyUrl { get; }
public int? Height { get; }
public int? Width { get; }
public EmbedImage(string url, string proxyUrl, int? height, int? width)
public EmbedImage(string url, int? height, int? width)
{
Url = url;
ProxyUrl = proxyUrl;
Height = height;
Width = width;
}

View File

@@ -1,20 +0,0 @@
using System;
using System.Collections.Generic;
// https://discordapp.com/developers/docs/resources/channel#embed-object-embed-provider-structure
namespace DiscordChatExporter.Core.Models
{
public class EmbedProvider
{
public string Name { get; }
public string Url { get; }
public EmbedProvider(string name, string url)
{
Name = name;
Url = url;
}
}
}

View File

@@ -1,23 +0,0 @@
using System;
using System.Collections.Generic;
// https://discordapp.com/developers/docs/resources/channel#embed-object-embed-video-structure
namespace DiscordChatExporter.Core.Models
{
public class EmbedVideo
{
public string Url { get; }
public int? Height { get; }
public int? Width { get; }
public EmbedVideo(string url, int? height, int? width)
{
Url = url;
Height = height;
Width = width;
}
}
}

View File

@@ -1,8 +1,9 @@
using System.Collections.Generic;
using Tyrrrz.Extensions;
using Tyrrrz.Extensions;
namespace DiscordChatExporter.Core.Models
{
// https://discordapp.com/developers/docs/resources/guild#guild-object
public partial class Guild
{
public string Id { get; }
@@ -15,24 +16,18 @@ namespace DiscordChatExporter.Core.Models
? $"https://cdn.discordapp.com/icons/{Id}/{IconHash}.png"
: "https://cdn.discordapp.com/embed/avatars/0.png";
public IReadOnlyList<Role> Roles { get; }
public Guild(string id, string name, string iconHash, IReadOnlyList<Role> roles)
public Guild(string id, string name, string iconHash)
{
Id = id;
Name = name;
IconHash = iconHash;
Roles = roles;
}
public override string ToString()
{
return Name;
}
public override string ToString() => Name;
}
public partial class Guild
{
public static Guild DirectMessages { get; } = new Guild("@me", "Direct Messages", null, new Role[0]);
public static Guild DirectMessages { get; } = new Guild("@me", "Direct Messages", null);
}
}

View File

@@ -1,17 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DiscordChatExporter.Core.Models
{
interface IMentionable
{
List<User> MentionedUsers { get; }
List<Role> MentionedRoles { get; }
List<Channel> MentionedChannels { get; }
}
}

View File

@@ -0,0 +1,30 @@
using System.Collections.Generic;
using System.Linq;
namespace DiscordChatExporter.Core.Models
{
public class Mentionables
{
public IReadOnlyList<User> Users { get; }
public IReadOnlyList<Channel> Channels { get; }
public IReadOnlyList<Role> Roles { get; }
public Mentionables(IReadOnlyList<User> users, IReadOnlyList<Channel> channels, IReadOnlyList<Role> roles)
{
Users = users;
Channels = channels;
Roles = roles;
}
public User GetUser(string id) =>
Users.FirstOrDefault(u => u.Id == id) ?? User.CreateUnknownUser(id);
public Channel GetChannel(string id) =>
Channels.FirstOrDefault(c => c.Id == id) ?? Channel.CreateDeletedChannel(id);
public Role GetRole(string id) =>
Roles.FirstOrDefault(r => r.Id == id) ?? Role.CreateDeletedRole(id);
}
}

View File

@@ -3,7 +3,9 @@ using System.Collections.Generic;
namespace DiscordChatExporter.Core.Models
{
public class Message : IMentionable
// https://discordapp.com/developers/docs/resources/channel#message-object
public class Message
{
public string Id { get; }
@@ -13,9 +15,9 @@ namespace DiscordChatExporter.Core.Models
public User Author { get; }
public DateTime TimeStamp { get; }
public DateTime Timestamp { get; }
public DateTime? EditedTimeStamp { get; }
public DateTime? EditedTimestamp { get; }
public string Content { get; }
@@ -23,36 +25,24 @@ namespace DiscordChatExporter.Core.Models
public IReadOnlyList<Embed> Embeds { get; }
public List<User> MentionedUsers { get; }
public IReadOnlyList<User> MentionedUsers { get; }
public List<Role> MentionedRoles { get; }
public List<Channel> MentionedChannels { get; }
public Message(string id, string channelId, MessageType type,
User author, DateTime timeStamp,
DateTime? editedTimeStamp, string content,
IReadOnlyList<Attachment> attachments, IReadOnlyList<Embed> embeds,
List<User> mentionedUsers, List<Role> mentionedRoles,
List<Channel> mentionedChannels)
public Message(string id, string channelId, MessageType type, User author, DateTime timestamp,
DateTime? editedTimestamp, string content, IReadOnlyList<Attachment> attachments,
IReadOnlyList<Embed> embeds, IReadOnlyList<User> mentionedUsers)
{
Id = id;
ChannelId = channelId;
Type = type;
Author = author;
TimeStamp = timeStamp;
EditedTimeStamp = editedTimeStamp;
Timestamp = timestamp;
EditedTimestamp = editedTimestamp;
Content = content;
Attachments = attachments;
Embeds = embeds;
MentionedUsers = mentionedUsers;
MentionedRoles = mentionedRoles;
MentionedChannels = mentionedChannels;
}
public override string ToString()
{
return Content;
}
public override string ToString() => Content;
}
}

View File

@@ -7,15 +7,17 @@ namespace DiscordChatExporter.Core.Models
{
public User Author { get; }
public DateTime TimeStamp { get; }
public DateTime Timestamp { get; }
public IReadOnlyList<Message> Messages { get; }
public MessageGroup(User author, DateTime timeStamp, IReadOnlyList<Message> messages)
public MessageGroup(User author, DateTime timestamp, IReadOnlyList<Message> messages)
{
Author = author;
TimeStamp = timeStamp;
Timestamp = timestamp;
Messages = messages;
}
public override string ToString() => $"{Author.FullName} | {Timestamp} | {Messages.Count} messages";
}
}

View File

@@ -1,5 +1,7 @@
namespace DiscordChatExporter.Core.Models
{
// https://discordapp.com/developers/docs/resources/channel#message-object-message-types
public enum MessageType
{
Default,

View File

@@ -1,5 +1,7 @@
namespace DiscordChatExporter.Core.Models
{
// https://discordapp.com/developers/docs/topics/permissions#role-object
public partial class Role
{
public string Id { get; }
@@ -12,17 +14,12 @@
Name = name;
}
public override string ToString()
{
return Name;
}
public override string ToString() => Name;
}
public partial class Role
{
public static Role CreateDeletedRole(string id)
{
return new Role(id, "deleted-role");
}
public static Role CreateDeletedRole(string id) =>
new Role(id, "deleted-role");
}
}

View File

@@ -2,6 +2,8 @@
namespace DiscordChatExporter.Core.Models
{
// https://discordapp.com/developers/docs/topics/permissions#role-object
public partial class User
{
public string Id { get; }
@@ -28,17 +30,12 @@ namespace DiscordChatExporter.Core.Models
AvatarHash = avatarHash;
}
public override string ToString()
{
return FullName;
}
public override string ToString() => FullName;
}
public partial class User
{
public static User CreateUnknownUser(string id)
{
return new User(id, 0, "Unknown", null);
}
public static User CreateUnknownUser(string id) =>
new User(id, 0, "Unknown", null);
}
}