From 0b1270a916ae2c6ab823206cff976aa55d5e2459 Mon Sep 17 00:00:00 2001 From: bloodwiing Date: Wed, 13 Dec 2023 00:30:24 +0200 Subject: [PATCH] Packet, Auth reworks & Messages --- .../dev/wiing/gossip/client/Connection.java | 80 +++++++++- .../dev/wiing/gossip/client/GossipApp.java | 3 + .../client/controllers/LoginController.java | 10 +- .../controllers/MainChatController.java | 73 ++++++++- .../client/controllers/MainController.java | 55 +++++-- .../item/MessageItemController.java | 88 +++++++++++ ...ntroller.java => TopicItemController.java} | 7 +- .../dev/wiing/gossip/client/styling.css | 6 +- .../{main-chat-view.fxml => chat-view.fxml} | 13 +- .../gossip/client/views/message-item.fxml | 40 +++++ .../{main-topic-item.fxml => topic-item.fxml} | 2 +- .../dev/wiing/gossip/lib/PacketHandler.java | 35 ++++- .../dev/wiing/gossip/lib/PacketManager.java | 16 +- .../dev/wiing/gossip/lib/data/AuthSecret.java | 47 ++++++ .../dev/wiing/gossip/lib/data/ListData.java | 60 ++++++++ .../dev/wiing/gossip/lib/data/LongData.java | 34 +++++ .../gossip/lib/data/PacketAtomicData.java | 6 + .../data/{DataType.java => PacketData.java} | 7 +- .../data/{StringType.java => StringData.java} | 7 +- .../dev/wiing/gossip/lib/models/Message.java | 30 +++- .../wiing/gossip/lib/models/SecretUser.java | 11 +- .../dev/wiing/gossip/lib/models/Topic.java | 19 ++- .../wiing/gossip/lib/packets/AckPacket.java | 41 +++++ .../lib/packets/AuthRequiredPacket.java | 19 +++ .../lib/packets/MessageCreatedPacket.java | 63 ++++++++ .../gossip/lib/packets/MessagePushPacket.java | 54 +++++++ ...et.java => RegisterCredentialsPacket.java} | 20 +-- ...Packet.java => RegisterRequestPacket.java} | 12 +- .../wiing/gossip/lib/packets/TestPacket.java | 5 +- ...dedPacket.java => TopicCreatedPacket.java} | 12 +- .../gossip/lib/packets/TopicJoinPacket.java | 41 +++++ ...eTopicPacket.java => TopicPushPacket.java} | 26 ++-- .../gossip/lib/packets/TopicUpdatePacket.java | 138 +++++++++++++++++ .../gossip/lib/packets/UserDataPacket.java | 4 +- ...chUserPacket.java => UserFetchPacket.java} | 6 +- Server/pom.xml | 16 ++ .../dev/wiing/gossip/server/Database.java | 33 +++-- .../java/dev/wiing/gossip/server/Program.java | 33 ++++- .../dev/wiing/gossip/server/UserSocket.java | 140 +++++++++++++++--- Server/src/main/java/module-info.java | 3 + Server/src/main/resources/log4j2.xml | 12 ++ Server/test.bin | Bin 0 -> 47 bytes 42 files changed, 1175 insertions(+), 152 deletions(-) create mode 100644 Client/src/main/java/dev/wiing/gossip/client/controllers/item/MessageItemController.java rename Client/src/main/java/dev/wiing/gossip/client/controllers/item/{MainTopicItemController.java => TopicItemController.java} (79%) rename Client/src/main/resources/dev/wiing/gossip/client/views/{main-chat-view.fxml => chat-view.fxml} (94%) create mode 100644 Client/src/main/resources/dev/wiing/gossip/client/views/message-item.fxml rename Client/src/main/resources/dev/wiing/gossip/client/views/{main-topic-item.fxml => topic-item.fxml} (92%) create mode 100644 Lib/src/main/java/dev/wiing/gossip/lib/data/AuthSecret.java create mode 100644 Lib/src/main/java/dev/wiing/gossip/lib/data/ListData.java create mode 100644 Lib/src/main/java/dev/wiing/gossip/lib/data/LongData.java create mode 100644 Lib/src/main/java/dev/wiing/gossip/lib/data/PacketAtomicData.java rename Lib/src/main/java/dev/wiing/gossip/lib/data/{DataType.java => PacketData.java} (57%) rename Lib/src/main/java/dev/wiing/gossip/lib/data/{StringType.java => StringData.java} (83%) create mode 100644 Lib/src/main/java/dev/wiing/gossip/lib/packets/AckPacket.java create mode 100644 Lib/src/main/java/dev/wiing/gossip/lib/packets/AuthRequiredPacket.java create mode 100644 Lib/src/main/java/dev/wiing/gossip/lib/packets/MessageCreatedPacket.java create mode 100644 Lib/src/main/java/dev/wiing/gossip/lib/packets/MessagePushPacket.java rename Lib/src/main/java/dev/wiing/gossip/lib/packets/{CredentialsPacket.java => RegisterCredentialsPacket.java} (56%) rename Lib/src/main/java/dev/wiing/gossip/lib/packets/{RegisterPacket.java => RegisterRequestPacket.java} (75%) rename Lib/src/main/java/dev/wiing/gossip/lib/packets/{TopicAddedPacket.java => TopicCreatedPacket.java} (86%) create mode 100644 Lib/src/main/java/dev/wiing/gossip/lib/packets/TopicJoinPacket.java rename Lib/src/main/java/dev/wiing/gossip/lib/packets/{CreateTopicPacket.java => TopicPushPacket.java} (67%) create mode 100644 Lib/src/main/java/dev/wiing/gossip/lib/packets/TopicUpdatePacket.java rename Lib/src/main/java/dev/wiing/gossip/lib/packets/{FetchUserPacket.java => UserFetchPacket.java} (82%) create mode 100644 Server/src/main/resources/log4j2.xml create mode 100644 Server/test.bin diff --git a/Client/src/main/java/dev/wiing/gossip/client/Connection.java b/Client/src/main/java/dev/wiing/gossip/client/Connection.java index efb88db..3fb5d4b 100644 --- a/Client/src/main/java/dev/wiing/gossip/client/Connection.java +++ b/Client/src/main/java/dev/wiing/gossip/client/Connection.java @@ -4,10 +4,7 @@ import dev.wiing.gossip.lib.PacketHandler; import dev.wiing.gossip.lib.PacketManager; import dev.wiing.gossip.lib.models.SecretUser; import dev.wiing.gossip.lib.models.User; -import dev.wiing.gossip.lib.packets.FetchUserPacket; -import dev.wiing.gossip.lib.packets.Packet; -import dev.wiing.gossip.lib.packets.UserDataPacket; -import javafx.application.Platform; +import dev.wiing.gossip.lib.packets.*; import java.io.IOException; import java.net.Socket; @@ -58,10 +55,22 @@ public class Connection { public void run() { while (true) { try { - Packet packet = connection.nextPacket(); - connection.getPacketHandler().runPacket(packet); + Packet packet; + if (connection.getSocket().getInputStream().available() > 0 || connection.queuedPackets.isEmpty()) { + packet = connection.nextPacket(false); + } else { + packet = connection.findPacketOfTypes(connection.packetHandler.getListeningTypes()); + } + + if (packet == null) continue; + + if (!connection.getPacketHandler().runPacket(packet)) { + connection.queuedPackets.add(packet); + } } catch (SocketException e) { break; + } catch (IOException e) { + e.printStackTrace(); } } } @@ -88,8 +97,13 @@ public class Connection { } } + public void sendPacketAuthenticated(AuthRequiredPacket packet) { + packet.setAuth(getSelf().getUserSecret()); + sendPacket(packet); + } + public Packet nextPacket(boolean useQueue) throws SocketException { - if (!queuedPackets.isEmpty()) { + if (useQueue && !queuedPackets.isEmpty()) { return queuedPackets.remove(0); } @@ -120,6 +134,56 @@ public class Connection { } } + public Packet findPacketOfTypes(List types) { + Packet packet = null; + + int i; + for (i = 0; i < queuedPackets.size(); i++) { + Packet queuedPacket = queuedPackets.get(i); + + if (types.contains(queuedPacket.getType())) { + packet = queuedPacket; + break; + } + } + + if (packet != null) { + queuedPackets.remove(i); + return packet; + } + + return null; + } + + public boolean findAck(short acknowledgement) throws IOException { + + while (true) { + while (socket.getInputStream().available() > 0); + + AckPacket ack = null; + + int i; + for (i = 0; i < queuedPackets.size(); i++) { + Packet queuedPacket = queuedPackets.get(i); + + if (queuedPacket.getType() == AckPacket.TYPE) { + ack = (AckPacket) queuedPacket; + + if (ack.getAcknowledgement() == acknowledgement) { + break; + } + + ack = null; + } + } + + if (ack != null) { + queuedPackets.remove(i); + return true; + } + } + } + public SecretUser getSelf() { return self; } @@ -143,7 +207,7 @@ public class Connection { return result; } - FetchUserPacket fetch = new FetchUserPacket(); + UserFetchPacket fetch = new UserFetchPacket(); fetch.setUserID(userID); Connection.getInstance().sendPacket(fetch); diff --git a/Client/src/main/java/dev/wiing/gossip/client/GossipApp.java b/Client/src/main/java/dev/wiing/gossip/client/GossipApp.java index a1702b9..bb3817e 100644 --- a/Client/src/main/java/dev/wiing/gossip/client/GossipApp.java +++ b/Client/src/main/java/dev/wiing/gossip/client/GossipApp.java @@ -10,8 +10,11 @@ import java.io.IOException; public class GossipApp extends Application { @Override public void start(Stage stage) throws IOException { + System.setProperty("prism.lcdtext", "false"); + FXMLLoader fxmlLoader = new FXMLLoader(Program.class.getResource("views/login-view.fxml")); Scene scene = new Scene(fxmlLoader.load(), 320, 240); + stage.setTitle("GossipApp"); stage.setScene(scene); stage.show(); diff --git a/Client/src/main/java/dev/wiing/gossip/client/controllers/LoginController.java b/Client/src/main/java/dev/wiing/gossip/client/controllers/LoginController.java index 119daad..0134e0a 100644 --- a/Client/src/main/java/dev/wiing/gossip/client/controllers/LoginController.java +++ b/Client/src/main/java/dev/wiing/gossip/client/controllers/LoginController.java @@ -4,9 +4,9 @@ package dev.wiing.gossip.client.controllers; import dev.wiing.gossip.client.Connection; import dev.wiing.gossip.client.data.UserAvatar; import dev.wiing.gossip.lib.models.SecretUser; -import dev.wiing.gossip.lib.packets.CredentialsPacket; +import dev.wiing.gossip.lib.packets.RegisterCredentialsPacket; import dev.wiing.gossip.lib.packets.Packet; -import dev.wiing.gossip.lib.packets.RegisterPacket; +import dev.wiing.gossip.lib.packets.RegisterRequestPacket; import javafx.animation.FadeTransition; import javafx.event.ActionEvent; import javafx.event.Event; @@ -51,7 +51,7 @@ public class LoginController implements Initializable { @FXML public void onLogin(ActionEvent event) { - RegisterPacket packet = new RegisterPacket(); + RegisterRequestPacket packet = new RegisterRequestPacket(); packet.setAvatarID((byte)0); packet.setUsername(txtUsername.getText()); @@ -64,8 +64,8 @@ public class LoginController implements Initializable { throw new RuntimeException(e); } - if (result != null && result.getType() == CredentialsPacket.TYPE) { - CredentialsPacket creds = (CredentialsPacket)result; + if (result != null && result.getType() == RegisterCredentialsPacket.TYPE) { + RegisterCredentialsPacket creds = (RegisterCredentialsPacket)result; SecretUser user = new SecretUser(packet.getUsername(), packet.getAvatarID(), creds.getUID(), creds.getSecret()); Connection.getInstance().setSelf(user); diff --git a/Client/src/main/java/dev/wiing/gossip/client/controllers/MainChatController.java b/Client/src/main/java/dev/wiing/gossip/client/controllers/MainChatController.java index 91c1c5e..aa18cdb 100644 --- a/Client/src/main/java/dev/wiing/gossip/client/controllers/MainChatController.java +++ b/Client/src/main/java/dev/wiing/gossip/client/controllers/MainChatController.java @@ -1,27 +1,33 @@ package dev.wiing.gossip.client.controllers; import dev.wiing.gossip.client.Connection; +import dev.wiing.gossip.client.controllers.item.MessageItemController; import dev.wiing.gossip.client.generic.Pair; import dev.wiing.gossip.client.utils.Utils; +import dev.wiing.gossip.lib.models.Message; import dev.wiing.gossip.lib.models.Topic; -import dev.wiing.gossip.lib.models.User; +import dev.wiing.gossip.lib.packets.MessagePushPacket; +import dev.wiing.gossip.lib.packets.TopicJoinPacket; +import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.fxml.FXML; -import javafx.fxml.Initializable; import javafx.scene.Parent; import javafx.scene.control.Label; import javafx.scene.control.TextArea; import javafx.scene.input.MouseEvent; import javafx.scene.layout.VBox; -import java.net.URL; +import java.io.IOException; +import java.util.ArrayList; import java.util.List; -import java.util.ResourceBundle; public class MainChatController { private Topic topic; + private final List messageItems = new ArrayList<>(); + private MessageItemController latestMessageItem = null; + @FXML private Label lblBabblersCount; @@ -68,7 +74,15 @@ public class MainChatController { this.topic.addChangeListener(evt -> { if (evt.getPropertyName().equals("userAdd") || evt.getPropertyName().equals("userRemove")) { - setBabblerCount(topic.getUsersReadOnly().size()); + Platform.runLater(() -> { + setBabblerCount(topic.getUsersReadOnly().size()); + }); + } + + if (evt.getPropertyName().equals("messageAdd")) { + Platform.runLater(() -> { + addMessage((Message)evt.getNewValue()); + }); } }); } @@ -78,6 +92,10 @@ public class MainChatController { lblVisitTopicName.setText(name); } + public Topic getTopic() { + return topic; + } + private void setBabblerCount(int count) { String res = "No Babblers"; if (count == 1) { @@ -95,20 +113,59 @@ public class MainChatController { vboxVisitPage.setVisible(!participating); } + private void addMessage(Message message) { + if (latestMessageItem == null || latestMessageItem.getAuthor().getUserID() != message.getAuthor().getUserID()) { + var newPair = MessageItemController.createInstance(); + + newPair.second().setAuthor(message.getAuthor()); + + vboxMessages.getChildren().add(newPair.first()); + + latestMessageItem = newPair.second(); + } + + latestMessageItem.addMessage(message); + } + @FXML void onJoinTopic(ActionEvent event) { - topic.addUser(Connection.getInstance().getSelf()); + TopicJoinPacket packet = new TopicJoinPacket(); + packet.setTopicID(topic.getId()); - togglePages(true); + Connection.getInstance().sendPacketAuthenticated(packet); + + try { + Connection.getInstance().findAck(TopicJoinPacket.TYPE); + + togglePages(true); + + } catch (IOException e) { + throw new RuntimeException(e); + } } @FXML void onSend(MouseEvent event) { + String messageContents = txtCompose.getText(); + txtCompose.clear(); + + MessagePushPacket packet = new MessagePushPacket(); + packet.setTopicID(topic.getId()); + packet.setMessage(messageContents); + + Connection.getInstance().sendPacketAuthenticated(packet); + + try { + Connection.getInstance().findAck(MessagePushPacket.TYPE); + + } catch (IOException e) { + throw new RuntimeException(e); + } } public static Pair createInstance() { - return Utils.createInstance("views/main-chat-view.fxml"); + return Utils.createInstance("views/chat-view.fxml"); } } diff --git a/Client/src/main/java/dev/wiing/gossip/client/controllers/MainController.java b/Client/src/main/java/dev/wiing/gossip/client/controllers/MainController.java index 42bab5b..e20be92 100644 --- a/Client/src/main/java/dev/wiing/gossip/client/controllers/MainController.java +++ b/Client/src/main/java/dev/wiing/gossip/client/controllers/MainController.java @@ -1,10 +1,12 @@ package dev.wiing.gossip.client.controllers; import dev.wiing.gossip.client.Connection; -import dev.wiing.gossip.client.controllers.item.MainTopicItemController; +import dev.wiing.gossip.client.controllers.item.TopicItemController; import dev.wiing.gossip.client.data.UserAvatar; import dev.wiing.gossip.client.generic.Pair; import dev.wiing.gossip.client.utils.Utils; +import dev.wiing.gossip.lib.data.LongData; +import dev.wiing.gossip.lib.models.Message; import dev.wiing.gossip.lib.models.Topic; import dev.wiing.gossip.lib.models.User; import dev.wiing.gossip.lib.packets.*; @@ -27,7 +29,7 @@ public class MainController implements Initializable { Topic activeTopic = null; Parent activeTopicElement = null; - private final Map topicContentMap = new ConcurrentHashMap<>(); + private final Map> topicMap = new ConcurrentHashMap<>(); @FXML private VBox vboxRoot; @@ -54,7 +56,7 @@ public class MainController implements Initializable { UserAvatar.getAvatar(user.getAvatarID()).applyToRegionBackground(paneIcon, true); - Connection.getInstance().getPacketHandler().addListener(TopicAddedPacket.class, packet -> { + Connection.getInstance().getPacketHandler().addListener(TopicCreatedPacket.class, packet -> { User host = Connection.getInstance().getUser(packet.getHostID()); Topic topic = new Topic( @@ -65,13 +67,13 @@ public class MainController implements Initializable { packet.getTopicColor() ); - var pair = MainTopicItemController.createInstance(); + var pair = TopicItemController.createInstance(); pair.second().setTopic(topic); var contentPair = MainChatController.createInstance(); contentPair.second().setTopic(topic); - topicContentMap.put(topic.getId(), contentPair.first()); + topicMap.put(topic.getId(), contentPair); AnchorPane.setLeftAnchor(contentPair.first(), 0.0); AnchorPane.setBottomAnchor(contentPair.first(), 0.0); @@ -90,6 +92,41 @@ public class MainController implements Initializable { }); }); + Connection.getInstance().getPacketHandler().addListener(TopicUpdatePacket.class, packet -> { + if (!topicMap.containsKey(packet.getTopicID())) return; + + Topic topic = topicMap.get(packet.getTopicID()).second().getTopic(); + + if (packet.isTopicNameModified()) topic.setName(packet.getTopicName()); + if (packet.isTopicDescriptionModified()) topic.setDescription(packet.getTopicDescription()); + + if (packet.haveUsersJoined()) { + for (LongData userID : packet.getUsersJoined()) { + User userJoined = Connection.getInstance().getUser(userID.getValue()); + topic.addUser(userJoined); + } + } + + if (packet.haveUsersLeft()) { + for (LongData userID : packet.getUsersLeft()) { + User userJoined = Connection.getInstance().getUser(userID.getValue()); + topic.removeUser(userJoined); + } + } + }); + + Connection.getInstance().getPacketHandler().addListener(MessageCreatedPacket.class, packet -> { + if (!topicMap.containsKey(packet.getTopicID())) return; + + Topic topic = topicMap.get(packet.getTopicID()).second().getTopic(); + + User author = Connection.getInstance().getUser(packet.getAuthorID()); + + Message message = new Message(author, topic, packet.getContents()); + + topic.addMessage(message); + }); + Connection.getInstance().beginHandlingPackets(); vboxTopics.getChildren().clear(); @@ -98,7 +135,7 @@ public class MainController implements Initializable { public void setActiveTopic(Topic topic, Parent element) { if (activeTopic != null) { activeTopicElement.getStyleClass().remove("tag-min"); - topicContentMap.get(activeTopic.getId()).setVisible(false); + topicMap.get(activeTopic.getId()).first().setVisible(false); } else { lblJoinMessage.setVisible(false); } @@ -120,13 +157,13 @@ public class MainController implements Initializable { activeTopic = topic; activeTopicElement = element; - topicContentMap.get(activeTopic.getId()).setVisible(true); + topicMap.get(activeTopic.getId()).first().setVisible(true); } @FXML void onCreateTopic(ActionEvent event) { - CreateTopicPacket packet = new CreateTopicPacket(); - packet.setUserSecret(Connection.getInstance().getSelf().getUserSecret()); + TopicPushPacket packet = new TopicPushPacket(); + packet.setAuth(Connection.getInstance().getSelf().getUserSecret()); packet.setTopicName("Point Nemo"); packet.setTopicDescription("We are so gone XDD"); diff --git a/Client/src/main/java/dev/wiing/gossip/client/controllers/item/MessageItemController.java b/Client/src/main/java/dev/wiing/gossip/client/controllers/item/MessageItemController.java new file mode 100644 index 0000000..10427de --- /dev/null +++ b/Client/src/main/java/dev/wiing/gossip/client/controllers/item/MessageItemController.java @@ -0,0 +1,88 @@ +package dev.wiing.gossip.client.controllers.item; + +import dev.wiing.gossip.client.Connection; +import dev.wiing.gossip.client.data.UserAvatar; +import dev.wiing.gossip.client.generic.Pair; +import dev.wiing.gossip.client.utils.Utils; +import dev.wiing.gossip.lib.models.Message; +import dev.wiing.gossip.lib.models.User; +import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.Parent; +import javafx.scene.control.Label; +import javafx.scene.layout.Pane; +import javafx.scene.layout.VBox; + +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.ResourceBundle; + +public class MessageItemController implements Initializable { + + private User author; + private final List messages = Collections.synchronizedList(new ArrayList<>()); + + @FXML + private Label lblAuthor; + + @FXML + private Label lblTag; + + @FXML + private Label lblTimeAgo; + + @FXML + private Pane paneIcon; + + @FXML + private VBox vboxMessages; + + @Override + public void initialize(URL location, ResourceBundle resources) { + vboxMessages.getChildren().clear(); + } + + public User getAuthor() { + return author; + } + + public void setAuthor(User author) { + this.author = author; + + this.lblAuthor.setText(author.getUsernameDisplay()); + + if (this.author.getUserID() == Connection.getInstance().getSelf().getUserID()) { + this.lblTag.setVisible(true); + this.lblTag.setText("You"); + } + + UserAvatar.getAvatar(this.author.getAvatarID()).applyToRegionBackground(paneIcon, true); + } + + public void addMessage(Message message) { + if (message.getAuthor() != author) return; + + if (!this.lblTag.isVisible() && messages.isEmpty() && message.getTopic().getHost().getUserID() == message.getAuthor().getUserID()) { + this.lblTag.setVisible(true); + this.lblTag.setText("Host"); + this.lblTag.getStyleClass().add("secondary"); + } + + messages.add(message); + + Label label = new Label(message.getContents()); + + vboxMessages.getChildren().add(label); + } + + public List getMessageReadOnly() { + return Collections.unmodifiableList(messages); + } + + public static Pair createInstance() { + return Utils.createInstance("views/message-item.fxml"); + } + +} diff --git a/Client/src/main/java/dev/wiing/gossip/client/controllers/item/MainTopicItemController.java b/Client/src/main/java/dev/wiing/gossip/client/controllers/item/TopicItemController.java similarity index 79% rename from Client/src/main/java/dev/wiing/gossip/client/controllers/item/MainTopicItemController.java rename to Client/src/main/java/dev/wiing/gossip/client/controllers/item/TopicItemController.java index db76afd..16ed522 100644 --- a/Client/src/main/java/dev/wiing/gossip/client/controllers/item/MainTopicItemController.java +++ b/Client/src/main/java/dev/wiing/gossip/client/controllers/item/TopicItemController.java @@ -3,7 +3,6 @@ package dev.wiing.gossip.client.controllers.item; import dev.wiing.gossip.client.generic.Pair; import dev.wiing.gossip.client.utils.Utils; import dev.wiing.gossip.lib.models.Topic; -import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.scene.Parent; @@ -11,7 +10,7 @@ import javafx.scene.control.Label; import javafx.scene.input.MouseEvent; import javafx.scene.layout.HBox; -public class MainTopicItemController { +public class TopicItemController { private Topic topic; @@ -30,8 +29,8 @@ public class MainTopicItemController { return topic; } - public static Pair createInstance() { - return Utils.createInstance("views/main-topic-item.fxml"); + public static Pair createInstance() { + return Utils.createInstance("views/topic-item.fxml"); } public void setOnMouseClicked(EventHandler eventHandler) { diff --git a/Client/src/main/resources/dev/wiing/gossip/client/styling.css b/Client/src/main/resources/dev/wiing/gossip/client/styling.css index ab0a444..614d8ac 100644 --- a/Client/src/main/resources/dev/wiing/gossip/client/styling.css +++ b/Client/src/main/resources/dev/wiing/gossip/client/styling.css @@ -151,7 +151,7 @@ Label.tag { } Label.tag.small { - -fx-background-color: -color; + -fx-background-color: ladder(hsb(0, 0%, 30%), -color, #0000); -fx-background-radius: 4px; -fx-border-width: 0; -fx-text-fill: white; @@ -159,6 +159,10 @@ Label.tag.small { -fx-padding: 2px 8px; } +.tag.secondary { + -color: #4a4a55; +} + CheckBox .box { -fx-background-color: #25252c; } diff --git a/Client/src/main/resources/dev/wiing/gossip/client/views/main-chat-view.fxml b/Client/src/main/resources/dev/wiing/gossip/client/views/chat-view.fxml similarity index 94% rename from Client/src/main/resources/dev/wiing/gossip/client/views/main-chat-view.fxml rename to Client/src/main/resources/dev/wiing/gossip/client/views/chat-view.fxml index 154e3ba..eeab6d6 100644 --- a/Client/src/main/resources/dev/wiing/gossip/client/views/main-chat-view.fxml +++ b/Client/src/main/resources/dev/wiing/gossip/client/views/chat-view.fxml @@ -16,8 +16,7 @@ - - + @@ -57,7 +56,7 @@ - + @@ -126,6 +125,12 @@ + + + + + + @@ -141,7 +146,7 @@ -