package CommunicationStream;
use Dancer ':syntax';
use Dancer::Plugin::Ajax;
use URI::Escape;
use WWW::Mechanize;
use HTML::TreeBuilder;
use HTML::FormatText;
use DateTime;
use DateTime::Format::Strptime;
use SOAP::Lite;
our $VERSION = '0.1';
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;
# SOAP Lite configuration
#my $soap = SOAP::Lite...
my $firstResult = 0;
get '/:ref' => sub {
my @messages = ();
my ($modifiedDate, $quickViewLinks, $linkToDocuments, $outlookProtocolLinks, $containsAttachment) = getCachedDocumentUris(params->{ref}, 0, 5); #fix this to use the number of documents
my $i = 0;
foreach my $quickViewLink (@{$quickViewLinks}) {
my $text = grab_page($quickViewLink);
my $datetime = getDisplayDate(${$modifiedDate}[$i]);
my ($date, $timestamp) = split(/\|/, $datetime);
if (index($text, "class=\"email") != -1) {
if (${$containsAttachment}[$i] eq "true") {
push(@messages, {date => $date, timestamp => $timestamp, link => "", text => $text, attachment => ""});
} else {
push(@messages, {date => $date, timestamp => $timestamp, link => "", text => $text});
}
}
elsif (index($text,"||") != -1) {
my @linkAndText = split(/\|\|/, $text);
push(@messages, {date => $date, timestamp => $timestamp, link => $linkAndText[0], text => $linkAndText[1]});
}
else {
push(@messages, {date => $date, timestamp => $timestamp, link => "", text => $text});
}
$i++;
}
template 'index' => {messages => \@messages};
};
ajax '/getNextResults:firstResultAndRef' => sub {
my $content = '';
my ($salesforceRef, $firstResult) = split(/\|/, params->{firstResultAndRef});
my @messages = ();
my ($modifiedDate, $quickViewLinks, $linkToDocuments, $outlookProtocolLinks) = getCachedDocumentUris($salesforceRef, $firstResult, 5);
my $i = 0;
foreach my $quickViewLink (@{$quickViewLinks}) {
my $text = grab_page($quickViewLink);
my $datetime = getDisplayDate(${$modifiedDate}[$i]);
my ($date, $timestamp) = split(/\|/, $datetime);
if (index($text, "class=\"email") != -1) {
push(@messages, {date => $date, timestamp => $timestamp, link => "", text => $text});
}
elsif (index($text,"||") != -1) {
my @linkAndText = split(/\|\|/, $text);
push(@messages, {date => $date, timestamp => $timestamp, link => $linkAndText[0], text => $linkAndText[1]});
}
else {
push(@messages, {date => $date, timestamp => $timestamp, link => "", text => $text});
}
$i++;
}
$content = template 'messages' => {messages => \@messages};
{
content => $content
}
;
};
ajax '/getAllResults:firstResultAndRef' => sub {
my $content = '';
my ($salesforceRef, $firstResult) = split(/\|/, params->{firstResultAndRef});
my @messages = ();
my ($modifiedDate, $quickViewLinks, $linkToDocuments, $outlookProtocolLinks) = getCachedDocumentUris($salesforceRef, $firstResult, 1000);
my $i = 0;
foreach my $quickViewLink (@{$quickViewLinks}) {
my $text = grab_page($quickViewLink);
my $datetime = getDisplayDate(${$modifiedDate}[$i]);
my ($date, $timestamp) = split(/\|/, $datetime);
if (index($text, "class=\"email") != -1) {
push(@messages, {date => $date, timestamp => $timestamp, link => "", text => $text});
}
elsif (index($text,"||") != -1) {
my @linkAndText = split(/\|\|/, $text);
push(@messages, {date => $date, timestamp => $timestamp, link => $linkAndText[0], text => $linkAndText[1]});
}
else {
push(@messages, {date => $date, timestamp => $timestamp, link => "", text => $text});
}
$i++;
}
$content = template 'messages' => {messages => \@messages};
{
content => $content
}
;
};
sub getResults {
my ($query, $firstResult, $numberOfResults) = ($_[0], $_[1], $_[2]);
my @params = (SOAP::Data->name("p_Params"=>
\SOAP::Data->value(SOAP::Data->name("BasicQuery" => $query) -> type("string"),
SOAP::Data->name("NumberOfResults" => $numberOfResults),
SOAP::Data->name("SortCriteria" => "ModifiedDateDescending"),
SOAP::Data->name("NeedCachedDocumentUris" => "true"),
SOAP::Data->name("FirstResult" => $firstResult),
SOAP::Data->name("TimeZoneOffset" => 4),
SOAP::Data->name("NeededFields" =>
\SOAP::Data->name("string" => "\@sysoutlookuri")))));
my $result = $soap->call($method => @params);
return $result;
}
sub getCachedDocumentUris {
my @URIs;
my ($salesforceRef, $firstResult, $numberOfResults) = ($_[0], $_[1], $_[2]);
my $SearchResults = getResults("$salesforceRef \@sysfiletype==(exchangemessage,SFCaseComment)", $firstResult, $numberOfResults);
my @modifiedDate = $SearchResults->valueof('//PerformQueryResponse/PerformQueryResult/Results/QueryResult/ModifiedDate');
my @tmpURIs = $SearchResults->valueof('//PerformQueryResponse/PerformQueryResult/Results/QueryResult/CachedDocumentUri');
my @clickableURIs = $SearchResults->valueof('//PerformQueryResponse/PerformQueryResult/Results/QueryResult/TargetUri');
my @outlookURIs = $SearchResults->valueof('//PerformQueryResponse/PerformQueryResult/Results/QueryResult/Fields/ResultField/Value');
my @containsAttachment = $SearchResults->valueof('//PerformQueryResponse/PerformQueryResult/Results/QueryResult/ContainsAttachment');
foreach my $URI (@tmpURIs) {
my ($LeftURI, $RemainingURI) = split('&docid=', $URI);
my ($MiddleURI, $RightURI) = split('&q=', $RemainingURI);
$MiddleURI =~ s/:/%3A/g;
$MiddleURI =~ s/@/%40/g;
$MiddleURI =~ s/\//%2F/g;
$MiddleURI =~ s/\$/%24/g;
$MiddleURI =~ s/é/%C3%A9/g;
$MiddleURI =~ s/\+/%2b/g;
$MiddleURI =~ s/Messages%2bTrait%C3%A9s/Messages\+Trait%C3%A9s/g;
#push (@URIs, uri_escape($URI));
push (@URIs, $LeftURI . '&docid=' . $MiddleURI . '&q=' . $RightURI);
}
return (\@modifiedDate, \@URIs, \@clickableURIs, \@outlookURIs, \@containsAttachment);
}
sub grab_page {
my @SupportAgents = ("Carl Bolduc", "Second Dude", "Third Dude");
# using shift to accept parameter passed to method
my $urlString = shift;
my $username = "domain\\user";
my $password = "great password";
my $mech = WWW::Mechanize->new(autocheck => 0);
$mech->agent('Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1');
$mech->credentials($username, $password);
my $response = $mech->get($urlString);
my $page_contents = $mech->content();
my $Format = HTML::FormatText->new(leftmargin => 0);
my $TreeBuilder = HTML::TreeBuilder->new;
$TreeBuilder->parse($page_contents);
my $Parsed = $Format->format($TreeBuilder);
my (@EmailsEnglish, @EmailsFrench);
my $FirstEmail;
# is this an email exchange
if (index($Parsed,"From:") != -1) {
@EmailsEnglish = split(/From:/,$Parsed);
$FirstEmail = $EmailsEnglish[0];
$FirstEmail =~ s/\n/
/g;
$FirstEmail =~ s/-+\s?Original Message\s?-+//g;
$FirstEmail =~ s/(
){3,}/
/g;
return "