GithubHelp home page GithubHelp logo

science-tools's Introduction

WHIMC-ScienceTools

GitHub release (latest by date)

ScienceTools is a Minecraft plugin to simulate values for scientific tools. This plugin uses WorldGuard to define regions in which to set scientific values. To set values, edit the config file.

Requires Java 11+


Building

Build the source with Maven:

$ mvn install

Configuration

The config file can be found under /plugins/WHIMC-ScienceTools/config.yml. Use /sciencetools reload whenever you change the config.

MySQL

In order to track the history of science tool usage, you have to connect to a SQL database.

Key Type Description
mysql.enabled boolean Whether to use a SQL database
mysql.host string The host of the database
mysql.port integer The port of the database
mysql.database string The name of the database to use
mysql.username string Username for credentials
mysql.password string Password for credentials

Example

mysql:
  enabled: true
  host: localhost
  port: 3306
  database: minecraft
  username: user
  password: pass

Messages

Messages can have either global or tool-specific scope. The global config messages should define all message types. Tool-specific config messages do not need to define all message types, and will default to the global messages config if an undefined message type is needed to display to the player.

Messages config will look like this:

messages:
  # The measure message to display
  measure-format: 
  # The numerical measure message to display
  numeric-measure-format: 
  # The disabled world message to display 
  disabled-in-world: 

Example for global config messages:

messages:
  measure-format: '{MEASUREMENT}'
  numeric-measure-format: 'The measured {TOOL} is {MEASUREMENT}{UNIT}'
  disabled-in-world: "We don't know how to measure that here"

Example for tool-specific config messages:

tools:
  ALTITUDE:
    display-name: "altitude"
    messages:
      disabled-in-world: "{TOOL} cannot be measured here"

Placeholders

Placeholder Description
{MEASUREMENT} The measurement of the tool at the player's position
{TOOL} The display name of the tool
{UNIT} The unit of the tool measurement

Unit Conversions

Unit conversions config will look like this:

conversions:
  # The name of the conversion 
  conversion_name:
    # The expression that will be used to convert the value
    expression: "{VAL} * 1.0"
    # The unit of the conversion
    unit: "unit"

Example:

conversions:
  fahrenheit: # Celsius -> Fahrenheit
    expression: "({VAL} * 9.0 / 5.0) + 32.0"
    unit: "°F"
  feet: # Meters -> Feet
    expression: "{VAL} * 3.28084"
    unit: "ft"

Placeholders

Placeholder Description
{VAL} The value that is being converted

Science Tools

A science tool can either be string-based or numeric. The default-measurement will determine this behavior. If the default-measurement is valid JavaScript syntax, the tool will be considered numeric. Numeric science tools have extra options for configuration.

String-based science tool example:

tools:
  # The tool key
  STRING_TOOL:
    # (optional: defaults to the tool key) A formatted version of the tool
    display-name: "String Tool"
    # The default fallback measurement to be used
    default-measurement: "Value"
    # (optional) World settings
    worlds:
      # Name of the world to configure
      WorldName:
        # (optional: Defaults to `default-expression`)
        #  The fallback measurement for this world
        global-measurement: "Value within worldName"
        # (optional) Region-specific measurements
        regions:
          region1: "Value within region1"
          region2: "Value within region2"
    # (optional) List of worlds where this tool cannot be measured
    disabled-worlds:
      - disabledWorld1
      - disabledWorld2

Numeric science tool example:

tools:
  NUMERIC_TOOL:
    display-name: "Numeric Tool"
    default-measurement: "1 + 1"
    
    # The following are for numeric science tools only!

    # The unit of the tool
    unit: "m"
    # The number of decimals to show in the printout
    precision: 4
    # A list of conversions that will be showed with the tool's printout
    conversions:
      - conversion_name

Region names are defined using WorldGuard.

Placeholders

Placeholder Description
{X} The player's current X position
{Y} The player's current Y position
{Z} The player's current Z position
{TIME_TICKS} The time of the world in ticks
{NIGHT} 0 if daytime, 1 otherwise
{WEATHER} 0 if the weather is clear, 1 otherwise
rand(min, max) A random decimal between min and max (inclusive)
randInt(min, max) A random integer between min and max (inclusive)
min(a, b) The minimum between a and b
max(a, b) The maximum between a and b
{<tool key>} The value from the given numeric tool

