-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
e15a4d5
commit 8ad7acc
Showing
17 changed files
with
513 additions
and
19 deletions.
There are no files selected for viewing
Submodule api
updated
6 files
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
50 changes: 50 additions & 0 deletions
50
impactor/src/main/java/net/impactdev/impactor/core/mail/ImpactorMailMessage.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
package net.impactdev.impactor.core.mail; | ||
|
||
import net.impactdev.impactor.api.mail.MailMessage; | ||
import net.kyori.adventure.text.Component; | ||
|
||
import java.time.Instant; | ||
import java.util.UUID; | ||
|
||
public class ImpactorMailMessage implements MailMessage { | ||
|
||
private final UUID uuid; | ||
private final Component message; | ||
private final Instant timestamp; | ||
private final UUID sender; | ||
|
||
public ImpactorMailMessage(UUID sender, Component message) { | ||
this.uuid = UUID.randomUUID(); | ||
this.message = message; | ||
this.sender = sender; | ||
this.timestamp = Instant.now(); | ||
} | ||
|
||
public ImpactorMailMessage(UUID uuid, UUID sender, Component message, Instant timestamp) { | ||
this.uuid = uuid; | ||
this.message = message; | ||
this.sender = sender; | ||
this.timestamp = timestamp; | ||
} | ||
|
||
@Override | ||
public Component content() { | ||
return this.message; | ||
} | ||
|
||
@Override | ||
public Instant timestamp() { | ||
return this.timestamp; | ||
} | ||
|
||
@Override | ||
public UUID uuid() { | ||
return this.uuid; | ||
} | ||
|
||
@Override | ||
public UUID sender() { | ||
return this.sender; | ||
} | ||
|
||
} |
56 changes: 56 additions & 0 deletions
56
impactor/src/main/java/net/impactdev/impactor/core/mail/ImpactorMailService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
package net.impactdev.impactor.core.mail; | ||
|
||
import com.github.benmanes.caffeine.cache.Cache; | ||
import com.github.benmanes.caffeine.cache.Caffeine; | ||
import net.impactdev.impactor.api.configuration.Config; | ||
import net.impactdev.impactor.api.mail.MailMessage; | ||
import net.impactdev.impactor.api.mail.MailService; | ||
import net.impactdev.impactor.api.mail.Mailbox; | ||
import net.impactdev.impactor.api.storage.StorageType; | ||
import net.impactdev.impactor.core.economy.EconomyConfig; | ||
import net.impactdev.impactor.core.mail.storage.MailStorage; | ||
import net.impactdev.impactor.core.mail.storage.MailStorageFactory; | ||
import net.impactdev.impactor.core.plugin.BaseImpactorPlugin; | ||
import net.kyori.adventure.text.Component; | ||
|
||
import java.util.UUID; | ||
import java.util.concurrent.CompletableFuture; | ||
|
||
public final class ImpactorMailService implements MailService { | ||
|
||
private final Config config; | ||
private final MailStorage storage; | ||
|
||
ImpactorMailService() { | ||
this.config = Config.builder() | ||
.path(BaseImpactorPlugin.instance().configurationDirectory().resolve("mail.conf")) | ||
.provider(EconomyConfig.class) | ||
.provideIfMissing(() -> BaseImpactorPlugin.instance().resource(root -> root.resolve("configs").resolve("mail.conf"))) | ||
.build(); | ||
|
||
this.storage = MailStorageFactory.instance( | ||
BaseImpactorPlugin.instance(), | ||
this.config.get(MailConfig.STORAGE_TYPE), | ||
StorageType.JSON | ||
); | ||
} | ||
|
||
@Override | ||
public CompletableFuture<Mailbox> mailbox(UUID target) { | ||
return this.storage.fetch(target); | ||
} | ||
|
||
@Override | ||
public CompletableFuture<Void> send(UUID from, UUID to, Component message) { | ||
return this.mailbox(to).thenAccept(mailbox -> { | ||
MailMessage mail = new ImpactorMailMessage(from, message); | ||
mailbox.append(mail); | ||
}); | ||
|
||
} | ||
|
||
@Override | ||
public String name() { | ||
return "Impactor Mail Service"; | ||
} | ||
} |
57 changes: 57 additions & 0 deletions
57
impactor/src/main/java/net/impactdev/impactor/core/mail/ImpactorMailbox.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
package net.impactdev.impactor.core.mail; | ||
|
||
import com.google.common.collect.Lists; | ||
import net.impactdev.impactor.api.mail.MailMessage; | ||
import net.impactdev.impactor.api.mail.Mailbox; | ||
import net.impactdev.impactor.api.mail.filters.MailFilter; | ||
|
||
import java.util.List; | ||
import java.util.Set; | ||
import java.util.concurrent.CompletableFuture; | ||
import java.util.concurrent.TimeUnit; | ||
import java.util.stream.Collectors; | ||
import java.util.stream.Stream; | ||
|
||
public final class ImpactorMailbox implements Mailbox { | ||
|
||
private final List<MailMessage> messages = Lists.newCopyOnWriteArrayList(); | ||
|
||
public ImpactorMailbox(List<MailMessage> messages) { | ||
this.messages.addAll(messages); | ||
} | ||
|
||
@Override | ||
public Set<MailMessage> mail(MailFilter... filters) { | ||
Stream<MailMessage> stream = this.messages.stream(); | ||
for(MailFilter filter : filters) { | ||
stream = stream.filter(filter); | ||
} | ||
|
||
return stream.collect(Collectors.toUnmodifiableSet()); | ||
} | ||
|
||
@Override | ||
public CompletableFuture<Boolean> append(MailMessage message) { | ||
return CompletableFuture.supplyAsync(() -> { | ||
this.messages.add(message); | ||
|
||
return true; | ||
}).orTimeout(5, TimeUnit.SECONDS); | ||
} | ||
|
||
@Override | ||
public CompletableFuture<Boolean> remove(MailMessage message) { | ||
return CompletableFuture.completedFuture(false); | ||
} | ||
|
||
@Override | ||
public CompletableFuture<Boolean> removeIf(MailFilter... filters) { | ||
return CompletableFuture.completedFuture(false); | ||
} | ||
|
||
@Override | ||
public CompletableFuture<Boolean> clear() { | ||
return CompletableFuture.completedFuture(false); | ||
} | ||
|
||
} |
14 changes: 14 additions & 0 deletions
14
impactor/src/main/java/net/impactdev/impactor/core/mail/MailConfig.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package net.impactdev.impactor.core.mail; | ||
|
||
import net.impactdev.impactor.api.configuration.key.ConfigKey; | ||
import net.impactdev.impactor.api.storage.StorageType; | ||
|
||
import static net.impactdev.impactor.api.configuration.key.ConfigKeyFactory.key; | ||
|
||
public final class MailConfig { | ||
|
||
public static final ConfigKey<StorageType> STORAGE_TYPE = key(adapter -> | ||
StorageType.parse(adapter.getString("storage-method", "json")) | ||
); | ||
|
||
} |
13 changes: 13 additions & 0 deletions
13
impactor/src/main/java/net/impactdev/impactor/core/mail/MailModule.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package net.impactdev.impactor.core.mail; | ||
|
||
import net.impactdev.impactor.api.mail.MailService; | ||
import net.impactdev.impactor.api.providers.ServiceProvider; | ||
import net.impactdev.impactor.core.modules.ImpactorModule; | ||
|
||
public final class MailModule implements ImpactorModule { | ||
|
||
@Override | ||
public void services(ServiceProvider provider) { | ||
provider.register(MailService.class, new ImpactorMailService()); | ||
} | ||
} |
86 changes: 86 additions & 0 deletions
86
impactor/src/main/java/net/impactdev/impactor/core/mail/storage/MailStorage.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
package net.impactdev.impactor.core.mail.storage; | ||
|
||
import com.github.benmanes.caffeine.cache.AsyncLoadingCache; | ||
import com.github.benmanes.caffeine.cache.Caffeine; | ||
import net.impactdev.impactor.api.Impactor; | ||
import net.impactdev.impactor.api.mail.MailMessage; | ||
import net.impactdev.impactor.api.mail.Mailbox; | ||
import net.impactdev.impactor.api.storage.Storage; | ||
import net.impactdev.impactor.api.utility.ExceptionPrinter; | ||
import net.impactdev.impactor.api.utility.printing.PrettyPrinter; | ||
import net.impactdev.impactor.core.plugin.BaseImpactorPlugin; | ||
import net.impactdev.impactor.core.utility.future.ThrowingRunnable; | ||
import net.impactdev.impactor.core.utility.future.ThrowingSupplier; | ||
|
||
import java.util.UUID; | ||
import java.util.concurrent.CompletableFuture; | ||
import java.util.concurrent.CompletionException; | ||
import java.util.concurrent.TimeUnit; | ||
|
||
public final class MailStorage implements Storage { | ||
|
||
private final MailStorageImplementation implementation; | ||
private final AsyncLoadingCache<UUID, Mailbox> mailboxes; | ||
|
||
MailStorage(MailStorageImplementation implementation) { | ||
this.implementation = implementation; | ||
this.mailboxes = Caffeine.newBuilder() | ||
.expireAfterAccess(1, TimeUnit.HOURS) | ||
.buildAsync(this.implementation::fetch); | ||
} | ||
|
||
@Override | ||
public void init() throws Exception { | ||
this.implementation.init(); | ||
} | ||
|
||
@Override | ||
public void shutdown() throws Exception { | ||
this.implementation.shutdown(); | ||
} | ||
|
||
@Override | ||
public CompletableFuture<Void> meta(PrettyPrinter printer) { | ||
return run(() -> this.implementation.meta(printer)).orTimeout(5, TimeUnit.SECONDS); | ||
} | ||
|
||
public CompletableFuture<Mailbox> fetch(UUID target) { | ||
return this.mailboxes.get(target); | ||
} | ||
|
||
public CompletableFuture<Void> save(UUID target, MailMessage message) { | ||
return run(() -> this.implementation.save(target, message)).thenAccept(ignore -> this.mailboxes.synchronous().invalidate(target)); | ||
} | ||
|
||
public CompletableFuture<Void> remove(UUID target, UUID message) { | ||
return run(() -> this.implementation.remove(target, message)).thenAccept(ignore -> this.mailboxes.synchronous().invalidate(target)); | ||
} | ||
|
||
private static CompletableFuture<Void> run(ThrowingRunnable runnable) { | ||
return CompletableFuture.runAsync(() -> { | ||
try { | ||
runnable.run(); | ||
} catch (Exception e) { | ||
ExceptionPrinter.print(BaseImpactorPlugin.instance().logger(), e); | ||
if (e instanceof RuntimeException) { | ||
throw (RuntimeException) e; | ||
} | ||
throw new CompletionException(e); | ||
} | ||
}, Impactor.instance().scheduler().async()); | ||
} | ||
|
||
private static <T> CompletableFuture<T> supply(ThrowingSupplier<T> supplier) { | ||
return CompletableFuture.supplyAsync(() -> { | ||
try { | ||
return supplier.supply(); | ||
} catch (Exception e) { | ||
ExceptionPrinter.print(BaseImpactorPlugin.instance().logger(), e); | ||
if (e instanceof RuntimeException) { | ||
throw (RuntimeException) e; | ||
} | ||
throw new CompletionException(e); | ||
} | ||
}, Impactor.instance().scheduler().async()); | ||
} | ||
} |
Oops, something went wrong.