Search in sources :

Example 1 with EventBotAction

use of won.bot.framework.eventbot.action.EventBotAction in project webofneeds by researchstudio-sat.

the class DebugBot method initializeEventListeners.

@Override
protected void initializeEventListeners() {
    String welcomeMessage = "Greetings! \nI am the DebugBot. I " + "can simulate multiple other users so you can test things. I understand a few commands. \nTo see which ones, " + "type 'usage'.";
    String welcomeHelpMessage = "When connecting with me, you can say 'ignore', or 'deny' to make me ignore or deny requests, and 'wait N' to make me wait N seconds (max 99) before reacting.";
    EventListenerContext ctx = getEventListenerContext();
    EventBus bus = getEventBus();
    // eagerly cache RDF data
    BotBehaviour eagerlyCacheBehaviour = new EagerlyPopulateCacheBehaviour(ctx);
    eagerlyCacheBehaviour.activate();
    // react to a bot command activating/deactivating eager caching
    bus.subscribe(SetCacheEagernessCommandEvent.class, new ActionOnEventListener(ctx, new BaseEventBotAction(ctx) {

        @Override
        protected void doRun(Event event, EventListener executingListener) throws Exception {
            if (event instanceof SetCacheEagernessCommandEvent) {
                if (((SetCacheEagernessCommandEvent) event).isEager()) {
                    eagerlyCacheBehaviour.activate();
                } else {
                    eagerlyCacheBehaviour.deactivate();
                }
            }
        }
    }));
    // react to a message that was not identified as a debug command
    BotBehaviour connectionMessageBehaviour = new ConnectionMessageBehaviour(ctx);
    connectionMessageBehaviour.activate();
    // react to the debug deactivate command (deactivate my need)
    BotBehaviour deactivateNeedBehaviour = new DeactivateNeedBehaviour(ctx);
    deactivateNeedBehaviour.activate();
    // react to the close behaviour
    BotBehaviour closeBehaviour = new CloseBevahiour(ctx);
    closeBehaviour.activate();
    // register with WoN nodes, be notified when new needs are created
    RegisterMatcherAction registerMatcherAction = new RegisterMatcherAction(ctx);
    this.matcherRegistrator = new ActionOnEventListener(ctx, registerMatcherAction, 1);
    bus.subscribe(ActEvent.class, this.matcherRegistrator);
    RandomDelayedAction delayedRegistration = new RandomDelayedAction(ctx, registrationMatcherRetryInterval, registrationMatcherRetryInterval, 0, registerMatcherAction);
    ActionOnEventListener matcherRetryRegistrator = new ActionOnEventListener(ctx, delayedRegistration);
    bus.subscribe(MatcherRegisterFailedEvent.class, matcherRetryRegistrator);
    // create the echo need for debug initial connect - if we're not reacting to the creation of our own echo need.
    CreateDebugNeedWithFacetsAction needForInitialConnectAction = new CreateDebugNeedWithFacetsAction(ctx, true, true);
    needForInitialConnectAction.setIsInitialForConnect(true);
    ActionOnEventListener initialConnector = new ActionOnEventListener(ctx, new NotFilter(new NeedUriInNamedListFilter(ctx, ctx.getBotContextWrapper().getNeedCreateListName())), needForInitialConnectAction);
    bus.subscribe(NeedCreatedEventForMatcher.class, initialConnector);
    // create the echo need for debug initial hint - if we're not reacting to the creation of our own echo need.
    CreateDebugNeedWithFacetsAction initialHinter = new CreateDebugNeedWithFacetsAction(ctx, true, true);
    initialHinter.setIsInitialForHint(true);
    ActionOnEventListener needForInitialHintListener = new ActionOnEventListener(ctx, new NotFilter(new NeedUriInNamedListFilter(ctx, ctx.getBotContextWrapper().getNeedCreateListName())), initialHinter);
    bus.subscribe(NeedCreatedEventForMatcher.class, needForInitialHintListener);
    // as soon as the echo need triggered by debug connect created, connect to original
    this.needConnector = new ActionOnEventListener(ctx, "needConnector", new RandomDelayedAction(ctx, CONNECT_DELAY_MILLIS, CONNECT_DELAY_MILLIS, 1, new ConnectWithAssociatedNeedAction(ctx, FacetType.OwnerFacet.getURI(), FacetType.OwnerFacet.getURI(), welcomeMessage + " " + welcomeHelpMessage)));
    bus.subscribe(NeedCreatedEventForDebugConnect.class, this.needConnector);
    // as soon as the echo need triggered by debug hint command created, hint to original
    this.needHinter = new ActionOnEventListener(ctx, "needHinter", new RandomDelayedAction(ctx, CONNECT_DELAY_MILLIS, CONNECT_DELAY_MILLIS, 1, new HintAssociatedNeedAction(ctx, FacetType.OwnerFacet.getURI(), FacetType.OwnerFacet.getURI(), matcherUri)));
    bus.subscribe(NeedCreatedEventForDebugHint.class, this.needHinter);
    // if the original need wants to connect - always open
    this.autoOpener = new ActionOnEventListener(ctx, new MultipleActions(ctx, new OpenConnectionDebugAction(ctx, welcomeMessage, welcomeHelpMessage), new PublishSetChattinessEventAction(ctx, true)));
    bus.subscribe(ConnectFromOtherNeedEvent.class, this.autoOpener);
    EventBotAction userCommandAction = new DebugBotIncomingMessageToEventMappingAction(ctx);
    // if the remote side opens, send a greeting and set to chatty.
    bus.subscribe(OpenFromOtherNeedEvent.class, new ActionOnEventListener(ctx, new MultipleActions(ctx, userCommandAction, new PublishSetChattinessEventAction(ctx, true))));
    // if the bot receives a text message - try to map the command of the text message to a DebugEvent
    messageFromOtherNeedListener = new ActionOnEventListener(ctx, userCommandAction);
    bus.subscribe(MessageFromOtherNeedEvent.class, messageFromOtherNeedListener);
    // react to usage command event
    this.usageMessageSender = new ActionOnEventListener(ctx, new SendMultipleMessagesAction(ctx, DebugBotIncomingMessageToEventMappingAction.USAGE_MESSAGES));
    bus.subscribe(UsageDebugCommandEvent.class, usageMessageSender);
    bus.subscribe(CloseCommandSuccessEvent.class, new ActionOnEventListener(ctx, "chattiness off", new PublishSetChattinessEventAction(ctx, false)));
    // react to close event: set connection to not chatty
    bus.subscribe(CloseFromOtherNeedEvent.class, new ActionOnEventListener(ctx, new PublishSetChattinessEventAction(ctx, false)));
    // react to the hint and connect commands by creating a need (it will fire correct need created for connect/hint
    // events)
    needCreator = new ActionOnEventListener(ctx, new CreateDebugNeedWithFacetsAction(ctx, true, true));
    bus.subscribe(HintDebugCommandEvent.class, needCreator);
    bus.subscribe(ConnectDebugCommandEvent.class, needCreator);
    bus.subscribe(SendNDebugCommandEvent.class, new ActionOnEventListener(ctx, new SendNDebugMessagesAction(ctx, DELAY_BETWEEN_N_MESSAGES, DebugBotIncomingMessageToEventMappingAction.N_MESSAGES)));
    MessageTimingManager timingManager = new MessageTimingManager(ctx, 20);
    // on every actEvent there is a chance we send a chatty message
    bus.subscribe(ActEvent.class, new ActionOnEventListener(ctx, new SendChattyMessageAction(ctx, CHATTY_MESSAGE_PROBABILITY, timingManager, DebugBotIncomingMessageToEventMappingAction.RANDOM_MESSAGES, DebugBotIncomingMessageToEventMappingAction.LAST_MESSAGES)));
    // set the chattiness of the connection
    bus.subscribe(SetChattinessDebugCommandEvent.class, new ActionOnEventListener(ctx, new SetChattinessAction(ctx)));
    // process eliza messages with eliza
    bus.subscribe(MessageToElizaEvent.class, new ActionOnEventListener(ctx, new AnswerWithElizaAction(ctx, 20)));
    // remember when we sent the last message
    bus.subscribe(WonMessageSentOnConnectionEvent.class, new ActionOnEventListener(ctx, new RecordMessageSentTimeAction(ctx, timingManager)));
    // remember when we got the last message
    bus.subscribe(WonMessageReceivedOnConnectionEvent.class, new ActionOnEventListener(ctx, new RecordMessageReceivedTimeAction(ctx, timingManager)));
    // initialize the sent timestamp when the open message is received
    bus.subscribe(OpenFromOtherNeedEvent.class, new ActionOnEventListener(ctx, new RecordMessageSentTimeAction(ctx, timingManager)));
    // initialize the sent timestamp when the connect message is received
    bus.subscribe(ConnectFromOtherNeedEvent.class, new ActionOnEventListener(ctx, new RecordMessageSentTimeAction(ctx, timingManager)));
}
Also used : EventListenerContext(won.bot.framework.eventbot.EventListenerContext) CreateDebugNeedWithFacetsAction(won.bot.framework.eventbot.action.impl.debugbot.CreateDebugNeedWithFacetsAction) SendMultipleMessagesAction(won.bot.framework.eventbot.action.impl.wonmessage.SendMultipleMessagesAction) NeedUriInNamedListFilter(won.bot.framework.eventbot.filter.impl.NeedUriInNamedListFilter) SendNDebugMessagesAction(won.bot.framework.eventbot.action.impl.debugbot.SendNDebugMessagesAction) EventBus(won.bot.framework.eventbot.bus.EventBus) HintAssociatedNeedAction(won.bot.framework.eventbot.action.impl.wonmessage.HintAssociatedNeedAction) MultipleActions(won.bot.framework.eventbot.action.impl.MultipleActions) PublishSetChattinessEventAction(won.bot.framework.eventbot.action.impl.debugbot.PublishSetChattinessEventAction) DebugBotIncomingMessageToEventMappingAction(won.bot.framework.eventbot.action.impl.debugbot.DebugBotIncomingMessageToEventMappingAction) OpenConnectionDebugAction(won.bot.framework.eventbot.action.impl.debugbot.OpenConnectionDebugAction) BaseEventListener(won.bot.framework.eventbot.listener.BaseEventListener) ActionOnEventListener(won.bot.framework.eventbot.listener.impl.ActionOnEventListener) EventListener(won.bot.framework.eventbot.listener.EventListener) RandomDelayedAction(won.bot.framework.eventbot.action.impl.RandomDelayedAction) CloseBevahiour(won.bot.framework.eventbot.behaviour.CloseBevahiour) ConnectWithAssociatedNeedAction(won.bot.framework.eventbot.action.impl.wonmessage.ConnectWithAssociatedNeedAction) BotBehaviour(won.bot.framework.eventbot.behaviour.BotBehaviour) RecordMessageSentTimeAction(won.bot.framework.eventbot.action.impl.debugbot.RecordMessageSentTimeAction) SetChattinessAction(won.bot.framework.eventbot.action.impl.debugbot.SetChattinessAction) AnswerWithElizaAction(won.bot.framework.eventbot.action.impl.debugbot.AnswerWithElizaAction) EagerlyPopulateCacheBehaviour(won.bot.framework.eventbot.behaviour.EagerlyPopulateCacheBehaviour) RecordMessageReceivedTimeAction(won.bot.framework.eventbot.action.impl.debugbot.RecordMessageReceivedTimeAction) SetCacheEagernessCommandEvent(won.bot.framework.eventbot.event.impl.debugbot.SetCacheEagernessCommandEvent) RegisterMatcherAction(won.bot.framework.eventbot.action.impl.matcher.RegisterMatcherAction) ConnectionMessageBehaviour(won.bot.framework.eventbot.behaviour.ConnectionMessageBehaviour) NotFilter(won.bot.framework.eventbot.filter.impl.NotFilter) BaseEventBotAction(won.bot.framework.eventbot.action.BaseEventBotAction) UsageDebugCommandEvent(won.bot.framework.eventbot.event.impl.debugbot.UsageDebugCommandEvent) MatcherRegisterFailedEvent(won.bot.framework.eventbot.event.impl.matcher.MatcherRegisterFailedEvent) HintDebugCommandEvent(won.bot.framework.eventbot.event.impl.debugbot.HintDebugCommandEvent) OpenFromOtherNeedEvent(won.bot.framework.eventbot.event.impl.wonmessage.OpenFromOtherNeedEvent) Event(won.bot.framework.eventbot.event.Event) SendNDebugCommandEvent(won.bot.framework.eventbot.event.impl.debugbot.SendNDebugCommandEvent) CloseFromOtherNeedEvent(won.bot.framework.eventbot.event.impl.wonmessage.CloseFromOtherNeedEvent) MessageFromOtherNeedEvent(won.bot.framework.eventbot.event.impl.wonmessage.MessageFromOtherNeedEvent) CloseCommandSuccessEvent(won.bot.framework.eventbot.event.impl.command.close.CloseCommandSuccessEvent) SetChattinessDebugCommandEvent(won.bot.framework.eventbot.event.impl.debugbot.SetChattinessDebugCommandEvent) WonMessageReceivedOnConnectionEvent(won.bot.framework.eventbot.event.impl.wonmessage.WonMessageReceivedOnConnectionEvent) ConnectDebugCommandEvent(won.bot.framework.eventbot.event.impl.debugbot.ConnectDebugCommandEvent) MessageToElizaEvent(won.bot.framework.eventbot.event.impl.debugbot.MessageToElizaEvent) ConnectFromOtherNeedEvent(won.bot.framework.eventbot.event.impl.wonmessage.ConnectFromOtherNeedEvent) WonMessageSentOnConnectionEvent(won.bot.framework.eventbot.event.impl.wonmessage.WonMessageSentOnConnectionEvent) ActEvent(won.bot.framework.eventbot.event.impl.lifecycle.ActEvent) SetCacheEagernessCommandEvent(won.bot.framework.eventbot.event.impl.debugbot.SetCacheEagernessCommandEvent) DeactivateNeedBehaviour(won.bot.framework.eventbot.behaviour.DeactivateNeedBehaviour) ActionOnEventListener(won.bot.framework.eventbot.listener.impl.ActionOnEventListener) MessageTimingManager(won.bot.framework.eventbot.action.impl.debugbot.MessageTimingManager) SendChattyMessageAction(won.bot.framework.eventbot.action.impl.debugbot.SendChattyMessageAction) EventBotAction(won.bot.framework.eventbot.action.EventBotAction) BaseEventBotAction(won.bot.framework.eventbot.action.BaseEventBotAction)

