diff --git a/abstracto-modules/core/pom.xml b/abstracto-modules/core/pom.xml
index 79e55d02..92f0ac6a 100644
--- a/abstracto-modules/core/pom.xml
+++ b/abstracto-modules/core/pom.xml
@@ -11,10 +11,9 @@
4.0.0
pom
- core-templates
+ core
1.0-SNAPSHOT
-
diff --git a/abstracto-modules/core/src/main/resources/en_US/builtins/duration_formatting_en_US.ftl b/abstracto-modules/core/src/main/resources/en_US/builtins/duration_formatting_en_US.ftl
new file mode 100644
index 00000000..1b224110
--- /dev/null
+++ b/abstracto-modules/core/src/main/resources/en_US/builtins/duration_formatting_en_US.ftl
@@ -0,0 +1 @@
+<#if days gt 1><#include "duration_days"><#elseif days = 1><#include "duration_day">#if> <#if hours gt 1><#include "duration_hours"><#elseif hours = 1><#include "duration_hour">#if> <#if minutes gt 1><#include "duration_minutes"><#elseif minutes = 1><#include "duration_minute">#if> <#if seconds gt 1><#include "duration_seconds"><#elseif seconds = 1><#include "duration_second">#if>
\ No newline at end of file
diff --git a/abstracto-modules/core/src/main/resources/en_US/builtins/embed_page_count_en_US.ftl b/abstracto-modules/core/src/main/resources/en_US/builtins/embed_page_count_en_US.ftl
new file mode 100644
index 00000000..085e5e59
--- /dev/null
+++ b/abstracto-modules/core/src/main/resources/en_US/builtins/embed_page_count_en_US.ftl
@@ -0,0 +1 @@
+<#include "embed_page_count_page">
\ No newline at end of file
diff --git a/abstracto-modules/core/src/main/resources/en_US/builtins/emote_mention_en_US.ftl b/abstracto-modules/core/src/main/resources/en_US/builtins/emote_mention_en_US.ftl
new file mode 100644
index 00000000..d32473eb
--- /dev/null
+++ b/abstracto-modules/core/src/main/resources/en_US/builtins/emote_mention_en_US.ftl
@@ -0,0 +1 @@
+${object.asMention}
\ No newline at end of file
diff --git a/abstracto-modules/experience-tracking/pom.xml b/abstracto-modules/experience-tracking/pom.xml
index 36223b61..19245180 100644
--- a/abstracto-modules/experience-tracking/pom.xml
+++ b/abstracto-modules/experience-tracking/pom.xml
@@ -11,7 +11,7 @@
4.0.0
pom
- experience-tracking-templates
+ experience-tracking
1.0-SNAPSHOT
diff --git a/abstracto-modules/experience-tracking/src/main/resources/en_US/commands/leaderboard/leaderboard_post_embed_en_US.ftl b/abstracto-modules/experience-tracking/src/main/resources/en_US/commands/leaderboard/leaderboard_post_embed_en_US.ftl
new file mode 100644
index 00000000..99ed0528
--- /dev/null
+++ b/abstracto-modules/experience-tracking/src/main/resources/en_US/commands/leaderboard/leaderboard_post_embed_en_US.ftl
@@ -0,0 +1,21 @@
+{
+<#macro userDisplay user>
+ ${user.rank} ${user.member.effectiveName} ${user.experience.experience} ${user.experience.currentLevel.level} ${user.experience.messageCount}
+#macro>
+ "author": {
+ "name": "${member.effectiveName}",
+ "avatar": "${member.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "description": "
+ <#include "leaderboard_rank_column"> | <#include "leaderboard_name_column"> | <#include "leaderboard_experience_column"> | <#include "leaderboard_level_column"> | <#include "leaderboard_messages_column">
+ <#list userExperiences as user>
+ <@userDisplay user=user />
+ #list>
+ <@userDisplay user=userExecuting />
+ "
+}
\ No newline at end of file
diff --git a/abstracto-modules/experience-tracking/src/main/resources/en_US/commands/listDisabledExperienceRoles/list_disabled_experience_roles_embed_en_US.ftl b/abstracto-modules/experience-tracking/src/main/resources/en_US/commands/listDisabledExperienceRoles/list_disabled_experience_roles_embed_en_US.ftl
new file mode 100644
index 00000000..54c1f9b0
--- /dev/null
+++ b/abstracto-modules/experience-tracking/src/main/resources/en_US/commands/listDisabledExperienceRoles/list_disabled_experience_roles_embed_en_US.ftl
@@ -0,0 +1,21 @@
+{
+ "author": {
+ "name": "${member.effectiveName}",
+ "avatar": "${member.user.effectiveAvatarUrl}"
+ },
+ "title": {
+ "title": "<#include "list_disabled_experience_roles_embed_title">"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "description": "
+ <#list roles as role>
+ ${role.role.asMention}
+ <#else>
+ <#include "list_disabled_experience_roles_embed_no_roles">
+ #list>
+ "
+}
\ No newline at end of file
diff --git a/abstracto-modules/experience-tracking/src/main/resources/en_US/commands/rank/rank_post_embed_en_US.ftl b/abstracto-modules/experience-tracking/src/main/resources/en_US/commands/rank/rank_post_embed_en_US.ftl
new file mode 100644
index 00000000..bddbb1e2
--- /dev/null
+++ b/abstracto-modules/experience-tracking/src/main/resources/en_US/commands/rank/rank_post_embed_en_US.ftl
@@ -0,0 +1,38 @@
+{
+ "author": {
+ "name": "${member.effectiveName}",
+ "avatar": "${member.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "fields": [
+ {
+ "name": "<#include "rank_xp_field_title">",
+ "value": "${rankUser.experience.experience}",
+ "inline": "true"
+ },
+ {
+ "name": "<#include "rank_level_field_title">",
+ "value": "${rankUser.experience.currentLevel.level}",
+ "inline": "true"
+ },
+ {
+ "name": "<#include "rank_messages_field_title">",
+ "value": "${rankUser.experience.messageCount}",
+ "inline": "true"
+ },
+ {
+ "name": "<#include "rank_to_next_level_field_title">",
+ "value": "${experienceToNextLevel}",
+ "inline": "true"
+ },
+ {
+ "name": "<#include "rank_rank_field_title">",
+ "value": "${rankUser.rank}",
+ "inline": "true"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/abstracto-modules/experience-tracking/src/main/resources/en_US/commands/syncExpRoles/user_sync_status_message_embed_en_US.ftl b/abstracto-modules/experience-tracking/src/main/resources/en_US/commands/syncExpRoles/user_sync_status_message_embed_en_US.ftl
new file mode 100644
index 00000000..6da663a7
--- /dev/null
+++ b/abstracto-modules/experience-tracking/src/main/resources/en_US/commands/syncExpRoles/user_sync_status_message_embed_en_US.ftl
@@ -0,0 +1,3 @@
+{
+ "additionalMessage": "<#include "syncExpRoles_updating_users_label">: ${currentCount}/${totalUserCount}."
+}
\ No newline at end of file
diff --git a/abstracto-modules/moderation/pom.xml b/abstracto-modules/moderation/pom.xml
index 63272c4a..a17836e6 100644
--- a/abstracto-modules/moderation/pom.xml
+++ b/abstracto-modules/moderation/pom.xml
@@ -11,7 +11,7 @@
4.0.0
pom
- moderation-templates
+ moderation
1.0-SNAPSHOT
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/command/ban/ban_log_embed_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/command/ban/ban_log_embed_en_US.ftl
new file mode 100644
index 00000000..42bd94b8
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/command/ban/ban_log_embed_en_US.ftl
@@ -0,0 +1,32 @@
+{
+ "author": {
+ "name": "${bannedUser.effectiveName}",
+ "avatar": "${bannedUser.user.effectiveAvatarUrl}"
+ },
+ "title": {
+ "title": "<#include "ban_log_title">"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "fields": [
+ {
+ "name": "<#include "ban_log_banned_user_field_title">",
+ "value": "${bannedUser.effectiveName} ${bannedUser.asMention} (${bannedUser.idLong?c})"
+ },
+ {
+ "name": "<#include "ban_log_banning_user_field_title">",
+ "value": "${banningUser.effectiveName} ${banningUser.asMention} (${banningUser.idLong?c})"
+ },
+ {
+ "name": "<#include "ban_log_jump_link_field_title">",
+ "value": "[${messageChannel.name}](${message.jumpUrl})"
+ },
+ {
+ "name": "<#include "ban_log_reason_field_title">",
+ "value": "${reason}"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/command/banId_log_embed_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/command/banId_log_embed_en_US.ftl
new file mode 100644
index 00000000..11b5cf76
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/command/banId_log_embed_en_US.ftl
@@ -0,0 +1,28 @@
+{
+ "title": {
+ "title": "<#include "ban_log_title">"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "fields": [
+ {
+ "name": "<#include "ban_log_banned_user_field_title">",
+ "value": "${bannedUserId?c}"
+ },
+ {
+ "name": "<#include "ban_log_banning_user_field_title">",
+ "value": "${banningUser.effectiveName} ${banningUser.asMention} (${banningUser.idLong?c})"
+ },
+ {
+ "name": "<#include "ban_log_jump_link_field_title">",
+ "value": "[${messageChannel.name}](${message.jumpUrl})"
+ },
+ {
+ "name": "<#include "ban_log_reason_field_title">",
+ "value": "${reason}"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/command/kick/kick_log_embed_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/command/kick/kick_log_embed_en_US.ftl
new file mode 100644
index 00000000..4719e852
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/command/kick/kick_log_embed_en_US.ftl
@@ -0,0 +1,32 @@
+{
+ "author": {
+ "name": "${kickedUser.effectiveName}",
+ "avatar": "${kickedUser.user.effectiveAvatarUrl}"
+ },
+ "title": {
+ "title": "<#include "kick_log_title">"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "fields": [
+ {
+ "name": "<#include "kick_log_kicked_user_field_title">",
+ "value": "${kickedUser.effectiveName} ${kickedUser.asMention} (${kickedUser.idLong?c})"
+ },
+ {
+ "name": "<#include "kick_log_kicking_user_field_title">",
+ "value": "${kickingUser.effectiveName} ${kickingUser.asMention} (${kickingUser.idLong?c})"
+ },
+ {
+ "name": "<#include "kick_log_jump_link_field_title">",
+ "value": "[${messageChannel.name}](${message.jumpUrl})"
+ },
+ {
+ "name": "<#include "kick_log_reason_field_title">",
+ "value": "${reason}"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/command/listNotes/user_notes_response_embed_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/command/listNotes/user_notes_response_embed_en_US.ftl
new file mode 100644
index 00000000..a398b7c1
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/command/listNotes/user_notes_response_embed_en_US.ftl
@@ -0,0 +1,31 @@
+{
+ "author": {
+ <#if specifiedUser??>
+ "name": "${specifiedUser.member.effectiveName}",
+ "avatar": "${specifiedUser.member.user.effectiveAvatarUrl}"
+ <#else>
+ "name": "${member.effectiveName}",
+ "avatar": "${member.user.effectiveAvatarUrl}"
+ #if>
+ },
+ "title": {
+ <#if specifiedUser??>
+ <#assign user>${specifiedUser.member.effectiveName}#assign>
+ "title": "<#include "user_notes_embed_user_title">"
+ <#else>
+ "title": "<#include "user_notes_embed_title">"
+ #if>
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "description": "<#list userNotes as note>
+ <#assign user>${note.fullUser.member.asMention}#assign>
+ <#assign noteText>${note.note.note}#assign>
+ <#assign noteId>${note.note.id}#assign>
+ <#assign date>${formatDate(note.note.created, "yyyy-MM-dd HH:mm:ss")}#assign>
+ <#include "user_notes_note_entry"><#else><#include "user_notes_no_notes">
+ #list>"
+}
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/command/mute/mute_log_embed_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/command/mute/mute_log_embed_en_US.ftl
new file mode 100644
index 00000000..310ec4f1
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/command/mute/mute_log_embed_en_US.ftl
@@ -0,0 +1,44 @@
+{
+ "author": {
+ "name": "${mutedUser.effectiveName}",
+ "avatar": "${mutedUser.user.effectiveAvatarUrl}"
+ },
+ "title": {
+ "title": "<#include "mute_log_title">"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "fields": [
+ {
+ "name": "<#include "mute_log_muted_user_field_title">",
+ "value": "${mutedUser.effectiveName} ${mutedUser.asMention} (${mutedUser.idLong?c})"
+ },
+ {
+ "name": "<#include "mute_log_muting_user_field_title">",
+ "value": "${mutingUser.effectiveName} ${mutingUser.asMention} (${mutingUser.idLong?c})"
+ },
+ {
+ "name": "<#include "mute_log_mute_location_field_title">",
+ "value": "[${messageChannel.name}](${message.jumpUrl})"
+ },
+ {
+ "name": "<#include "mute_log_mute_reason_field_title">",
+ "value": "${mute.reason}"
+ },
+ {
+ "name": "<#include "mute_log_mute_duration_field_title">",
+ "value": "${fmtDuration(muteDuration)}"
+ },
+ {
+ "name": "<#include "mute_log_muted_until_field_title">",
+ "value": "${formatDate(mute.muteTargetDate, "yyyy-MM-dd HH:mm:ss")}"
+ }
+ ],
+ "footer": {
+ "text": "<#include "mute_log_mute_id_footer"> #${mute.id}"
+ },
+ "timeStamp": "${mute.muteDate}"
+}
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/command/mute/unmute_log_embed_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/command/mute/unmute_log_embed_en_US.ftl
new file mode 100644
index 00000000..9d39f2eb
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/command/mute/unmute_log_embed_en_US.ftl
@@ -0,0 +1,55 @@
+{
+ <#if unMutedUser?has_content>
+ "author": {
+ "name": "${unMutedUser.effectiveName}",
+ "avatar": "${unMutedUser.user.effectiveAvatarUrl}"
+ },
+ #if>
+ "title": {
+ "title": "<#include "unMute_log_title">"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "fields": [
+ {
+ "name": "<#include "unMute_log_unmuted_user_field_title">",
+ <#if unMutedUser?has_content>
+ "value": "${unMutedUser.effectiveName} ${unMutedUser.asMention} (${unMutedUser.idLong?c})"
+ <#else>
+ "value": "<#include "user_left_server"> (${mute.mutedUser.userReference.id?c})"
+ #if>
+
+ },
+ {
+ "name": "<#include "mute_log_muting_user_field_title">",
+ <#if mutingUser?has_content>
+ "value": "${mutingUser.effectiveName} ${mutingUser.asMention} (${mutingUser.idLong?c})"
+ <#else>
+ "value": "<#include "user_left_server"> (${mute.mutingUser.userReference.id?c})"
+ #if>
+ },
+ {
+ "name": "<#include "mute_log_mute_location_field_title">",
+ "value": "[Link](${messageUrl})"
+ },
+ {
+ "name": "<#include "unMute_log_muted_since_field_title">",
+ "value": "${formatDate(mute.muteDate, "yyyy-MM-dd HH:mm:ss")}"
+ },
+ {
+ "name": "<#include "mute_log_mute_duration_field_title">",
+ "value": "${fmtDuration(muteDuration)}"
+ },
+ {
+ "name": "<#include "mute_log_mute_reason_field_title">",
+ "value": "${mute.reason}"
+ }
+ ],
+ "footer": {
+ "text": "<#include "mute_log_mute_id_footer"> #${mute.id}"
+ },
+ "timeStamp": "${unmuteDate}"
+}
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/command/myWarnings/myWarnings_response_embed_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/command/myWarnings/myWarnings_response_embed_en_US.ftl
new file mode 100644
index 00000000..5f7e1e40
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/command/myWarnings/myWarnings_response_embed_en_US.ftl
@@ -0,0 +1,14 @@
+{
+ "author": {
+ "name": "${member.effectiveName}",
+ "avatar": "${member.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ }
+ <#assign userMention>${member.effectiveName}#assign>
+ ,"description" :"<#include "myWarnings_with_decay_embed_description">"
+ #if>
+}
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/command/purge/purge_status_update_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/command/purge/purge_status_update_en_US.ftl
new file mode 100644
index 00000000..36202062
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/command/purge/purge_status_update_en_US.ftl
@@ -0,0 +1 @@
+<#include "purge_status_update_message">
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/command/slowMode/slowmode_log_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/command/slowMode/slowmode_log_en_US.ftl
new file mode 100644
index 00000000..b0bb4e57
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/command/slowMode/slowmode_log_en_US.ftl
@@ -0,0 +1 @@
+The slowmode in channel ${channel.name} has been set to ${channel.slowMode} seconds.
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/command/unMute/unMute_has_no_active_mute_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/command/unMute/unMute_has_no_active_mute_en_US.ftl
new file mode 100644
index 00000000..c2012d45
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/command/unMute/unMute_has_no_active_mute_en_US.ftl
@@ -0,0 +1 @@
+<#include "unMute_has_no_active_mute_message">
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/command/warn/warn_log_embed_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/command/warn/warn_log_embed_en_US.ftl
new file mode 100644
index 00000000..294b98d5
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/command/warn/warn_log_embed_en_US.ftl
@@ -0,0 +1,41 @@
+{
+ "author": {
+ "name": "${warnedUser.effectiveName}",
+ "avatar": "${warnedUser.user.effectiveAvatarUrl}"
+ },
+ "title": {
+ "title": "<#include "warn_log_title">"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "fields": [
+ {
+ "name": "<#include "warn_log_warned_user_field_title">",
+ "value": "${warnedUser.effectiveName} ${warnedUser.asMention} (${warnedUser.idLong?c})"
+ },
+ <#if warningUser?has_content>
+ {
+ "name": "<#include "warn_log_warning_user_field_title">",
+ "value": "${warningUser.effectiveName} ${warningUser.asMention} (${warningUser.idLong?c})"
+ },
+ #if>
+ <#if warning?has_content>
+ {
+ "name": "<#include "warn_log_warn_location_field_title">",
+ "value": "[${messageChannel.name}](${message.jumpUrl})"
+ },
+ #if>
+ {
+ "name": "<#include "warn_log_warn_reason_field_title">",
+ "value": "${reason}"
+ }
+ ],
+ "footer": {
+ <#if warningUser?has_content>
+ "text": "<#include "warn_log_warn_id_footer"> #${warning.id}"
+ #if>
+ }
+}
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/command/warnings/warnings_response_paginator_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/command/warnings/warnings_response_paginator_en_US.ftl
new file mode 100644
index 00000000..3b3e5647
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/command/warnings/warnings_response_paginator_en_US.ftl
@@ -0,0 +1,7 @@
+{
+<#assign warnCount>${warnings?size}#assign>
+ "headerText": "<#include "warnings_header_text">",
+ "items": [
+ <#list warnings as warning>"<#include "warnings_warn_entry">"<#sep>,#list>
+ ]
+}
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/command/warnings/warnings_warn_entry_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/command/warnings/warnings_warn_entry_en_US.ftl
new file mode 100644
index 00000000..71479ffe
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/command/warnings/warnings_warn_entry_en_US.ftl
@@ -0,0 +1,11 @@
+<#assign warnId>${warning.warning.id}#assign>
+<#assign reason>${warning.warning.reason}#assign>
+<#assign warnedUserText><#if warning.warnedUser.member??>${warning.warnedUser.member.asMention}(${warning.warnedUser.member.user.id})<#else>${warning.warnedUser.aUserInAServer.id}#if>#assign>
+<#assign warningUserText><#if warning.warningUser.member??>${warning.warningUser.member.asMention}(${warning.warningUser.member.user.id})<#else>${warning.warningUser.aUserInAServer.id}#if>#assign>
+<#assign warnDate>${formatDate(warning.warning.warnDate, "yyyy-MM-dd HH:mm:ss")}#assign>
+
+<#include "warnings_warn_entry_text">
+<#if warning.warning.decayed>
+<#assign decayDate>${formatDate(warning.warning.decayDate, "yyyy-MM-dd HH:mm:ss")}#assign>
+<#include "warnings_warn_is_decayed">
+#if>
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/exception/no_message_found_exception_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/exception/no_message_found_exception_en_US.ftl
new file mode 100644
index 00000000..b3ac0014
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/exception/no_message_found_exception_en_US.ftl
@@ -0,0 +1 @@
+<#include "no_message_found_exception_message">
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/exception/note_not_found_exception_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/exception/note_not_found_exception_en_US.ftl
new file mode 100644
index 00000000..49b8d550
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/exception/note_not_found_exception_en_US.ftl
@@ -0,0 +1 @@
+<#include "note_not_found_exception_message">
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/listener/message_deleted/message_deleted_attachment_embed_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/listener/message_deleted/message_deleted_attachment_embed_en_US.ftl
new file mode 100644
index 00000000..13c267ac
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/listener/message_deleted/message_deleted_attachment_embed_en_US.ftl
@@ -0,0 +1,12 @@
+{
+ "imageUrl": "${imageUrl}",
+ "fields": [
+ {
+ "name": "<#include "messageDeleted_attachment_link_field_title">",
+ "value": "[<#include "messageDeleted_attachment_link_display_text">](${imageUrl})"
+ }
+ ],
+ "footer": {
+ "text": "<#include "messageDeleted_attachment_footer"> #${counter}"
+ }
+}
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/listener/message_deleted/message_deleted_embed_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/listener/message_deleted/message_deleted_embed_en_US.ftl
new file mode 100644
index 00000000..ada35460
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/listener/message_deleted/message_deleted_embed_en_US.ftl
@@ -0,0 +1,22 @@
+{
+ "author": {
+ "name": "${member.effectiveName}#${member.user.discriminator}",
+ "avatar": "${member.user.effectiveAvatarUrl}"
+ },
+ "description": "<#include "messageDeleted_description_text">",
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 0
+ },
+ "fields": [
+ {
+ "name": "<#include "messageDeleted_original_message_field_title">",
+ "value": "${cachedMessage.content}"
+ },
+ {
+ "name": "<#include "messageDeleted_message_link_field_title">",
+ "value": "[${messageChannel.name}](${cachedMessage.messageUrl})"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/listener/message_edited/message_edited_embed_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/listener/message_edited/message_edited_embed_en_US.ftl
new file mode 100644
index 00000000..5df87aa5
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/listener/message_edited/message_edited_embed_en_US.ftl
@@ -0,0 +1,26 @@
+{
+ "author": {
+ "name": "${member.effectiveName}#${member.user.discriminator}",
+ "avatar": "${member.user.effectiveAvatarUrl}"
+ },
+ "description": "<#include "messageEdited_description_text">",
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 0
+ },
+ "fields": [
+ {
+ "name": "<#include "messageEdited_original_message_field_title">",
+ "value": "${messageBefore.content}"
+ },
+ {
+ "name": "<#include "messageEdited_new_message_field_title">",
+ "value": "${messageAfter.contentRaw}"
+ },
+ {
+ "name": "<#include "messageEdited_link_field_title">",
+ "value": "[${messageChannel.name}](${messageBefore.messageUrl})"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/abstracto-modules/moderation/src/main/resources/en_US/scheduler/warnDecay/warn_decay_log_embed_en_US.ftl b/abstracto-modules/moderation/src/main/resources/en_US/scheduler/warnDecay/warn_decay_log_embed_en_US.ftl
new file mode 100644
index 00000000..8f714a7a
--- /dev/null
+++ b/abstracto-modules/moderation/src/main/resources/en_US/scheduler/warnDecay/warn_decay_log_embed_en_US.ftl
@@ -0,0 +1,15 @@
+{
+ "title": {
+ "title": "<#include "warnDecay_title">"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "description": "<#list warnings as warning>
+ <#if warning.warnedMember??><#assign warnedUser>${warning.warnedMember.asMention} (${warning.warnedMember.id})#assign><#else><#assign warnedUser> ${warning.warning.warnedUser.userReference.id?c}#assign>#if> <#if warning.warningMember??><#assign warningUser> ${warning.warningMember.asMention} (${warning.warningMember.id})#assign><#else><#assign warningUser>${warning.warning.warningUser.userReference.id?c}#assign>#if> <#include "warnDecay_log_warn_entry">
+ <#else>
+ <#include "warnDecay_log_no_warnings">
+ #list>"
+}
\ No newline at end of file
diff --git a/abstracto-modules/modmail/pom.xml b/abstracto-modules/modmail/pom.xml
index 1be7eef3..a312fb3c 100644
--- a/abstracto-modules/modmail/pom.xml
+++ b/abstracto-modules/modmail/pom.xml
@@ -11,7 +11,7 @@
4.0.0
pom
- modmail-templates
+ modmail
1.0-SNAPSHOT
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/command/contact/modmail_thread_already_exists_embed_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/command/contact/modmail_thread_already_exists_embed_en_US.ftl
new file mode 100644
index 00000000..ade880f1
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/command/contact/modmail_thread_already_exists_embed_en_US.ftl
@@ -0,0 +1,18 @@
+{
+ "author": {
+ "name": "${member.effectiveName}",
+ "avatar": "${member.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "description": "<#include "modmail_thread_already_exists">",
+ "fields": [
+ {
+ "name": "<#include "modmail_existing_thread_link_field_title">",
+ "value": "[<#include "modmail_existing_thread_link_content_display_text">](${threadUrl})"
+ }
+ ]
+}
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_category_not_setup_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_category_not_setup_en_US.ftl
new file mode 100644
index 00000000..f0390cd8
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_category_not_setup_en_US.ftl
@@ -0,0 +1 @@
+<#assign categoryId>${(error.templateModel['categoryId'])!"0"}#assign><#include "modmail_category_not_setup_text">
\ No newline at end of file
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_exception_cannot_delete_channel_embed_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_exception_cannot_delete_channel_embed_en_US.ftl
new file mode 100644
index 00000000..80bad841
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_exception_cannot_delete_channel_embed_en_US.ftl
@@ -0,0 +1,12 @@
+{
+ "author": {
+ "name": "${user.member.effectiveName}",
+ "avatar": "${user.member.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "description": "<#include "close_failed_to_delete_text_channel">"
+}
\ No newline at end of file
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_exception_cannot_message_user_embed_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_exception_cannot_message_user_embed_en_US.ftl
new file mode 100644
index 00000000..2206378d
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_exception_cannot_message_user_embed_en_US.ftl
@@ -0,0 +1,12 @@
+{
+ "author": {
+ "name": "${user.member.effectiveName}",
+ "avatar": "${user.member.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "description": "<#include "reply_exception_cannot_send_message_to_use">"
+}
\ No newline at end of file
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_exception_failed_to_create_mod_mail_thread_embed_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_exception_failed_to_create_mod_mail_thread_embed_en_US.ftl
new file mode 100644
index 00000000..26f6a67b
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_exception_failed_to_create_mod_mail_thread_embed_en_US.ftl
@@ -0,0 +1,12 @@
+{
+ "author": {
+ "name": "${user.member.effectiveName}",
+ "avatar": "${user.member.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "description": "<#include "modmail_failed_to_create_mod_mail_thread">"
+}
\ No newline at end of file
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_exception_generic_embed_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_exception_generic_embed_en_US.ftl
new file mode 100644
index 00000000..8f5d3bec
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_exception_generic_embed_en_US.ftl
@@ -0,0 +1,12 @@
+{
+ "author": {
+ "name": "${user.member.effectiveName}",
+ "avatar": "${user.member.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "description": "<#include "modmail_generic_error">"
+}
\ No newline at end of file
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_exception_post_target_not_defined_embed_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_exception_post_target_not_defined_embed_en_US.ftl
new file mode 100644
index 00000000..5187db61
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/exception/modmail_exception_post_target_not_defined_embed_en_US.ftl
@@ -0,0 +1,12 @@
+{
+ "author": {
+ "name": "${user.member.effectiveName}",
+ "avatar": "${user.member.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "description": "<#include "modmail_post_target_error">"
+}
\ No newline at end of file
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/exception/setup_category_not_valid_exception_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/exception/setup_category_not_valid_exception_en_US.ftl
new file mode 100644
index 00000000..f71fbe59
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/exception/setup_category_not_valid_exception_en_US.ftl
@@ -0,0 +1 @@
+<#include "setup_category_not_valid_exception_message">
\ No newline at end of file
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/listener/messageReceived/modmail_modal_server_choice_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/listener/messageReceived/modmail_modal_server_choice_en_US.ftl
new file mode 100644
index 00000000..e40aba80
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/listener/messageReceived/modmail_modal_server_choice_en_US.ftl
@@ -0,0 +1,5 @@
+<#include "server_chooser_server_list_description">
+
+<#list commonGuilds as guild>
+ ${guild.reactionEmote} ${guild.guild.guild.name}
+#list>
\ No newline at end of file
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/listener/messageReceived/modmail_no_server_available_embed_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/listener/messageReceived/modmail_no_server_available_embed_en_US.ftl
new file mode 100644
index 00000000..ad0bf190
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/listener/messageReceived/modmail_no_server_available_embed_en_US.ftl
@@ -0,0 +1,8 @@
+{
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "description": "<#include "modmail_no_server_available">"
+}
\ No newline at end of file
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/listener/messageReceived/modmail_notification_message_embed_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/listener/messageReceived/modmail_notification_message_embed_en_US.ftl
new file mode 100644
index 00000000..ad34a977
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/listener/messageReceived/modmail_notification_message_embed_en_US.ftl
@@ -0,0 +1,19 @@
+{
+ "author": {
+ "name": "${threadUser.member.effectiveName}",
+ "avatar": "${threadUser.member.user.effectiveAvatarUrl}"
+ },
+ "title": {
+ "title": "<#include "modmail_notification_message_title">"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ <#assign user>${threadUser.member.effectiveName}#${threadUser.member.user.discriminator}(${threadUser.member.user.id})#assign>
+ "description": "<#include "modmail_notification_message_description">"
+ <#if roles?size gt 0>
+ ,"additionalMessage": "<#list roles as role>${role.role.asMention}<#sep>,#list>"
+ #if>
+}
\ No newline at end of file
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/listener/messageReceived/modmail_user_message_embed_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/listener/messageReceived/modmail_user_message_embed_en_US.ftl
new file mode 100644
index 00000000..156b31a3
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/listener/messageReceived/modmail_user_message_embed_en_US.ftl
@@ -0,0 +1,23 @@
+{
+ "author": {
+ "name": "${threadUser.member.effectiveName}",
+ "avatar": "${threadUser.member.user.effectiveAvatarUrl}"
+ },
+ "title": {
+ "title": "<#include "modmail_thread_user_message_title">"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ <#if postedMessage.contentRaw?has_content>
+ "description": "${postedMessage.contentRaw}"
+ #if>
+ <#if postedMessage.attachments?size gt 0>
+ ,"imageUrl": "${postedMessage.attachments[0].proxyUrl}"
+ #if>
+ <#if subscribers?size gt 0>
+ ,"additionalMessage": "<#list subscribers as subscriber>${subscriber.member.asMention}<#sep>,#list>"
+ #if>
+}
\ No newline at end of file
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/modmail/closing/logging/modmail_close_header_embed_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/modmail/closing/logging/modmail_close_header_embed_en_US.ftl
new file mode 100644
index 00000000..8373141f
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/modmail/closing/logging/modmail_close_header_embed_en_US.ftl
@@ -0,0 +1,15 @@
+{
+ "title": {
+ "title": "<#include "modmail_closing_notification_title">"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ <#assign messageCount>${closedThread.messages?size}#assign>
+ <#assign user>user#assign>
+ <#assign startDate>${formatDate(closedThread.created,"yyyy-MM-dd HH:mm:ss")}#assign>
+ <#assign duration>${fmtDuration(duration)}#assign>
+ "description": "<#include "close_closing_description">"
+}
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/modmail/closing/logging/modmail_close_logged_message_embed_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/modmail/closing/logging/modmail_close_logged_message_embed_en_US.ftl
new file mode 100644
index 00000000..6c4b1c56
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/modmail/closing/logging/modmail_close_logged_message_embed_en_US.ftl
@@ -0,0 +1,21 @@
+{
+ "author": {
+ "name": "${author.member.effectiveName}",
+ "avatar": "${author.member.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ }
+ <#if message.embeds[0].description?has_content>
+ ,"description": "${message.embeds[0].description}"
+ #if>
+ <#if message.attachments?size gt 0>
+ ,"imageUrl": "${message.embeds[0].image.proxyUrl}"
+ #if>
+ <#if modMailMessage.anonymous>
+ , "additionalMessage": "<#include "modmail_anonymous_message_note">"
+ #if>
+ ,"timeStamp": "${message.timeCreated}"
+}
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/modmail/closing/modmail_closing_user_message_embed_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/modmail/closing/modmail_closing_user_message_embed_en_US.ftl
new file mode 100644
index 00000000..acba982f
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/modmail/closing/modmail_closing_user_message_embed_en_US.ftl
@@ -0,0 +1,8 @@
+{
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "description": "${closingMessage}"
+}
\ No newline at end of file
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/modmail/modmail_staff_message_embed_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/modmail/modmail_staff_message_embed_en_US.ftl
new file mode 100644
index 00000000..a7470d76
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/modmail/modmail_staff_message_embed_en_US.ftl
@@ -0,0 +1,20 @@
+{
+ "author": {
+ "name": "${moderator.effectiveName}",
+ "avatar": "${moderator.user.effectiveAvatarUrl}"
+ },
+ "title": {
+ "title": "<#include "modmail_thread_staff_message_title">"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ }
+ <#if text?has_content>
+ , "description": "${text}"
+ #if>
+ <#if postedMessage.attachments?size gt 0>
+ ,"imageUrl": "${postedMessage.attachments[0].proxyUrl}"
+ #if>
+}
\ No newline at end of file
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/modmail/modmail_thread_header_embed_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/modmail/modmail_thread_header_embed_en_US.ftl
new file mode 100644
index 00000000..906afa4f
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/modmail/modmail_thread_header_embed_en_US.ftl
@@ -0,0 +1,15 @@
+{
+ "author": {
+ "name": "${threadUser.member.effectiveName}",
+ "avatar": "${threadUser.member.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ <#assign user>${threadUser.member.effectiveName}#${threadUser.member.user.discriminator} (${threadUser.member.user.id})#assign>
+ <#assign joinDate>${threadUser.member.timeJoined}#assign>
+ <#assign roles><#list threadUser.member.roles as role>${role.asMention}<#sep>,<#else><#include "modmail_thread_header_no_roles">#list>#assign>
+ "description": "<#include "modmail_thread_header_embed_description">"
+}
\ No newline at end of file
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/modmail/setup/setup_modmail_category_action_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/modmail/setup/setup_modmail_category_action_en_US.ftl
new file mode 100644
index 00000000..e37a3e14
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/modmail/setup/setup_modmail_category_action_en_US.ftl
@@ -0,0 +1 @@
+<#assign category>${param.category.name}#assign><#include "setup_modmail_category_action_display">
\ No newline at end of file
diff --git a/abstracto-modules/modmail/src/main/resources/en_US/modmail/setup/setup_modmail_category_message_en_US.ftl b/abstracto-modules/modmail/src/main/resources/en_US/modmail/setup/setup_modmail_category_message_en_US.ftl
new file mode 100644
index 00000000..7947f143
--- /dev/null
+++ b/abstracto-modules/modmail/src/main/resources/en_US/modmail/setup/setup_modmail_category_message_en_US.ftl
@@ -0,0 +1 @@
+<#assign categoryName><#if category?has_content>${category.name}<#else><#include "setup_modmail_category_message_no_category">#if>#assign><#include "setup_modmail_category_message_display">
\ No newline at end of file
diff --git a/abstracto-modules/utility/pom.xml b/abstracto-modules/utility/pom.xml
index 3490ebf4..869040b8 100644
--- a/abstracto-modules/utility/pom.xml
+++ b/abstracto-modules/utility/pom.xml
@@ -11,7 +11,7 @@
4.0.0
pom
- utility-templates
+ utility
1.0-SNAPSHOT
diff --git a/abstracto-modules/utility/src/main/resources/en_US/commands/remind/remind_reminder_embed_en_US.ftl b/abstracto-modules/utility/src/main/resources/en_US/commands/remind/remind_reminder_embed_en_US.ftl
new file mode 100644
index 00000000..8bb5c31b
--- /dev/null
+++ b/abstracto-modules/utility/src/main/resources/en_US/commands/remind/remind_reminder_embed_en_US.ftl
@@ -0,0 +1,27 @@
+{
+ "author": {
+ "name": "${member.effectiveName}",
+ "avatar": "${member.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "description": "<#include "remind_reminder_description">",
+ "fields": [
+ {
+ "name": "<#include "remind_reminder_duration_field_title">",
+ "value": "${fmtDuration(duration)}"
+ },
+ {
+ "name": "<#include "remind_reminder_note_field_title">",
+ "value": "${reminder.text}"
+ },
+ {
+ "name": "<#include "remind_reminder_link_field_title">",
+ "value": "[<#include "remind_reminder_link_content_display_text">](${messageUrl})"
+ }
+ ],
+ "additionalMessage": "${member.asMention}"
+}
\ No newline at end of file
diff --git a/abstracto-modules/utility/src/main/resources/en_US/commands/remind/remind_response_embed_en_US.ftl b/abstracto-modules/utility/src/main/resources/en_US/commands/remind/remind_response_embed_en_US.ftl
new file mode 100644
index 00000000..f560ac6c
--- /dev/null
+++ b/abstracto-modules/utility/src/main/resources/en_US/commands/remind/remind_response_embed_en_US.ftl
@@ -0,0 +1,15 @@
+{
+ <#assign id>${reminder.id}#assign>
+ <#assign messageUrl>${message.jumpUrl}#assign>
+ "author": {
+ "name": "${member.effectiveName}",
+ "avatar": "${member.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "description": "<#include "remind_reminding_description_text">",
+ "additionalMessage": "${member.asMention}"
+}
\ No newline at end of file
diff --git a/abstracto-modules/utility/src/main/resources/en_US/commands/reminders/reminders_response_embed_en_US.ftl b/abstracto-modules/utility/src/main/resources/en_US/commands/reminders/reminders_response_embed_en_US.ftl
new file mode 100644
index 00000000..59768670
--- /dev/null
+++ b/abstracto-modules/utility/src/main/resources/en_US/commands/reminders/reminders_response_embed_en_US.ftl
@@ -0,0 +1,24 @@
+{
+ "author": {
+ "name": "${member.effectiveName}",
+ "avatar": "${member.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "title": {
+ "title": "<#include "reminders_reminders_embed_title">"
+ },
+ "fields": [
+ <#list reminders as reminder>
+ {
+ <#assign id>${reminder.id}#assign>
+ "name": "<#include "reminders_reminder_field_title">",
+ "value": "<#include "reminders_due_on">"
+ }
+ <#sep>,
+ #list>
+ ]
+}
\ No newline at end of file
diff --git a/abstracto-modules/utility/src/main/resources/en_US/commands/serverInfo/serverinfo_embed_emotes_field_title_en_US.ftl b/abstracto-modules/utility/src/main/resources/en_US/commands/serverInfo/serverinfo_embed_emotes_field_title_en_US.ftl
new file mode 100644
index 00000000..e62335fc
--- /dev/null
+++ b/abstracto-modules/utility/src/main/resources/en_US/commands/serverInfo/serverinfo_embed_emotes_field_title_en_US.ftl
@@ -0,0 +1 @@
+<#assign additionalInfo><#if count gt 1>${count}<#else><#assign count>${list?size}#assign><#include "serverinfo_embed_emotes_title_total_emotes">#if>#assign><#include "serverinfo_embed_emotes_field_title_message">
\ No newline at end of file
diff --git a/abstracto-modules/utility/src/main/resources/en_US/commands/serverInfo/serverinfo_response_embed_en_US.ftl b/abstracto-modules/utility/src/main/resources/en_US/commands/serverInfo/serverinfo_response_embed_en_US.ftl
new file mode 100644
index 00000000..6fd3d0fa
--- /dev/null
+++ b/abstracto-modules/utility/src/main/resources/en_US/commands/serverInfo/serverinfo_response_embed_en_US.ftl
@@ -0,0 +1,43 @@
+{
+ "title": {
+ "title": "<#assign name=guild.name><#include "serverinfo_embed_title">"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "fields": [
+ {
+ "name": "<#include "serverinfo_embed_id_field_title">",
+ "value": "${guild.id}",
+ "inline": "true"
+ },
+ {
+ "name": "<#include "serverinfo_embed_owner_field_title">",
+ "value": "${guild.owner.effectiveName}#${guild.owner.user.discriminator}",
+ "inline": "true"
+ },
+ {
+ "name": "<#include "serverinfo_embed_members_field_title">",
+ "value": "${guild.memberCount}",
+ "inline": "true"
+ },
+ {
+ "name": "<#include "serverinfo_embed_role_count_field_title">",
+ "value": "${guild.roles?size}",
+ "inline": "true"
+ },
+ {
+ "name": "<#include "serverinfo_embed_created_field_title">",
+ "value": "${guild.timeCreated}",
+ "inline": "true"
+ },
+ ${safeFieldLength(guild.emotes, 'emote_mention', 'serverinfo_embed_emotes_field_title', 'false')},
+ {
+ "name": "<#include "serverinfo_embed_features_field_title">",
+ "value": "<#list guild.features as feature>${feature}<#else>No features#list>",
+ "inline": "true"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/abstracto-modules/utility/src/main/resources/en_US/commands/showAvatar/showAvatar_response_embed_en_US.ftl b/abstracto-modules/utility/src/main/resources/en_US/commands/showAvatar/showAvatar_response_embed_en_US.ftl
new file mode 100644
index 00000000..ace76f0c
--- /dev/null
+++ b/abstracto-modules/utility/src/main/resources/en_US/commands/showAvatar/showAvatar_response_embed_en_US.ftl
@@ -0,0 +1,24 @@
+{
+ "author": {
+ "name": "${memberInfo.user.name}#${memberInfo.user.discriminator}",
+ "avatar": "${memberInfo.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "imageUrl": "${memberInfo.user.effectiveAvatarUrl}",
+ "fields": [
+ {
+ "name": "<#include "showAvatar_response_embed_user_field_title">",
+ "value": "${memberInfo.user.name}#${memberInfo.user.discriminator}",
+ "inline": "true"
+ },
+ {
+ "name": "<#include "showAvatar_response_embed_image_field_title">",
+ "value": "[<#include "showAvatar_response_embed_image_field_value_display">](${memberInfo.user.effectiveAvatarUrl})",
+ "inline": "true"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/abstracto-modules/utility/src/main/resources/en_US/commands/showEmote/showEmote_response_en_US.ftl b/abstracto-modules/utility/src/main/resources/en_US/commands/showEmote/showEmote_response_en_US.ftl
new file mode 100644
index 00000000..db1c1a0c
--- /dev/null
+++ b/abstracto-modules/utility/src/main/resources/en_US/commands/showEmote/showEmote_response_en_US.ftl
@@ -0,0 +1 @@
+<#assign name> ${emote.name} #assign> <#assign url> ${emote.imageUrl} #assign>**<#include "showEmote_name">**: ${emote.name} **<#include "showEmote_link">**: ${emote.imageUrl}
\ No newline at end of file
diff --git a/abstracto-modules/utility/src/main/resources/en_US/commands/starStats/starStats_response_embed_en_US.ftl b/abstracto-modules/utility/src/main/resources/en_US/commands/starStats/starStats_response_embed_en_US.ftl
new file mode 100644
index 00000000..fafbf404
--- /dev/null
+++ b/abstracto-modules/utility/src/main/resources/en_US/commands/starStats/starStats_response_embed_en_US.ftl
@@ -0,0 +1,53 @@
+{
+ "title": {
+ "title": "<#include "starStats_response_title">"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "description": "<#include "startStats_description">",
+ "fields": [
+ {
+ "name": "<#include "starStats_top_starred_field_title">",
+ "value": "
+ <#list topPosts as post>
+ <#assign badge>${badgeEmotes[post?index]}#assign><#assign count>${post.starCount}<#assign link>${post.messageUrl}#assign> <#include "starStats_starred_entry">
+ <#else>
+ <#include "starStats_no_starred_messages">
+ #list>
+ "
+ },
+ {
+ "name": "<#include "starStats_top_starrer_field_title">",
+ "value": "
+ <#list starGiver as starrer>
+ <#assign badge>${badgeEmotes[starrer?index]}#assign><#assign count>${starrer.starCount}
+ <#if starrer.member?has_content>
+ <#assign user>${starrer.member.asMention}#assign> <#include "starStats_starrer_entry">
+ <#else>
+ <#assign user>${starrer.user.id?c}#assign> <#include "starStats_starrer_entry_left_guild_en_US.ftl">
+ #if>
+ <#else>
+ <#include "starStats_no_starred_messages">
+ #list>
+ "
+ },
+ {
+ "name": "<#include "starStats_top_receiver_field_title">",
+ "value": "
+ <#list starReceiver as starred>
+ <#assign badge>${badgeEmotes[starred?index]}#assign><#assign count>${starred.starCount}
+ <#if starred.member?has_content>
+ <#assign user>${starred.member.asMention}#assign> <#include "starStats_receiver_entry">
+ <#else>
+ <#assign user>${starred.user.id?c}#assign> <#include "starStats_receiver_entry_left_guild">
+ #if>
+ <#else>
+ <#include "starStats_no_starred_messages">
+ #list>
+ "
+ }
+ ]
+}
\ No newline at end of file
diff --git a/abstracto-modules/utility/src/main/resources/en_US/commands/suggest/suggest_log_embed_en_US.ftl b/abstracto-modules/utility/src/main/resources/en_US/commands/suggest/suggest_log_embed_en_US.ftl
new file mode 100644
index 00000000..ddea7b3f
--- /dev/null
+++ b/abstracto-modules/utility/src/main/resources/en_US/commands/suggest/suggest_log_embed_en_US.ftl
@@ -0,0 +1,35 @@
+{
+ "author": {
+ <#if suggester?has_content>
+ "name": "${suggester.effectiveName}",
+ "avatar": "${suggester.user.effectiveAvatarUrl}"
+ <#else>
+ "name": "${suggesterUser.userReference.id}"
+ #if>
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ <#assign user>${member.effectiveName}#assign>
+ <#assign id>${suggestion.id}#assign>
+ <#if suggestion.state = "ACCEPTED">
+ "description": "~~${text}~~ \n✅ ${reason} - <#include "suggest_accepted_by">",
+ <#elseif suggestion.state = "REJECTED">
+ "description": "~~${text}~~ \n❌ ${reason} - <#include "suggest_rejected_by">",
+ <#else>
+ "description": "${text}",
+ #if>
+ <#if suggestion.state = "ACCEPTED" || suggestion.state = "REJECTED">
+ "fields": [
+ {
+ "name": "<#include "suggest_link_field_title">",
+ "value": "[<#include "suggest_link_display_value">](${originalMessageUrl})"
+ }
+ ],
+ #if>
+ "footer": {
+ "text": "<#include "suggest_suggestion_id_footer">"
+ }
+}
\ No newline at end of file
diff --git a/abstracto-modules/utility/src/main/resources/en_US/commands/userInfo/userInfo_response_embed_en_US.ftl b/abstracto-modules/utility/src/main/resources/en_US/commands/userInfo/userInfo_response_embed_en_US.ftl
new file mode 100644
index 00000000..7114908c
--- /dev/null
+++ b/abstracto-modules/utility/src/main/resources/en_US/commands/userInfo/userInfo_response_embed_en_US.ftl
@@ -0,0 +1,49 @@
+{
+ "author": {
+ "name": "${memberInfo.user.name}#${memberInfo.user.discriminator}",
+ "avatar": "${memberInfo.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ "thumbnail": "${memberInfo.user.effectiveAvatarUrl}",
+ "fields": [
+ {
+ "name": "<#include "userInfo_response_embed_id_field_title">",
+ "value": "${memberInfo.user.id}",
+ "inline": "true"
+ },
+ <#if memberInfo.nickname?has_content>
+ {
+ "name": "<#include "userInfo_response_embed_nickname_field_title">",
+ "value": "${memberInfo.nickname}",
+ "inline": "true"
+ },
+ #if>
+ {
+ "name": "<#include "userInfo_response_embed_status_field_title">",
+ "value": "${memberInfo.onlineStatus.key}",
+ "inline": "true"
+ },
+ {
+ "name": "<#include "userInfo_response_embed_joined_field_title">",
+ "value": "${formatDate(memberInfo.timeJoined, "yyyy-MM-dd HH:mm:ss")}",
+ "inline": "true"
+ },
+ {
+ "name": "<#include "userInfo_response_embed_registered_field_title">",
+ "value": "${formatDate(memberInfo.timeCreated, "yyyy-MM-dd HH:mm:ss")}",
+ "inline": "true"
+ }
+ <#if memberInfo.activities?size gt 0>
+ ,
+ {
+ "name": "<#include "userInfo_response_embed_activity_field_title">",
+ "value": "<#list memberInfo.activities as activity>${activity.type}<#sep>, #list>",
+ "inline": "true"
+ }
+ #if>
+ ]
+}
\ No newline at end of file
diff --git a/abstracto-modules/utility/src/main/resources/en_US/listener/embed/message_embed_embed_en_US.ftl b/abstracto-modules/utility/src/main/resources/en_US/listener/embed/message_embed_embed_en_US.ftl
new file mode 100644
index 00000000..c4e6d711
--- /dev/null
+++ b/abstracto-modules/utility/src/main/resources/en_US/listener/embed/message_embed_embed_en_US.ftl
@@ -0,0 +1,34 @@
+{
+ "author": {
+ "name": "${author.effectiveName}",
+ "avatar": "${author.user.effectiveAvatarUrl}"
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ },
+ <#if embeddedMessage.content?has_content || embeddedMessage.embeds?size gt 0>
+ "description": "${embeddedMessage.content}
+ <#list embeddedMessage.embeds>
+ <#include "message_embed_embed_embeds_name">:
+ <#items as embed>
+ <#include "message_embed_embed_description">: <#if embed.description?has_content >${embed.description}#if> <#if embed.imageUrl?has_content> <#include "message_embed_embed_image_url">: ${embed.imageUrl} #if>
+ #items>
+ #list>
+ ",
+ #if>
+ <#if embeddedMessage.attachmentUrls?size gt 0>
+ "imageUrl": "${embeddedMessage.attachmentUrls[0]}",
+ #if>
+ "fields": [
+ {
+ "name": "<#include "message_embed_embed_quoted_by_field_title">",
+ <#assign user>${embeddingUser.asMention}#assign>
+ <#assign channelName>${sourceChannel.name}#assign>
+ <#assign messageLink>${embeddedMessage.messageUrl}#assign>
+ "value": "<#include "message_embed_embed_quoted_by_field_value">"
+ }
+ ],
+ "timeStamp": "${embeddedMessage.timeCreated}"
+}
\ No newline at end of file
diff --git a/abstracto-modules/utility/src/main/resources/en_US/listener/starboard/starboard_post_embed_en_US.ftl b/abstracto-modules/utility/src/main/resources/en_US/listener/starboard/starboard_post_embed_en_US.ftl
new file mode 100644
index 00000000..4d7e7ad2
--- /dev/null
+++ b/abstracto-modules/utility/src/main/resources/en_US/listener/starboard/starboard_post_embed_en_US.ftl
@@ -0,0 +1,49 @@
+{
+ "author": {
+ <#if author?has_content>
+ "name": "${author.effectiveName}",
+ "avatar": "${author.user.effectiveAvatarUrl}"
+ <#else>
+ "name": "${user.id?c} (<#include "user_left_server">)"
+ #if>
+ },
+ "color" : {
+ "r": 200,
+ "g": 0,
+ "b": 255
+ }
+ <#if message.content?has_content || message.embeds?size gt 0>
+ ,"description": "${message.content}
+ <#list message.embeds>
+ <#include "starboard_post_embed_embeds_name">:
+ <#items as embed>
+ <#include "starboard_post_embed_description">: ${embed.description} <#if embed.imageUrl?has_content> <#include "starboard_post_embed_image_url">: ${embed.imageUrl} #if>
+ #items>
+ #list>
+ "
+ #if>
+ <#assign emote>${starLevelEmote}#assign>
+ <#assign count>${starCount}#assign>
+ <#assign messageId>${message.messageId?c}#assign>
+ <#if channel?has_content>
+ <#assign channelMention>${channel.asMention}#assign>
+ ,"additionalMessage": "<#include "starboard_post_embed_additional_message">"
+ <#else>
+ <#assign channelMention>${aChannel.id?c}#assign>
+ ,"additionalMessage": "<#include "starboard_post_embed_additional_message">"
+ #if>
+ <#if message.attachmentUrls?size gt 0>
+ ,"imageUrl": "${message.attachmentUrls[0]}"
+ #if>
+ ,"fields": [
+ {
+ "name": "<#include "starboard_post_embed_original_field_title">"
+ <#if channel?has_content>
+ ,"value": "[${channel.name}](${message.messageUrl})"
+ <#else>
+ ,"value": "[${aChannel.id?c}](${message.messageUrl})"
+ #if>
+ }
+ ],
+ "timeStamp": "${message.timeCreated}"
+}
\ No newline at end of file