Search in sources :

Example 6 with ConnectionMessageCommandEvent

use of won.bot.framework.eventbot.event.impl.command.connectionmessage.ConnectionMessageCommandEvent in project webofneeds by researchstudio-sat.

the class SendChattyMessageAction method doRun.

@Override
protected void doRun(final Event event, EventListener executingListener) throws Exception {
    Set<URI> toRemove = null;
    Collection<Object> chattyConnections = getEventListenerContext().getBotContext().loadObjectMap(KEY_CHATTY_CONNECTIONS).values();
    if (chattyConnections == null)
        return;
    theloop: for (Object o : chattyConnections) {
        URI conURI = (URI) o;
        if (random.nextDouble() > probabilityOfSendingMessage) {
            continue;
        }
        // determine which kind of message to send depending on inactivity of partner.
        MessageTimingManager.InactivityPeriod inactivityPeriod = messageTimingManager.getInactivityPeriodOfPartner(conURI);
        // don't send a chatty message when we just sent one
        if (!this.messageTimingManager.isWaitedLongEnough(conURI)) {
            continue;
        }
        String message = null;
        switch(inactivityPeriod) {
            case ACTIVE:
                // do not send a message
                continue theloop;
            case SHORT:
                message = getRandomMessage(this.messagesForShortInactivity);
                break;
            case LONG:
                message = getRandomMessage(this.messagesForLongInactivity);
                break;
            case TOO_LONG:
                if (toRemove == null)
                    toRemove = new HashSet<URI>();
                toRemove.add(conURI);
                message = "Ok, you've been absent for a while now. I will stop bugging you. If you want me to resume " + "doing that, say 'chatty on'. For more information, say 'usage'";
                break;
        }
        // publish an event that causes the message to be sent
        Dataset connectionRDF = getEventListenerContext().getLinkedDataSource().getDataForResource(conURI);
        Connection con = RdfUtils.findFirst(connectionRDF, x -> new ConnectionModelMapper().fromModel(x));
        if (con != null) {
            Model messageModel = WonRdfUtils.MessageUtils.textMessage(message);
            getEventListenerContext().getEventBus().publish(new ConnectionMessageCommandEvent(con, messageModel));
        } else {
            logger.warn("could not send chatty message on connection {} - failed to generate Connection object from RDF", conURI);
        }
    }
    if (toRemove != null) {
        for (URI uri : toRemove) {
            getEventListenerContext().getBotContext().removeFromObjectMap(KEY_CHATTY_CONNECTIONS, uri.toString());
        }
    }
}
Also used : ConnectionModelMapper(won.protocol.model.ConnectionModelMapper) Connection(won.protocol.model.Connection) Collection(java.util.Collection) Set(java.util.Set) Random(java.util.Random) BaseEventBotAction(won.bot.framework.eventbot.action.BaseEventBotAction) WonRdfUtils(won.protocol.util.WonRdfUtils) Model(org.apache.jena.rdf.model.Model) HashSet(java.util.HashSet) Event(won.bot.framework.eventbot.event.Event) ConnectionMessageCommandEvent(won.bot.framework.eventbot.event.impl.command.connectionmessage.ConnectionMessageCommandEvent) RdfUtils(won.protocol.util.RdfUtils) EventListener(won.bot.framework.eventbot.listener.EventListener) URI(java.net.URI) Dataset(org.apache.jena.query.Dataset) EventListenerContext(won.bot.framework.eventbot.EventListenerContext) Dataset(org.apache.jena.query.Dataset) Connection(won.protocol.model.Connection) URI(java.net.URI) Model(org.apache.jena.rdf.model.Model) ConnectionModelMapper(won.protocol.model.ConnectionModelMapper) ConnectionMessageCommandEvent(won.bot.framework.eventbot.event.impl.command.connectionmessage.ConnectionMessageCommandEvent)

Example 7 with ConnectionMessageCommandEvent

use of won.bot.framework.eventbot.event.impl.command.connectionmessage.ConnectionMessageCommandEvent in project webofneeds by researchstudio-sat.

the class SendMessageOnCrawlResultAction method onCrawlSuccess.

@Override
protected final void onCrawlSuccess(CrawlConnectionCommandSuccessEvent successEvent) {
    Model messageModel = makeSuccessMessage(successEvent);
    if (messageModel == null)
        return;
    getEventListenerContext().getEventBus().publish(new ConnectionMessageCommandEvent(con, messageModel));
}
Also used : Model(org.apache.jena.rdf.model.Model) ConnectionMessageCommandEvent(won.bot.framework.eventbot.event.impl.command.connectionmessage.ConnectionMessageCommandEvent)

Example 8 with ConnectionMessageCommandEvent

use of won.bot.framework.eventbot.event.impl.command.connectionmessage.ConnectionMessageCommandEvent in project webofneeds by researchstudio-sat.

the class MailCommandAction method processReferenceMailCommands.

private void processReferenceMailCommands(MimeMessage message, WonURI wonUri) {
    MailBotContextWrapper botContextWrapper = ((MailBotContextWrapper) getEventListenerContext().getBotContextWrapper());
    EventBus bus = getEventListenerContext().getEventBus();
    try {
        if (wonUri == null) {
            throw new NullPointerException("No corresponding wonUri found");
        }
        URI needUri;
        URI remoteNeedUri = null;
        Dataset connectionRDF = null;
        switch(wonUri.getType()) {
            case CONNECTION:
                connectionRDF = getEventListenerContext().getLinkedDataSource().getDataForResource(wonUri.getUri());
                needUri = WonRdfUtils.ConnectionUtils.getLocalNeedURIFromConnection(connectionRDF, wonUri.getUri());
                remoteNeedUri = WonRdfUtils.ConnectionUtils.getRemoteNeedURIFromConnection(connectionRDF, wonUri.getUri());
                break;
            case NEED:
            default:
                needUri = wonUri.getUri();
                break;
        }
        MimeMessage originalMessage = botContextWrapper.getMimeMessageForURI(needUri);
        if (originalMessage == null) {
            throw new NullPointerException("no originalmessage found");
        }
        logger.debug("Validate mailorigin with originalmail:");
        logger.debug("Command Message Sender: " + message.getFrom());
        logger.debug("Original Message Sender: " + originalMessage.getFrom());
        String senderNew = ((InternetAddress) message.getFrom()[0]).getAddress();
        String senderOriginal = ((InternetAddress) originalMessage.getFrom()[0]).getAddress();
        if (!senderNew.equals(senderOriginal)) {
            throw new AccessControlException("Sender of original and command mail are not equal");
        } else {
            logger.debug("Sender of original and command mail are not equal, continue with command processing");
        }
        ActionType actionType = determineAction(getEventListenerContext(), message, wonUri);
        logger.debug("Executing " + actionType + " on uri: " + wonUri.getUri() + " of type " + wonUri.getType());
        Connection con;
        switch(actionType) {
            case CLOSE_CONNECTION:
                con = RdfUtils.findFirst(connectionRDF, x -> new ConnectionModelMapper().fromModel(x));
                bus.publish(new CloseCommandEvent(con));
                break;
            case OPEN_CONNECTION:
                bus.publish(new ConnectCommandEvent(needUri, remoteNeedUri));
                break;
            case IMPLICIT_OPEN_CONNECTION:
                bus.publish(new ConnectCommandEvent(needUri, remoteNeedUri, mailContentExtractor.getTextMessage(message)));
                break;
            case SENDMESSAGE:
                con = RdfUtils.findFirst(connectionRDF, x -> new ConnectionModelMapper().fromModel(x));
                Model messageModel = WonRdfUtils.MessageUtils.textMessage(mailContentExtractor.getTextMessage(message));
                bus.publish(new ConnectionMessageCommandEvent(con, messageModel));
                break;
            case CLOSE_NEED:
                bus.publish(new DeactivateNeedCommandEvent(needUri));
                break;
            case NO_ACTION:
            default:
                // INVALID COMMAND
                logger.error("No command was given or assumed");
                break;
        }
    } catch (AccessControlException ace) {
        logger.error("ACCESS RESTRICTION: sender of original and command mail are not equal, command will be blocked");
    } catch (Exception e) {
        logger.error("no reply mail was set or found: " + e.getMessage());
    }
}
Also used : StringUtils(org.apache.commons.lang.StringUtils) Connection(won.protocol.model.Connection) MailBotContextWrapper(won.bot.framework.bot.context.MailBotContextWrapper) EventBus(won.bot.framework.eventbot.bus.EventBus) MailCommandEvent(won.bot.framework.eventbot.event.impl.mail.MailCommandEvent) MessagingException(javax.mail.MessagingException) Model(org.apache.jena.rdf.model.Model) InternetAddress(javax.mail.internet.InternetAddress) SubscribeUnsubscribeEvent(won.bot.framework.eventbot.event.impl.mail.SubscribeUnsubscribeEvent) WonURI(won.bot.framework.eventbot.action.impl.mail.model.WonURI) DefaultNeedModelWrapper(won.protocol.util.DefaultNeedModelWrapper) URI(java.net.URI) Dataset(org.apache.jena.query.Dataset) EventListenerContext(won.bot.framework.eventbot.EventListenerContext) ConnectionModelMapper(won.protocol.model.ConnectionModelMapper) NeedState(won.protocol.model.NeedState) SubscribeStatus(won.bot.framework.eventbot.action.impl.mail.model.SubscribeStatus) ActionType(won.bot.framework.eventbot.action.impl.mail.model.ActionType) IOException(java.io.IOException) BaseEventBotAction(won.bot.framework.eventbot.action.BaseEventBotAction) MimeMessage(javax.mail.internet.MimeMessage) WonRdfUtils(won.protocol.util.WonRdfUtils) List(java.util.List) Event(won.bot.framework.eventbot.event.Event) ConnectionMessageCommandEvent(won.bot.framework.eventbot.event.impl.command.connectionmessage.ConnectionMessageCommandEvent) RdfUtils(won.protocol.util.RdfUtils) AccessControlException(java.security.AccessControlException) EventListener(won.bot.framework.eventbot.listener.EventListener) DeactivateNeedCommandEvent(won.bot.framework.eventbot.event.impl.command.deactivate.DeactivateNeedCommandEvent) CloseCommandEvent(won.bot.framework.eventbot.event.impl.command.close.CloseCommandEvent) ConnectCommandEvent(won.bot.framework.eventbot.event.impl.command.connect.ConnectCommandEvent) InternetAddress(javax.mail.internet.InternetAddress) ActionType(won.bot.framework.eventbot.action.impl.mail.model.ActionType) MailBotContextWrapper(won.bot.framework.bot.context.MailBotContextWrapper) Dataset(org.apache.jena.query.Dataset) Connection(won.protocol.model.Connection) AccessControlException(java.security.AccessControlException) DeactivateNeedCommandEvent(won.bot.framework.eventbot.event.impl.command.deactivate.DeactivateNeedCommandEvent) EventBus(won.bot.framework.eventbot.bus.EventBus) CloseCommandEvent(won.bot.framework.eventbot.event.impl.command.close.CloseCommandEvent) WonURI(won.bot.framework.eventbot.action.impl.mail.model.WonURI) URI(java.net.URI) MessagingException(javax.mail.MessagingException) IOException(java.io.IOException) AccessControlException(java.security.AccessControlException) MimeMessage(javax.mail.internet.MimeMessage) ConnectCommandEvent(won.bot.framework.eventbot.event.impl.command.connect.ConnectCommandEvent) Model(org.apache.jena.rdf.model.Model) ConnectionModelMapper(won.protocol.model.ConnectionModelMapper) ConnectionMessageCommandEvent(won.bot.framework.eventbot.event.impl.command.connectionmessage.ConnectionMessageCommandEvent)

Example 9 with ConnectionMessageCommandEvent

use of won.bot.framework.eventbot.event.impl.command.connectionmessage.ConnectionMessageCommandEvent in project webofneeds by researchstudio-sat.

the class TelegramMessageReceivedAction method doRun.

@Override
protected void doRun(Event event, EventListener executingListener) throws Exception {
    EventBus bus = getEventListenerContext().getEventBus();
    EventListenerContext ctx = getEventListenerContext();
    if (event instanceof TelegramMessageReceivedEvent && ctx.getBotContextWrapper() instanceof TelegramBotContextWrapper) {
        TelegramBotContextWrapper botContextWrapper = (TelegramBotContextWrapper) ctx.getBotContextWrapper();
        Update update = ((TelegramMessageReceivedEvent) event).getUpdate();
        Message message = update.getMessage();
        CallbackQuery callbackQuery = update.getCallbackQuery();
        if (message != null && message.isCommand()) {
            wonTelegramBotHandler.getCommandRegistry().executeCommand(wonTelegramBotHandler, message);
        } else if (callbackQuery != null && update.hasCallbackQuery()) {
            message = callbackQuery.getMessage();
            String data = callbackQuery.getData();
            WonURI correspondingURI = botContextWrapper.getWonURIForMessageId(message.getMessageId());
            AnswerCallbackQuery answerCallbackQuery = new AnswerCallbackQuery();
            answerCallbackQuery.setCallbackQueryId(callbackQuery.getId());
            switch(correspondingURI.getType()) {
                case NEED:
                    break;
                case CONNECTION:
                    if ("0".equals(data)) {
                        // CLOSE CONNECTION
                        Dataset connectionRDF = getEventListenerContext().getLinkedDataSource().getDataForResource(correspondingURI.getUri());
                        Connection con = RdfUtils.findFirst(connectionRDF, x -> new ConnectionModelMapper().fromModel(x));
                        bus.publish(new CloseCommandEvent(con));
                        answerCallbackQuery.setText("Closed Connection");
                    } else if ("1".equals(data)) {
                        // ACCEPT CONNECTION
                        Dataset connectionRDF = getEventListenerContext().getLinkedDataSource().getDataForResource(correspondingURI.getUri());
                        URI remoteNeed = WonRdfUtils.ConnectionUtils.getRemoteNeedURIFromConnection(connectionRDF, correspondingURI.getUri());
                        URI localNeed = WonRdfUtils.ConnectionUtils.getLocalNeedURIFromConnection(connectionRDF, correspondingURI.getUri());
                        bus.publish(new ConnectCommandEvent(localNeed, remoteNeed));
                        answerCallbackQuery.setText("Opened Connection");
                    }
                    break;
            }
            wonTelegramBotHandler.answerCallbackQuery(answerCallbackQuery);
            EditMessageReplyMarkup editMessageReplyMarkup = new EditMessageReplyMarkup();
            editMessageReplyMarkup.setMessageId(message.getMessageId());
            editMessageReplyMarkup.setChatId(message.getChatId());
            editMessageReplyMarkup.setReplyMarkup(null);
            wonTelegramBotHandler.editMessageReplyMarkup(editMessageReplyMarkup);
        } else if (message != null && message.isReply() && message.hasText()) {
            WonURI correspondingURI = botContextWrapper.getWonURIForMessageId(message.getReplyToMessage().getMessageId());
            Dataset connectionRDF = getEventListenerContext().getLinkedDataSource().getDataForResource(correspondingURI.getUri());
            Connection con = RdfUtils.findFirst(connectionRDF, x -> new ConnectionModelMapper().fromModel(x));
            Model messageModel = WonRdfUtils.MessageUtils.textMessage(message.getText());
            bus.publish(new ConnectionMessageCommandEvent(con, messageModel));
        }
    }
}
Also used : AnswerCallbackQuery(org.telegram.telegrambots.api.methods.AnswerCallbackQuery) Message(org.telegram.telegrambots.api.objects.Message) CallbackQuery(org.telegram.telegrambots.api.objects.CallbackQuery) Connection(won.protocol.model.Connection) Update(org.telegram.telegrambots.api.objects.Update) EventBus(won.bot.framework.eventbot.bus.EventBus) Model(org.apache.jena.rdf.model.Model) WonTelegramBotHandler(won.bot.framework.eventbot.action.impl.telegram.WonTelegramBotHandler) TelegramMessageReceivedEvent(won.bot.framework.eventbot.event.impl.telegram.TelegramMessageReceivedEvent) WonURI(won.bot.framework.eventbot.action.impl.mail.model.WonURI) TelegramBotContextWrapper(won.bot.framework.bot.context.TelegramBotContextWrapper) URI(java.net.URI) Dataset(org.apache.jena.query.Dataset) EventListenerContext(won.bot.framework.eventbot.EventListenerContext) ConnectionModelMapper(won.protocol.model.ConnectionModelMapper) TelegramContentExtractor(won.bot.framework.eventbot.action.impl.telegram.util.TelegramContentExtractor) BaseEventBotAction(won.bot.framework.eventbot.action.BaseEventBotAction) AnswerCallbackQuery(org.telegram.telegrambots.api.methods.AnswerCallbackQuery) WonRdfUtils(won.protocol.util.WonRdfUtils) Event(won.bot.framework.eventbot.event.Event) ConnectionMessageCommandEvent(won.bot.framework.eventbot.event.impl.command.connectionmessage.ConnectionMessageCommandEvent) RdfUtils(won.protocol.util.RdfUtils) EventListener(won.bot.framework.eventbot.listener.EventListener) CloseCommandEvent(won.bot.framework.eventbot.event.impl.command.close.CloseCommandEvent) EditMessageReplyMarkup(org.telegram.telegrambots.api.methods.updatingmessages.EditMessageReplyMarkup) ConnectCommandEvent(won.bot.framework.eventbot.event.impl.command.connect.ConnectCommandEvent) EventListenerContext(won.bot.framework.eventbot.EventListenerContext) CallbackQuery(org.telegram.telegrambots.api.objects.CallbackQuery) AnswerCallbackQuery(org.telegram.telegrambots.api.methods.AnswerCallbackQuery) Message(org.telegram.telegrambots.api.objects.Message) Dataset(org.apache.jena.query.Dataset) Connection(won.protocol.model.Connection) EventBus(won.bot.framework.eventbot.bus.EventBus) CloseCommandEvent(won.bot.framework.eventbot.event.impl.command.close.CloseCommandEvent) Update(org.telegram.telegrambots.api.objects.Update) WonURI(won.bot.framework.eventbot.action.impl.mail.model.WonURI) URI(java.net.URI) WonURI(won.bot.framework.eventbot.action.impl.mail.model.WonURI) TelegramBotContextWrapper(won.bot.framework.bot.context.TelegramBotContextWrapper) ConnectCommandEvent(won.bot.framework.eventbot.event.impl.command.connect.ConnectCommandEvent) EditMessageReplyMarkup(org.telegram.telegrambots.api.methods.updatingmessages.EditMessageReplyMarkup) Model(org.apache.jena.rdf.model.Model) ConnectionModelMapper(won.protocol.model.ConnectionModelMapper) TelegramMessageReceivedEvent(won.bot.framework.eventbot.event.impl.telegram.TelegramMessageReceivedEvent) ConnectionMessageCommandEvent(won.bot.framework.eventbot.event.impl.command.connectionmessage.ConnectionMessageCommandEvent)

Aggregations

Model (org.apache.jena.rdf.model.Model)9 ConnectionMessageCommandEvent (won.bot.framework.eventbot.event.impl.command.connectionmessage.ConnectionMessageCommandEvent)9 EventListenerContext (won.bot.framework.eventbot.EventListenerContext)4 Connection (won.protocol.model.Connection)4 URI (java.net.URI)3 Dataset (org.apache.jena.query.Dataset)3 BaseEventBotAction (won.bot.framework.eventbot.action.BaseEventBotAction)3 EventBus (won.bot.framework.eventbot.bus.EventBus)3 Event (won.bot.framework.eventbot.event.Event)3 CloseCommandEvent (won.bot.framework.eventbot.event.impl.command.close.CloseCommandEvent)3 EventListener (won.bot.framework.eventbot.listener.EventListener)3 ConnectionModelMapper (won.protocol.model.ConnectionModelMapper)3 RdfUtils (won.protocol.util.RdfUtils)3 WonRdfUtils (won.protocol.util.WonRdfUtils)3 StopWatch (org.springframework.util.StopWatch)2 WonURI (won.bot.framework.eventbot.action.impl.mail.model.WonURI)2 ConnectCommandEvent (won.bot.framework.eventbot.event.impl.command.connect.ConnectCommandEvent)2 DeactivateNeedCommandEvent (won.bot.framework.eventbot.event.impl.command.deactivate.DeactivateNeedCommandEvent)2 IOException (java.io.IOException)1 AccessControlException (java.security.AccessControlException)1