Validation

Validation config will look like this:

validation:
  # Amount of 'wiggle room' given when accepting answers
  tolerance: 10
  # time (in seconds) until timeout
  timeout: 30
  messages:
    prompt:
      all:
        - '&8> The message to send'
        - '&8> The next line of the message to send'
      TOOLNAME:
        - '&8> The message to send'
    timeout:
      all:
        - '&8> The message to send'
      TOOLNAME:
        - '&8> The message to send'
    no-number:
      all:
        - '&8> The message to send'
      TOOLNAME:
        - '&8> The message to send'
    found-number:
      all: []
    success:
      all:
        - '&8> The message to send'
      TOOLNAME:
        - '&8> The message to send'
    failure:
      all:
        - '&8> The message to send'
      TOOLNAME:
        - '&8> The message to send'
  commands:
    prompt:
      all: []
    timeout:
      all: []
    no-number:
      all: []
    found-number:
      all: []
    success:
      all: []
      TOOLNAME:
        - "The action"

Example Using Quests:

validation:
  tolerance: 1.0
  timeout: 30
  messages:
    prompt:
      all:
        - '&8>'
        - '&8> &7&lData Entry Computer &7&o(v2.0)'
        - '&8>'
        - '&8>   &7Current {TOOL}: &8Unknown'
        - '&8>'
        - '&8>   &7Please type the {TOOL} value you just measured:'
        - '&8>'
    timeout:
      all:
        - '&8>'
        - '&8> &7Computer left idle.'
        - '&8> &7Logging off... Goodbye!'
        - '&8>'
    no-number:
      all:
        - '&8> &cNo numbers detected!'
        - '&8> &7Click the computer to try again!'
    found-number:
      all: []
    success:
      all:
        - '&8> &7Value updated!'
        - '&8> &7Current {TOOL}: &a{VAL}{UNIT}'
    failure:
      all:
        - '&8> &e{VAL}{UNIT}&7 does not match the range of possible data.'
        - '&8> &7Click the computer to try again!'
      TEMPERATURE:
        - "&8>   &7If you're stuck, talk to &fMisavo&7 again!"
      PRESSURE:
        - "&8>   &7If you're stuck, talk to &fHarlem&7 again!"
      WIND:
        - "&8>   &7If you're stuck, talk to &fHuxley&7 again!"
      OXYGEN:
        - "&8>   &7If you're stuck, talk to &fOlivia&7 again!"
  commands:
    prompt:
      all: []
    timeout:
      all: []
    no-number:
      all: []
    found-number:
      all: []
    success:
      all: []
      ALTITUDE:
      - "questadmin nextstage {PLAYER} Ice on Fire!"
      TEMPERATURE:
      - "questadmin nextstage {PLAYER} What's Cooler Than Being Cool?"
      PRESSURE:
      - 'questadmin nextstage {PLAYER} Feeling the Pressure'
      WIND:
      - 'questadmin nextstage {PLAYER} Not-So-Solar-Wind'
      OXYGEN:
      - 'questadmin nextstage {PLAYER} A Breath of Fresh Air'
      RADIATION:
      - 'questadmin nextstage {PLAYER} Seas of Lava?'

Placeholders

Placeholder Description
{TOOL} The current science tool
{VAL} The provided value
{UNIT} The current science tool's units
{PLAYER} The target player

Commands

Command Description
/sciencetools Display command help
/sciencetools validate <tool> <player> Take the value of the tool at the target player's current location
/sciencetools validate <tool> <player> <world> <x> <y> <z> Take the value of the tool at the provided location
/sciencetools reload Reload the plugin's config
/sciencetools js Run interpreted JavaScript
/sciencetools measure <tool> Measure the given science tool
/sciencetools history <player> View the science tool usage history of a player

 

