You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nlpcraft.apache.org by se...@apache.org on 2021/04/26 14:49:42 UTC

[incubator-nlpcraft] branch NLPCRAFT-305 created (now 2054954)

This is an automated email from the ASF dual-hosted git repository.

sergeykamov pushed a change to branch NLPCRAFT-305
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git.


      at 2054954  Comments added.

This branch includes the following new commits:

     new 2054954  Comments added.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[incubator-nlpcraft] 01/01: Comments added.

Posted by se...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

sergeykamov pushed a commit to branch NLPCRAFT-305
in repository https://gitbox.apache.org/repos/asf/incubator-nlpcraft.git

commit 2054954361911567dfbd1d34f4f21e82cecd6226
Author: Sergey Kamov <sk...@gmail.com>
AuthorDate: Mon Apr 26 17:49:31 2021 +0300

    Comments added.
---
 .../nplcraft/example/minecraft/NCExampleMod.java   | 38 ++++++++++++++++-
 .../example/minecraft/utils/GameFilesDump.java     |  2 +-
 ...FIllMatchProcessor.kt => FillMatchProcessor.kt} | 33 +++++++++++----
 .../nlpcraft/example/minecraft/MinecraftModel.kt   | 36 +++++++++-------
 .../org/apache/nlpcraft/example/minecraft/Utils.kt | 49 ----------------------
 .../nlpcraft/example/minecraft/ValueLoaders.kt     |  5 +++
 .../example/minecraft/NCMinecraftModelSpec.kt      |  2 +-
 7 files changed, 91 insertions(+), 74 deletions(-)

diff --git a/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nplcraft/example/minecraft/NCExampleMod.java b/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nplcraft/example/minecraft/NCExampleMod.java
index 6a5b3c8..90c9c9f 100644
--- a/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nplcraft/example/minecraft/NCExampleMod.java
+++ b/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nplcraft/example/minecraft/NCExampleMod.java
@@ -41,15 +41,23 @@ import java.nio.file.Paths;
 import java.util.HashSet;
 import java.util.Set;
 
