Late-pulling
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user