use of won.bot.framework.bot.context.MailBotContextWrapper in project webofneeds by researchstudio-sat.
the class Message2MailAction method doRun.
@Override
protected void doRun(Event event, EventListener executingListener) throws Exception {
EventListenerContext ctx = getEventListenerContext();
if (event instanceof MessageFromOtherNeedEvent && ctx.getBotContextWrapper() instanceof MailBotContextWrapper) {
MailBotContextWrapper botContextWrapper = (MailBotContextWrapper) ctx.getBotContextWrapper();
Connection con = ((MessageFromOtherNeedEvent) event).getCon();
URI responseTo = con.getNeedURI();
URI remoteNeedUri = con.getRemoteNeedURI();
MimeMessage originalMail = botContextWrapper.getMimeMessageForURI(responseTo);
logger.debug("Someone sent a message for URI: " + responseTo + " sending a mail to the creator: " + MailContentExtractor.getFromAddressString(originalMail));
WonMimeMessage answerMessage = mailGenerator.createMessageMail(originalMail, responseTo, remoteNeedUri, con.getConnectionURI());
botContextWrapper.addMailIdWonURIRelation(answerMessage.getMessageID(), new WonURI(con.getConnectionURI(), UriType.CONNECTION));
sendChannel.send(new GenericMessage<>(answerMessage));
} else {
logger.debug("event was not of type MessageFromOtherNeedEvent");
}
}
use of won.bot.framework.bot.context.MailBotContextWrapper 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.bot.context.MailBotContextWrapper in project webofneeds by researchstudio-sat.
the class MailCommandAction method retrieveCorrespondingNeedUriFromMailByTitle.
/**
* This Method tries to find a corresponding open need uri from a user(given by the from adress) and returns the
* corresponding need uri if there was an open need with the same title
* @param message used to extract sender adress and subject(title)
* @return
*/
private URI retrieveCorrespondingNeedUriFromMailByTitle(MimeMessage message) {
try {
MailBotContextWrapper botContextWrapper = ((MailBotContextWrapper) getEventListenerContext().getBotContextWrapper());
String sender = ((InternetAddress) message.getFrom()[0]).getAddress();
URI needURI = null;
String titleToClose = mailContentExtractor.getTitle(message).trim();
if (sender != null) {
List<WonURI> needUris = botContextWrapper.getWonURIsForMailAddress(sender);
for (WonURI u : needUris) {
Dataset needRDF = getEventListenerContext().getLinkedDataSource().getDataForResource(u.getUri());
DefaultNeedModelWrapper needModelWrapper = new DefaultNeedModelWrapper(needRDF);
String needTitle = StringUtils.trim(needModelWrapper.getSomeTitleFromIsOrAll("en", "de"));
if (titleToClose.equals(needTitle) && needModelWrapper.getNeedState().equals(NeedState.ACTIVE)) {
return u.getUri();
}
}
}
return needURI;
} catch (MessagingException me) {
logger.error("could not extract information from mimemessage");
return null;
}
}
use of won.bot.framework.bot.context.MailBotContextWrapper 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());
}
}
Aggregations