Using /sciencetools validate OXYGEN MyName when standing on LunarCrater (outdoors) on our server will open a data entry computer prompt in the chat that accepts a value (input by typing a number in the chat). It will want a value of 0.0% since the oxygen levels on the moon are at 0.0%.

Using /sciencetools validate PRESSURE MyName LunarCrater 40 22 37 on our server will open a data entry computer prompt in the chat that accepts a value (input by typing a number in the chat). It will want a value 101.30kPa since the specified coordinates are in a specific building with a different pressure than the outside (0kPa).


Dependencies

science-tools's People

Contributors

emicb avatar geph avatar gurmantoor avatar jackah2 avatar samhum avatar whimxiqal avatar

Watchers

 avatar  avatar  avatar

science-tools's Issues

Rework how validations are saved

Currently, validations are only specified by a science tool. To allow for further use, you should be able to create as many validations as you'd like with a unique name to identify them.

Language on computer input instructions

Change the language on the input computers to be more specific. For instance "Please type the Pressure value you just measured"
could become "Please press T and then type the Pressure value you just measured inside of the newly constructed building"

Players won't know "T" for type if they're new to Minecraft and will be more likely to succeed if they are reminded of where to take the measure.

Configurable precision of numbers

Currently, all numbers are trimmed to show two decimals. This number should be configurable per conversion to allow for units that are much smaller in magnitude.

Plugin documentation

README.md should be modified to contain more information about the plugin. For example, all commands with descriptions and all permissions.

Quests Module loading borked

Quests module loading errors:

