Late-pulling

This commit is contained in:
2023-12-13 11:25:41 +02:00
parent 0b1270a916
commit fff9fb90fa
27 changed files with 1260 additions and 193 deletions
@@ -134,4 +134,8 @@ public class Database {
logger.info("Topic removed: \"{}\" (#{})", topic.getName(), topic.getId());
}
public List<Topic> getAllTopicsReadOnly() {
return Collections.unmodifiableList(topics.values().stream().toList());
}
}
@@ -1,18 +1,15 @@
package dev.wiing.gossip.server;
import dev.wiing.gossip.lib.data.LongData;
import dev.wiing.gossip.lib.models.Message;
import dev.wiing.gossip.lib.models.SecretUser;
import dev.wiing.gossip.lib.models.Topic;
import dev.wiing.gossip.lib.models.User;
import dev.wiing.gossip.lib.models.*;
import dev.wiing.gossip.lib.packets.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.SocketException;
import java.util.List;
public record UserSocket(Socket socket) implements Runnable {
@@ -33,7 +30,7 @@ public record UserSocket(Socket socket) implements Runnable {
if (!socket.isConnected())
break;
Packet packet = Globals.getPacketManager().readPacket(new BufferedInputStream(socket.getInputStream()));
Packet packet = Globals.getPacketManager().readPacket(socket.getInputStream());
if (packet == null) continue;
@@ -52,6 +49,14 @@ public record UserSocket(Socket socket) implements Runnable {
onUserJoinTopic((TopicJoinPacket) packet);
break;
case TopicListFetchPacket.TYPE:
onTopicListFetch((TopicListFetchPacket) packet);
break;
case TopicFetchPacket.TYPE:
onFetchTopic((TopicFetchPacket) packet);
break;
case UserFetchPacket.TYPE:
onFetchUser((UserFetchPacket) packet);
break;
@@ -59,6 +64,14 @@ public record UserSocket(Socket socket) implements Runnable {
case MessagePushPacket.TYPE:
onUserMessage((MessagePushPacket) packet);
break;
case MessageListFetchPacket.TYPE:
onMessageListFetch((MessageListFetchPacket) packet);
break;
case MessageFetchPacket.TYPE:
onFetchMessage((MessageFetchPacket) packet);
break;
}
} catch (SocketException e) {
loop = false;
@@ -120,10 +133,13 @@ public record UserSocket(Socket socket) implements Runnable {
if (requester == null) return;
if (topic == null) return;
if (!topic.hasUser(requester)) {
info("\"{}\" joined topic \"{}\" (#{})", topic.getHost().getUsername().toUpperCase(), topic.getName().toUpperCase(), topic.getId());
topic.addUser(requester);
}
if (topic.hasUser(requester)) return;
info("\"{}\" joined topic \"{}\" (#{})", topic.getHost().getUsername().toUpperCase(), topic.getName().toUpperCase(), topic.getId());
topic.addUser(requester);
SystemMessage message = new SystemMessage(topic.getNextMessageID(), topic, SystemMessage.SystemType.USER_JOIN, requester, "");
topic.addMessage(message);
AckPacket resp = new AckPacket();
resp.setAcknowledgement(packet);
@@ -138,17 +154,62 @@ public record UserSocket(Socket socket) implements Runnable {
updatePacket.setTopicID(topic.getId());
updatePacket.getUsersJoined().add(new LongData().setValue(requester.getUserID()));
MessageSystemPacket systemPacket = new MessageSystemPacket();
systemPacket.setTopicID(topic.getId());
systemPacket.setSystemType(message.getType());
systemPacket.setUserID(message.getUser().getUserID());
for (User user : Database.getInstance().getUsers()) {
Socket socket = Database.getInstance().getUserSocket(user.getUserID());
try {
Globals.getPacketManager().writePacket(socket.getOutputStream(), updatePacket);
Globals.getPacketManager().writeAllPackets(socket.getOutputStream(), updatePacket, systemPacket);
} catch (IOException e) {
logger.error(e);
}
}
}
private void onTopicListFetch(TopicListFetchPacket packet) {
TopicListDataPacket result = new TopicListDataPacket();
info("Requested Topic list");
for (Topic topic : Database.getInstance().getAllTopicsReadOnly()) {
result.getTopicIDs().add(new LongData().setValue(topic.getId()));
}
try {
Globals.getPacketManager().replyPacket(packet, result);
} catch (IOException e) {
logger.error(e);
}
}
private void onFetchTopic(TopicFetchPacket packet) {
Topic topic = Database.getInstance().getTopic(packet.getTopicID());
if (topic == null) return;
info("Requested topic #{}", topic.getId());
TopicDataPacket resp = new TopicDataPacket();
resp.setTopicID(topic.getId());
resp.setHostID(topic.getHost().getUserID());
resp.setTopicName(topic.getName());
resp.setTopicDescription(topic.getDescription());
resp.setTopicColor(topic.getColor());
for (User value : topic.getUsersReadOnly().values()) {
resp.getUserIDs().add(new LongData().setValue(value.getUserID()));
}
try {
Globals.getPacketManager().replyPacket(packet, resp);
} catch (IOException e) {
logger.error(e);
}
}
private void onFetchUser(UserFetchPacket packet) {
User user = Database.getInstance().getUserByID(packet.getUserID());
@@ -175,9 +236,9 @@ public record UserSocket(Socket socket) implements Runnable {
if (user == null) return;
if (topic == null) return;
Message message = new Message(user, topic, packet.getMessage());
UserMessage userMessage = new UserMessage(topic.getNextMessageID(), user, topic, packet.getMessage());
topic.addMessage(message);
topic.addMessage(userMessage);
info("\"{}\" in \"{}\" sends \"{}\"", user.getUsername().toUpperCase(), topic.getName().toUpperCase(), packet.getMessage());
@@ -193,7 +254,7 @@ public record UserSocket(Socket socket) implements Runnable {
MessageCreatedPacket messageCreated = new MessageCreatedPacket();
messageCreated.setAuthorID(user.getUserID());
messageCreated.setTopicID(topic.getId());
messageCreated.setContents(message.getContents());
messageCreated.setContents(userMessage.getContents());
for (User babbler : topic.getUsersReadOnly().values()) {
Socket userSocket = Database.getInstance().getUserSocket(babbler.getUserID());
@@ -206,4 +267,58 @@ public record UserSocket(Socket socket) implements Runnable {
}
}
private void onMessageListFetch(MessageListFetchPacket packet) {
Topic topic = Database.getInstance().getTopic(packet.getTopicID());
if (topic == null) return;
info("Requested Message list on #{}", topic.getId());
MessageListDataPacket result = new MessageListDataPacket();
for (Message message : topic.getMessagesReadOnly()) {
result.getMessageIDs().add(new LongData().setValue(message.getId()));
}
try {
Globals.getPacketManager().replyPacket(packet, result);
} catch (IOException e) {
logger.error(e);
}
}
private void onFetchMessage(MessageFetchPacket packet) {
Topic topic = Database.getInstance().getTopic(packet.getTopicID());
if (topic == null) return;
Message message = topic.getMessageByID(packet.getMessageID());
if (message == null) return;
info("Requested message #{} on #{}", message.getId(), topic.getId());
MessageDataPacket resp = new MessageDataPacket();
resp.setMessageID(message.getId());
resp.setTopicID(message.getTopic().getId());
if (message instanceof UserMessage userMessage) {
resp.setMessageType(MessageDataPacket.MessageType.USER);
resp.setUserAuthorID(userMessage.getAuthor().getUserID());
resp.setUserContents(userMessage.getContents());
} else if (message instanceof SystemMessage systemMessage) {
resp.setMessageType(MessageDataPacket.MessageType.SYSTEM);
resp.setSystemType(systemMessage.getType());
if (systemMessage.getUser() != null)
resp.setSystemUserID(systemMessage.getUser().getUserID());
resp.setSystemContents(systemMessage.getContents());
}
try {
Globals.getPacketManager().replyPacket(packet, resp);
} catch (IOException e) {
logger.error(e);
}
}
}