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 "
$FirstEmail
"; } elsif (index($Parsed,"De:") != -1) { @EmailsFrench = split(/De:/,$Parsed); $FirstEmail = $EmailsFrench[0]; $FirstEmail =~ s/\n/
/g; return "
$FirstEmail
"; } # is this a mantis exchange elsif (index($Parsed,"================") != -1) { my $LastNote = substr($Parsed,rindex($Parsed,"----------------------------------------------------------------------",rindex($Parsed, "----------------------------------------------------------------------") -1)); #$LastNote =~ s/-{11,}//g; $LastNote = substr($LastNote,0,index($LastNote,"===========")); my $LastNoteAuthor = substr($LastNote,0,rindex($LastNote,"----------------------------------------------------------------------")); $LastNoteAuthor =~ s/-{11,}//g; # Extract the link to the mantis comment my $MantisLink = ""; if ($LastNoteAuthor =~ m/http:\/\/mantis\/view.php\?id=\d*#c\d*/) { $MantisLink = $&; } # Detect if Dev or Support is speaking foreach (@SupportAgents) { if (index($LastNoteAuthor,$_) != -1) { $LastNoteAuthor = "Support:"; last; } else { $LastNoteAuthor = "Dev:"; } } my $LastNoteMessage = substr($LastNote,rindex($LastNote,"----------------------------------------------------------------------")); $LastNoteMessage =~ s/-{11,}//g; $LastNoteMessage =~ s/\n/
/g; $LastNoteMessage =~ s/(
){3,}/
/g; return "||
" . $LastNoteAuthor . "
" . $LastNoteMessage . "
"; #return "
" . $LastNoteAuthor . "
" . $LastNoteMessage . "
"; } else { $Parsed =~ s/\n/
/g; $Parsed =~ s/(
){3,}/
/g; #salesforce comment return "
$Parsed
"; } } sub getDisplayDate { my $modifiedDate = $_[0]; #"20090103 12:00"; my $format = new DateTime::Format::Strptime( pattern => '%Y-%m-%dT%H:%M:%S', time_zone => 'GMT', ); my $date = $format->parse_datetime($modifiedDate); #print $date->strftime("%Y%m%d %H:%M %Z")."\n"; $date->set_time_zone("America/New_York"); return $date->day_abbr().", ".$date->month_abbr()." ".$date->strftime("%d|%H:%M"); } true;