X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FCore.java;h=5d176ce630eb353ca99b49ec82f96ea1568efdcc;hb=a4a36be82ab54c924a6c9cf6b01a7fef3f2e9124;hp=90443ce833c534d9b25f80b7633abf820bfb554b;hpb=f2dee89b35c6ff8acf80ea9cb355aa9c45d829a1;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/core/Core.java b/src/main/java/net/pterodactylus/sone/core/Core.java index 90443ce..5d176ce 100644 --- a/src/main/java/net/pterodactylus/sone/core/Core.java +++ b/src/main/java/net/pterodactylus/sone/core/Core.java @@ -561,10 +561,9 @@ public class Core implements IdentityListener { synchronized (newPosts) { boolean isNew = !knownPosts.contains(postId) && newPosts.contains(postId); if (markAsKnown) { - newPosts.remove(postId); - knownPosts.add(postId); - if (isNew) { - coreListenerManager.fireMarkPostKnown(getPost(postId)); + Post post = getPost(postId, false); + if (post != null) { + markPostKnown(post); } } return isNew; @@ -572,16 +571,33 @@ public class Core implements IdentityListener { } /** - * Returns the reply with the given ID. + * Returns the reply with the given ID. If there is no reply with the given + * ID yet, a new one is created. * * @param replyId * The ID of the reply to get - * @return The reply, or {@code null} if there is no such reply + * @return The reply */ public Reply getReply(String replyId) { + return getReply(replyId, true); + } + + /** + * Returns the reply with the given ID. If there is no reply with the given + * ID yet, a new one is created, unless {@code create} is false in which + * case {@code null} is returned. + * + * @param replyId + * The ID of the reply to get + * @param create + * {@code true} to always return a {@link Reply}, {@code false} + * to return {@code null} if no reply can be found + * @return The reply, or {@code null} if there is no such reply + */ + public Reply getReply(String replyId, boolean create) { synchronized (replies) { Reply reply = replies.get(replyId); - if (reply == null) { + if (create && (reply == null)) { reply = new Reply(replyId); replies.put(replyId, reply); } @@ -637,10 +653,9 @@ public class Core implements IdentityListener { synchronized (newReplies) { boolean isNew = !knownReplies.contains(replyId) && newReplies.contains(replyId); if (markAsKnown) { - newReplies.remove(replyId); - knownReplies.add(replyId); - if (isNew) { - coreListenerManager.fireMarkReplyKnown(getReply(replyId)); + Reply reply = getReply(replyId, false); + if (reply != null) { + markReplyKnown(reply); } } return isNew; @@ -870,6 +885,9 @@ public class Core implements IdentityListener { if (!soneRescueMode) { for (Post post : storedSone.getPosts()) { posts.remove(post.getId()); + if (!sone.getPosts().contains(post)) { + markPostKnown(post); + } } } synchronized (newPosts) { @@ -887,6 +905,9 @@ public class Core implements IdentityListener { if (!soneRescueMode) { for (Reply reply : storedSone.getReplies()) { replies.remove(reply.getId()); + if (!sone.getReplies().contains(reply)) { + markReplyKnown(reply); + } } } synchronized (newReplies) { @@ -999,13 +1020,18 @@ public class Core implements IdentityListener { if (postId == null) { break; } + String postRecipientId = configuration.getStringValue(postPrefix + "/Recipient").getValue(null); long postTime = configuration.getLongValue(postPrefix + "/Time").getValue((long) 0); String postText = configuration.getStringValue(postPrefix + "/Text").getValue(null); if ((postTime == 0) || (postText == null)) { logger.log(Level.WARNING, "Invalid post found, aborting load!"); return; } - posts.add(getPost(postId).setSone(sone).setTime(postTime).setText(postText)); + Post post = getPost(postId).setSone(sone).setTime(postTime).setText(postText); + if ((postRecipientId != null) && (postRecipientId.length() == 43)) { + post.setRecipient(getSone(postRecipientId)); + } + posts.add(post); } /* load replies. */ @@ -1123,6 +1149,7 @@ public class Core implements IdentityListener { for (Post post : sone.getPosts()) { String postPrefix = sonePrefix + "/Posts/" + postCounter++; configuration.getStringValue(postPrefix + "/ID").setValue(post.getId()); + configuration.getStringValue(postPrefix + "/Recipient").setValue((post.getRecipient() != null) ? post.getRecipient().getId() : null); configuration.getLongValue(postPrefix + "/Time").setValue(post.getTime()); configuration.getStringValue(postPrefix + "/Text").setValue(post.getText()); } @@ -1191,11 +1218,48 @@ public class Core implements IdentityListener { * @return The created post */ public Post createPost(Sone sone, long time, String text) { + return createPost(sone, null, time, text); + } + + /** + * Creates a new post. + * + * @param sone + * The Sone that creates the post + * @param recipient + * The recipient Sone, or {@code null} if this post does not have + * a recipient + * @param text + * The text of the post + * @return The created post + */ + public Post createPost(Sone sone, Sone recipient, String text) { + return createPost(sone, recipient, System.currentTimeMillis(), text); + } + + /** + * Creates a new post. + * + * @param sone + * The Sone that creates the post + * @param recipient + * The recipient Sone, or {@code null} if this post does not have + * a recipient + * @param time + * The time of the post + * @param text + * The text of the post + * @return The created post + */ + public Post createPost(Sone sone, Sone recipient, long time, String text) { if (!isLocalSone(sone)) { logger.log(Level.FINE, "Tried to create post for non-local Sone: %s", sone); return null; } Post post = new Post(sone, time, text); + if (recipient != null) { + post.setRecipient(recipient); + } synchronized (posts) { posts.put(post.getId(), post); }