diff options
-rw-r--r-- | juick-common/src/main/java/com/juick/server/protocol/JuickProtocol.java | 166 | ||||
-rw-r--r-- | juick-common/src/main/java/com/juick/server/protocol/ProtocolListener.java | 30 | ||||
-rw-r--r-- | juick-server/src/main/java/com/juick/server/XMPPBot.java | 47 | ||||
-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; |