package tc.oc.api.bukkit.users; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.stream.Stream; import javax.annotation.Nullable; import javax.inject.Inject; import javax.inject.Singleton; import org.bukkit.entity.Player; import org.bukkit.event.EventBus; import tc.oc.api.bukkit.event.UserUpdateEvent; import tc.oc.api.bukkit.friends.OnlineFriends; import tc.oc.api.docs.User; import tc.oc.api.docs.UserId; import tc.oc.api.minecraft.users.UserStore; import tc.oc.api.users.UserService; import tc.oc.minecraft.scheduler.MainThreadExecutor; @Singleton public class BukkitUserStore extends UserStore<Player> implements OnlinePlayers, OnlineFriends { @Inject private EventBus eventBus; @Inject private MainThreadExecutor executor; @Inject private UserService userService; @Override protected void updateUser(tc.oc.minecraft.api.entity.Player player, @Nullable User before, @Nullable User after) { eventBus.callEvent(new UserUpdateEvent((Player) player, before, after), event -> super.updateUser(player, before, after)); } @Override public boolean areFriends(Player a, UserId b) { final User aUser = tryUser(a); return aUser != null && aUser.friends().contains(b); } @Override public boolean areFriends(Player a, Player b) { final User bUser = tryUser(b); return bUser != null && areFriends(a, bUser); } @Override public Stream<Player> onlineFriends(UserId userId) { return all().stream().filter(player -> areFriends(player, userId)); } @Override public Stream<Player> onlineFriends(Player player) { final User user = tryUser(player); return user == null ? Stream.empty() : onlineFriends(user); } public void refresh(final Collection<Player> players) { final Map<String, Player> idToKey = new HashMap<>(); for(Player player : players) { User user = tryUser(player); if(user != null) { idToKey.put(user._id(), player); } } if(idToKey.isEmpty()) return; executor.callback(userService.find(idToKey.keySet()), (result) -> { for(User user : result.documents()) { final Player player = idToKey.get(user._id()); if(player != null) { replaceUser(player, user); } } }); } }