From 12be54ff48d8c32649b00a216e266c198b4adcd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20N=C3=A6rvig=20W=C3=B8hlk?= Date: Fri, 21 Jan 2022 20:04:49 +0100 Subject: [PATCH 01/12] Started work on polls --- .../kepler/messages/MessageHandler.java | 14 +++- .../messages/incoming/poll/POLL_START.java | 24 ++++++ .../messages/incoming/user/GET_INFO.java | 7 +- .../messages/outgoing/poll/POLL_CONTENTS.java | 75 +++++++++++++++++++ .../messages/outgoing/poll/POLL_OFFER.java | 17 +++++ .../org/alexdev/kepler/util/StringUtil.java | 12 +++ 6 files changed, 143 insertions(+), 6 deletions(-) create mode 100644 Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_START.java create mode 100644 Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java create mode 100644 Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_OFFER.java diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/MessageHandler.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/MessageHandler.java index c2b47404b..9b184bbf6 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/MessageHandler.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/MessageHandler.java @@ -12,10 +12,7 @@ import org.alexdev.kepler.messages.incoming.club.SUBSCRIBE_CLUB; import org.alexdev.kepler.messages.incoming.events.*; import org.alexdev.kepler.messages.incoming.games.*; -import org.alexdev.kepler.messages.incoming.handshake.GENERATEKEY; -import org.alexdev.kepler.messages.incoming.handshake.INIT_CRYPTO; -import org.alexdev.kepler.messages.incoming.handshake.SSO; -import org.alexdev.kepler.messages.incoming.handshake.TRY_LOGIN; +import org.alexdev.kepler.messages.incoming.handshake.*; import org.alexdev.kepler.messages.incoming.infobus.CHANGEWORLD; import org.alexdev.kepler.messages.incoming.infobus.TRYBUS; import org.alexdev.kepler.messages.incoming.infobus.VOTE; @@ -24,6 +21,7 @@ import org.alexdev.kepler.messages.incoming.messenger.*; import org.alexdev.kepler.messages.incoming.moderation.*; import org.alexdev.kepler.messages.incoming.navigator.*; +import org.alexdev.kepler.messages.incoming.poll.POLL_START; import org.alexdev.kepler.messages.incoming.purse.GETUSERCREDITLOG; import org.alexdev.kepler.messages.incoming.purse.REDEEM_VOUCHER; import org.alexdev.kepler.messages.incoming.recycler.CONFIRM_FURNI_RECYCLING; @@ -102,6 +100,7 @@ private MessageHandler() { registerGamePackets(); registerJukeboxPackets(); registerEcotronPackets(); + registerPollPackets(); } /** @@ -126,6 +125,13 @@ private void registerHandshakePackets() { registerEvent(756, new TRY_LOGIN()); } + /** + * Register handshake packets. + */ + private void registerPollPackets() { + registerEvent(234, new POLL_START()); + } + /** * Register handshake packets. */ diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_START.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_START.java new file mode 100644 index 000000000..fac45da60 --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_START.java @@ -0,0 +1,24 @@ +package org.alexdev.kepler.messages.incoming.poll; + +import org.alexdev.kepler.game.player.Player; +import org.alexdev.kepler.messages.outgoing.poll.POLL_CONTENTS; +import org.alexdev.kepler.messages.types.MessageEvent; +import org.alexdev.kepler.server.netty.streams.NettyRequest; + +import java.sql.SQLException; + +public class POLL_START implements MessageEvent { + + @Override + public void handle(Player player, NettyRequest reader) throws SQLException { + if (!player.isLoggedIn()) { + return; + } + + Integer id = reader.readInt(); + System.out.println("START POLL WITH ID " + id); + + player.send(new POLL_CONTENTS()); + + } +} diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/user/GET_INFO.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/user/GET_INFO.java index ad194e7f7..faa2b97e3 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/user/GET_INFO.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/user/GET_INFO.java @@ -1,17 +1,20 @@ package org.alexdev.kepler.messages.incoming.user; import org.alexdev.kepler.game.player.Player; -import org.alexdev.kepler.messages.outgoing.handshake.AVAILABLE_SETS; +import org.alexdev.kepler.messages.outgoing.poll.POLL_OFFER; import org.alexdev.kepler.messages.outgoing.user.UPDATE_REQUEST; import org.alexdev.kepler.messages.outgoing.user.USER_OBJECT; import org.alexdev.kepler.messages.types.MessageEvent; import org.alexdev.kepler.server.netty.streams.NettyRequest; -import org.alexdev.kepler.util.config.GameConfiguration; public class GET_INFO implements MessageEvent { @Override public void handle(Player player, NettyRequest reader) { + + // TODO REMOVE + player.send(new POLL_OFFER()); + player.send(new USER_OBJECT(player.getVersion(), player.getDetails())); if(player.getDetails().getEmail().length() == 0) { player.send(new UPDATE_REQUEST()); diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java new file mode 100644 index 000000000..d9ce6ac3c --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java @@ -0,0 +1,75 @@ +package org.alexdev.kepler.messages.outgoing.poll; + +import org.alexdev.kepler.messages.types.MessageComposer; +import org.alexdev.kepler.server.netty.streams.NettyResponse; +import org.alexdev.kepler.util.StringUtil; + +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + + +public class POLL_CONTENTS extends MessageComposer { + + @Override + public void compose(NettyResponse response) { + // tPollID + response.writeInt(1); + // tPollHeadLine + response.writeString("TEST AFSTEMNING"); + // tPollThankYou + response.writeString("Tak fordi du deltog i afstemningen!"); + + // Question count + response.writeInt(2); + + + // questionID + response.writeInt(1); + // questionNumber + response.writeInt(1); + // questionType + response.writeInt(2); + // questionText + response.writeString(StringUtil.charsetEncode("æøå")); + // tSelectionCount + response.writeInt(2); + // minSelect + response.writeInt(1); + // maxSelect + response.writeInt(1); + // questionText + response.writeString("Nej"); + response.writeString("Ja"); + + + + + + + // questionID + response.writeInt(2); + // questionNumber + response.writeInt(2); + // questionType + response.writeInt(1); + // questionText + response.writeString(StringUtil.charsetEncode("Vælg dine favorit mærker")); + // tSelectionCount + response.writeInt(3); + // minSelect + response.writeInt(1); + // maxSelect + response.writeInt(2); + // questionText + response.writeString("Nokia"); + response.writeString("Sony"); + response.writeString("Apple"); + + } + + @Override + public short getHeader() { + return 317; + } +} \ No newline at end of file diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_OFFER.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_OFFER.java new file mode 100644 index 000000000..05da817d1 --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_OFFER.java @@ -0,0 +1,17 @@ +package org.alexdev.kepler.messages.outgoing.poll; + +import org.alexdev.kepler.messages.types.MessageComposer; +import org.alexdev.kepler.server.netty.streams.NettyResponse; + +public class POLL_OFFER extends MessageComposer { + @Override + public void compose(NettyResponse response) { + response.writeInt(1); + response.writeString("TEST"); + } + + @Override + public short getHeader() { + return 316; + } +} \ No newline at end of file diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/util/StringUtil.java b/Kepler-Server/src/main/java/org/alexdev/kepler/util/StringUtil.java index a81c5aa39..cb5e017bd 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/util/StringUtil.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/util/StringUtil.java @@ -3,6 +3,7 @@ import org.alexdev.kepler.game.GameScheduler; import org.alexdev.kepler.util.config.GameConfiguration; +import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.text.Normalizer; @@ -92,6 +93,17 @@ public static List split(String str, String delim) { return new ArrayList<>(Arrays.asList(str.split(delim))); } + public static String charsetEncode (String input){ + String output = ""; + try { + output = new String(input.getBytes("ISO-8859-1"), "UTF-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return output; + } + + /** * Get encoding for strings * From 989560983fc26572e92af9ddc86fd570acf8dce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20N=C3=A6rvig=20W=C3=B8hlk?= Date: Tue, 19 Apr 2022 13:31:06 +0200 Subject: [PATCH 02/12] feature: Continue to explore polls --- .../kepler/messages/MessageHandler.java | 4 +- .../messages/incoming/poll/POLL_ANSWER.java | 39 +++++++++++++++++++ .../messages/incoming/poll/POLL_REJECT.java | 22 +++++++++++ .../messages/incoming/rooms/TRYFLAT.java | 4 ++ .../messages/incoming/user/GET_INFO.java | 4 -- .../messages/outgoing/poll/POLL_CONTENTS.java | 28 ++++++++----- 6 files changed, 87 insertions(+), 14 deletions(-) create mode 100644 Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_ANSWER.java create mode 100644 Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_REJECT.java diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/MessageHandler.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/MessageHandler.java index 9b184bbf6..531980d8f 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/MessageHandler.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/MessageHandler.java @@ -21,7 +21,7 @@ import org.alexdev.kepler.messages.incoming.messenger.*; import org.alexdev.kepler.messages.incoming.moderation.*; import org.alexdev.kepler.messages.incoming.navigator.*; -import org.alexdev.kepler.messages.incoming.poll.POLL_START; +import org.alexdev.kepler.messages.incoming.poll.*; import org.alexdev.kepler.messages.incoming.purse.GETUSERCREDITLOG; import org.alexdev.kepler.messages.incoming.purse.REDEEM_VOUCHER; import org.alexdev.kepler.messages.incoming.recycler.CONFIRM_FURNI_RECYCLING; @@ -130,6 +130,8 @@ private void registerHandshakePackets() { */ private void registerPollPackets() { registerEvent(234, new POLL_START()); + registerEvent(235, new POLL_REJECT()); + registerEvent(236, new POLL_ANSWER()); } /** diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_ANSWER.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_ANSWER.java new file mode 100644 index 000000000..98546c98b --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_ANSWER.java @@ -0,0 +1,39 @@ +package org.alexdev.kepler.messages.incoming.poll; + +import org.alexdev.kepler.game.player.Player; +import org.alexdev.kepler.messages.types.MessageEvent; +import org.alexdev.kepler.server.netty.streams.NettyRequest; + +import java.sql.SQLException; + +public class POLL_ANSWER implements MessageEvent { + + @Override + public void handle(Player player, NettyRequest reader) throws SQLException { + if (!player.isLoggedIn()) { + return; + } + Integer id = reader.readInt(); + System.out.println("POLL ANSWER - POLL ID: " + id); + Integer questionId = reader.readInt(); + System.out.println("POLL ANSWER - QUESTION ID: " + questionId); + + + if(questionId == 2 || questionId == 1) { + Integer amountSelected = reader.readInt(); + System.out.println("POLL ANSWER - AMOUNT SELECTED: " + amountSelected); + + for(Integer i = 0; i < amountSelected; i++) { + Integer selectedIndex = reader.readInt(); + System.out.println("POLL ANSWER - SELECTED: " + selectedIndex); + } + + } + + if(questionId == 3) { + String text = reader.readString(); + System.out.println("POLL ANSWER - TEXT: " + text); + } + + } +} diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_REJECT.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_REJECT.java new file mode 100644 index 000000000..1561cfb5f --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_REJECT.java @@ -0,0 +1,22 @@ +package org.alexdev.kepler.messages.incoming.poll; + +import org.alexdev.kepler.game.player.Player; +import org.alexdev.kepler.messages.outgoing.poll.POLL_CONTENTS; +import org.alexdev.kepler.messages.types.MessageEvent; +import org.alexdev.kepler.server.netty.streams.NettyRequest; + +import java.sql.SQLException; + +public class POLL_REJECT implements MessageEvent { + + @Override + public void handle(Player player, NettyRequest reader) throws SQLException { + if (!player.isLoggedIn()) { + return; + } + + Integer id = reader.readInt(); + System.out.println("REJECTED POLL " + id); + + } +} diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/rooms/TRYFLAT.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/rooms/TRYFLAT.java index 19450d75e..17776eea0 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/rooms/TRYFLAT.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/rooms/TRYFLAT.java @@ -5,6 +5,7 @@ import org.alexdev.kepler.game.player.Player; import org.alexdev.kepler.game.room.Room; import org.alexdev.kepler.game.room.RoomManager; +import org.alexdev.kepler.messages.outgoing.poll.POLL_OFFER; import org.alexdev.kepler.messages.outgoing.rooms.FLATNOTALLOWEDTOENTER; import org.alexdev.kepler.messages.outgoing.rooms.DOORBELL_WAIT; import org.alexdev.kepler.messages.outgoing.rooms.FLAT_LETIN; @@ -16,6 +17,9 @@ public class TRYFLAT implements MessageEvent { @Override public void handle(Player player, NettyRequest reader) { + // TODO REMOVE + player.send(new POLL_OFFER()); + int roomId = -1; String contents = reader.contents(); diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/user/GET_INFO.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/user/GET_INFO.java index faa2b97e3..b064d894b 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/user/GET_INFO.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/user/GET_INFO.java @@ -11,10 +11,6 @@ public class GET_INFO implements MessageEvent { @Override public void handle(Player player, NettyRequest reader) { - - // TODO REMOVE - player.send(new POLL_OFFER()); - player.send(new USER_OBJECT(player.getVersion(), player.getDetails())); if(player.getDetails().getEmail().length() == 0) { player.send(new UPDATE_REQUEST()); diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java index d9ce6ac3c..9fb15f189 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java @@ -21,7 +21,7 @@ public void compose(NettyResponse response) { response.writeString("Tak fordi du deltog i afstemningen!"); // Question count - response.writeInt(2); + response.writeInt(3); // questionID @@ -29,9 +29,9 @@ public void compose(NettyResponse response) { // questionNumber response.writeInt(1); // questionType - response.writeInt(2); + response.writeInt(1); // questionText - response.writeString(StringUtil.charsetEncode("æøå")); + response.writeString("æøå"); //response.writeString(StringUtil.charsetEncode("æøå")); // tSelectionCount response.writeInt(2); // minSelect @@ -44,9 +44,6 @@ public void compose(NettyResponse response) { - - - // questionID response.writeInt(2); // questionNumber @@ -54,18 +51,31 @@ public void compose(NettyResponse response) { // questionType response.writeInt(1); // questionText - response.writeString(StringUtil.charsetEncode("Vælg dine favorit mærker")); + response.writeString("Vælg dine favorit mærker"); // tSelectionCount response.writeInt(3); // minSelect - response.writeInt(1); + response.writeInt(0); // maxSelect - response.writeInt(2); + response.writeInt(0); // questionText response.writeString("Nokia"); response.writeString("Sony"); response.writeString("Apple"); + + + + // questionID + response.writeInt(3); + // questionNumber + response.writeInt(3); + // questionType + response.writeInt(3); + // questionText + response.writeString("Skriv noget"); //response.writeString(StringUtil.charsetEncode("æøå")); + + } @Override From f431d36cc20ee0a651b5ad1453fc846f9ebf7c9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20N=C3=A6rvig=20W=C3=B8hlk?= Date: Tue, 19 Apr 2022 15:17:19 +0200 Subject: [PATCH 03/12] feature: Continue exploration of polls --- .../alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java index 9fb15f189..0a839d0cc 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java @@ -24,6 +24,8 @@ public void compose(NettyResponse response) { response.writeInt(3); + + // questionID response.writeInt(1); // questionNumber @@ -57,7 +59,7 @@ public void compose(NettyResponse response) { // minSelect response.writeInt(0); // maxSelect - response.writeInt(0); + response.writeInt(3); // questionText response.writeString("Nokia"); response.writeString("Sony"); From 59acf3fc8b4fe1a95fd596668529200a4c432924 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20N=C3=A6rvig=20W=C3=B8hlk?= Date: Mon, 25 Apr 2022 14:52:47 +0200 Subject: [PATCH 04/12] Created classes for Poll system --- .../alexdev/kepler/dao/mysql/PollsDao.java | 67 +++++++++++++++++++ .../org/alexdev/kepler/game/polls/Poll.java | 28 ++++++++ .../alexdev/kepler/game/polls/PollAnswer.java | 26 +++++++ .../alexdev/kepler/game/polls/PollOffer.java | 25 +++++++ .../kepler/game/polls/PollQuestion.java | 26 +++++++ .../kepler/game/polls/PollQuestionOption.java | 25 +++++++ .../kepler/game/polls/PollQuestionType.java | 6 ++ .../kepler/game/polls/PollTrigger.java | 38 +++++++++++ tools/sql/polls.sql | 67 +++++++++++++++++++ 9 files changed, 308 insertions(+) create mode 100644 Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollsDao.java create mode 100644 Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java create mode 100644 Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollAnswer.java create mode 100644 Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollOffer.java create mode 100644 Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java create mode 100644 Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestionOption.java create mode 100644 Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestionType.java create mode 100644 Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollTrigger.java create mode 100644 tools/sql/polls.sql diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollsDao.java b/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollsDao.java new file mode 100644 index 000000000..0d1ac0c84 --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollsDao.java @@ -0,0 +1,67 @@ +package org.alexdev.kepler.dao.mysql; + +import org.alexdev.kepler.dao.Storage; +import org.alexdev.kepler.game.item.Photo; + +import java.sql.*; + +public class PollsDao { + public static void addAnswer(int photoId, int userId, long timestamp, byte[] photo, int checksum) throws SQLException { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO items_photos (photo_id, photo_user_id, timestamp, photo_data, photo_checksum) VALUES (?, ?, ?, ?, ?)", sqlConnection); + + Blob photoBlob = sqlConnection.createBlob(); + photoBlob.setBytes(1, photo); + + preparedStatement.setInt(1, photoId); + preparedStatement.setInt(2, userId); + preparedStatement.setLong(3, timestamp); + preparedStatement.setBlob(4, photoBlob); + preparedStatement.setInt(5, checksum); + preparedStatement.execute(); + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + + public static Photo getPhoto(int photoId) throws SQLException { + Photo photo = null; + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM items_photos WHERE photo_id = ?", sqlConnection);// (photo_id, photo_user_id, timestamp, photo_data, photo_checksum) VALUES (?, ?, ?, ?, ?)", sqlConnection); + preparedStatement.setInt(1, photoId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + Blob photoBlob = resultSet.getBlob("photo_data"); + int blobLength = (int) photoBlob.length(); + + byte[] photoBlobBytes = photoBlob.getBytes(1, blobLength); + photo = new Photo(photoId, resultSet.getInt("photo_checksum"), photoBlobBytes, resultSet.getLong("timestamp")); + } + + } catch (Exception e) { + Storage.logError(e); + throw e; + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + Storage.closeSilently(resultSet); + } + + return photo; + } +} diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java new file mode 100644 index 000000000..64edcf698 --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java @@ -0,0 +1,28 @@ +package org.alexdev.kepler.game.polls; + +public class Poll { + private int id; + private String headline; + private String thankYou; + private String description; + + public Poll(int id, String headline, String thankYou, String description) { + this.id = id; + this.headline = headline; + this.thankYou = thankYou; + this.description = description; + } + + public int getId() { + return id; + } + public String getHeadline() { + return headline; + } + public String getThankYou() { + return thankYou; + } + public String getDescription() { + return description; + } +} diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollAnswer.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollAnswer.java new file mode 100644 index 000000000..50e154551 --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollAnswer.java @@ -0,0 +1,26 @@ +package org.alexdev.kepler.game.polls; + + +public class PollAnswer { + private int id; + private int pollQuestionId; + private String value; + + public PollAnswer(int id, int pollQuestionId, String value) { + this.id = id; + this.pollQuestionId = pollQuestionId; + this.value = value; + } + + public int getId() { + return id; + } + + public int getPollQuestionId() { + return pollQuestionId; + } + + public String getValue() { + return value; + } +} diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollOffer.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollOffer.java new file mode 100644 index 000000000..1b56a3c36 --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollOffer.java @@ -0,0 +1,25 @@ +package org.alexdev.kepler.game.polls; + +public class PollOffer { + private int id; + private int pollId; + private int userId; + + public PollOffer(int id, int pollId, int userId) { + this.id = id; + this.pollId = pollId; + this.userId = userId; + } + + public int getId() { + return id; + } + + public int getPollId() { + return pollId; + } + + public int getUserId() { + return userId; + } +} diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java new file mode 100644 index 000000000..d7e4d4385 --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java @@ -0,0 +1,26 @@ +package org.alexdev.kepler.game.polls; + + +public class PollQuestion { + private int id; + private int pollId; + private PollQuestionType pollQuestionType; + + public PollQuestion(int id, int pollId, PollQuestionType pollQuestionType) { + this.id = id; + this.pollId = pollId; + this.pollQuestionType = pollQuestionType; + } + + public int getId() { + return id; + } + + public int getPollId() { + return pollId; + } + + public org.alexdev.kepler.game.polls.PollQuestionType getPollQuestionType() { + return pollQuestionType; + } +} diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestionOption.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestionOption.java new file mode 100644 index 000000000..a476af9ec --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestionOption.java @@ -0,0 +1,25 @@ +package org.alexdev.kepler.game.polls; + +public class PollQuestionOption { + private int id; + private String name; + private int pollQuestionId; + + public PollQuestionOption(int id, String name, int pollQuestionId) { + this.id = id; + this.name = name; + this.pollQuestionId = pollQuestionId; + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public int getPollQuestionId() { + return pollQuestionId; + } +} diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestionType.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestionType.java new file mode 100644 index 000000000..7583dcf2a --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestionType.java @@ -0,0 +1,6 @@ +package org.alexdev.kepler.game.polls; + +public enum PollQuestionType { + CHOICE, + TEXT +} diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollTrigger.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollTrigger.java new file mode 100644 index 000000000..f82d6198b --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollTrigger.java @@ -0,0 +1,38 @@ +package org.alexdev.kepler.game.polls; + + +public class PollTrigger { + private int id; + private int pollId; + private int roomId; + private int timeFrom; + private int timeTo; + + public PollTrigger(int id, int pollId, int roomId, int timeFrom, int timeTo) { + this.id = id; + this.pollId = pollId; + this.roomId = roomId; + this.timeFrom = timeFrom; + this.timeTo = timeTo; + } + + public int getId() { + return id; + } + + public int getPollId() { + return pollId; + } + + public int getRoomId() { + return roomId; + } + + public int getTimeFrom() { + return timeFrom; + } + + public int getTimeTo() { + return timeTo; + } +} diff --git a/tools/sql/polls.sql b/tools/sql/polls.sql new file mode 100644 index 000000000..4b9722e2b --- /dev/null +++ b/tools/sql/polls.sql @@ -0,0 +1,67 @@ +CREATE TABLE IF NOT EXISTS `polls` +( + `id` int NOT NULL AUTO_INCREMENT , + `headline` varchar(255) NOT NULL , + `thank_you` varchar(255) NOT NULL , + `description` text NOT NULL , + +PRIMARY KEY (`id`) +); + +CREATE TABLE IF NOT EXISTS `polls_answers` +( + `id` int NOT NULL AUTO_INCREMENT , + `poll_question_id` int NOT NULL , + `value` text NOT NULL , + +PRIMARY KEY (`id`), +KEY `FK_34` (`poll_question_id`), +CONSTRAINT `polls_questions_polls_answers_fk` FOREIGN KEY `FK_34` (`poll_question_id`) REFERENCES `polls_questions` (`id`) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS `polls_offers` +( + `id` int NOT NULL AUTO_INCREMENT , + `user_id` int NOT NULL , + `poll_id` int NOT NULL , + +PRIMARY KEY (`id`), +KEY `FK_66` (`poll_id`), +CONSTRAINT `polls_polls_offers_fk` FOREIGN KEY `FK_66` (`poll_id`) REFERENCES `polls` (`id`) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS `polls_questions` +( + `id` int NOT NULL AUTO_INCREMENT , + `poll_id` int NOT NULL , + `type` enum('choice', 'text') NOT NULL , + +PRIMARY KEY (`id`), +KEY `FK_23` (`poll_id`), +CONSTRAINT `polls_polls_questions_fk` FOREIGN KEY `FK_23` (`poll_id`) REFERENCES `polls` (`id`) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS `polls_questions_options` +( + `id` int NOT NULL AUTO_INCREMENT , + `name` varchar(255) NOT NULL , + `poll_question_id` int NOT NULL , + +PRIMARY KEY (`id`), +KEY `FK_50` (`poll_question_id`), +CONSTRAINT `polls_questions_polls_questions_options_fk` FOREIGN KEY `FK_50` (`poll_question_id`) REFERENCES `polls_questions` (`id`) ON DELETE CASCADE +); + +CREATE TABLE IF NOT EXISTS `polls_triggers` +( + `id` int NOT NULL AUTO_INCREMENT , + `poll_id` int NOT NULL , + `room` int NULL , + `time_from` int NULL , + `time_to` int NULL , + +PRIMARY KEY (`id`), +KEY `FK_39` (`poll_id`), +CONSTRAINT `polls_polls_triggers_fk` FOREIGN KEY `FK_39` (`poll_id`) REFERENCES `polls` (`id`) ON DELETE CASCADE +); + From e9a5c6398d57118edce429d154eeae8044b6352c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20N=C3=A6rvig=20W=C3=B8hlk?= Date: Sun, 1 May 2022 13:32:15 +0200 Subject: [PATCH 05/12] Started work on polls dao --- .../org/alexdev/kepler/dao/mysql/PollDao.java | 26 +++++++++++++++++++ .../org/alexdev/kepler/game/polls/Poll.java | 10 +++++-- .../kepler/game/polls/PollQuestion.java | 12 ++++++++- 3 files changed, 45 insertions(+), 3 deletions(-) create mode 100644 Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java b/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java new file mode 100644 index 000000000..0678aa538 --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java @@ -0,0 +1,26 @@ +package org.alexdev.kepler.dao.mysql; + +import org.alexdev.kepler.dao.Storage; +import org.alexdev.kepler.game.polls.Poll; +import org.alexdev.kepler.game.polls.PollQuestionOption; +import org.apache.commons.lang3.tuple.Pair; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.List; + +public class PollDao { + + public static Poll getPollOffers(int userId) { + return null; + } + + public static List getPollQuestions() { + return null; + } + + public + +} diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java index 64edcf698..5b4a2624a 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java @@ -1,16 +1,19 @@ package org.alexdev.kepler.game.polls; +import java.util.List; + public class Poll { private int id; private String headline; private String thankYou; private String description; - - public Poll(int id, String headline, String thankYou, String description) { + private List questions; + public Poll(int id, String headline, String thankYou, String description, List questions) { this.id = id; this.headline = headline; this.thankYou = thankYou; this.description = description; + this.questions = questions; } public int getId() { @@ -25,4 +28,7 @@ public String getThankYou() { public String getDescription() { return description; } + public List getQuestions() { + return questions; + } } diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java index d7e4d4385..43fe12bee 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java @@ -1,10 +1,13 @@ package org.alexdev.kepler.game.polls; +import java.util.List; + public class PollQuestion { private int id; private int pollId; private PollQuestionType pollQuestionType; + private List options; public PollQuestion(int id, int pollId, PollQuestionType pollQuestionType) { this.id = id; @@ -20,7 +23,14 @@ public int getPollId() { return pollId; } - public org.alexdev.kepler.game.polls.PollQuestionType getPollQuestionType() { + public List getOptions() { + return options; + } + public void addOptions(List options) { + this.options = options; + } + + public PollQuestionType getPollQuestionType() { return pollQuestionType; } } From adc8a9910c94e4fdf75e091b94a2f333f4f6636d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20N=C3=A6rvig=20W=C3=B8hlk?= Date: Tue, 3 May 2022 14:43:20 +0200 Subject: [PATCH 06/12] Started work on implementation of polls --- .../org/alexdev/kepler/dao/mysql/PollDao.java | 73 +++++-- .../alexdev/kepler/dao/mysql/PollsDao.java | 67 ------- .../org/alexdev/kepler/game/polls/Poll.java | 13 +- tools/sql/polls.sql | 184 +++++++++++------- 4 files changed, 189 insertions(+), 148 deletions(-) delete mode 100644 Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollsDao.java diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java b/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java index 0678aa538..f3e45544f 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java @@ -1,26 +1,77 @@ package org.alexdev.kepler.dao.mysql; import org.alexdev.kepler.dao.Storage; -import org.alexdev.kepler.game.polls.Poll; -import org.alexdev.kepler.game.polls.PollQuestionOption; -import org.apache.commons.lang3.tuple.Pair; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.util.ArrayList; +import org.alexdev.kepler.game.polls.*; + +import java.sql.*; import java.util.List; public class PollDao { - public static Poll getPollOffers(int userId) { + public static Poll getPoll(int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + Poll poll = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM polls WHERE id NOT IN (SELECT id FROM polls_offers where user_id = ?) limit 1;", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + poll = new Poll( + resultSet.getInt("id"), + resultSet.getString("headline"), + resultSet.getString("thank_you"), + resultSet.getString("description") + ); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return poll; + } + + public static List getPollQuestions(int pollId) { return null; } - public static List getPollQuestions() { + public static List getPollQuestionOptions(int pollId) { return null; } - public + public static List getPollTriggers() { + return null; + } + + public static void addAnswer(PollAnswer answer) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO polls_answers (poll_question_id, value) VALUES (?, ?)", sqlConnection); + + preparedStatement.setInt(1, answer.getPollQuestionId()); + preparedStatement.setString(2, answer.getValue()); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + } diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollsDao.java b/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollsDao.java deleted file mode 100644 index 0d1ac0c84..000000000 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollsDao.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.alexdev.kepler.dao.mysql; - -import org.alexdev.kepler.dao.Storage; -import org.alexdev.kepler.game.item.Photo; - -import java.sql.*; - -public class PollsDao { - public static void addAnswer(int photoId, int userId, long timestamp, byte[] photo, int checksum) throws SQLException { - Connection sqlConnection = null; - PreparedStatement preparedStatement = null; - - try { - sqlConnection = Storage.getStorage().getConnection(); - preparedStatement = Storage.getStorage().prepare("INSERT INTO items_photos (photo_id, photo_user_id, timestamp, photo_data, photo_checksum) VALUES (?, ?, ?, ?, ?)", sqlConnection); - - Blob photoBlob = sqlConnection.createBlob(); - photoBlob.setBytes(1, photo); - - preparedStatement.setInt(1, photoId); - preparedStatement.setInt(2, userId); - preparedStatement.setLong(3, timestamp); - preparedStatement.setBlob(4, photoBlob); - preparedStatement.setInt(5, checksum); - preparedStatement.execute(); - } catch (Exception e) { - Storage.logError(e); - throw e; - } finally { - Storage.closeSilently(preparedStatement); - Storage.closeSilently(sqlConnection); - } - } - - public static Photo getPhoto(int photoId) throws SQLException { - Photo photo = null; - - Connection sqlConnection = null; - PreparedStatement preparedStatement = null; - ResultSet resultSet = null; - - try { - sqlConnection = Storage.getStorage().getConnection(); - preparedStatement = Storage.getStorage().prepare("SELECT * FROM items_photos WHERE photo_id = ?", sqlConnection);// (photo_id, photo_user_id, timestamp, photo_data, photo_checksum) VALUES (?, ?, ?, ?, ?)", sqlConnection); - preparedStatement.setInt(1, photoId); - resultSet = preparedStatement.executeQuery(); - - if (resultSet.next()) { - Blob photoBlob = resultSet.getBlob("photo_data"); - int blobLength = (int) photoBlob.length(); - - byte[] photoBlobBytes = photoBlob.getBytes(1, blobLength); - photo = new Photo(photoId, resultSet.getInt("photo_checksum"), photoBlobBytes, resultSet.getLong("timestamp")); - } - - } catch (Exception e) { - Storage.logError(e); - throw e; - } finally { - Storage.closeSilently(preparedStatement); - Storage.closeSilently(sqlConnection); - Storage.closeSilently(resultSet); - } - - return photo; - } -} diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java index 5b4a2624a..63dcf1a01 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java @@ -1,5 +1,7 @@ package org.alexdev.kepler.game.polls; +import org.alexdev.kepler.dao.mysql.PollDao; + import java.util.List; public class Poll { @@ -7,13 +9,12 @@ public class Poll { private String headline; private String thankYou; private String description; - private List questions; - public Poll(int id, String headline, String thankYou, String description, List questions) { + + public Poll(int id, String headline, String thankYou, String description) { this.id = id; this.headline = headline; this.thankYou = thankYou; this.description = description; - this.questions = questions; } public int getId() { @@ -29,6 +30,10 @@ public String getDescription() { return description; } public List getQuestions() { - return questions; + return PollDao.getPollQuestions(this.id); + } + + public void sendAvailablePoll(int userId, int roomId) { + PollDao.get } } diff --git a/tools/sql/polls.sql b/tools/sql/polls.sql index 4b9722e2b..2ef4b7e66 100644 --- a/tools/sql/polls.sql +++ b/tools/sql/polls.sql @@ -1,67 +1,119 @@ -CREATE TABLE IF NOT EXISTS `polls` -( - `id` int NOT NULL AUTO_INCREMENT , - `headline` varchar(255) NOT NULL , - `thank_you` varchar(255) NOT NULL , - `description` text NOT NULL , - -PRIMARY KEY (`id`) -); - -CREATE TABLE IF NOT EXISTS `polls_answers` -( - `id` int NOT NULL AUTO_INCREMENT , - `poll_question_id` int NOT NULL , - `value` text NOT NULL , - -PRIMARY KEY (`id`), -KEY `FK_34` (`poll_question_id`), -CONSTRAINT `polls_questions_polls_answers_fk` FOREIGN KEY `FK_34` (`poll_question_id`) REFERENCES `polls_questions` (`id`) ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS `polls_offers` -( - `id` int NOT NULL AUTO_INCREMENT , - `user_id` int NOT NULL , - `poll_id` int NOT NULL , - -PRIMARY KEY (`id`), -KEY `FK_66` (`poll_id`), -CONSTRAINT `polls_polls_offers_fk` FOREIGN KEY `FK_66` (`poll_id`) REFERENCES `polls` (`id`) ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS `polls_questions` -( - `id` int NOT NULL AUTO_INCREMENT , - `poll_id` int NOT NULL , - `type` enum('choice', 'text') NOT NULL , - -PRIMARY KEY (`id`), -KEY `FK_23` (`poll_id`), -CONSTRAINT `polls_polls_questions_fk` FOREIGN KEY `FK_23` (`poll_id`) REFERENCES `polls` (`id`) ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS `polls_questions_options` -( - `id` int NOT NULL AUTO_INCREMENT , - `name` varchar(255) NOT NULL , - `poll_question_id` int NOT NULL , - -PRIMARY KEY (`id`), -KEY `FK_50` (`poll_question_id`), -CONSTRAINT `polls_questions_polls_questions_options_fk` FOREIGN KEY `FK_50` (`poll_question_id`) REFERENCES `polls_questions` (`id`) ON DELETE CASCADE -); - -CREATE TABLE IF NOT EXISTS `polls_triggers` -( - `id` int NOT NULL AUTO_INCREMENT , - `poll_id` int NOT NULL , - `room` int NULL , - `time_from` int NULL , - `time_to` int NULL , - -PRIMARY KEY (`id`), -KEY `FK_39` (`poll_id`), -CONSTRAINT `polls_polls_triggers_fk` FOREIGN KEY `FK_39` (`poll_id`) REFERENCES `polls` (`id`) ON DELETE CASCADE -); +-- +-- Table structure for table `polls` +-- + +CREATE TABLE IF NOT EXISTS `polls` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `headline` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `thank_you` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` text COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `polls_answers` +-- + +CREATE TABLE IF NOT EXISTS `polls_answers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `poll_question_id` int(11) NOT NULL, + `value` text NOT NULL, + PRIMARY KEY (`id`), + KEY `polls_questions_polls_answers_FK` (`poll_question_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `polls_offers` +-- + +CREATE TABLE IF NOT EXISTS `polls_offers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL, + `poll_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `polls_polls_offers_FK` (`poll_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `polls_questions` +-- + +CREATE TABLE IF NOT EXISTS `polls_questions` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `poll_id` int(11) NOT NULL, + `type` enum('choice','text') NOT NULL, + PRIMARY KEY (`id`), + KEY `polls_polls_questions_FK` (`poll_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `polls_questions_options` +-- + +CREATE TABLE IF NOT EXISTS `polls_questions_options` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `poll_question_id` int(11) NOT NULL, + PRIMARY KEY (`id`), + KEY `polls_questions_polls_questions_options_FK` (`poll_question_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- -------------------------------------------------------- + +-- +-- Table structure for table `polls_triggers` +-- + +CREATE TABLE IF NOT EXISTS `polls_triggers` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `poll_id` int(11) NOT NULL, + `room` int(11) DEFAULT NULL, + `time_from` int(11) DEFAULT NULL, + `time_to` int(11) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `polls_polls_triggers_FK` (`poll_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- +-- Constraints for dumped tables +-- + +-- +-- Constraints for table `polls_answers` +-- +ALTER TABLE `polls_answers` + ADD CONSTRAINT `polls_questions_polls_answers_FK` FOREIGN KEY (`poll_question_id`) REFERENCES `polls` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- +-- Constraints for table `polls_offers` +-- +ALTER TABLE `polls_offers` + ADD CONSTRAINT `polls_polls_offers_FK` FOREIGN KEY (`poll_id`) REFERENCES `polls` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- +-- Constraints for table `polls_questions` +-- +ALTER TABLE `polls_questions` + ADD CONSTRAINT `polls_polls_questions_FK` FOREIGN KEY (`poll_id`) REFERENCES `polls` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- +-- Constraints for table `polls_questions_options` +-- +ALTER TABLE `polls_questions_options` + ADD CONSTRAINT `polls_questions_polls_questions_options_FK` FOREIGN KEY (`poll_question_id`) REFERENCES `polls_questions` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- +-- Constraints for table `polls_triggers` +-- +ALTER TABLE `polls_triggers` + ADD CONSTRAINT `polls_polls_triggers_FK` FOREIGN KEY (`poll_id`) REFERENCES `polls` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION; +COMMIT; \ No newline at end of file From 3587a319fb4abc84ad7e5056e472e4e4538e516c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20N=C3=A6rvig=20W=C3=B8hlk?= Date: Thu, 5 May 2022 19:05:40 +0200 Subject: [PATCH 07/12] Started adding SQL for polls --- .../org/alexdev/kepler/dao/mysql/PollDao.java | 9 ++++---- .../org/alexdev/kepler/game/polls/Poll.java | 22 +++++++++++++++++-- .../kepler/game/polls/PollTrigger.java | 12 +++++----- 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java b/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java index f3e45544f..ea5dc83b6 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java @@ -8,7 +8,7 @@ public class PollDao { - public static Poll getPoll(int userId) { + public static Poll getPoll(int pollId) { Connection sqlConnection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; @@ -17,8 +17,8 @@ public static Poll getPoll(int userId) { try { sqlConnection = Storage.getStorage().getConnection(); - preparedStatement = Storage.getStorage().prepare("SELECT * FROM polls WHERE id NOT IN (SELECT id FROM polls_offers where user_id = ?) limit 1;", sqlConnection); - preparedStatement.setInt(1, userId); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM polls WHERE id = ? limit 1;", sqlConnection); + preparedStatement.setInt(1, pollId); resultSet = preparedStatement.executeQuery(); if (resultSet.next()) { @@ -42,6 +42,7 @@ public static Poll getPoll(int userId) { } public static List getPollQuestions(int pollId) { + // SELECT * FROM polls_triggers WHERE poll_id NOT IN (SELECT poll_id FROM polls_offers where user_id = 1) limit 1 return null; } @@ -49,7 +50,7 @@ public static List getPollQuestionOptions(int pollId) { return null; } - public static List getPollTriggers() { + public static List getPollTrigger() { return null; } diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java index 63dcf1a01..706823659 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java @@ -33,7 +33,25 @@ public List getQuestions() { return PollDao.getPollQuestions(this.id); } - public void sendAvailablePoll(int userId, int roomId) { - PollDao.get + public void sendAvailablePoll(int userId, Integer roomId) { + List triggers = PollDao.getPollTrigger(); + + for (PollTrigger trigger : triggers) { + if(trigger.getTimeFrom() != null && trigger.getTimeTo() != null) { + if(trigger.getRoomId() != null) { + + } else { + + } + } else { + if(trigger.getRoomId() != null) { + + } else { + + } + } + + } + } } diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollTrigger.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollTrigger.java index f82d6198b..c67678659 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollTrigger.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollTrigger.java @@ -4,9 +4,9 @@ public class PollTrigger { private int id; private int pollId; - private int roomId; - private int timeFrom; - private int timeTo; + private Integer roomId; + private Integer timeFrom; + private Integer timeTo; public PollTrigger(int id, int pollId, int roomId, int timeFrom, int timeTo) { this.id = id; @@ -24,15 +24,15 @@ public int getPollId() { return pollId; } - public int getRoomId() { + public Integer getRoomId() { return roomId; } - public int getTimeFrom() { + public Integer getTimeFrom() { return timeFrom; } - public int getTimeTo() { + public Integer getTimeTo() { return timeTo; } } From 77413bdabba78ed7a4781eeed3d142972af2ea38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20N=C3=A6rvig=20W=C3=B8hlk?= Date: Tue, 10 May 2022 06:47:41 +0200 Subject: [PATCH 08/12] Prompting for poll now works --- .../org/alexdev/kepler/dao/mysql/PollDao.java | 54 ++++++++++++++++++- .../org/alexdev/kepler/game/polls/Poll.java | 49 +++++++++++++---- .../kepler/game/polls/PollTrigger.java | 25 ++++++--- .../messages/incoming/rooms/TRYFLAT.java | 3 -- .../kepler/messages/incoming/user/PONG.java | 7 +++ .../messages/outgoing/poll/POLL_OFFER.java | 13 ++++- 6 files changed, 129 insertions(+), 22 deletions(-) diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java b/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java index ea5dc83b6..08b9580d3 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java @@ -2,8 +2,10 @@ import org.alexdev.kepler.dao.Storage; import org.alexdev.kepler.game.polls.*; +import org.alexdev.kepler.game.room.Room; import java.sql.*; +import java.util.ArrayList; import java.util.List; public class PollDao { @@ -50,8 +52,56 @@ public static List getPollQuestionOptions(int pollId) { return null; } - public static List getPollTrigger() { - return null; + public static List getPollTriggers(int userId) { + List triggers = new ArrayList<>(); + + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT\n" + + "pt.id as trigger_id,\n" + + "pt.room,\n" + + "pt.time_from,\n" + + "pt.time_to,\n" + + "p.id as poll_id,\n" + + "p.headline,\n" + + "p.thank_you,\n" + + "p.description\n" + + "FROM polls_triggers as pt\n" + + "LEFT JOIN polls as p on pt.poll_id = p.id\n" + + "WHERE p.id NOT IN (SELECT po.poll_id FROM polls_offers as po where po.user_id = ?);", sqlConnection); + preparedStatement.setInt(1, userId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + PollTrigger trigger = new PollTrigger( + resultSet.getInt("trigger_id"), + resultSet.getInt("poll_id"), + resultSet.getInt("room"), + resultSet.getInt("time_from"), + resultSet.getInt("time_to"), + new Poll( + resultSet.getInt("poll_id"), + resultSet.getString("headline"), + resultSet.getString("thank_you"), + resultSet.getString("description") + ) + ); + triggers.add(trigger); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return triggers; } public static void addAnswer(PollAnswer answer) { diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java index 706823659..026f7dc0b 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java @@ -1,7 +1,11 @@ package org.alexdev.kepler.game.polls; import org.alexdev.kepler.dao.mysql.PollDao; +import org.alexdev.kepler.game.player.Player; +import org.alexdev.kepler.messages.outgoing.poll.POLL_OFFER; +import org.alexdev.kepler.util.DateUtil; +import java.util.ArrayList; import java.util.List; public class Poll { @@ -33,24 +37,51 @@ public List getQuestions() { return PollDao.getPollQuestions(this.id); } - public void sendAvailablePoll(int userId, Integer roomId) { - List triggers = PollDao.getPollTrigger(); + public static void sendAvailablePoll(Player player) { + List triggers = PollDao.getPollTriggers(player.getDetails().getId()); for (PollTrigger trigger : triggers) { - if(trigger.getTimeFrom() != null && trigger.getTimeTo() != null) { - if(trigger.getRoomId() != null) { + System.out.println("GOT TRIGGERS FOR POLLS"); + System.out.println(trigger.getPoll().headline); + System.out.println("WAt: " + trigger.getTimeTo()); + } + if(triggers.isEmpty()) return; - } else { + List triggersForRoom = new ArrayList<>(); + List triggersWithNoRoom = new ArrayList<>(); - } - } else { - if(trigger.getRoomId() != null) { + for (PollTrigger trigger : triggers) { + if(trigger.getRoomId() != 0) { + triggersForRoom.add(trigger); + } else { + triggersWithNoRoom.add(trigger); + } + } - } else { + List actualTriggers = new ArrayList<>(); + + for (PollTrigger trigger : triggersForRoom) { + boolean hasTimeWindow = trigger.getTimeFrom() != 0 && trigger.getTimeTo() != 0; + System.out.println("hastimewindow: " + hasTimeWindow); + boolean isWithinTimeWindow = hasTimeWindow ? !(DateUtil.getCurrentTimeSeconds() >= trigger.getTimeFrom() && DateUtil.getCurrentTimeSeconds() <= trigger.getTimeTo()) : true; + System.out.println("isWithinTime: " + isWithinTimeWindow); + if(isWithinTimeWindow) { + if(trigger.getRoomId() == player.getRoomUser().getRoom().getId()) { + System.out.println("ADDED TRIGGER TO ACUTAL TRIGGERS"); + actualTriggers.add(trigger); + } else if(trigger.getRoomId() == 0) { + System.out.println("ADDED TRIGGER TO ACUTAL TRIGGERS 2"); + actualTriggers.add(trigger); } } + } + + if(!actualTriggers.isEmpty()) { + System.out.println("ADDED TRIGGER TO ACUTAL TRIGGERS"); + PollTrigger pollTrigger = actualTriggers.get(0); + player.send(new POLL_OFFER(pollTrigger.getPoll().getId(), pollTrigger.getPoll().getDescription())); } } diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollTrigger.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollTrigger.java index c67678659..b863cf4a7 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollTrigger.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollTrigger.java @@ -4,9 +4,10 @@ public class PollTrigger { private int id; private int pollId; - private Integer roomId; - private Integer timeFrom; - private Integer timeTo; + private int roomId; + private int timeFrom; + private int timeTo; + private Poll poll; public PollTrigger(int id, int pollId, int roomId, int timeFrom, int timeTo) { this.id = id; @@ -16,6 +17,15 @@ public PollTrigger(int id, int pollId, int roomId, int timeFrom, int timeTo) { this.timeTo = timeTo; } + public PollTrigger(int id, int pollId, int roomId, int timeFrom, int timeTo, Poll poll) { + this.id = id; + this.pollId = pollId; + this.roomId = roomId; + this.timeFrom = timeFrom; + this.timeTo = timeTo; + this.poll = poll; + } + public int getId() { return id; } @@ -24,15 +34,18 @@ public int getPollId() { return pollId; } - public Integer getRoomId() { + public int getRoomId() { return roomId; } - public Integer getTimeFrom() { + public int getTimeFrom() { return timeFrom; } - public Integer getTimeTo() { + public int getTimeTo() { return timeTo; } + public Poll getPoll() { + return poll; + } } diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/rooms/TRYFLAT.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/rooms/TRYFLAT.java index 17776eea0..4e55aede3 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/rooms/TRYFLAT.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/rooms/TRYFLAT.java @@ -17,9 +17,6 @@ public class TRYFLAT implements MessageEvent { @Override public void handle(Player player, NettyRequest reader) { - // TODO REMOVE - player.send(new POLL_OFFER()); - int roomId = -1; String contents = reader.contents(); diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/user/PONG.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/user/PONG.java index 59dc3e40c..aa90ca080 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/user/PONG.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/user/PONG.java @@ -1,6 +1,8 @@ package org.alexdev.kepler.messages.incoming.user; import org.alexdev.kepler.game.player.Player; +import org.alexdev.kepler.game.polls.Poll; +import org.alexdev.kepler.messages.outgoing.poll.POLL_OFFER; import org.alexdev.kepler.messages.types.MessageEvent; import org.alexdev.kepler.server.netty.streams.NettyRequest; @@ -9,5 +11,10 @@ public class PONG implements MessageEvent { public void handle(Player player, NettyRequest reader) { // Nice pong :^) player.setPingOK(true); + + Poll.sendAvailablePoll(player); + + + } } diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_OFFER.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_OFFER.java index 05da817d1..52a6f364b 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_OFFER.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_OFFER.java @@ -4,10 +4,19 @@ import org.alexdev.kepler.server.netty.streams.NettyResponse; public class POLL_OFFER extends MessageComposer { + + private final Integer id; + private final String name; + + public POLL_OFFER(Integer id, String name) { + this.id = id; + this.name = name; + } + @Override public void compose(NettyResponse response) { - response.writeInt(1); - response.writeString("TEST"); + response.writeInt(this.id); + response.writeString(this.name); } @Override From 856705c7c3f0b70ec8a7ee901cd305c165cd70a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20N=C3=A6rvig=20W=C3=B8hlk?= Date: Wed, 11 May 2022 14:30:00 +0200 Subject: [PATCH 09/12] Added text field to poll question --- .../java/org/alexdev/kepler/game/polls/PollQuestion.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java index 43fe12bee..839d3ca09 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java @@ -8,11 +8,13 @@ public class PollQuestion { private int pollId; private PollQuestionType pollQuestionType; private List options; + private String text; - public PollQuestion(int id, int pollId, PollQuestionType pollQuestionType) { + public PollQuestion(int id, int pollId, PollQuestionType pollQuestionType, String text) { this.id = id; this.pollId = pollId; this.pollQuestionType = pollQuestionType; + this.text = text; } public int getId() { @@ -33,4 +35,5 @@ public void addOptions(List options) { public PollQuestionType getPollQuestionType() { return pollQuestionType; } + public String getText() { return text; } } From e348ac5799d809b9dca43906ab7e9488eaa04da8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20N=C3=A6rvig=20W=C3=B8hlk?= Date: Wed, 11 May 2022 22:40:37 +0200 Subject: [PATCH 10/12] Presenting polls to the user now works Now to save the answers. --- .../org/alexdev/kepler/dao/mysql/PollDao.java | 87 +++++++++++++++++-- .../org/alexdev/kepler/game/polls/Poll.java | 34 ++------ .../kepler/game/polls/PollQuestion.java | 13 ++- .../messages/incoming/poll/POLL_REJECT.java | 3 +- .../messages/incoming/poll/POLL_START.java | 8 +- .../messages/outgoing/poll/POLL_CONTENTS.java | 63 ++++++++++++-- 6 files changed, 163 insertions(+), 45 deletions(-) diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java b/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java index 08b9580d3..a5204d5c4 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java @@ -2,7 +2,6 @@ import org.alexdev.kepler.dao.Storage; import org.alexdev.kepler.game.polls.*; -import org.alexdev.kepler.game.room.Room; import java.sql.*; import java.util.ArrayList; @@ -44,12 +43,70 @@ public static Poll getPoll(int pollId) { } public static List getPollQuestions(int pollId) { - // SELECT * FROM polls_triggers WHERE poll_id NOT IN (SELECT poll_id FROM polls_offers where user_id = 1) limit 1 - return null; + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + List questions = new ArrayList<>(); + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM polls_questions WHERE id = ?", sqlConnection); + preparedStatement.setInt(1, pollId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + questions.add(new PollQuestion( + resultSet.getInt("id"), + resultSet.getInt("poll_id"), + PollQuestionType.valueOf(resultSet.getString("type")), + resultSet.getString("text"), + resultSet.getInt("min_select"), + resultSet.getInt("max_select") + )); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return questions; } - public static List getPollQuestionOptions(int pollId) { - return null; + public static List getPollQuestionOptions(int questionId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + List questionOptions = new ArrayList<>(); + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM polls_questions_options WHERE poll_question_id = ?", sqlConnection); + preparedStatement.setInt(1, questionId); + resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + questionOptions.add(new PollQuestionOption( + resultSet.getInt("id"), + resultSet.getString("name"), + resultSet.getInt("poll_question_id") + )); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return questionOptions; } public static List getPollTriggers(int userId) { @@ -124,5 +181,25 @@ public static void addAnswer(PollAnswer answer) { } } + public static void addOffer(int pollId, int userId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("INSERT INTO polls_offers (poll_Id, user_id) VALUES (?, ?)", sqlConnection); + + preparedStatement.setInt(1, pollId); + preparedStatement.setInt(2, userId); + preparedStatement.execute(); + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + } + } diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java index 026f7dc0b..ad1caec14 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java @@ -33,53 +33,35 @@ public String getThankYou() { public String getDescription() { return description; } + public List getQuestions() { - return PollDao.getPollQuestions(this.id); + List questions = PollDao.getPollQuestions(this.id); + for (PollQuestion question : questions) { + question.addOptions(PollDao.getPollQuestionOptions(question.getId())); + } + return questions; } public static void sendAvailablePoll(Player player) { List triggers = PollDao.getPollTriggers(player.getDetails().getId()); - for (PollTrigger trigger : triggers) { - System.out.println("GOT TRIGGERS FOR POLLS"); - System.out.println(trigger.getPoll().headline); - System.out.println("WAt: " + trigger.getTimeTo()); - } if(triggers.isEmpty()) return; - List triggersForRoom = new ArrayList<>(); - List triggersWithNoRoom = new ArrayList<>(); - - for (PollTrigger trigger : triggers) { - if(trigger.getRoomId() != 0) { - triggersForRoom.add(trigger); - } else { - triggersWithNoRoom.add(trigger); - } - } - List actualTriggers = new ArrayList<>(); - - for (PollTrigger trigger : triggersForRoom) { + for (PollTrigger trigger : triggers) { boolean hasTimeWindow = trigger.getTimeFrom() != 0 && trigger.getTimeTo() != 0; - System.out.println("hastimewindow: " + hasTimeWindow); - boolean isWithinTimeWindow = hasTimeWindow ? !(DateUtil.getCurrentTimeSeconds() >= trigger.getTimeFrom() && DateUtil.getCurrentTimeSeconds() <= trigger.getTimeTo()) : true; - System.out.println("isWithinTime: " + isWithinTimeWindow); + boolean isWithinTimeWindow = !hasTimeWindow || !(DateUtil.getCurrentTimeSeconds() >= trigger.getTimeFrom() && DateUtil.getCurrentTimeSeconds() <= trigger.getTimeTo()); if(isWithinTimeWindow) { if(trigger.getRoomId() == player.getRoomUser().getRoom().getId()) { - System.out.println("ADDED TRIGGER TO ACUTAL TRIGGERS"); actualTriggers.add(trigger); } else if(trigger.getRoomId() == 0) { - System.out.println("ADDED TRIGGER TO ACUTAL TRIGGERS 2"); actualTriggers.add(trigger); } } } - if(!actualTriggers.isEmpty()) { - System.out.println("ADDED TRIGGER TO ACUTAL TRIGGERS"); PollTrigger pollTrigger = actualTriggers.get(0); player.send(new POLL_OFFER(pollTrigger.getPoll().getId(), pollTrigger.getPoll().getDescription())); } diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java index 839d3ca09..33a4b1cf1 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java @@ -9,12 +9,16 @@ public class PollQuestion { private PollQuestionType pollQuestionType; private List options; private String text; + private int maxSelect; + private int minSelect; - public PollQuestion(int id, int pollId, PollQuestionType pollQuestionType, String text) { + public PollQuestion(int id, int pollId, PollQuestionType pollQuestionType, String text, int minSelect, int maxSelect) { this.id = id; this.pollId = pollId; this.pollQuestionType = pollQuestionType; this.text = text; + this.minSelect = minSelect; + this.maxSelect = maxSelect; } public int getId() { @@ -24,6 +28,12 @@ public int getId() { public int getPollId() { return pollId; } + public int getMaxSelect() { + return maxSelect; + } + public int getMinSelect() { + return minSelect; + } public List getOptions() { return options; @@ -36,4 +46,5 @@ public PollQuestionType getPollQuestionType() { return pollQuestionType; } public String getText() { return text; } + } diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_REJECT.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_REJECT.java index 1561cfb5f..7335b1186 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_REJECT.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_REJECT.java @@ -1,5 +1,6 @@ package org.alexdev.kepler.messages.incoming.poll; +import org.alexdev.kepler.dao.mysql.PollDao; import org.alexdev.kepler.game.player.Player; import org.alexdev.kepler.messages.outgoing.poll.POLL_CONTENTS; import org.alexdev.kepler.messages.types.MessageEvent; @@ -16,7 +17,7 @@ public void handle(Player player, NettyRequest reader) throws SQLException { } Integer id = reader.readInt(); - System.out.println("REJECTED POLL " + id); + PollDao.addOffer(id, player.getDetails().getId()); } } diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_START.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_START.java index fac45da60..1a536bc2c 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_START.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_START.java @@ -1,6 +1,8 @@ package org.alexdev.kepler.messages.incoming.poll; +import org.alexdev.kepler.dao.mysql.PollDao; import org.alexdev.kepler.game.player.Player; +import org.alexdev.kepler.game.polls.Poll; import org.alexdev.kepler.messages.outgoing.poll.POLL_CONTENTS; import org.alexdev.kepler.messages.types.MessageEvent; import org.alexdev.kepler.server.netty.streams.NettyRequest; @@ -16,9 +18,9 @@ public void handle(Player player, NettyRequest reader) throws SQLException { } Integer id = reader.readInt(); - System.out.println("START POLL WITH ID " + id); - - player.send(new POLL_CONTENTS()); + PollDao.addOffer(id, player.getDetails().getId()); + Poll poll = PollDao.getPoll(id); + player.send(new POLL_CONTENTS(poll)); } } diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java index 0a839d0cc..085af0372 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java @@ -1,5 +1,9 @@ package org.alexdev.kepler.messages.outgoing.poll; +import org.alexdev.kepler.game.polls.Poll; +import org.alexdev.kepler.game.polls.PollQuestion; +import org.alexdev.kepler.game.polls.PollQuestionOption; +import org.alexdev.kepler.game.polls.PollQuestionType; import org.alexdev.kepler.messages.types.MessageComposer; import org.alexdev.kepler.server.netty.streams.NettyResponse; import org.alexdev.kepler.util.StringUtil; @@ -7,25 +11,66 @@ import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.util.List; public class POLL_CONTENTS extends MessageComposer { + private Poll poll; + public POLL_CONTENTS(Poll poll) { + this.poll = poll; + } + @Override public void compose(NettyResponse response) { - // tPollID - response.writeInt(1); - // tPollHeadLine - response.writeString("TEST AFSTEMNING"); - // tPollThankYou - response.writeString("Tak fordi du deltog i afstemningen!"); - // Question count - response.writeInt(3); + // tPollID + response.writeInt(this.poll.getId()); + // tPollHeadLine + response.writeString(this.poll.getHeadline()); + // tPollThankYou + response.writeString(this.poll.getThankYou()); + // Question count + response.writeInt(this.poll.getQuestions().size()); + + List questions = this.poll.getQuestions(); + for (PollQuestion question : questions) { + // questionID + response.writeInt(question.getId()); + System.out.println("questionID: " + question.getId()); + // questionNumber + response.writeInt(questions.indexOf(question)+1); + System.out.println("questionNumber: " + question.getId()); + // questionType + response.writeInt((question.getPollQuestionType() == PollQuestionType.CHOICE) ? 1 : 3); + System.out.println("questionType: " + ((question.getPollQuestionType() == PollQuestionType.CHOICE) ? 1 : 3)); + // questionText + response.writeString(question.getText()); + System.out.println("questionText: " + question.getText()); + if(question.getPollQuestionType() == PollQuestionType.CHOICE) { + // tSelectionCount + response.writeInt(question.getOptions().size()); + System.out.println("tSelectionCount: " + question.getOptions().size()); + // minSelect + response.writeInt(question.getMinSelect()); + System.out.println("minSelect: " + question.getMinSelect()); + // maxSelect + response.writeInt(question.getMaxSelect()); + System.out.println("maxSelect: " + question.getMaxSelect()); + // questionText + for(PollQuestionOption option : question.getOptions()) { + response.writeString(option.getName()); + System.out.println("questionText: " + option.getName()); + } + } + + } + +/* // questionID response.writeInt(1); // questionNumber @@ -76,7 +121,7 @@ public void compose(NettyResponse response) { response.writeInt(3); // questionText response.writeString("Skriv noget"); //response.writeString(StringUtil.charsetEncode("æøå")); - +*/ } From 581eb700f4fd9aba6f59a8b4a14ccc74e59622cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20N=C3=A6rvig=20W=C3=B8hlk?= Date: Mon, 16 May 2022 09:33:07 +0200 Subject: [PATCH 11/12] Fixed offline messenger requests --- .../src/main/java/org/alexdev/kepler/game/polls/Poll.java | 2 +- .../messages/incoming/messenger/MESSENGER_GETREQUESTS.java | 7 ------- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java index ad1caec14..a183db433 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java @@ -53,7 +53,7 @@ public static void sendAvailablePoll(Player player) { boolean hasTimeWindow = trigger.getTimeFrom() != 0 && trigger.getTimeTo() != 0; boolean isWithinTimeWindow = !hasTimeWindow || !(DateUtil.getCurrentTimeSeconds() >= trigger.getTimeFrom() && DateUtil.getCurrentTimeSeconds() <= trigger.getTimeTo()); if(isWithinTimeWindow) { - if(trigger.getRoomId() == player.getRoomUser().getRoom().getId()) { + if(player.getRoomUser() != null && trigger.getRoomId() == player.getRoomUser().getRoom().getId()) { actualTriggers.add(trigger); } else if(trigger.getRoomId() == 0) { actualTriggers.add(trigger); diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/messenger/MESSENGER_GETREQUESTS.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/messenger/MESSENGER_GETREQUESTS.java index f87794771..f59557a28 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/messenger/MESSENGER_GETREQUESTS.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/messenger/MESSENGER_GETREQUESTS.java @@ -17,12 +17,5 @@ public void handle(Player player, NettyRequest reader) { for (MessengerUser requester : player.getMessenger().getRequests()) { player.send(new FRIEND_REQUEST(requester)); } - for (MessengerMessage offlineMessage : player.getMessenger().getOfflineMessages().values()) { - if(offlineMessage.getFromId() == 0) { - player.send(new CAMPAIGN_MSG(offlineMessage)); - } else { - player.send(new MESSENGER_MSG(offlineMessage)); - } - } } } From 1911e52de933ed785ea5a03b6b4950edbf394fea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20N=C3=A6rvig=20W=C3=B8hlk?= Date: Sun, 24 Jul 2022 17:15:40 +0200 Subject: [PATCH 12/12] feat: More work on polls --- .../org/alexdev/kepler/dao/mysql/PollDao.java | 36 ++++++++++++++++++- .../org/alexdev/kepler/game/polls/Poll.java | 2 +- .../alexdev/kepler/game/polls/PollAnswer.java | 5 +++ .../messages/incoming/poll/POLL_ANSWER.java | 32 ++++++++++------- .../messages/outgoing/poll/POLL_CONTENTS.java | 4 --- 5 files changed, 61 insertions(+), 18 deletions(-) diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java b/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java index a5204d5c4..a97b19248 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java @@ -51,7 +51,7 @@ public static List getPollQuestions(int pollId) { try { sqlConnection = Storage.getStorage().getConnection(); - preparedStatement = Storage.getStorage().prepare("SELECT * FROM polls_questions WHERE id = ?", sqlConnection); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM polls_questions WHERE poll_id = ?", sqlConnection); preparedStatement.setInt(1, pollId); resultSet = preparedStatement.executeQuery(); @@ -202,4 +202,38 @@ public static void addOffer(int pollId, int userId) { } + public static PollQuestion getQuestion(int questionId) { + Connection sqlConnection = null; + PreparedStatement preparedStatement = null; + ResultSet resultSet = null; + + PollQuestion question = null; + + try { + sqlConnection = Storage.getStorage().getConnection(); + preparedStatement = Storage.getStorage().prepare("SELECT * FROM polls_questions WHERE id = ? limit 1;", sqlConnection); + preparedStatement.setInt(1, questionId); + resultSet = preparedStatement.executeQuery(); + + if (resultSet.next()) { + question = new PollQuestion( + resultSet.getInt("id"), + resultSet.getInt("poll_id"), + PollQuestionType.valueOf(resultSet.getString("type")), + resultSet.getString("text"), + resultSet.getInt("min_select"), + resultSet.getInt("max_select") + ); + } + + } catch (Exception e) { + Storage.logError(e); + } finally { + Storage.closeSilently(resultSet); + Storage.closeSilently(preparedStatement); + Storage.closeSilently(sqlConnection); + } + + return question; + } } diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java index a183db433..8a276f6eb 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java @@ -53,7 +53,7 @@ public static void sendAvailablePoll(Player player) { boolean hasTimeWindow = trigger.getTimeFrom() != 0 && trigger.getTimeTo() != 0; boolean isWithinTimeWindow = !hasTimeWindow || !(DateUtil.getCurrentTimeSeconds() >= trigger.getTimeFrom() && DateUtil.getCurrentTimeSeconds() <= trigger.getTimeTo()); if(isWithinTimeWindow) { - if(player.getRoomUser() != null && trigger.getRoomId() == player.getRoomUser().getRoom().getId()) { + if((player.getRoomUser() != null && player.getRoomUser().getRoom() != null) && trigger.getRoomId() == player.getRoomUser().getRoom().getId()) { actualTriggers.add(trigger); } else if(trigger.getRoomId() == 0) { actualTriggers.add(trigger); diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollAnswer.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollAnswer.java index 50e154551..62037c9ce 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollAnswer.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollAnswer.java @@ -6,6 +6,11 @@ public class PollAnswer { private int pollQuestionId; private String value; + public PollAnswer(int pollQuestionId, String value) { + this.pollQuestionId = pollQuestionId; + this.value = value; + } + public PollAnswer(int id, int pollQuestionId, String value) { this.id = id; this.pollQuestionId = pollQuestionId; diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_ANSWER.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_ANSWER.java index 98546c98b..004c368b5 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_ANSWER.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_ANSWER.java @@ -1,10 +1,13 @@ package org.alexdev.kepler.messages.incoming.poll; +import org.alexdev.kepler.dao.mysql.PollDao; import org.alexdev.kepler.game.player.Player; +import org.alexdev.kepler.game.polls.*; import org.alexdev.kepler.messages.types.MessageEvent; import org.alexdev.kepler.server.netty.streams.NettyRequest; import java.sql.SQLException; +import java.util.List; public class POLL_ANSWER implements MessageEvent { @@ -14,26 +17,31 @@ public void handle(Player player, NettyRequest reader) throws SQLException { return; } Integer id = reader.readInt(); - System.out.println("POLL ANSWER - POLL ID: " + id); Integer questionId = reader.readInt(); - System.out.println("POLL ANSWER - QUESTION ID: " + questionId); + System.out.println("ID: " + id); + System.out.println("questionId: " + questionId); - if(questionId == 2 || questionId == 1) { - Integer amountSelected = reader.readInt(); - System.out.println("POLL ANSWER - AMOUNT SELECTED: " + amountSelected); + PollQuestion question = PollDao.getQuestion(questionId); + if(question == null) return; + List questionOptions = PollDao.getPollQuestionOptions(question.getId()); + if(question.getPollQuestionType() == PollQuestionType.CHOICE) { + // amountSelected + Integer amountSelected = reader.readInt(); for(Integer i = 0; i < amountSelected; i++) { Integer selectedIndex = reader.readInt(); - System.out.println("POLL ANSWER - SELECTED: " + selectedIndex); + if(questionOptions != null) { + PollQuestionOption option = questionOptions.get(selectedIndex-1); + if(option != null) { + PollDao.addAnswer(new PollAnswer(question.getId(), Integer.toString(option.getId()))); + } + } } - - } - - if(questionId == 3) { + } else { String text = reader.readString(); - System.out.println("POLL ANSWER - TEXT: " + text); + // THIS IS WRONG FIX IT LATER + PollDao.addAnswer(new PollAnswer(question.getId(), text)); } - } } diff --git a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java index 085af0372..63a575f12 100644 --- a/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java @@ -23,10 +23,6 @@ public POLL_CONTENTS(Poll poll) { @Override public void compose(NettyResponse response) { - - - - // tPollID response.writeInt(this.poll.getId()); // tPollHeadLine