Example 2 with EventBotAction

use of won.bot.framework.eventbot.action.EventBotAction in project webofneeds by researchstudio-sat.

the class SecurityBotTests method runBot.

private void runBot(Class botClass) throws ExecutionException, InterruptedException {
    IntegrationtestBot bot = null;
    // create a bot instance and auto-wire it
    AutowireCapableBeanFactory beanFactory = applicationContext.getAutowireCapableBeanFactory();
    bot = (IntegrationtestBot) beanFactory.autowire(botClass, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false);
    Object botBean = beanFactory.initializeBean(bot, "theBot");
    bot = (IntegrationtestBot) botBean;
    // the bot also needs a trigger so its act() method is called regularly.
    // (there is no trigger bean in the context)
    PeriodicTrigger trigger = new PeriodicTrigger(500, TimeUnit.MILLISECONDS);
    trigger.setInitialDelay(100);
    ((TriggeredBot) bot).setTrigger(trigger);
    // adding the bot to the bot manager will cause it to be initialized.
    // at that point, the trigger starts.
    botManager.addBot(bot);
    final SettableListenableFuture<TestFinishedEvent> futureTestResult = new SettableListenableFuture();
    final EventListenerContext ctx = bot.getExposedEventListenerContext();
    // action for setting the future when we get a test result
    EventBotAction setFutureAction = new SetFutureAction(ctx, futureTestResult);
    // action for setting the future when an error occurs
    EventBotAction setFutureFromErrorAction = new SetFutureFromErrorEventAction(ctx, futureTestResult, bot);
    // add a listener for test success
    ctx.getEventBus().subscribe(TestPassedEvent.class, new ActionOnEventListener(ctx, setFutureAction));
    // add a listener for test failure
    ctx.getEventBus().subscribe(TestFailedEvent.class, new ActionOnEventListener(ctx, setFutureAction));
    // add a listener for errors
    ctx.getEventBus().subscribe(ErrorEvent.class, new ActionOnEventListener(ctx, setFutureFromErrorAction));
    // wait for the result
    TestFinishedEvent result = futureTestResult.get();
    if (result instanceof TestFailedEvent) {
        Assert.fail(((TestFailedEvent) result).getMessage());
    }
}
Also used : EventListenerContext(won.bot.framework.eventbot.EventListenerContext) SettableListenableFuture(org.springframework.util.concurrent.SettableListenableFuture) IntegrationtestBot(won.bot.IntegrationtestBot) AutowireCapableBeanFactory(org.springframework.beans.factory.config.AutowireCapableBeanFactory) TriggeredBot(won.bot.framework.bot.base.TriggeredBot) PeriodicTrigger(org.springframework.scheduling.support.PeriodicTrigger) TestFailedEvent(won.bot.framework.eventbot.event.impl.test.TestFailedEvent) TestFinishedEvent(won.bot.framework.eventbot.event.impl.test.TestFinishedEvent) ActionOnEventListener(won.bot.framework.eventbot.listener.impl.ActionOnEventListener) EventBotAction(won.bot.framework.eventbot.action.EventBotAction) BaseEventBotAction(won.bot.framework.eventbot.action.BaseEventBotAction)