11.10 14:17:49 [Server] ERROR Unable to load module from file: WHIMC-ScienceTools-2.4.2.jar
11.10 14:17:49 [Server] WARN java.lang.InstantiationException
11.10 14:17:49 [Server] WARN at java.base/jdk.internal.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:48)
11.10 14:17:49 [Server] WARN at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
11.10 14:17:49 [Server] WARN at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
11.10 14:17:49 [Server] WARN at Quests-4.0.8.jar//me.blackvein.quests.Quests.loadModule(Quests.java:977)
11.10 14:17:49 [Server] WARN at Quests-4.0.8.jar//me.blackvein.quests.Quests.loadModules(Quests.java:886)
11.10 14:17:49 [Server] WARN at Quests-4.0.8.jar//me.blackvein.quests.Quests.lambda$delayLoadQuestInfo$2(Quests.java:801)
11.10 14:17:49 [Server] WARN at org.bukkit.craftbukkit.v1_17_R1.scheduler.CraftTask.run(CraftTask.java:101)
11.10 14:17:49 [Server] WARN at org.bukkit.craftbukkit.v1_17_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:483)
11.10 14:17:49 [Server] WARN at net.minecraft.server.MinecraftServer.b(MinecraftServer.java:1559)
11.10 14:17:49 [Server] WARN at net.minecraft.server.dedicated.DedicatedServer.b(DedicatedServer.java:479)
11.10 14:17:49 [Server] WARN at net.minecraft.server.MinecraftServer.a(MinecraftServer.java:1475)
11.10 14:17:49 [Server] WARN at net.minecraft.server.MinecraftServer.x(MinecraftServer.java:1274)
11.10 14:17:49 [Server] WARN at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:319)
11.10 14:17:49 [Server] WARN at java.base/java.lang.Thread.run(Thread.java:831)
11.10 14:17:49 [Server] WARN Loaded class me.blackvein.quests.CustomObjective from WHIMC-ScienceTools v2.4.2 which is not a depend, softdepend or loadbefore of this plugin.
11.10 14:17:49 [Server] ERROR Unable to load module from file: WHIMC-Observations-2.4.6.jar, jar file is not a valid module!
11.10 14:17:49 [Server] WARN me.blackvein.quests.exceptions.QuestFormatException: Observation Objective custom objective not found for Stage 2, see quest of ID custom9
11.10 14:17:49 [Server] WARN at Quests-4.0.8.jar//me.blackvein.quests.Quests.loadCustomSections(Quests.java:3911)
11.10 14:17:49 [Server] WARN at Quests-4.0.8.jar//me.blackvein.quests.Quests.loadModules(Quests.java:909)
11.10 14:17:49 [Server] WARN at Quests-4.0.8.jar//me.blackvein.quests.Quests.lambda$delayLoadQuestInfo$2(Quests.java:801)
11.10 14:17:49 [Server] WARN at org.bukkit.craftbukkit.v1_17_R1.scheduler.CraftTask.run(CraftTask.java:101)
11.10 14:17:49 [Server] WARN at org.bukkit.craftbukkit.v1_17_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:483)
11.10 14:17:49 [Server] WARN at net.minecraft.server.MinecraftServer.b(MinecraftServer.java:1559)
11.10 14:17:49 [Server] WARN at net.minecraft.server.dedicated.DedicatedServer.b(DedicatedServer.java:479)
11.10 14:17:49 [Server] WARN at net.minecraft.server.MinecraftServer.a(MinecraftServer.java:1475)
11.10 14:17:49 [Server] WARN at net.minecraft.server.MinecraftServer.x(MinecraftServer.java:1274)
11.10 14:17:49 [Server] WARN at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:319)
11.10 14:17:49 [Server] WARN at java.base/java.lang.Thread.run(Thread.java:831)
11.10 14:17:49 [Server] WARN me.blackvein.quests.exceptions.QuestFormatException: Observation Objective custom objective not found for Stage 1, see quest of ID custom12
11.10 14:17:49 [Server] WARN at Quests-4.0.8.jar//me.blackvein.quests.Quests.loadCustomSections(Quests.java:3911)
11.10 14:17:49 [Server] WARN at Quests-4.0.8.jar//me.blackvein.quests.Quests.loadModules(Quests.java:909)
11.10 14:17:49 [Server] WARN at Quests-4.0.8.jar//me.blackvein.quests.Quests.lambda$delayLoadQuestInfo$2(Quests.java:801)
11.10 14:17:49 [Server] WARN at org.bukkit.craftbukkit.v1_17_R1.scheduler.CraftTask.run(CraftTask.java:101)
11.10 14:17:49 [Server] WARN at org.bukkit.craftbukkit.v1_17_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:483)
11.10 14:17:49 [Server] WARN at net.minecraft.server.MinecraftServer.b(MinecraftServer.java:1559)
11.10 14:17:49 [Server] WARN at net.minecraft.server.dedicated.DedicatedServer.b(DedicatedServer.java:479)
11.10 14:17:49 [Server] WARN at net.minecraft.server.MinecraftServer.a(MinecraftServer.java:1475)
11.10 14:17:49 [Server] WARN at net.minecraft.server.MinecraftServer.x(MinecraftServer.java:1274)
11.10 14:17:49 [Server] WARN at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:319)
11.10 14:17:49 [Server] WARN at java.base/java.lang.Thread.run(Thread.java:831)
11.10 14:17:49 [Server] WARN me.blackvein.quests.exceptions.QuestFormatException: Observation Objective custom objective not found for Stage 1, see quest of ID custom13
...

Record interactions

Relating to #2, record validations and tools into a database. Some of the actions may be retrievable through CoreProtect like commands.

Create {weather_clear} and {time_of_day} as variables for use in config file

Could be just simple variables so we can assign different temperatures by time, like
world:
mars:
default-measurement: ____
day: ____
night: ____

day: would be the max value reached by noon on a given world, and then night: would be the minimum reached at midnight; values would be something like (day - night / 12 hr or equivalent of time) * actual time.

Add prompt for input

Part of a quest could ask the user to answer a question. For now, there wouldn't be much (or any) validation for the response. The response should be recorded somewhere.

Number regex doesn't work

If you write a message with text before the number, it does not catch it. For example, I could type My altitude is 99m and it would not find a number match.

Ability to /investigate with a tool

Type /investigate then right-click on any given block to get information about it's material composition.

In the config file this would be something like all block types of a given type could be given data for this plugin, otherwise it says "unknown" or its default MC type value.

This could be expanded to be a debug_stick-like wand where blocks from far away could be selected for observation, such as the temperature of the lava on the surface of Cancri

Advanced variable determinations

