aboutsummaryrefslogtreecommitdiff
path: root/juick-server/src/main/java/com/juick/server/XMPPBot.java
diff options
context:
space:
mode:
Diffstat (limited to 'juick-server/src/main/java/com/juick/server/XMPPBot.java')
-rw-r--r--juick-server/src/main/java/com/juick/server/XMPPBot.java47
1 files changed, 45 insertions, 2 deletions
diff --git a/juick-server/src/main/java/com/juick/server/XMPPBot.java b/juick-server/src/main/java/com/juick/server/XMPPBot.java
index b8789276..d8901fbb 100644
--- a/juick-server/src/main/java/com/juick/server/XMPPBot.java
+++ b/juick-server/src/main/java/com/juick/server/XMPPBot.java
@@ -20,11 +20,13 @@ package com.juick.server;
import com.juick.Tag;
import com.juick.User;
import com.juick.server.component.LikeEvent;
+import com.juick.server.component.MessageEvent;
import com.juick.server.component.SubscribeEvent;
+import com.juick.server.util.TagUtils;
import com.juick.server.xmpp.s2s.StanzaListener;
import com.juick.formatters.PlainTextFormatter;
import com.juick.server.helpers.TagStats;
-import com.juick.server.protocol.annotation.UserCommand;
+import com.juick.server.xmpp.helpers.annotation.UserCommand;
import com.juick.service.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
@@ -34,6 +36,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import rocks.xmpp.addr.Jid;
import rocks.xmpp.core.stanza.model.*;
@@ -85,11 +88,24 @@ public class XMPPBot implements StanzaListener, AutoCloseable {
@Inject
private ApplicationEventPublisher applicationEventPublisher;
+ private ApplicationListener<MessageEvent> onMessage;
+
@PostConstruct
public void init() {
xmpp.addStanzaListener(this);
broadcastPresence(null);
pt = new PrettyTime(new Locale("ru"));
+ onMessage = event -> {
+ com.juick.Message msg = event.getMessage();
+ if (msg.getRid() == 0 && msg.getMid() > 0) {
+ String notify = "New message posted.\n#" + msg.getMid() + " https://juick.com/" + msg.getMid();
+ List<String> activeJids = userService.getActiveJIDs();
+ userService.getJIDsbyUID(msg.getUser().getUid())
+ .stream()
+ .filter(activeJids::contains)
+ .forEach(jid -> sendReply(Jid.of(jid), notify));
+ }
+ };
}
public Jid getJid() {
@@ -322,7 +338,13 @@ public class XMPPBot implements StanzaListener, AutoCloseable {
Optional<String> result = processCommand(user_from, msg.getFrom(), command);
result.ifPresent(r -> sendReply(msg.getFrom(), r));
- return result.isPresent();
+ // new message
+ List<Tag> tags = tagService.fromString(command, false);
+ String body = command.substring(TagUtils.toString(tags).length());
+ int mid = messagesService.createMessage(user_from.getUid(), body, null, tags);
+ subscriptionService.subscribeMessage(mid, user_from.getUid());
+ applicationEventPublisher.publishEvent(new MessageEvent(this, messagesService.getMessage(mid)));
+ return true;
}
@UserCommand(pattern = "^ping$", patternFlags = Pattern.CASE_INSENSITIVE,
@@ -552,6 +574,7 @@ public class XMPPBot implements StanzaListener, AutoCloseable {
User toUser = userService.getUserByName(args[1]);
if (subscribe) {
if (subscriptionService.subscribeUser(user, toUser)) {
+ // TODO: already subscribed case
applicationEventPublisher.publishEvent(new SubscribeEvent(this, user, toUser));
return "Subscribed to @" + toUser.getName();
}
@@ -699,6 +722,26 @@ public class XMPPBot implements StanzaListener, AutoCloseable {
}
return "Your feed is empty";
}
+ @UserCommand(pattern = "^(#|\\.)(\\d+)((\\.|\\-|\\/)(\\d+))?\\s([\\s\\S]+)",
+ help = "#1234 *tag *tag2 - edit tags\n#1234 text - reply to message")
+ public String EditOrReply(User user, String... args) {
+ int mid = NumberUtils.toInt(args[1]);
+ int rid = NumberUtils.toInt(args[4], 0);
+ String txt = args[5];
+ List<Tag> messageTags = tagService.fromString(txt, true);
+ if (messageTags.size() > 0) {
+ if (user.getUid() != messagesService.getMessageAuthor(mid).getUid()) {
+ return "It is not your message";
+ }
+ tagService.updateTags(mid, messageTags);
+ return "Tags are updated";
+ } else {
+ int newrid = messagesService.createReply(mid, rid, user.getUid(), txt, null);
+ applicationEventPublisher.publishEvent(new MessageEvent(this, messagesService.getReply(mid, newrid)));
+ return "Reply posted.\n#" + mid + "/" + newrid + " "
+ + "https://juick.com/" + mid + "#" + newrid;
+ }
+ }
void sendReply(Jid jidTo, String txt) {
Message reply = new Message();