Giter VIP home page Giter VIP logo

lushrewards's People

Contributors

gitsentinel avatar oaklaptop avatar oakloaf avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

lushrewards's Issues

error in use /rewards

it happened in the lastest version(2.1.5 beta) for all players
and it also happened on some players(not everyon) in 2.1.4

<[01:45:00 INFO]: BallkingCN issued server command: /rewards
�[01:45:00 ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'rewards' in plugin ActivityRewarder v2.1.5-BETA
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:47) ~[kaiiju-api-1.20.1-R0.1-SNAPSHOT.jar:?]
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:155) ~[kaiiju-api-1.20.1-R0.1-SNAPSHOT.jar:?]
at org.bukkit.craftbukkit.v1_20_R1.CraftServer.dispatchCommand(CraftServer.java:1048) ~[kaiiju-1.20.1.jar:git-Kaiiju-"c2b7aec"]
at org.bukkit.craftbukkit.v1_20_R1.command.BukkitCommandWrapper.run(BukkitCommandWrapper.java:64) ~[kaiiju-1.20.1.jar:git-Kaiiju-"c2b7aec"]
at com.mojang.brigadier.CommandDispatcher.execute(CommandDispatcher.java:265) ~[kaiiju-1.20.1.jar:?]
at net.minecraft.commands.Commands.performCommand(Commands.java:324) ~[?:?]
at net.minecraft.commands.Commands.performCommand(Commands.java:308) ~[?:?]
at net.minecraft.server.network.ServerGamePacketListenerImpl.performChatCommand(ServerGamePacketListenerImpl.java:2405) ~[?:?]
at net.minecraft.server.network.ServerGamePacketListenerImpl.lambda$handleChatCommand$17(ServerGamePacketListenerImpl.java:2365) ~[?:?]
at io.papermc.paper.threadedregions.EntityScheduler.executeTick(EntityScheduler.java:173) ~[kaiiju-1.20.1.jar:git-Kaiiju-"c2b7aec"]
at net.minecraft.server.MinecraftServer.tickServer(MinecraftServer.java:1523) ~[kaiiju-1.20.1.jar:git-Kaiiju-"c2b7aec"]
at io.papermc.paper.threadedregions.TickRegions$ConcreteRegionTickHandle.tickRegion(TickRegions.java:360) ~[kaiiju-1.20.1.jar:git-Kaiiju-"c2b7aec"]
at io.papermc.paper.threadedregions.TickRegionScheduler$RegionScheduleHandle.runTick(TickRegionScheduler.java:385) ~[kaiiju-1.20.1.jar:git-Kaiiju-"c2b7aec"]
at ca.spottedleaf.concurrentutil.scheduler.SchedulerThreadPool$TickThreadRunner.run(SchedulerThreadPool.java:525) ~[kaiiju-1.20.1.jar:git-Kaiiju-"c2b7aec"]
at java.lang.Thread.run(Thread.java:833) ~[?:?]
Caused by: com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 27 path $.textures.skin.url
at com.google.gson.internal.Streams.parse(Streams.java:61) ~[gson-2.10.jar:?]
at com.google.gson.JsonParser.parseReader(JsonParser.java:102) ~[gson-2.10.jar:?]
at com.google.gson.JsonParser.parseReader(JsonParser.java:70) ~[gson-2.10.jar:?]
at com.google.gson.JsonParser.parseString(JsonParser.java:51) ~[gson-2.10.jar:?]
at me.dave.activityrewarder.utils.skullcreator.NewSkullCreator.getUrlFromBase64(NewSkullCreator.java:82) ~[ActivityRewarder-2.1.5-BETA.jar:?]
at me.dave.activityrewarder.utils.skullcreator.NewSkullCreator.makeProfile(NewSkullCreator.java:71) ~[ActivityRewarder-2.1.5-BETA.jar:?]
at me.dave.activityrewarder.utils.skullcreator.NewSkullCreator.mutateItemMeta(NewSkullCreator.java:34) ~[ActivityRewarder-2.1.5-BETA.jar:?]
at me.dave.activityrewarder.utils.SimpleItemStack.getItemStack(SimpleItemStack.java:171) ~[ActivityRewarder-2.1.5-BETA.jar:?]
at me.dave.activityrewarder.module.dailyrewards.DailyRewardsGui.lambda$recalculateContents$5(DailyRewardsGui.java:274) ~[ActivityRewarder-2.1.5-BETA.jar:?]
at java.lang.Iterable.forEach(Iterable.java:75) ~[?:?]
at me.dave.activityrewarder.module.dailyrewards.DailyRewardsGui.recalculateContents(DailyRewardsGui.java:265) ~[ActivityRewarder-2.1.5-BETA.jar:?]
at me.dave.activityrewarder.gui.abstracts.AbstractGui.openInventory(AbstractGui.java:86) ~[ActivityRewarder-2.1.5-BETA.jar:?]
at me.dave.activityrewarder.commands.RewardCmd.onCommand(RewardCmd.java:400) ~[ActivityRewarder-2.1.5-BETA.jar:?]
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[kaiiju-api-1.20.1-R0.1-SNAPSHOT.jar:?]
... 14 more
Caused by: com.google.gson.stream.MalformedJsonException: Unterminated object at line 1 column 27 path $.textures.skin.url
at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1657) ~[gson-2.10.jar:?]
at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:500) ~[gson-2.10.jar:?]
at com.google.gson.stream.JsonReader.hasNext(JsonReader.java:422) ~[gson-2.10.jar:?]
at com.google.gson.internal.bind.TypeAdapters$28.read(TypeAdapters.java:779) ~[gson-2.10.jar:?]
at com.google.gson.internal.bind.TypeAdapters$28.read(TypeAdapters.java:725) ~[gson-2.10.jar:?]
at com.google.gson.internal.Streams.parse(Streams.java:49) ~[gson-2.10.jar:?]
at com.google.gson.JsonParser.parseReader(JsonParser.java:102) ~[gson-2.10.jar:?]
at com.google.gson.JsonParser.parseReader(JsonParser.java:70) ~[gson-2.10.jar:?]
at com.google.gson.JsonParser.parseString(JsonParser.java:51) ~[gson-2.10.jar:?]
at me.dave.activityrewarder.utils.skullcreator.NewSkullCreator.getUrlFromBase64(NewSkullCreator.java:82) ~[ActivityRewarder-2.1.5-BETA.jar:?]
at me.dave.activityrewarder.utils.skullcreator.NewSkullCreator.makeProfile(NewSkullCreator.java:71) ~[ActivityRewarder-2.1.5-BETA.jar:?]
at me.dave.activityrewarder.utils.skullcreator.NewSkullCreator.mutateItemMeta(NewSkullCreator.java:34) ~[ActivityRewarder-2.1.5-BETA.jar:?]
at me.dave.activityrewarder.utils.SimpleItemStack.getItemStack(SimpleItemStack.java:171) ~[ActivityRewarder-2.1.5-BETA.jar:?]
at me.dave.activityrewarder.module.dailyrewards.DailyRewardsGui.lambda$recalculateContents$5(DailyRewardsGui.java:274) ~[ActivityRewarder-2.1.5-BETA.jar:?]
at java.lang.Iterable.forEach(Iterable.java:75) ~[?:?]
at me.dave.activityrewarder.module.dailyrewards.DailyRewardsGui.recalculateContents(DailyRewardsGui.java:265) ~[ActivityRewarder-2.1.5-BETA.jar:?]
at me.dave.activityrewarder.gui.abstracts.AbstractGui.openInventory(AbstractGui.java:86) ~[ActivityRewarder-2.1.5-BETA.jar:?]
at me.dave.activityrewarder.commands.RewardCmd.onCommand(RewardCmd.java:400) ~[ActivityRewarder-2.1.5-BETA.jar:?]
at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[kaiiju-api-1.20.1-R0.1-SNAPSHOT.jar:?]
... 14 more

