Wolfizen

Custom MessageChannel Implementation [3/3]

Jan 11th, 2016
286
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.77 KB | None | 0 0
  1. import org.spongepowered.api.text.Text;
  2. import org.spongepowered.api.text.channel.MessageReceiver;
  3.  
  4. import javax.annotation.Nullable;
  5. import java.util.*;
  6. import java.util.function.Supplier;
  7. import java.util.stream.Collectors;
  8. import java.util.stream.Stream;
  9. import java.util.stream.StreamSupport;
  10.  
  11. public class TextChannel implements MessageChannel<MessageReceiver,Text>, MessageReceiver {
  12.  
  13.     // Static
  14.  
  15.     public static final TextChannel TO_NONE = new TextChannel(Stream::of);
  16.  
  17.     public static TextChannel.Mutable from(MessageReceiver... recipients) {
  18.         return fromCollection(Arrays.asList(recipients));
  19.     }
  20.  
  21.     public static <I extends MessageReceiver> TextChannel.Mutable fromCollection(Collection<I> recipients) {
  22.         Set<MessageReceiver> recipientsSet = Collections.newSetFromMap(new WeakHashMap<>());
  23.         recipientsSet.addAll(recipients);
  24.         return new TextChannel.Mutable(recipientsSet);
  25.     }
  26.  
  27.     public static <I extends MessageReceiver> TextChannel fromIterable(Supplier<Iterable<I>> iterableSupplier) {
  28.         return fromStream(() -> StreamSupport.stream(iterableSupplier.get().spliterator(), false));
  29.     }
  30.  
  31.     public static TextChannel.SpongeWrapper fromSpongeChannel(org.spongepowered.api.text.channel.MessageChannel spongeMessageChannel) {
  32.         return new TextChannel.SpongeWrapper(spongeMessageChannel);
  33.     }
  34.  
  35.     public static <I extends MessageReceiver> TextChannel fromStream(Supplier<Stream<I>> streamSupplier) {
  36.         return new TextChannel(streamSupplier);
  37.     }
  38.  
  39.     // Class
  40.  
  41.     private final Supplier<Stream<MessageReceiver>> recipientsSupplier;
  42.     private TextChannel.SpongeUnwrapper wrapperMessageChannel = null;
  43.  
  44.     @SuppressWarnings("unchecked") // Cast is safe
  45.     protected <I extends MessageReceiver> TextChannel(@Nullable  Supplier<Stream<I>> recipientsSupplier) {
  46.         this.recipientsSupplier = recipientsSupplier == null ? Stream::of : (Supplier<Stream<MessageReceiver>>) (Supplier<?>) recipientsSupplier;
  47.     }
  48.  
  49.     /**
  50.      * Converts this TextChannel into a SpongeAPI {@link org.spongepowered.api.text.channel.MessageChannel MessageChannel} for use in the Sponge ecosystem.
  51.      *
  52.      * @return A MessageChannel described by this TextChannel
  53.      */
  54.     @Override
  55.     public org.spongepowered.api.text.channel.MessageChannel getMessageChannel() {
  56.         // Create the subclass on-demand, save object for future use.
  57.         if (wrapperMessageChannel == null) wrapperMessageChannel = new TextChannel.SpongeUnwrapper(this);
  58.         return wrapperMessageChannel;
  59.     }
  60.  
  61.     @Override
  62.     public Stream<MessageReceiver> getRecipients() {
  63.         return recipientsSupplier.get();
  64.     }
  65.  
  66.     @Override
  67.     public void sendMessage(Text message) {
  68.         send(message);
  69.     }
  70.  
  71.     @Override
  72.     public void sendTo(MessageReceiver recipient, Text message) {
  73.         // Basic loop prevention
  74.         if (recipient != this) recipient.sendMessage(message);
  75.     }
  76.  
  77.     @Override
  78.     public void setMessageChannel(org.spongepowered.api.text.channel.MessageChannel channel) {
  79.         // Do nothing
  80.     }
  81.  
  82.     // Subclasses
  83.  
  84.     public static class Mutable extends TextChannel implements MutableMessageChannel<MessageReceiver,Text> {
  85.  
  86.         private final Collection<MessageReceiver> recipients;
  87.  
  88.         @SuppressWarnings("unchecked") // Cast is safe
  89.         protected <I extends MessageReceiver> Mutable(Collection<I> recipients) {
  90.             super(recipients::stream);
  91.             this.recipients = (Collection<MessageReceiver>) recipients;
  92.         }
  93.  
  94.         @Override
  95.         public boolean addRecipient(MessageReceiver recipient) {
  96.             return recipients.add(recipient);
  97.         }
  98.  
  99.         @Override
  100.         public void clearRecipients() {
  101.             recipients.clear();
  102.         }
  103.  
  104.         @Override
  105.         public boolean removeRecipient(MessageReceiver recipient) {
  106.             return recipients.remove(recipient);
  107.         }
  108.     }
  109.  
  110.     public static class SpongeWrapper extends TextChannel {
  111.  
  112.         private final org.spongepowered.api.text.channel.MessageChannel spongeMessageChannel;
  113.  
  114.         protected SpongeWrapper(org.spongepowered.api.text.channel.MessageChannel spongeMessageChannel) {
  115.             super(null);
  116.             this.spongeMessageChannel = spongeMessageChannel;
  117.         }
  118.  
  119.         @Override
  120.         public org.spongepowered.api.text.channel.MessageChannel getMessageChannel() {
  121.             return spongeMessageChannel;
  122.         }
  123.  
  124.         @Override
  125.         public Stream<MessageReceiver> getRecipients() {
  126.             return spongeMessageChannel.getMembers().stream();
  127.         }
  128.  
  129.         @Override
  130.         public Optional<Text> transformMessage(@Nullable Object sender, MessageReceiver recipient, Text originalMessage) {
  131.             return spongeMessageChannel.transformMessage(sender, recipient, originalMessage);
  132.         }
  133.     }
  134.  
  135.     public static class SpongeUnwapper implements org.spongepowered.api.text.channel.MessageChannel {
  136.  
  137.         private final TextChannel textChannel;
  138.  
  139.         protected SpongeUnwrapper(TextChannel textChannel) {
  140.             this.textChannel = textChannel;
  141.         }
  142.  
  143.         @Override
  144.         public Collection<MessageReceiver> getMembers() {
  145.             return textChannel.getRecipients().collect(Collectors.toList());
  146.         }
  147.  
  148.         @Override
  149.         public void send(Text original) {
  150.             textChannel.send(original);
  151.         }
  152.  
  153.         @Override
  154.         public void send(@Nullable Object sender, Text original) {
  155.             textChannel.send(sender, original);
  156.         }
  157.  
  158.         @Override
  159.         public Optional<Text> transformMessage(@Nullable Object sender, MessageReceiver recipient, Text original) {
  160.             return textChannel.transformMessage(sender, recipient, original);
  161.         }
  162.     }
  163. }
Advertisement
Add Comment
Please, Sign In to add comment