Skip to content

Commit bd53040

Browse files
tnoctuagniftygnome
authored andcommitted
Add Feature: Mail-To Contacts
This commit adds support for contacting authors/contributors by email if they have added their contact information in accordance with the fabric.mod.json specification. If an entry has contact information and if that contact information contains an email address, an email emoticon will be displayed next to their name in the menu. Clicking a line with an email emoticon will prompt to open a mailto:address link. - Add Feature: Mail-To Contacts
1 parent 8ac0658 commit bd53040

5 files changed

Lines changed: 66 additions & 2 deletions

File tree

src/main/java/com/terraformersmc/modmenu/gui/widget/DescriptionListWidget.java

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.terraformersmc.modmenu.config.ModMenuConfig;
55
import com.terraformersmc.modmenu.gui.ModsScreen;
66
import com.terraformersmc.modmenu.util.mod.Mod;
7+
import net.fabricmc.loader.api.metadata.ContactInformation;
78
import net.minecraft.client.MinecraftClient;
89
import net.minecraft.client.font.TextRenderer;
910
import net.minecraft.client.gui.Click;
@@ -242,7 +243,12 @@ private void rebuildUI() {
242243
indent = 16;
243244

244245
for (var line : textRenderer.wrapLines(Text.literal(contributor), wrapWidth - 24)) {
245-
this.addEntry(new DescriptionEntry(line, indent));
246+
ContactInformation contact = mod.getContact(contributor);
247+
if (contact != null && contact.get("email").isPresent()) {
248+
this.addEntry(new MailableContactEntry(line, contact.get("email").get(), indent));
249+
} else {
250+
this.addEntry(new DescriptionEntry(line, indent));
251+
}
246252
indent = 24;
247253
}
248254
}
@@ -392,4 +398,37 @@ public boolean mouseClicked(Click click, boolean doubleClick) {
392398
return super.mouseClicked(click, doubleClick);
393399
}
394400
}
401+
402+
protected class MailableContactEntry extends DescriptionEntry {
403+
private final String email;
404+
405+
public MailableContactEntry(OrderedText text, String email, int indent) {
406+
super(text, indent);
407+
this.email = email;
408+
}
409+
410+
public MailableContactEntry(OrderedText text, String link) {
411+
this(text, link, 0);
412+
}
413+
414+
@Override
415+
public void render(DrawContext drawContext, int mouseX, int mouseY, boolean isSelected, float delta) {
416+
super.render(drawContext, mouseX, mouseY, isSelected, delta);
417+
drawContext.drawTextWithShadow(textRenderer, Text.literal(" ").append(Text.literal("✉")), this.getContentX() + indent + textRenderer.getWidth(text) + 1, this.getContentY(), 0xFFAAAAAA);
418+
}
419+
420+
@Override
421+
public boolean mouseClicked(Click click, boolean doubled) {
422+
if (isMouseOver(click.x(), click.y())) {
423+
client.setScreen(new ConfirmLinkScreen((open) -> {
424+
if (open) {
425+
Util.getOperatingSystem().open("mailto:" + email);
426+
}
427+
client.setScreen(parent);
428+
}, "mailto:" + email, false));
429+
}
430+
431+
return super.mouseClicked(click, doubled);
432+
}
433+
}
395434
}

src/main/java/com/terraformersmc/modmenu/util/mod/Mod.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.terraformersmc.modmenu.config.ModMenuConfig;
88
import com.terraformersmc.modmenu.util.mod.fabric.FabricIconHandler;
99
import eu.pb4.placeholders.api.ParserContext;
10+
import net.fabricmc.loader.api.metadata.ContactInformation;
1011
import net.minecraft.client.resource.language.I18n;
1112
import net.minecraft.client.texture.NativeImageBackedTexture;
1213
import net.minecraft.text.Text;
@@ -80,6 +81,8 @@ default Text getFormattedDescription() {
8081

8182
@NotNull List<String> getAuthors();
8283

84+
ContactInformation getContact(String author);
85+
8386
/**
8487
* @return a mapping of contributors to their roles.
8588
*/

src/main/java/com/terraformersmc/modmenu/util/mod/fabric/FabricDummyParentMod.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.terraformersmc.modmenu.util.mod.Mod;
88
import net.fabricmc.loader.api.FabricLoader;
99
import net.fabricmc.loader.api.ModContainer;
10+
import net.fabricmc.loader.api.metadata.ContactInformation;
1011
import net.minecraft.client.texture.NativeImageBackedTexture;
1112
import org.jetbrains.annotations.NotNull;
1213
import org.jetbrains.annotations.Nullable;
@@ -94,6 +95,11 @@ public FabricDummyParentMod(FabricMod host, String id) {
9495
}
9596

9697
@Override
98+
public ContactInformation getContact(String author) {
99+
return null;
100+
}
101+
102+
@Override
97103
public @NotNull Map<String, Collection<String>> getContributors() {
98104
return Map.of();
99105
}

src/main/java/com/terraformersmc/modmenu/util/mod/fabric/FabricMod.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,21 @@ public FabricMod(ModContainer modContainer, Set<String> modpackMods) {
237237
return authors;
238238
}
239239

240+
@Override
241+
public ContactInformation getContact(String author) {
242+
for (Person person : metadata.getAuthors()) {
243+
if (person.getName().equals(author)) {
244+
return person.getContact();
245+
}
246+
}
247+
for (Person person : metadata.getContributors()) {
248+
if (person.getName().equals(author)) {
249+
return person.getContact();
250+
}
251+
}
252+
return null;
253+
}
254+
240255
@Override
241256
public @NotNull Map<String, Collection<String>> getContributors() {
242257
var contributors = new LinkedHashMap<String, Collection<String>>();

src/main/resources/fabric.mod.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,8 @@
9999
"Pyrrha",
100100
"sakura-ryoko",
101101
"gniftygnome",
102-
"lowercasebtw"
102+
"lowercasebtw",
103+
"tnoctua"
103104
],
104105
"description": "Adds a mod menu to view the list of mods you have installed.",
105106
"mixins": [

0 commit comments

Comments
 (0)