Example 3 with EventBotAction

use of won.bot.framework.eventbot.action.EventBotAction in project webofneeds by researchstudio-sat.

the class CoordinationBehaviour method onActivate.

@Override
protected void onActivate(Optional<Object> message) {
    EventBotAction actionToExecute = null;
    if (typeB == CoordinationType.ACTIVATE) {
        actionToExecute = new BaseEventBotAction(context) {

            @Override
            protected void doRun(Event event, EventListener executingListener) throws Exception {
                BotBehaviourEvent botBehaviourEvent = (BotBehaviourEvent) event;
                behaviourB.activate(botBehaviourEvent.getMessage());
                deactivate(botBehaviourEvent.getMessage());
            }
        };
    } else {
        actionToExecute = new BaseEventBotAction(context) {

            @Override
            protected void doRun(Event event, EventListener executingListener) throws Exception {
                BotBehaviourEvent botBehaviourEvent = (BotBehaviourEvent) event;
                behaviourB.deactivate(botBehaviourEvent.getMessage());
                deactivate(botBehaviourEvent.getMessage());
            }
        };
    }
    Class<? extends Event> eventClazz = null;
    if (typeA == CoordinationType.ACTIVATE) {
        eventClazz = BotBehaviourActivatedEvent.class;
    } else {
        eventClazz = BotBehaviourDeactivatedEvent.class;
    }
    subscribeWithAutoCleanup(eventClazz, new ActionOnEventListener(context, new EventFilter() {

        @Override
        public boolean accept(Event event) {
            return ((BotBehaviourEvent) event).getBehaviour() == behaviourA;
        }
    }, actionToExecute));
}
Also used : BaseEventBotAction(won.bot.framework.eventbot.action.BaseEventBotAction) Event(won.bot.framework.eventbot.event.Event) ActionOnEventListener(won.bot.framework.eventbot.listener.impl.ActionOnEventListener) EventListener(won.bot.framework.eventbot.listener.EventListener) ActionOnEventListener(won.bot.framework.eventbot.listener.impl.ActionOnEventListener) EventFilter(won.bot.framework.eventbot.filter.EventFilter) EventBotAction(won.bot.framework.eventbot.action.EventBotAction) BaseEventBotAction(won.bot.framework.eventbot.action.BaseEventBotAction)