+/**
+ * Minecraft MOD. It contains simple REST client, which forward user request to server, and replaces initial request by server answers.
+ * Note that it requires started NLPCraft server ad probe with loaded `nlpcraft.minecraft.ex` model.
+ */
 @Mod("nlpcraft_mod")
 public class NCExampleMod {
+    // Initial configuration values for communication with NLPCraft server.
+    // These values can be overridden by 'nlpcraft-settings.json' file values.
     private static final String DFLT_EMAIL = "admin@admin.com";
     private static final String DFLT_PSWD = "admin";
     private static final String DFLT_HOST = "0.0.0.0";
     private static final int DFLT_PORT = 8081;
 
-    private static final Logger LOGGER = LogManager.getLogger();
+    // Model ID which should be loaded in probe.
     private static final String MODEL_ID = "nlpcraft.minecraft.ex";
+
+    private static final Logger LOGGER = LogManager.getLogger();
     private static final Gson GSON = new Gson();
 
     private final Set<String> convCmds = new HashSet<>();
@@ -59,6 +67,7 @@ public class NCExampleMod {
     private MinecraftServer server;
     private String token;
 
+    // Serialization and deserialization classes.
     private static class AskParams {
         private String mdlId;
         private String acsTok;
@@ -143,6 +152,13 @@ public class NCExampleMod {
         return s;
     }
 
+    /**
+     * Ask method.
+     * @param txt Request.
+     * @return Server response.
+     *
+     * @throws Exception If any error occurs.
+     */
     private NCResponse askProbe(String txt) throws Exception {
         assert baseUrl != null;
 
@@ -163,7 +179,7 @@ public class NCExampleMod {
             resp = post("ask/sync", GSON.toJson(params), NCResponse.class);
         }
         catch (UnauthorizedException e) {
-            // Token can be expired.
+            // Token can be expired, it tries to connect and process given command again.
             this.token = signin();
 
             params.acsTok = this.token;
@@ -181,10 +197,25 @@ public class NCExampleMod {
         return resp;
     }
 
+    /**
+     * Signin method.
+     * @return Server token.
+     *
+     * @throws Exception If any error occurs.
+     */
     private String signin() throws Exception {
         return post("signin", GSON.toJson(creds), NCSignResponse.class).acsTok;
     }
 
+    /**
+     * REST post method.
+     * @param url Request URL.
+     * @param postJson Parameters.
+     * @param clazz Response class type.
+     * @return Response.
+     *
+     * @throws Exception If any error occurs.
+     */
     private <T> T post(String url, String postJson, Class<T> clazz) throws Exception {
         assert baseUrl != null;
 
@@ -214,6 +245,9 @@ public class NCExampleMod {
         }
     }
 
+    /**
+     * Loads settings. It tries to read `"nlpcraft-settings.json` properties file or use default values if file is not found.
+     */
     private void loadSettings() {
         try (
             Reader reader =
diff --git a/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nplcraft/example/minecraft/utils/GameFilesDump.java b/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nplcraft/example/minecraft/utils/GameFilesDump.java
index b2e06a2..59d6d7e 100644
--- a/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nplcraft/example/minecraft/utils/GameFilesDump.java
+++ b/nlpcraft-examples/minecraft-mod/src/main/java/org/apache/nplcraft/example/minecraft/utils/GameFilesDump.java
@@ -26,7 +26,7 @@ import net.minecraft.util.registry.Registry;
 import net.minecraftforge.registries.ForgeRegistryEntry;
 
 /**
- * Utility for getting data from minecraft.
+ * Utility for getting data from minecraft. These values are used for preparing synonyms for user defined elements.
  */
 public class GameFilesDump {
     private final static Gson GSON = new Gson();
diff --git a/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/FIllMatchProcessor.kt b/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/FillMatchProcessor.kt
similarity index 78%
rename from nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/FIllMatchProcessor.kt
rename to nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/FillMatchProcessor.kt
index f576a52..7bf20ad 100644
--- a/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/FIllMatchProcessor.kt
+++ b/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/FillMatchProcessor.kt
@@ -22,7 +22,25 @@ import org.apache.nlpcraft.example.minecraft.MinecraftObjectValueLoader.Companio
 import org.apache.nlpcraft.model.*
 import java.util.*
 
-class FIllMatchProcessor {
+/**
+ * Special processor for support 'fillIntent' intent processing.
+ * Is is designed as separated class to simplify main model class.
+ */
+class FillMatchProcessor {
+    internal data class Coordinate(val x: Int = 0, val y: Int = 0, val z: Int = 0) {
+        override fun toString(): String {
+            return "$x $y $z"
+        }
+
+        fun relative(): String {
+            return "~$x ~$y ~$z"
+        }
+
+        fun relativeRotated(): String {
+            return "^$x ^$y ^$z"
+        }
+    }
+
     companion object {
         fun process(
             ctx: NCIntentMatch,
@@ -67,16 +85,17 @@ class FIllMatchProcessor {
                 x.partTokens.stream()
                     .filter { it.id == "nlpcraft:num" }
                     .findAny()
-                    .map { it.toInt() }
+                    .map { it.meta<Double>("nlpcraft:num:from").toInt() }
             }.orElse(default)
         }
 
         private fun findPlayer(position: NCToken): String {
-            return position.partTokens.stream()
-                .filter { it.id == "mc:player" }
-                .findAny()
-                .orElseThrow { AssertionError("Player wasn't found") }
-                .player()
+            val part = position.partTokens.stream()
+                    .filter { it.id == "mc:player" }
+                    .findAny()
+                    .orElseThrow { AssertionError("Player wasn't found") }
+
+            return if (part.lemma == "i" || part.lemma == "my") "@p" else part.originalText ?: "@p"
         }
     }
 }
diff --git a/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftModel.kt b/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftModel.kt
index 58dfe74..ad793d5 100644
--- a/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftModel.kt
+++ b/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/MinecraftModel.kt
@@ -23,8 +23,19 @@ import org.apache.nlpcraft.example.minecraft.MinecraftObjectValueLoader.Companio
 import org.apache.nlpcraft.model.*
 import java.util.*
 
-@Suppress("unused")
+/**
+ * Minecraft example data model.
+ * TODO:
+ * <p>
+ * See 'README.md' file in the same folder for running and testing instructions.
+ */
 class MinecraftModel : NCModelFileAdapter("minecraft.yaml") {
+    private fun checkAmbiguous(ctx: NCIntentMatch) {
+        if (ctx.isAmbiguous) {
+            throw NCRejection("Ambiguous request")
+        }
+    }
+
     @NCIntentRef("weatherIntent")
     @NCIntentSample(
         "make it rain",
@@ -33,9 +44,7 @@ class MinecraftModel : NCModelFileAdapter("minecraft.yaml") {
         "heavy storm is coming"
     )
     fun onWeatherMatch(ctx: NCIntentMatch, @NCIntentTerm("arg") tok: NCToken): NCResult {
-        if (ctx.isAmbiguous) {
-            throw NCRejection("Ambiguous request")
-        }
+        checkAmbiguous(ctx)
 
         return NCResult.text("weather ${tok.id}")
     }
@@ -48,9 +57,7 @@ class MinecraftModel : NCModelFileAdapter("minecraft.yaml") {
         "it's midnight"
     )
     fun onTimeMatch(ctx: NCIntentMatch, @NCIntentTerm("arg") tok: NCToken): NCResult {
-        if (ctx.isAmbiguous) {
-            throw NCRejection("Ambiguous request")
-        }
+        checkAmbiguous(ctx)
 
         val time: Int = when (tok.id) {
             "morning" -> 23000
@@ -67,7 +74,7 @@ class MinecraftModel : NCModelFileAdapter("minecraft.yaml") {
 
     @NCIntentRef("giveIntent")
     @NCIntentSample(
-        "give me iron sword",
+        "give my iron sword",
         "give me 10 grass blocks",
         "give #PlayerName a jigsaw",
         "give #PlayerName 1 kilogram of feathers",
@@ -79,13 +86,14 @@ class MinecraftModel : NCModelFileAdapter("minecraft.yaml") {
         @NCIntentTerm("action") target: NCToken,
         @NCIntentTerm("quantity") quantity: Optional<NCToken>
     ): NCResult {
-        if (ctx.isAmbiguous) {
-            throw NCRejection("Ambiguous request")
-        }
+        checkAmbiguous(ctx)
 
         val itemRegistry = dumps["item"]!![item.value]!!
-        val player = target.partTokens[1].player()
-        val itemQuantity = quantity.map(NCToken::toInt).orElse(1)
+
+        val part = target.partTokens[1]
+        val player = if (part.lemma == "i" || part.lemma == "my") "@p" else part.originalText ?: "@p"
+
+        val itemQuantity = if (quantity.isPresent) quantity.get().meta<Double>("nlpcraft:num:from").toInt() else 1
 
         return NCResult.text("give $player $itemRegistry $itemQuantity")
     }
@@ -106,6 +114,6 @@ class MinecraftModel : NCModelFileAdapter("minecraft.yaml") {
         @NCIntentTerm("len") length: Optional<NCToken>,
         @NCIntentTerm("position") position: NCToken,
     ): NCResult {
-        return FIllMatchProcessor.process(ctx, shape, block, length, position)
+        return FillMatchProcessor.process(ctx, shape, block, length, position)
     }
 }
diff --git a/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/Utils.kt b/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/Utils.kt
deleted file mode 100644
index 31fdf47..0000000
--- a/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/Utils.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-package org.apache.nlpcraft.example.minecraft
-
-import org.apache.nlpcraft.model.NCToken
-
-private var firstPersonWords = setOf("me", "my", "i")
-
-internal fun NCToken.normText(): String {
-    return this.meta("nlpcraft:nlp:normtext")
-}
-
-internal fun NCToken.toInt(): Int {
-    return this.meta<Double>("nlpcraft:num:from").toInt()
-}
-
-internal fun NCToken.player(): String {
-    return if (firstPersonWords.contains(this.normText())) "@p" else this.originalText ?: "@p"
-}
-
-internal data class Coordinate(val x: Int = 0, val y: Int = 0, val z: Int = 0) {
-    override fun toString(): String {
-        return "$x $y $z"
-    }
-
-    fun relative(): String {
-        return "~$x ~$y ~$z"
-    }
-
-    fun relativeRotated(): String {
-        return "^$x ^$y ^$z"
-    }
-}
\ No newline at end of file
diff --git a/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/ValueLoaders.kt b/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/ValueLoaders.kt
index 89b44e3..def4d26 100644
--- a/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/ValueLoaders.kt
+++ b/nlpcraft-examples/minecraft/src/main/kotlin/org/apache/nlpcraft/example/minecraft/ValueLoaders.kt
@@ -26,6 +26,11 @@ import org.apache.nlpcraft.model.NCModelFileAdapter
 import org.apache.nlpcraft.model.NCValue
 import org.apache.nlpcraft.model.NCValueLoader
 
+/**
+ * Data loader from JSON data files.
+ * These files which prepared via 'minectaft-mod' module org.apache.nplcraft.example.minecraft.utils.GameFilesDump
+ * for this supported `minecraft` server version.
+ */
 class MinecraftObjectValueLoader : NCValueLoader {
     private data class Dump(val version: String, val data: Map<String, String>)
 
diff --git a/nlpcraft-examples/minecraft/src/test/kotlin/org/apache/nlpcraft/example/minecraft/NCMinecraftModelSpec.kt b/nlpcraft-examples/minecraft/src/test/kotlin/org/apache/nlpcraft/example/minecraft/NCMinecraftModelSpec.kt
index b32fa53..34e7f0d 100644
--- a/nlpcraft-examples/minecraft/src/test/kotlin/org/apache/nlpcraft/example/minecraft/NCMinecraftModelSpec.kt
+++ b/nlpcraft-examples/minecraft/src/test/kotlin/org/apache/nlpcraft/example/minecraft/NCMinecraftModelSpec.kt
@@ -22,7 +22,7 @@ import org.apache.nlpcraft.NCTestContext
 import org.apache.nlpcraft.NCTestEnvironment
 import org.junit.jupiter.api.Test
 import kotlin.test.assertEquals
-
+import kotlin.test.assertTrue
 
 @NCTestEnvironment(model = MinecraftModel::class, startClient = true)
 class NCMinecraftModelSpec : NCTestContext() {