[ADD]: Create a README.md

The repo is missing a README.md file. I want to work on the README file as a part of the Modtoberfest. Kindly assign this issue to me.

Activity Rewarded disable another plugin LibertyBans for "boolean org.bukkit.Server.isGlobalTickThread()"

Hi, after update ActivityRewarded to recoded version and restart my server i receive that message from console when the plugin is enable

java.lang.NoSuchMethodError: 'boolean org.bukkit.Server.isGlobalTickThread()' at space.arim.morepaperlib.scheduling.GracefulScheduling.isOnGlobalRegionThread(GracefulScheduling.java:146) ~[ActivityRewarder-2.0.2.jar:?] at space.arim.api.env.bukkit.BukkitFactoryOfTheFutureImpl.isPrimaryThread0(BukkitFactoryOfTheFutureImpl.java:59) ~[LibertyBans-ClassLoader:?] at space.arim.api.env.concurrent.MainThreadCachingFutureFactory.isPrimaryThread(MainThreadCachingFutureFactory.java:49) ~[LibertyBans-ClassLoader:?] at space.arim.api.env.bukkit.BukkitFactoryOfTheFutureImpl.create(BukkitFactoryOfTheFutureImpl.java:53) ~[LibertyBans-ClassLoader:?] at space.arim.api.env.bukkit.BukkitFactoryOfTheFuture.create(BukkitFactoryOfTheFuture.java:56) ~[LibertyBans-ClassLoader:?] at space.arim.api.env.bukkit.BukkitFactoryOfTheFuture.create(BukkitFactoryOfTheFuture.java:45) ~[LibertyBans-ClassLoader:?] at space.arim.api.env.bukkit.BukkitPlatformHandleImpl.createFuturesFactory(BukkitPlatformHandle.java:64) ~[LibertyBans-ClassLoader:?] at java.util.Optional.orElseGet(Optional.java:364) ~[?:?] at space.arim.libertybans.core.service.StandardAsynchronicityManager.startup(StandardAsynchronicityManager.java:90) ~[LibertyBans-ClassLoader:?] at space.arim.libertybans.core.LifecycleGodfather.startup0(LifecycleGodfather.java:75) ~[LibertyBans-ClassLoader:?] at space.arim.libertybans.core.AbstractBaseFoundation.timedEvent(AbstractBaseFoundation.java:126) ~[LibertyBans-ClassLoader:?] [09:36:33 INFO]: [LibertyBans] Disabling LibertyBans v1.1.0-RC1

