diff --git a/pom.xml b/pom.xml index 3072d3b..6ba0a6d 100644 --- a/pom.xml +++ b/pom.xml @@ -16,8 +16,8 @@ jar - 1.8 - 1.8 + 14 + 14 UTF-8 diff --git a/src/main/java/com/alterdekim/javabot/util/LuaDeserializer.java b/src/main/java/com/alterdekim/javabot/util/LuaDeserializer.java index f0ec8e9..91fdeee 100644 --- a/src/main/java/com/alterdekim/javabot/util/LuaDeserializer.java +++ b/src/main/java/com/alterdekim/javabot/util/LuaDeserializer.java @@ -7,6 +7,7 @@ import lombok.extern.slf4j.Slf4j; import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaValue; +import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -20,6 +21,39 @@ public class LuaDeserializer { .collect(Collectors.toList()); } + private static T deserialize(LuaTable table, Class obj) { + try { + List keys = Arrays.stream(table.keys()) + .map(LuaValue::checkjstring) + .collect(Collectors.toList()); + T result = obj.getDeclaredConstructor().newInstance(); + Arrays.stream(obj.getDeclaredFields()) + .filter(f -> keys.contains(f.getName())) + .forEach(f -> { + try { + f.setAccessible(true); + f.set(result, checkObject(f, table.get(f.getName()))); + } catch (IllegalAccessException e) { + log.error(e.getMessage()); + } + }); + return result; + } catch (Exception e) { + log.error(e.getMessage()); + } + return null; + } + + private static Object checkObject(Field f, LuaValue val) { + return switch(f.getType().getCanonicalName()) { + case "java.lang.Boolean" -> val.checkboolean(); + case "java.lang.Long" -> val.checklong(); + case "java.lang.Float", "java.lang.Double" -> val.checkdouble(); + case "java.lang.Integer" -> val.checkint(); + default -> null; + }; + } + private static Player deserializePlayer(LuaTable table) { int age = table.get("age").checkint(); Player p = new Player(table.get("telegramId").checklong(), table.get("firstName").checkjstring()); @@ -28,16 +62,24 @@ public class LuaDeserializer { p.setIsVoted(table.get("isVoted").checkboolean()); p.setScriptMessageId(table.get("scriptMessageId").checkint()); - p.setGender(deserializeGender(table.get("gender").checktable())); + p.setGender(deserialize(table.get("gender").checktable(), Bio.class)); + p.setHealth(deserialize(table.get("health").checktable(), Health.class)); + p.setHobby(deserialize(table.get("hobby").checktable(), Hobby.class)); + p.setWork(deserialize(table.get("work").checktable(), Work.class)); + p.setLuggage(deserialize(table.get("luggage").checktable(), Luggage.class)); + p.setInfoSections(deserialize(table.get("infoSections").checktable(), InfoSections.class)); + + /*p.setGender(deserializeGender(table.get("gender").checktable())); p.setHealth(deserializeHealth(table.get("health").checktable())); p.setHobby(deserializeHobby(table.get("hobby").checktable())); p.setWork(deserializeWork(table.get("work").checktable())); p.setLuggage(deserializeLuggage(table.get("luggage").checktable())); - p.setInfoSections(deserializeInfoSections(table.get("infoSections").checktable())); + p.setInfoSections(deserializeInfoSections(table.get("infoSections").checktable()));*/ return p; } + /* private static InfoSections deserializeInfoSections(LuaTable table) { InfoSections infoSections = new InfoSections(); infoSections.setIsGenderShowed(table.get("isGenderShowed").checkboolean()); @@ -103,5 +145,5 @@ public class LuaDeserializer { bio.setIsMale(table.get("isMale").checkboolean()); bio.setIsFemale(table.get("isFemale").checkboolean()); return bio; - } + } */ } diff --git a/src/main/java/com/alterdekim/javabot/util/LuaSerializer.java b/src/main/java/com/alterdekim/javabot/util/LuaSerializer.java index 3389e1e..cffd518 100644 --- a/src/main/java/com/alterdekim/javabot/util/LuaSerializer.java +++ b/src/main/java/com/alterdekim/javabot/util/LuaSerializer.java @@ -1,6 +1,5 @@ package com.alterdekim.javabot.util; -import com.alterdekim.javabot.bot.Player; import lombok.extern.slf4j.Slf4j; import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaValue; @@ -17,12 +16,6 @@ import java.util.stream.IntStream; @Slf4j public class LuaSerializer { - /* public static LuaTable serializeObjectList(List list) { - LuaTable table = new LuaTable(); - IntStream.range(0, list.size()).forEach(i -> table.set(i, serializeObject(list.get(i)))); - return table; - }*/ - public static LuaTable serializeObjectList(List list) { LuaTable table = new LuaTable(); IntStream.range(0, list.size()).forEach(i -> table.set(i, serializeObject(list.get(i)))); @@ -31,15 +24,17 @@ public class LuaSerializer { public static LuaValue serializeObject(Object o) { Map map = new HashMap<>(); - getPrivateFields(o.getClass()).stream() + getPrivateFields(o.getClass()) .forEach(f -> { try { f.setAccessible(true); String type_name = ((Class) f.getType()).getName(); String name = f.getName(); switch (type_name) { - case "java.lang.Long": - map.put(name, ((Long) f.get(o)).longValue()); + case "java.lang.Long", "java.lang.Integer", + "java.lang.Float", "java.lang.Double", + "java.lang.Boolean", "java.lang.String": + map.put(name, f.get(o)); break; case "long": map.put(name, f.getLong(o)); @@ -47,30 +42,15 @@ public class LuaSerializer { case "int": map.put(name, f.getInt(o)); break; - case "java.lang.Integer": - map.put(name, ((Integer) f.get(o)).intValue()); - break; case "float": map.put(name, f.getFloat(o)); break; - case "java.lang.Float": - map.put(name, ((Float) f.get(o)).floatValue()); - break; case "double": map.put(name, f.getDouble(o)); break; - case "java.lang.Double": - map.put(name, ((Double) f.get(o)).doubleValue()); - break; case "boolean": map.put(name, f.getBoolean(o)); break; - case "java.lang.Boolean": - map.put(name, ((Boolean) f.get(o)).booleanValue()); - break; - case "java.lang.String": - map.put(name, (String) f.get(o)); - break; case "java.util.List": break; default: