use of won.bot.framework.eventbot.listener.EventListener in project webofneeds by researchstudio-sat.
the class DuplicateMessageSendingConversationBot method initializeEventListeners.
@Override
protected void initializeEventListeners() {
EventListenerContext ctx = getDuplicateMessageSenderDecorator(getEventListenerContext());
final EventBus bus = getEventBus();
// we're not expecting any failure messages in this test:
bus.subscribe(FailureResponseEvent.class, new ActionOnEventListener(ctx, new BaseEventBotAction(ctx) {
@Override
protected void doRun(Event event, EventListener executingListener) throws Exception {
FailureResponseEvent failureResponseEvent = (FailureResponseEvent) event;
bus.publish(new TestFailedEvent(DuplicateMessageSendingConversationBot.this, "Message failed: " + failureResponseEvent.getOriginalMessageURI() + ": " + WonRdfUtils.MessageUtils.getTextMessage(failureResponseEvent.getFailureMessage())));
}
}));
// create needs every trigger execution until 2 needs are created
bus.subscribe(ActEvent.class, new ActionOnEventListener(ctx, new CreateNeedWithFacetsAction(ctx, getBotContextWrapper().getNeedCreateListName()), NO_OF_NEEDS));
// connect needs
bus.subscribe(NeedCreatedEvent.class, new ActionOnceAfterNEventsListener(ctx, "needConnector", NO_OF_NEEDS * 2, new ConnectFromListToListAction(ctx, getBotContextWrapper().getNeedCreateListName(), getBotContextWrapper().getNeedCreateListName(), FacetType.OwnerFacet.getURI(), FacetType.OwnerFacet.getURI(), MILLIS_BETWEEN_MESSAGES, "Hi!")));
// add a listener that is informed of the connect/open events and that auto-opens
// subscribe it to:
// * connect events - so it responds with open
// * open events - so it responds with open (if the open received was the first open, and we still need to accept the connection)
bus.subscribe(ConnectFromOtherNeedEvent.class, new ActionOnEventListener(ctx, new OpenConnectionAction(ctx, "Hi!")));
// add a listener that auto-responds to messages by a message
// after 10 messages, it unsubscribes from all events
// subscribe it to:
// * message events - so it responds
// * open events - so it initiates the chain reaction of responses
BaseEventListener autoResponder = new AutomaticMessageResponderListener(ctx, NO_OF_MESSAGES, MILLIS_BETWEEN_MESSAGES);
bus.subscribe(OpenFromOtherNeedEvent.class, autoResponder);
bus.subscribe(MessageFromOtherNeedEvent.class, autoResponder);
// add a listener that closes the connection after it has seen 10 messages
bus.subscribe(MessageFromOtherNeedEvent.class, new ActionOnceAfterNEventsListener(ctx, NO_OF_MESSAGES, new CloseConnectionAction(ctx, "Bye!")));
// add a listener that closes the connection when a failureEvent occurs
EventListener onFailureConnectionCloser = new ActionOnEventListener(ctx, new CloseConnectionAction(ctx, "Bye!"));
bus.subscribe(FailureResponseEvent.class, onFailureConnectionCloser);
// add a listener that auto-responds to a close message with a deactivation of both needs.
// subscribe it to:
// * close events
bus.subscribe(CloseFromOtherNeedEvent.class, new ActionOnEventListener(ctx, new MultipleActions(ctx, new DeactivateAllNeedsAction(ctx), new PublishEventAction(ctx, new TestPassedEvent(this))), 1));
// add a listener that counts two NeedDeactivatedEvents and then tells the
// framework that the bot's work is done
bus.subscribe(NeedDeactivatedEvent.class, new ActionOnceAfterNEventsListener(ctx, NO_OF_NEEDS, new SignalWorkDoneAction(ctx)));
}
use of won.bot.framework.eventbot.listener.EventListener 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());
}
}
}
use of won.bot.framework.eventbot.listener.EventListener in project webofneeds by researchstudio-sat.
the class CreateNeedFromMailAction method doRun.
protected void doRun(Event event, EventListener executingListener) throws Exception {
EventListenerContext ctx = getEventListenerContext();
if (event instanceof CreateNeedFromMailEvent && ctx.getBotContextWrapper() instanceof MailBotContextWrapper) {
MailBotContextWrapper botContextWrapper = (MailBotContextWrapper) ctx.getBotContextWrapper();
MimeMessage message = ((CreateNeedFromMailEvent) event).getMessage();
try {
NeedContentPropertyType type = mailContentExtractor.getNeedType(message);
String title = mailContentExtractor.getTitle(message);
String description = mailContentExtractor.getDescription(message);
String[] tags = mailContentExtractor.getTags(message);
boolean isUsedForTesting = mailContentExtractor.isUsedForTesting(message);
boolean isDoNotMatch = mailContentExtractor.isDoNotMatch(message);
WonNodeInformationService wonNodeInformationService = ctx.getWonNodeInformationService();
final URI wonNodeUri = ctx.getNodeURISource().getNodeURI();
final URI needURI = wonNodeInformationService.generateNeedURI(wonNodeUri);
DefaultNeedModelWrapper needModelWrapper = new DefaultNeedModelWrapper(needURI.toString());
needModelWrapper.setTitle(type, title);
needModelWrapper.setDescription(type, description);
for (String tag : tags) {
needModelWrapper.addTag(type, tag);
}
for (URI facet : facets) {
needModelWrapper.addFacetUri(facet.toString());
}
Dataset dataset = needModelWrapper.copyDataset();
logger.debug("creating need on won node {} with content {} ", wonNodeUri, StringUtils.abbreviate(RdfUtils.toString(dataset), 150));
WonMessage createNeedMessage = createWonMessage(wonNodeInformationService, needURI, wonNodeUri, dataset, isUsedForTesting, isDoNotMatch);
EventBotActionUtils.rememberInList(ctx, needURI, uriListName);
botContextWrapper.addUriMimeMessageRelation(needURI, message);
EventListener successCallback = new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
logger.debug("need creation successful, new need URI is {}", needURI);
String sender = MailContentExtractor.getFromAddressString(botContextWrapper.getMimeMessageForURI(needURI));
botContextWrapper.addMailAddressWonURIRelation(sender, new WonURI(needURI, UriType.NEED));
logger.debug("created need was from sender: " + sender);
}
};
EventListener failureCallback = new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
String textMessage = WonRdfUtils.MessageUtils.getTextMessage(((FailureResponseEvent) event).getFailureMessage());
logger.debug("need creation failed for need URI {}, original message URI {}: {}", new Object[] { needURI, ((FailureResponseEvent) event).getOriginalMessageURI(), textMessage });
EventBotActionUtils.removeFromList(ctx, needURI, uriListName);
botContextWrapper.removeUriMimeMessageRelation(needURI);
}
};
EventBotActionUtils.makeAndSubscribeResponseListener(createNeedMessage, successCallback, failureCallback, ctx);
logger.debug("registered listeners for response to message URI {}", createNeedMessage.getMessageURI());
ctx.getWonMessageSender().sendWonMessage(createNeedMessage);
logger.debug("need creation message sent with message URI {}", createNeedMessage.getMessageURI());
} catch (MessagingException me) {
logger.error("messaging exception occurred: {}", me);
}
}
}
use of won.bot.framework.eventbot.listener.EventListener in project webofneeds by researchstudio-sat.
the class CreateNeedWithFacetsAction method doRun.
@Override
protected void doRun(Event event, EventListener executingListener) throws Exception {
EventListenerContext ctx = getEventListenerContext();
if (ctx.getNeedProducer().isExhausted()) {
logger.info("the bot's need producer is exhausted.");
ctx.getEventBus().publish(new NeedProducerExhaustedEvent());
return;
}
final Dataset needDataset = ctx.getNeedProducer().create();
if (needDataset == null) {
logger.warn("needproducer failed to produce a need model, aborting need creation");
return;
}
URI needUriFromProducer = null;
Resource needResource = WonRdfUtils.NeedUtils.getNeedResource(needDataset);
if (needResource.isURIResource()) {
needUriFromProducer = URI.create(needResource.getURI().toString());
RdfUtils.replaceBaseURI(needDataset, needResource.getURI());
} else {
RdfUtils.replaceBaseResource(needDataset, needResource);
}
final URI needUriBeforeCreation = needUriFromProducer;
NeedModelWrapper needModelWrapper = new NeedModelWrapper(needDataset);
for (URI facetURI : facets) {
WonRdfUtils.FacetUtils.addFacet(needModelWrapper.getNeedModel(), facetURI);
}
final Dataset needDatasetWithFacets = needModelWrapper.copyDataset();
final URI wonNodeUri = ctx.getNodeURISource().getNodeURI();
logger.debug("creating need on won node {} with content {} ", wonNodeUri, StringUtils.abbreviate(RdfUtils.toString(needDatasetWithFacets), 150));
WonNodeInformationService wonNodeInformationService = ctx.getWonNodeInformationService();
final URI needURI = wonNodeInformationService.generateNeedURI(wonNodeUri);
WonMessage createNeedMessage = createWonMessage(wonNodeInformationService, needURI, wonNodeUri, needDatasetWithFacets);
// remember the need URI so we can react to success/failure responses
EventBotActionUtils.rememberInList(ctx, needURI, uriListName);
EventListener successCallback = new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
logger.debug("need creation successful, new need URI is {}", needURI);
ctx.getEventBus().publish(new NeedCreatedEvent(needURI, wonNodeUri, needDatasetWithFacets, null, needUriBeforeCreation));
}
};
EventListener failureCallback = new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
String textMessage = WonRdfUtils.MessageUtils.getTextMessage(((FailureResponseEvent) event).getFailureMessage());
logger.debug("need creation failed for need URI {}, original message URI {}: {}", new Object[] { needURI, ((FailureResponseEvent) event).getOriginalMessageURI(), textMessage });
EventBotActionUtils.removeFromList(ctx, needURI, uriListName);
ctx.getEventBus().publish(new NeedCreationFailedEvent(wonNodeUri, needUriBeforeCreation));
}
};
EventBotActionUtils.makeAndSubscribeResponseListener(createNeedMessage, successCallback, failureCallback, ctx);
logger.debug("registered listeners for response to message URI {}", createNeedMessage.getMessageURI());
ctx.getWonMessageSender().sendWonMessage(createNeedMessage);
logger.debug("need creation message sent with message URI {}", createNeedMessage.getMessageURI());
}
use of won.bot.framework.eventbot.listener.EventListener in project webofneeds by researchstudio-sat.
the class CreateDebugNeedWithFacetsAction method doRun.
@Override
protected void doRun(Event event, EventListener executingListener) throws Exception {
String replyText = "";
URI reactingToNeedUriTmp = null;
Dataset needDataset = null;
if (event instanceof NeedSpecificEvent) {
reactingToNeedUriTmp = ((NeedSpecificEvent) event).getNeedURI();
} else {
logger.warn("could not process non-need specific event {}", event);
return;
}
if (event instanceof NeedCreatedEventForMatcher) {
needDataset = ((NeedCreatedEventForMatcher) event).getNeedData();
} else if (event instanceof HintDebugCommandEvent) {
reactingToNeedUriTmp = ((HintDebugCommandEvent) event).getRemoteNeedURI();
} else if (event instanceof ConnectDebugCommandEvent) {
reactingToNeedUriTmp = ((ConnectDebugCommandEvent) event).getRemoteNeedURI();
} else {
logger.error("CreateEchoNeedWithFacetsAction cannot handle " + event.getClass().getName());
return;
}
final URI reactingToNeedUri = reactingToNeedUriTmp;
String titleString = null;
boolean createNeed = true;
if (needDataset != null) {
DefaultNeedModelWrapper needModelWrapper = new DefaultNeedModelWrapper(needDataset);
titleString = needModelWrapper.getSomeTitleFromIsOrAll("en", "de");
createNeed = needModelWrapper.hasFlag(WON.USED_FOR_TESTING) && !needModelWrapper.hasFlag(WON.NO_HINT_FOR_ME);
}
// if create need is false do not continue the debug need creation
if (!createNeed)
return;
if (titleString != null) {
if (isInitialForConnect) {
replyText = "Debugging with initial connect: " + titleString;
} else if (isInitialForHint) {
replyText = "Debugging with initial hint: " + titleString;
} else {
replyText = "Debugging: " + titleString;
}
} else {
replyText = "Debug Need No. " + counter.increment();
}
EventListenerContext ctx = getEventListenerContext();
WonNodeInformationService wonNodeInformationService = ctx.getWonNodeInformationService();
EventBus bus = ctx.getEventBus();
final URI wonNodeUri = ctx.getNodeURISource().getNodeURI();
final URI needURI = wonNodeInformationService.generateNeedURI(wonNodeUri);
DefaultNeedModelWrapper needModelWrapper = new DefaultNeedModelWrapper(needURI.toString());
needModelWrapper.setTitle(NeedContentPropertyType.IS_AND_SEEKS, replyText);
needModelWrapper.setDescription(NeedContentPropertyType.IS_AND_SEEKS, "This is a need automatically created by the DebugBot.");
for (URI facet : facets) {
needModelWrapper.addFacetUri(facet.toString());
}
final Dataset debugNeedDataset = needModelWrapper.copyDataset();
final Event origEvent = event;
logger.debug("creating need on won node {} with content {} ", wonNodeUri, StringUtils.abbreviate(RdfUtils.toString(debugNeedDataset), 150));
WonMessage createNeedMessage = createWonMessage(wonNodeInformationService, needURI, wonNodeUri, debugNeedDataset);
// remember the need URI so we can react to success/failure responses
EventBotActionUtils.rememberInList(ctx, needURI, uriListName);
EventListener successCallback = new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
logger.debug("need creation successful, new need URI is {}", needURI);
// save the mapping between the original and the reaction in to the context.
getEventListenerContext().getBotContextWrapper().addUriAssociation(reactingToNeedUri, needURI);
if ((origEvent instanceof HintDebugCommandEvent) || isInitialForHint) {
bus.publish(new NeedCreatedEventForDebugHint(needURI, wonNodeUri, debugNeedDataset, null));
} else if ((origEvent instanceof ConnectDebugCommandEvent) || isInitialForConnect) {
bus.publish(new NeedCreatedEventForDebugConnect(needURI, wonNodeUri, debugNeedDataset, null));
} else {
bus.publish(new NeedCreatedEvent(needURI, wonNodeUri, debugNeedDataset, null));
}
}
};
EventListener failureCallback = new EventListener() {
@Override
public void onEvent(Event event) throws Exception {
String textMessage = WonRdfUtils.MessageUtils.getTextMessage(((FailureResponseEvent) event).getFailureMessage());
logger.debug("need creation failed for need URI {}, original message URI {}: {}", new Object[] { needURI, ((FailureResponseEvent) event).getOriginalMessageURI(), textMessage });
EventBotActionUtils.removeFromList(ctx, needURI, uriListName);
bus.publish(new NeedCreationFailedEvent(wonNodeUri));
}
};
EventBotActionUtils.makeAndSubscribeResponseListener(createNeedMessage, successCallback, failureCallback, ctx);
logger.debug("registered listeners for response to message URI {}", createNeedMessage.getMessageURI());
ctx.getWonMessageSender().sendWonMessage(createNeedMessage);
logger.debug("need creation message sent with message URI {}", createNeedMessage.getMessageURI());
}
Aggregations