And if disable ActivityRewarder LibertyBans work without a problem

ScreenShot with Activity Rewarded and LibertyBans
image
image
image

ScreenShot without ActivityRewarder
image
image

Thank you and have a nice day

Feature Request: about idle/afk.

The daily playtime goals module allows you to reward your players based on the amount of playtime they have on the server for a singular day this resets at the end of each day and does not include time that players are idle/afk.

it means the players wont be reward from there afk time but they still online in server

can you add an option on whether online time includes AFK time?

[Error] Upgrade version 2.0.4 to 2.1.4 and then occur error when issue command /rewards

Logs

[11:38:22] [Server thread/INFO]: test3 issued server command: /rewards
[11:38:22] [Server thread/ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'rewards' in plugin ActivityRewarder v2.1.4
	at org.bukkit.command.PluginCommand.execute(PluginCommand.java:47) ~[purpur-api-1.20.1-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:168) ~[purpur-api-1.20.1-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.craftbukkit.v1_20_R1.CraftServer.dispatchCommand(CraftServer.java:1001) ~[purpur-1.20.1.jar:git-Purpur-2062]
	at org.bukkit.craftbukkit.v1_20_R1.command.BukkitCommandWrapper.run(BukkitCommandWrapper.java:64) ~[purpur-1.20.1.jar:git-Purpur-2062]
	at com.mojang.brigadier.CommandDispatcher.execute(CommandDispatcher.java:265) ~[purpur-1.20.1.jar:?]
	at net.minecraft.commands.Commands.performCommand(Commands.java:332) ~[?:?]
	at net.minecraft.commands.Commands.performCommand(Commands.java:316) ~[?:?]
	at net.minecraft.server.network.ServerGamePacketListenerImpl.performChatCommand(ServerGamePacketListenerImpl.java:2447) ~[?:?]
	at net.minecraft.server.network.ServerGamePacketListenerImpl.lambda$handleChatCommand$22(ServerGamePacketListenerImpl.java:2407) ~[?:?]
	at net.minecraft.util.thread.BlockableEventLoop.lambda$submitAsync$0(BlockableEventLoop.java:59) ~[?:?]
	at java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1768) ~[?:?]
	at net.minecraft.server.TickTask.run(TickTask.java:18) ~[purpur-1.20.1.jar:git-Purpur-2062]
	at net.minecraft.util.thread.BlockableEventLoop.doRunTask(BlockableEventLoop.java:153) ~[?:?]
	at net.minecraft.util.thread.ReentrantBlockableEventLoop.doRunTask(ReentrantBlockableEventLoop.java:24) ~[?:?]
	at net.minecraft.server.MinecraftServer.doRunTask(MinecraftServer.java:1365) ~[purpur-1.20.1.jar:git-Purpur-2062]
	at net.minecraft.server.MinecraftServer.d(MinecraftServer.java:197) ~[purpur-1.20.1.jar:git-Purpur-2062]
	at net.minecraft.util.thread.BlockableEventLoop.pollTask(BlockableEventLoop.java:126) ~[?:?]
	at net.minecraft.server.MinecraftServer.pollTaskInternal(MinecraftServer.java:1342) ~[purpur-1.20.1.jar:git-Purpur-2062]
	at net.minecraft.server.MinecraftServer.pollTask(MinecraftServer.java:1335) ~[purpur-1.20.1.jar:git-Purpur-2062]
	at net.minecraft.util.thread.BlockableEventLoop.managedBlock(BlockableEventLoop.java:136) ~[?:?]
	at net.minecraft.server.MinecraftServer.waitUntilNextTick(MinecraftServer.java:1313) ~[purpur-1.20.1.jar:git-Purpur-2062]
	at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1201) ~[purpur-1.20.1.jar:git-Purpur-2062]
	at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:322) ~[purpur-1.20.1.jar:git-Purpur-2062]
	at java.lang.Thread.run(Thread.java:833) ~[?:?]
