aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Vitaly Takmazov2018-03-21 14:49:52 +0300
committerGravatar Vitaly Takmazov2018-03-21 14:49:52 +0300
commit2c1ea441673d9d6370e2ea419f2d0f9a863cb0d3 (patch)
tree50492cde82622d8de6a88056569a61b02a547a63
parentcfa0a72e2822817b5d8fc45e673ca3d40f214572 (diff)
xmpp: remaining xmpp commands
-rw-r--r--juick-common/src/main/java/com/juick/server/protocol/JuickProtocol.java166
-rw-r--r--juick-common/src/main/java/com/juick/server/protocol/ProtocolListener.java30
-rw-r--r--juick-server/src/main/java/com/juick/server/XMPPBot.java47
-rw-r--r--juick-server/src/main/java/com/juick/server/xmpp/helpers/annotation/UserCommand.java (renamed from juick-common/src/main/java/com/juick/server/protocol/annotation/UserCommand.java)2
4 files changed, 46 insertions, 199 deletions
diff --git a/juick-common/src/main/java/com/juick/server/protocol/JuickProtocol.java b/juick-common/src/main/java/com/juick/server/protocol/JuickProtocol.java
deleted file mode 100644
index 5206e1e8..00000000
--- a/juick-common/src/main/java/com/juick/server/protocol/JuickProtocol.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (C) 2008-2017, Juick
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package com.juick.server.protocol;
-
-import com.juick.Message;
-import com.juick.Tag;
-import com.juick.User;
-import com.juick.formatters.PlainTextFormatter;
-import com.juick.server.protocol.annotation.UserCommand;
-import com.juick.server.util.TagUtils;
-import com.juick.service.*;
-import org.apache.commons.lang3.math.NumberUtils;
-import org.apache.commons.lang3.reflect.MethodUtils;
-
-import javax.inject.Inject;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
-/**
- * Created by oxpa on 22.03.16.
- */
-
-public class JuickProtocol {
-
- private String baseUri;
- private ProtocolListener listener;
-
- @Inject
- UserService userService;
- @Inject
- TagService tagService;
- @Inject
- MessagesService messagesService;
- @Inject
- SubscriptionService subscriptionService;
- @Inject
- PMQueriesService pmQueriesService;
- @Inject
- PrivacyQueriesService privacyQueriesService;
- @Inject
- ShowQueriesService showQueriesService;
-
- public JuickProtocol(String baseUri) {
- this.baseUri = baseUri;
- }
-
- /**
- * find command by pattern and invoke
- * @param user who send command
- * @param userInput given by user
- * @return command result
- * @throws InvocationTargetException
- * @throws IllegalAccessException
- * @throws NoSuchMethodException
- */
- public String getReply(User user, String userInput) throws InvocationTargetException,
- IllegalAccessException, NoSuchMethodException {
- Optional<Method> cmd = MethodUtils.getMethodsListWithAnnotation(getClass(), UserCommand.class).stream()
- .filter(m -> Pattern.compile(m.getAnnotation(UserCommand.class).pattern(),
- m.getAnnotation(UserCommand.class).patternFlags()).matcher(userInput).matches())
- .findFirst();
- if (!cmd.isPresent()) {
- // default command - post as new message
- return postMessage(user, userInput.trim());
- } else {
- Matcher matcher = Pattern.compile(cmd.get().getAnnotation(UserCommand.class).pattern(),
- cmd.get().getAnnotation(UserCommand.class).patternFlags()).matcher(userInput.trim());
- List<String> groups = new ArrayList<>();
- while (matcher.find()) {
- for (int i = 1; i <= matcher.groupCount(); i++) {
- groups.add(matcher.group(i));
- }
- }
- return (String) getClass().getMethod(cmd.get().getName(), User.class, String[].class)
- .invoke(this, user, groups.toArray(new String[groups.size()]));
- }
- }
-
- public String postMessage(User user, String input) {
- List<Tag> tags = tagService.fromString(input, false);
- String body = input.substring(TagUtils.toString(tags).length());
- int mid = messagesService.createMessage(user.getUid(), body, null, tags);
- subscriptionService.subscribeMessage(mid, user.getUid());
- listener.messagePosted(messagesService.getMessage(mid));
- return "New message posted.\n#" + mid + " " + baseUri + mid;
- }
-
-
-
- @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);
- listener.messagePosted(messagesService.getReply(mid, newrid));
- return "Reply posted.\n#" + mid + "/" + newrid + " "
- + baseUri + mid + "#" + newrid;
- }
- }
-
-
- @UserCommand(pattern = "^(s|u)\\s+\\@(\\S+)$", help = "S @user - subscribe to user's posts",
- patternFlags = Pattern.CASE_INSENSITIVE)
- public String commandSubscribeUser(User user, String... args) {
- boolean subscribe = args[0].equalsIgnoreCase("s");
- User toUser = userService.getUserByName(args[1]);
- if (toUser.getUid() > 0) {
- if (subscribe) {
- if (subscriptionService.subscribeUser(user, toUser)) {
- listener.userSubscribed(user, toUser);
- return "Subscribed";
- // TODO: already subscribed case
- }
- } else {
- if (subscriptionService.unSubscribeUser(user, toUser)) {
- return "Unsubscribed from @" + toUser.getName();
- }
- return "You was not subscribed to @" + toUser.getName();
- }
- }
- return "Error";
- }
-
- public String getBaseUri() {
- return baseUri;
- }
-
- public ProtocolListener getListener() {
- return listener;
- }
-
- public void setListener(ProtocolListener listener) {
- this.listener = listener;
- }
-}
diff --git a/juick-common/src/main/java/com/juick/server/protocol/ProtocolListener.java b/juick-common/src/main/java/com/juick/server/protocol/ProtocolListener.java
deleted file mode 100644
index f051e6d0..00000000
--- a/juick-common/src/main/java/com/juick/server/protocol/ProtocolListener.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008-2017, Juick
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-package com.juick.server.protocol;
-
-import com.juick.Message;
-import com.juick.User;
-
-/**
- * Created by vitalyster on 19.12.2016.
- */
-public interface ProtocolListener {
- void privateMessage(User from, User to, String body);
- void userSubscribed(User from, User to);
- void messagePosted(Message msg);
-}
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();
diff --git a/juick-common/src/main/java/com/juick/server/protocol/annotation/UserCommand.java b/juick-server/src/main/java/com/juick/server/xmpp/helpers/annotation/UserCommand.java
index ab37a4e1..383383c9 100644
--- a/juick-common/src/main/java/com/juick/server/protocol/annotation/UserCommand.java
+++ b/juick-server/src/main/java/com/juick/server/xmpp/helpers/annotation/UserCommand.java
@@ -15,7 +15,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-package com.juick.server.protocol.annotation;
+package com.juick.server.xmpp.helpers.annotation;
import org.apache.commons.lang3.StringUtils;