Evaluate a space to see if it is oxygen tight (/pressurized or something?)

Game conditions that should modify variables

  • Weather - temperature, airflow, pressure
  • Time of day - temperature

Block conditions that modify variables

  • Being in or near lava, water - temperature, pressure
  • Under blocks - radiation, temperature
  • Being near light sources - temperature

Variables that influence one another

  • Planet size/density ⇔ atmosphere, pressure, gravity
  • Wind ⇔ temperature, pressure
  • Altitude ⇔ temperature, pressure, radiation

Make messages configurable

Things to make configurable:

  • Measuring format
  • World disabled message
  • Anything else that makes sense to be configurable

Sciencetools config loading error

May have to do with compilation issue.

11.10 15:17:01 [Server] INFO Enabling WHIMC-ScienceTools v2.4.3
11.10 15:17:01 [Server] ERROR Cannot load configuration from stream
11.10 15:17:01 [Server] INFO org.bukkit.configuration.InvalidConfigurationException: while scanning a simple key
11.10 15:17:01 [Server] INFO in 'string', line 22, column 1:
11.10 15:17:01 [Server] INFO =======
11.10 15:17:01 [Server] INFO ^
11.10 15:17:01 [Server] INFO could not find expected ':'
11.10 15:17:01 [Server] INFO in 'string', line 23, column 9:
11.10 15:17:01 [Server] INFO unit: "°F"
11.10 15:17:01 [Server] INFO ^
11.10 15:17:01 [Server] INFO at org.bukkit.configuration.file.YamlConfiguration.loadFromString(YamlConfiguration.java:59) ~[patched_1.17.1.jar:git-Paper-249]
11.10 15:17:01 [Server] INFO at org.bukkit.configuration.file.FileConfiguration.load(FileConfiguration.java:160) ~[patched_1.17.1.jar:git-Paper-249]
...

Unit not displaying right on some tools

Tools affected (Chase figured out these so far, at least):
Wind (airflow)
Altitude
Atmosphere
Tectonic
Tides

Config file does have messages configured now and it still does it.

Make regions world-specific

WorldGuard regions are currently checked by name. Since regions are world-specific, the plugin should also require the world name to specify a region.

Current path (tools.TOOL.regions.REGION):

regions:
  example: 1

New proposed path (tools.TOOL.regions.WORLD.REGION):

regions:
  world:
    example: 1
  world_end:
    example: 5

Add new observable variables

/magnetic_field (strong, moderate, weak)
/gravity (relative to earth, use # units in G's)
/rotational_period or /day (number, on decimal unit is hours)
/orbital_period or /year (whole number, unit is days)
/planet_radius or /radius (whole number, km or miles)
/axis-tilt or /tilt (number, one decimal use ° for units)
/tides (empty string)

Atmospheric Makeup

The PBS Nova Lab really focuses on the atmospheric makeup of the explored exoplanets. The current structure of the plugin doesn't support this. Initially, we should have a separate command like /atmosphere that will display a customized message for the current world/region's makeup. Eventually, validation should be extended to support this. However, since this doesn't really fit into the structure of the plugin, it should just be a separate command with customizable JavaScript expressions for each chosen element.

SQL connection lag issue on 1.18.1

Appears to be happening in the context of when this bug is causing the server to lag badly

13.01 19:41:20 [Server] INFO Geph issued server command: /oxygen
13.01 19:41:20 [Server] WARN com.mysql.cj.jdbc.exceptions.CommunicationsException: The last packet successfully received from the server was 90,439,088 milliseconds ago. The last packet sent successfully to the server was 90,439,088 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
13.01 19:41:20 [Server] WARN at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
13.01 19:41:20 [Server] WARN at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
13.01 19:41:20 [Server] WARN at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
13.01 19:41:20 [Server] WARN at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1098)
13.01 19:41:20 [Server] WARN at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1046)
13.01 19:41:20 [Server] WARN at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1371)
13.01 19:41:20 [Server] WARN at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1031)
13.01 19:41:20 [Server] WARN at WHIMC-ScienceTools-2.4.5.jar//edu.whimc.sciencetools.utils.sql.Queryer.lambda$storeNewMeasurement$4(Queryer.java:115)
13.01 19:41:20 [Server] WARN at org.bukkit.craftbukkit.v1_18_R1.scheduler.CraftTask.run(CraftTask.java:101)
13.01 19:41:20 [Server] WARN at org.bukkit.craftbukkit.v1_18_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:57)
13.01 19:41:20 [Server] WARN at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22)
13.01 19:41:20 [Server] WARN at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
13.01 19:41:20 [Server] WARN at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
13.01 19:41:20 [Server] WARN at java.base/java.lang.Thread.run(Thread.java:833)
13.01 19:41:20 [Server] WARN Caused by: com.mysql.cj.exceptions.CJCommunicationsException: The last packet successfully received from the server was 90,439,088 milliseconds ago. The last packet sent successfully to the server was 90,439,088 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
13.01 19:41:20 [Server] WARN at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
13.01 19:41:20 [Server] WARN at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
13.01 19:41:20 [Server] WARN at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
13.01 19:41:20 [Server] WARN at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
13.01 19:41:20 [Server] WARN at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
13.01 19:41:20 [Server] WARN at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
13.01 19:41:20 [Server] WARN at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
13.01 19:41:20 [Server] WARN at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
13.01 19:41:20 [Server] WARN at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167)
13.01 19:41:20 [Server] WARN at com.mysql.cj.protocol.a.NativeProtocol.send(NativeProtocol.java:567)
13.01 19:41:20 [Server] WARN at com.mysql.cj.protocol.a.NativeProtocol.sendCommand(NativeProtocol.java:622)
13.01 19:41:20 [Server] WARN at com.mysql.cj.protocol.a.NativeProtocol.sendQueryPacket(NativeProtocol.java:987)
13.01 19:41:20 [Server] WARN at com.mysql.cj.NativeSession.execSQL(NativeSession.java:666)
13.01 19:41:20 [Server] WARN at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:930)
13.01 19:41:20 [Server] WARN ... 11 more
13.01 19:41:20 [Server] WARN Caused by: java.net.SocketException: Broken pipe
13.01 19:41:20 [Server] WARN at java.base/sun.nio.ch.NioSocketImpl.implWrite(NioSocketImpl.java:420)
13.01 19:41:20 [Server] WARN at java.base/sun.nio.ch.NioSocketImpl.write(NioSocketImpl.java:440)
13.01 19:41:20 [Server] WARN at java.base/sun.nio.ch.NioSocketImpl$2.write(NioSocketImpl.java:826)
13.01 19:41:20 [Server] WARN at java.base/java.net.Socket$SocketOutputStream.write(Socket.java:1035)
13.01 19:41:20 [Server] WARN at java.base/java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:81)
13.01 19:41:20 [Server] WARN at java.base/java.io.BufferedOutputStream.flush(BufferedOutputStream.java:142)
13.01 19:41:20 [Server] WARN at com.mysql.cj.protocol.a.SimplePacketSender.send(SimplePacketSender.java:55)
13.01 19:41:20 [Server] WARN at com.mysql.cj.protocol.a.TimeTrackingPacketSender.send(TimeTrackingPacketSender.java:50)
13.01 19:41:20 [Server] WARN at com.mysql.cj.protocol.a.NativeProtocol.send(NativeProtocol.java:558)
13.01 19:41:20 [Server] WARN ... 15 more

Add "alias" variable

Add a variable that can be used in the config to allow for different command words to do the same thing. For instance /airflow could be set as an alias for /wind, rather than making a whole new set of variables. This would be helpful to allow for shortened commands like /temp or /emrad or even anticipating spelling errors with something like /preshir

Change wind to airflow

Wind should be changed to airflow. This will require changing the enum and the config. /wind can be made an alias of /airflow.

Ability to copy result to clip board

Ability to click on a result to copy it to their clipboard, so they can then paste it into an observation easily. Or maybe even just start making an observation with the measure - so you'd take the temperature and then you could click on a "make an observation with it!" link that would then say "The temperature is 10000 degrees so WRITE HERE"

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.