Aggregations

BaseEventBotAction (won.bot.framework.eventbot.action.BaseEventBotAction)3 EventBotAction (won.bot.framework.eventbot.action.EventBotAction)3 ActionOnEventListener (won.bot.framework.eventbot.listener.impl.ActionOnEventListener)3 EventListenerContext (won.bot.framework.eventbot.EventListenerContext)2 Event (won.bot.framework.eventbot.event.Event)2 AutowireCapableBeanFactory (org.springframework.beans.factory.config.AutowireCapableBeanFactory)1 PeriodicTrigger (org.springframework.scheduling.support.PeriodicTrigger)1 SettableListenableFuture (org.springframework.util.concurrent.SettableListenableFuture)1 IntegrationtestBot (won.bot.IntegrationtestBot)1 TriggeredBot (won.bot.framework.bot.base.TriggeredBot)1 MultipleActions (won.bot.framework.eventbot.action.impl.MultipleActions)1 RandomDelayedAction (won.bot.framework.eventbot.action.impl.RandomDelayedAction)1 AnswerWithElizaAction (won.bot.framework.eventbot.action.impl.debugbot.AnswerWithElizaAction)1 CreateDebugNeedWithFacetsAction (won.bot.framework.eventbot.action.impl.debugbot.CreateDebugNeedWithFacetsAction)1 DebugBotIncomingMessageToEventMappingAction (won.bot.framework.eventbot.action.impl.debugbot.DebugBotIncomingMessageToEventMappingAction)1 MessageTimingManager (won.bot.framework.eventbot.action.impl.debugbot.MessageTimingManager)1 OpenConnectionDebugAction (won.bot.framework.eventbot.action.impl.debugbot.OpenConnectionDebugAction)1 PublishSetChattinessEventAction (won.bot.framework.eventbot.action.impl.debugbot.PublishSetChattinessEventAction)1 RecordMessageReceivedTimeAction (won.bot.framework.eventbot.action.impl.debugbot.RecordMessageReceivedTimeAction)1 RecordMessageSentTimeAction (won.bot.framework.eventbot.action.impl.debugbot.RecordMessageSentTimeAction)1