use strict; use warnings; use Cpanel::JSON::XS; use Data::Dumper; use LWP::UserAgent; use HTTP::Request::Common qw(GET POST); use MIME::Base64; use Try::Tiny; main (); sub main { my $user_agent = LWP::UserAgent->new(); my $bearer_token = &get_bearer_token($user_agent); my @config = ( { 'group_name' => 'value', 'management_unit_id' => 'value', 'webhook_url' => 'value', }, { # you will need to repeat the above hash with key value pairs for every queue you are iterating through. } ); foreach my $group (@config) { my $schedules = &get_schedule_data($user_agent, $bearer_token, $group->{management_unit_id}); my @on_queue_user_ids; foreach my $entry (@{$schedules->{entities}}) { if($entry->{systemPresence} eq 'OnQueue') { push( @on_queue_user_ids, $entry->{user}{id}, ); } } my @usernames_without_stations; foreach my $user_id (@on_queue_user_ids) { my $station_details = &get_station_data($user_agent, $bearer_token, $user_id); if (!defined $station_details->{effectiveStation}) { my $name = $station_details->{lastAssociatedStation}{name} || $user_id; push( @usernames_without_stations, $name ); } } if (scalar @usernames_without_stations == 0) { next; } my @alert_messages; foreach my $username (@usernames_without_stations) { push( @alert_messages, $username . ' currently has no webRTC phone assigned. ' ) }; &post_alert_message($user_agent, \@alert_messages, $group->{webhook_url}); } } sub get_bearer_token { my $ua = shift; my $client_id = 'value'; my $client_secret = 'value'; my $request_uri = 'value'; my $auth_header_value = 'Basic ' . encode_base64($client_id . ':' . $client_secret, ''); my $response_content; my $decoded_content; my $request = POST( $request_uri, Content_Type => 'application/x-www-form-urlencoded', Authorization => $auth_header_value, Content => [grant_type => 'client_credentials'] ); my $response = $ua->request($request); if($response->is_success) { $response_content = $response->decoded_content; } else { &error( 'Received failure code response from POST request to get bearer token', $response->status_line . "\n" . $response->decoded_content ); } try { $decoded_content = decode_json($response_content); } catch { &error( $_, # CROAK error stored here 'Error while decoding JSON returned from POST request to get bearer token' ); }; if(!defined $decoded_content->{'access_token'} || $decoded_content->{'access_token'} eq '') { &error( 'Access token not defined or blank', 'Error while accessing bearer token in decoded JSON' ); } return 'Bearer ' . $decoded_content->{'access_token'}; } sub get_schedule_data { my $ua = shift; my $bearer_token = shift; my $management_unit_id = shift; my $request_uri = 'first part of management unit id api' . $management_unit_id . 'remaining part'; my $response_content; my $decoded_content; my $request = GET( $request_uri, Content_Type => 'application/json', Authorization => $bearer_token, ); my $response = $ua->request($request); if($response->is_success) { $response_content = $response->decoded_content; } else { &error( 'Received failure code response from GET request to get schedules', $response->status_line . "\n" . $response->decoded_content ); } try { $decoded_content = decode_json $response_content; } catch { &error( $_, # CROAK error stored here 'Error while decoding JSON returned from GET request to get schedules' ); }; return $decoded_content; } sub get_station_data { my $ua = shift; my $bearer_token = shift; my $user_id = shift; my $request_uri = 'first part of user station api' . $user_id . 'second part'; my $response_content; my $decoded_content; my $request = GET( $request_uri, Content_Type => 'application/json', Authorization => $bearer_token, ); my $response = $ua->request($request); if($response->is_success) { $response_content = $response->decoded_content; } else { &error( 'Received failure code response from GET request to get station information', $response->status_line . "\n" . $response->decoded_content ); } try { $decoded_content = decode_json $response_content; } catch { &error( $_, # CROAK error stored here 'Error while decoding JSON returned from GET request to get station information' ); }; return $decoded_content; } sub post_alert_message { my $ua = shift; my $alert_messages = shift; my $webhook_url = shift; my @adaptive_card_data; foreach my $message (@{$alert_messages}) { push( @adaptive_card_data, { 'type' => 'TextBlock', 'text' => $message, } ); }; my $adaptive_card = { 'type' => 'message', 'attachments' => [{ 'contentType' => 'application/vnd.microsoft.card.adaptive', 'content' => { '$schema' => 'http://adaptivecards.io/schemas/adaptive-card.json', 'type' => 'AdaptiveCard', 'version' => '1.2', 'body' => \@adaptive_card_data, } }], }; my $serialized_adaptive_card; try { $serialized_adaptive_card = encode_json($adaptive_card); } catch { &error( $_, # CROAK error stored here 'Error while encoding adaptive card' ); }; my $response_content; my $decoded_content; my $request = POST( $webhook_url, Content_Type => 'application/json', Content => $serialized_adaptive_card ); my $response = $ua->request($request); if(!$response->is_success) { &error( 'Received failure code response from POST request to webhook API.', $response->status_line . "\n" . $response->decoded_content ); } } sub error { my ($response, $reason) = @_; print "$response\n\n$reason\n\n"; exit; }