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..a97b19248 --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/dao/mysql/PollDao.java @@ -0,0 +1,239 @@ +package org.alexdev.kepler.dao.mysql; + +import org.alexdev.kepler.dao.Storage; +import org.alexdev.kepler.game.polls.*; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class PollDao { + + public static Poll getPoll(int pollId) { + 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 = ? limit 1;", sqlConnection); + preparedStatement.setInt(1, pollId); + 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) { + 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 poll_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 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) { + 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) { + 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); + } + } + + 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); + } + } + + + 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 new file mode 100644 index 000000000..8a276f6eb --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/Poll.java @@ -0,0 +1,70 @@ +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 { + 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; + } + + public List getQuestions() { + 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()); + if(triggers.isEmpty()) return; + + List actualTriggers = new ArrayList<>(); + + for (PollTrigger trigger : triggers) { + 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 && player.getRoomUser().getRoom() != null) && trigger.getRoomId() == player.getRoomUser().getRoom().getId()) { + actualTriggers.add(trigger); + } else if(trigger.getRoomId() == 0) { + actualTriggers.add(trigger); + } + } + } + + if(!actualTriggers.isEmpty()) { + 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/PollAnswer.java b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollAnswer.java new file mode 100644 index 000000000..62037c9ce --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollAnswer.java @@ -0,0 +1,31 @@ +package org.alexdev.kepler.game.polls; + + +public class PollAnswer { + private int id; + 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; + 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..33a4b1cf1 --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollQuestion.java @@ -0,0 +1,50 @@ +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; + private String text; + private int maxSelect; + private int minSelect; + + 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() { + return id; + } + + public int getPollId() { + return pollId; + } + public int getMaxSelect() { + return maxSelect; + } + public int getMinSelect() { + return minSelect; + } + + public List getOptions() { + return options; + } + public void addOptions(List options) { + this.options = options; + } + + public PollQuestionType getPollQuestionType() { + return pollQuestionType; + } + public String getText() { return text; } + +} 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..b863cf4a7 --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/game/polls/PollTrigger.java @@ -0,0 +1,51 @@ +package org.alexdev.kepler.game.polls; + + +public class PollTrigger { + private int id; + private int pollId; + 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; + this.pollId = pollId; + this.roomId = roomId; + this.timeFrom = timeFrom; + 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; + } + + public int getPollId() { + return pollId; + } + + public int getRoomId() { + return roomId; + } + + public int getTimeFrom() { + return timeFrom; + } + + public int getTimeTo() { + return timeTo; + } + public Poll getPoll() { + return poll; + } +} 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 99658f4dc..080293bf4 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.*; 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,15 @@ private void registerHandshakePackets() { registerEvent(756, new TRY_LOGIN()); } + /** + * Register handshake packets. + */ + private void registerPollPackets() { + registerEvent(234, new POLL_START()); + registerEvent(235, new POLL_REJECT()); + registerEvent(236, new POLL_ANSWER()); + } + /** * Register handshake packets. */ 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)); - } - } } } 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..004c368b5 --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_ANSWER.java @@ -0,0 +1,47 @@ +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 { + + @Override + public void handle(Player player, NettyRequest reader) throws SQLException { + if (!player.isLoggedIn()) { + return; + } + Integer id = reader.readInt(); + Integer questionId = reader.readInt(); + + System.out.println("ID: " + id); + System.out.println("questionId: " + questionId); + + 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(); + if(questionOptions != null) { + PollQuestionOption option = questionOptions.get(selectedIndex-1); + if(option != null) { + PollDao.addAnswer(new PollAnswer(question.getId(), Integer.toString(option.getId()))); + } + } + } + } else { + String text = reader.readString(); + // 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/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..7335b1186 --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_REJECT.java @@ -0,0 +1,23 @@ +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; +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(); + 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 new file mode 100644 index 000000000..1a536bc2c --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/poll/POLL_START.java @@ -0,0 +1,26 @@ +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; + +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(); + 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/incoming/rooms/TRYFLAT.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/incoming/rooms/TRYFLAT.java index 19450d75e..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 @@ -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; 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..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 @@ -1,12 +1,11 @@ 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 { 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_CONTENTS.java b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java new file mode 100644 index 000000000..63a575f12 --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_CONTENTS.java @@ -0,0 +1,128 @@ +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; + +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(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 + response.writeInt(1); + // questionType + response.writeInt(1); + // questionText + response.writeString("æøå"); //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("Vælg dine favorit mærker"); + // tSelectionCount + response.writeInt(3); + // minSelect + response.writeInt(0); + // maxSelect + response.writeInt(3); + // 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 + 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..52a6f364b --- /dev/null +++ b/Kepler-Server/src/main/java/org/alexdev/kepler/messages/outgoing/poll/POLL_OFFER.java @@ -0,0 +1,26 @@ +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 { + + 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(this.id); + response.writeString(this.name); + } + + @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 * diff --git a/tools/sql/polls.sql b/tools/sql/polls.sql new file mode 100644 index 000000000..2ef4b7e66 --- /dev/null +++ b/tools/sql/polls.sql @@ -0,0 +1,119 @@ + +-- +-- 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