Caused by: java.lang.NullPointerException: Cannot invoke "String.length()" because "b64" is null
	at me.dave.activityrewarder.utils.skullcreator.NewSkullCreator.makeProfile(NewSkullCreator.java:60) ~[ActivityRewarder-2.1.4.jar:?]
	at me.dave.activityrewarder.utils.skullcreator.NewSkullCreator.mutateItemMeta(NewSkullCreator.java:35) ~[ActivityRewarder-2.1.4.jar:?]
	at me.dave.activityrewarder.utils.SimpleItemStack.getItemStack(SimpleItemStack.java:169) ~[ActivityRewarder-2.1.4.jar:?]
	at me.dave.activityrewarder.module.dailyrewards.DailyRewardsGui.lambda$recalculateContents$5(DailyRewardsGui.java:274) ~[ActivityRewarder-2.1.4.jar:?]
	at java.lang.Iterable.forEach(Iterable.java:75) ~[?:?]
	at me.dave.activityrewarder.module.dailyrewards.DailyRewardsGui.recalculateContents(DailyRewardsGui.java:265) ~[ActivityRewarder-2.1.4.jar:?]
	at me.dave.activityrewarder.gui.abstracts.AbstractGui.openInventory(AbstractGui.java:86) ~[ActivityRewarder-2.1.4.jar:?]
	at me.dave.activityrewarder.commands.RewardCmd.onCommand(RewardCmd.java:397) ~[ActivityRewarder-2.1.4.jar:?]
	at org.bukkit.command.PluginCommand.execute(PluginCommand.java:45) ~[purpur-api-1.20.1-R0.1-SNAPSHOT.jar:?]
	... 23 more

config.yml

# For more details on configuring ActivityRewarder check out the documentation at https://dave-12.gitbook.io/activity-rewarder

# Enable or disable specific ActivityRewarder modules
modules:
  daily-rewards: true
  daily-playtime-goals: true
  global-playtime-goals: false

# The length in seconds between reminders being sent (Set to -1 to disable)
reminder-period: 600
# The sound that will be played when a player is sent a reminder
reminder-sound: block_note_block_pling

# Display items for different reward categories
categories:
  small:
    material: player_head
    skull-texture: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYTAxYzYzYzIwM2ExODQxZGUyN2EwZTA5YTI5NWY1Yjg3MzM2MjcwMjRmMTY2OGEwMWQyMDE4NmEzZjg2MzA0MCJ9fX0=
  medium:
    material: player_head
    skull-texture: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjEwMzhjZGM4NDIzNGI1YWZiM2FlYTg1M2JmM2QwNTE3NWQxOWFlN2I0ODc1YTkxYjUyZjc2NmMwN2IzZGIwYiJ9fX0=
  large:
    material: player_head
    skull-texture: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjUyODdhZjk3ZjkzZDM3MTg5NzNmNGUxM2VkMGZhM2E2ZjQzOWU3MmMxNDVmZTRjZDkwMmIwNWMxYzEwYWYxOCJ9fX0=

# Display item templates
item-templates:
  # Template for default rewards
  default-reward:
    display-name: "&#A5B8FEDay %day%"
  # Template for collectable rewards
  redeemable-reward:
    material: player_head
    skull-texture: e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmI1N2Y0ODVlOWVjY2E1MzIzNDQ4NTBjNTFhYjQ0ZGQ2YWE1ZDQ1MTRiMzFjNmRmOWZjMjBlMzZiM2E4OWQ4YyJ9fX0=
    display-name: "&#f5e389Day %day% - Redeemable"
    enchanted: true
  # Template for collected rewards
  collected-reward:
    material: player_head
    skull-texture: e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZWZkNTEyY2NlNGU3OTUyOGI2MGIzNWRmZTZmN2JmYzg0M2IyOTY4NDIxMDViMWNkMjY4MjdiNTkwOGIxMzU0ZCJ9fX0=
    display-name: "&#f5e389Day %day% - Collected"
    enchanted: false
  # Template for missed rewards
  missed-reward:
    material: player_head
    skull-texture: e3RleHR1cmVzOntTS0lOOnt1cmw6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGRkMzBhYWMyYTFmMmQxOGM3NzU1Y2ZjYTJiYzYwOWZjMzkxZjQxOTg5YjA2NmNlOTMxNjA3NzY5MDZiZTg1YSJ9fX0=
    display-name: "&7Day %day% &8(Missed)"
  # Template for upcoming reward
  upcoming-reward:
    lore:
      - "&7&o- Upcoming reward"

  # Template for border items - more items can be created like this to be used within the gui templates
  '#':
    material: light_blue_stained_glass_pane
    display-name: "&7"
  'P':
    material: player_head
    display-name: "&#A5B8FE&lPlayer Info:"
    skull-texture: mirror
    lore:
      # - "&#c4f8ffDays: &f%rewarder_day_num%"
      - "&#c4f8ffCount Down: &f%rewarder_countdown%"
      - "&#c4f8ffStreak: &f%rewarder_streak%"
      - "&#c4f8ffHighest Streak: &f%rewarder_highest_streak%"

messages:
  prefix: "<gradient:#CEB5FE:#81BAFE><bold>Rewards</bold></gradient> &8» "
  reload: "&#b7faa2ActivityRewarder has been reloaded &#66b04f🔃"
  reminder: "%prefix% &#ffe27aIt looks like you haven't collected today's reward from &#ffc940/rewards"
  daily-reward-given: "&#b7faa2You have collected today's daily reward"
  daily-playtime-reward-given: "&#b7faa2You have collected your rewards for playing &#66b04f%minutes% &#b7faa2minutes"
  global-playtime-reward-given: "&#b7faa2You have collected your rewards for playing &#66b04f%minutes% &#b7faa2minutes"
  reset: "&#ffe27aAre you sure you want to reset &#e0c01b%target%'s &#ffe27adays? Type &#e0c01b'/rewards reset %target% confirm' &#ffe27ato confirm"
  reset-days: "&#ffe27aAre you sure you want to reset &#e0c01b%target%'s &#ffe27adays? Type &#e0c01b'/rewards reset-days %target% confirm' &#ffe27ato confirm"
  set-days: "&#ffe27aAre you sure you want to set &#e0c01b%target%'s &#ffe27adays? Type &#e0c01b'/rewards set-days %target% %day% confirm' &#ffe27ato confirm"
  set-days-confirm: "&#66b04f%target%'s &#b7faa2day number has been set to &#66b04f%day%"
  reset-streak: "&#ffe27aAre you sure you want to reset &#e0c01b%target%'s &#ffe27astreak? Type &#e0c01b'/rewards reset-streak %target% confirm' &#ffe27ato confirm"
  set-streak: "&#ffe27aAre you sure you want to set &#e0c01b%target%'s &#ffe27astreak? Type &#e0c01b'/rewards set-streak %target% %streak% confirm' &#ffe27ato confirm"
  set-streak-confirm: "&#66b04f%target%'s &#b7faa2streak has been set to &#66b04f%streak%"
  unknown-player: "&#ff6969Could not find &#d13636%player%"
  no-permissions: "&#ff6969Insufficient permissions"
  incorrect-usage: "&#ff6969Incorrect usage try &#d13636%command-usage%"

# Performance mode only stores rewards that are currently viewable to players.
# The config will automatically reload at the start of each day when enabled
enable-performance-mode: false

# Debug Modes: none, daily, playtime, all
debug-mode: none

maybe a error about daily-playtime-goals

There are no error reports. But the daily online reward doesn't seem to reset the next day, and it seems that my players only claimed it once and never claimed it a second time on next day

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.