From 08f82607a64e9729d706c8f735fbc8032ec7b37d Mon Sep 17 00:00:00 2001 From: Cameron Ball Date: Tue, 20 Nov 2018 11:02:09 +0800 Subject: [PATCH] Refactor readEmails script Additionally: - Update the other scripts as the Common namespace is gone - A few strings added - Catch-all protection added to purjolok --- bins.php | 11 ++----- common.php | 76 ++++++++++++++++++++++++++++++++++++++----- purjolok.php | 30 +++++------------ readEmailsAndSendMessages.php | 46 ++++---------------------- rules.php | 16 +++------ strings.php | 7 ++++ wednesday.php | 3 +- 7 files changed, 98 insertions(+), 91 deletions(-) create mode 100644 strings.php diff --git a/bins.php b/bins.php index 8473ea4..f590952 100644 --- a/bins.php +++ b/bins.php @@ -1,12 +1,5 @@ sendMessage( - [ - 'chat_id' => CHAT_ID, - 'text' => 'Take out that BINZ #TrashSLAM 🚮' - ] -); +sendToGroupChat(getString('takeoutthebins')); diff --git a/common.php b/common.php index 7b88a67..a32339d 100644 --- a/common.php +++ b/common.php @@ -1,12 +1,9 @@ format(DATE_FORMAT); +} + +const sendToGroupChat = 'sendToGroupChat'; +function sendToGroupChat(string $message) { + return getTelegram()->sendMessage(['chat_id' => CHAT_ID, 'text' => $message]); +} + +const generateReminderText = 'generateReminderText'; +function generateReminderText($message) { + return getString('billreminder', REMIND_THRESHOLD, $message['service'], splitBill($message['amount']), formatDate($message['due'])); +} + +const generateNewBillText = 'generateNewBillText'; +function generateNewBillText($message) { + return getString('newbill', $message['service'], splitBill($message['amount']), formatDate($message['due'])); +} + +const messageNeedsReminder = 'messageNeedsReminder'; +function messageNeedsReminder($message) { + return $message['due']->diff(new DateTimeImmutable)->d == REMIND_THRESHOLD; +} + + +function ∘(...$fs) { + return function($arg) use ($fs) { + return array_reduce(array_reverse($fs), function($c, $f) { + return $f($c); + }, $arg); + }; +} + +function map($callable) { + return function($list) use ($callable) { + return array_map($callable, $list); + }; +} + +function filter($callable) { + return function($list) use ($callable) { + return array_filter($list, $callable); + }; +} + +function ∪($a, $b) { + return array_merge($a, $b); +} + function getMessagesFromInbox($inbox, array $rules, $unseenOnly = true) { return array_filter( array_map( @@ -63,15 +121,17 @@ function getMessagesFromInbox($inbox, array $rules, $unseenOnly = true) { return []; } + $messageTransform = $rule['messageTransform'] ?? 'identity'; + $dateTransform = $rule['dateTransform'] ?? 'identity'; + $body = imap_fetchbody($inbox, $emails[0], '1', FT_UID); - preg_match($rule['regex'], $rule['messageTransform']($body), $matches); + preg_match($rule['regex'], $messageTransform($body), $matches); return [ 'service' => $service, 'id' => substr(md5($body), 0, 6), 'uid' => $emails[0], - 'telegramMessage' => $rule['telegramMessage'], - 'due' => new DateTimeImmutable($rule['dateTransform']($matches['due'])), + 'due' => new DateTimeImmutable($dateTransform($matches['due'])), 'amount' => $matches['amount'] ]; }, diff --git a/purjolok.php b/purjolok.php index 1678cb2..185da44 100644 --- a/purjolok.php +++ b/purjolok.php @@ -1,19 +1,17 @@ getWebhookUpdates())) { + getTelegram()->sendMessage([ + 'chat_id' => getTelegram()->getWebhookUpdates()->get('message')->get('from')->get('id'), + 'text' => "Sorry, Dad says I can't talk to you." + ]); + exit(0); +} getTelegram()->addCommand( new class extends Command { @@ -58,11 +56,6 @@ getTelegram()->addCommand( protected $description = 'List my bills'; public function handle($arguments) { - if (!canChatWith($this->getUpdate())) { - $this->replyWithMessage(['text' => "Sorry, Dad says I can't talk to you."]); - return; - } - $this->replyWithMessage(['text' => 'Fetching ' . getMessageSenderDisplayName($this->getUpdate()) . "'s unpaid bills. Just a sec ..."]); $this->replyWithChatAction(['action' => Actions::TYPING]); $this->replyWithMessage([ @@ -98,11 +91,6 @@ getTelegram()->addCommand( protected $description = 'Mark a bill as paid'; public function handle($arguments) { - if (!canChatWith($this->getUpdate())) { - $this->replyWithMessage(['text' => "Sorry, Dad says I can't talk to you."]); - return; - } - if (!$arguments) { $this->replyWithMessage(['text' => "I need the bill id. The /mybills command lists all your bills with the ids in brackets. Here, I'll show you..."]); $this->triggerCommand('mybills'); diff --git a/readEmailsAndSendMessages.php b/readEmailsAndSendMessages.php index 2280fe7..e574aba 100644 --- a/readEmailsAndSendMessages.php +++ b/readEmailsAndSendMessages.php @@ -1,44 +1,12 @@ sendMessage( - [ - 'chat_id' => CHAT_ID, - 'text'=> $message - ] - ); - }, - array_merge( - array_map( - function($message) { - return sprintf( - '[REMINDER: %d DAYS] ' . $message['telegramMessage'], - REMIND_THRESHOLD, - splitBill($message['amount']), - $message['due']->format('jS \of M') - ); - }, - array_filter( - getMessagesFromInbox(getInbox('Multiple Inboxes/Needs Action'), require 'rules.php', false), - function($message) { - return $message['due']->diff(new DateTimeImmutable)->d == REMIND_THRESHOLD; - } - ) - ), - array_map( - function($message) { - return sprintf( - $message['telegramMessage'], - splitBill($message['amount']), - $message['due']->format('jS \of M') - ); - }, - getMessagesFromInbox(getInbox('Multiple Inboxes/Needs Action'), require 'rules.php') - ) - ) +map(sendToGroupChat)( + ∪(∘(map(generateReminderText), filter(messageNeedsReminder), 'ggetMessagesFromInbox')(FALSE), + ∘(map(generateNewBillText), 'ggetMessagesFromInbox')(TRUE)) ); diff --git a/rules.php b/rules.php index e31341c..807e1f9 100644 --- a/rules.php +++ b/rules.php @@ -3,10 +3,7 @@ return [ 'Electricity' => [ 'imapQuery' => 'FROM "@synergy.net.au"', - 'regex' => '/New charges: \$(?[0-9]+(\.[0-9]{2})?) Due (?\d{1,2} \w{3} \d+)/', - 'messageTransform' => 'Common\identity', - 'dateTransform' => 'Common\identity', - 'telegramMessage' => "Electricity bill: $%s each due on the %s" + 'regex' => '/New charges: \$(?[0-9]+(\.[0-9]{2})?) Due (?\d{1,2} \w{3} \d+)/' ], 'Water' => [ 'imapQuery' => 'FROM "@watercorporation.com.au"', @@ -16,25 +13,20 @@ return [ }, 'dateTransform' => function($date) { return str_replace('/', '-', $date); - }, - 'telegramMessage' => "Water bill: $%s each due on the %s" + } ], 'Internet' => [ 'imapQuery' => 'FROM "@online.telstra.com"', 'regex' => '/Total \$(?[0-9]+(\.[0-9]{2})?).*?Due Date (?\d{1,2} \w{3} \d{4})/', 'messageTransform' => function($message) { return implode(" ", array_map('trim', explode("\n", strip_tags(html_entity_decode($message))))); - }, - 'dateTransform' => 'Common\identity', - 'telegramMessage' => "Internet bill: $%s each due on the %s" + } ], 'Gas' => [ 'imapQuery' => 'FROM "@energy.agl.com.au"', 'regex' => '/Direct Debit amount: \$(?[0-9]+(\.[0-9]{2})?).*?Direct Debit date: (?\d{1,2} \w{3} \d+)/', 'messageTransform' => function($message) { return implode(" ", array_map('trim', explode("\n", $message))); - }, - 'dateTransform' => 'Common\identity', - 'telegramMessage' => "Gas bill: $%s each due on the %s" + } ] ]; diff --git a/strings.php b/strings.php new file mode 100644 index 0000000..f9908dc --- /dev/null +++ b/strings.php @@ -0,0 +1,7 @@ + 'Take out that BINZ #TrashSLAM 🚮', + 'newbill' => '%s bill: $%s each due on the %s', + 'billreminder' => '[REMINDER %d DAYS] %s bill: $%s each due on the %s' +]; \ No newline at end of file diff --git a/wednesday.php b/wednesday.php index 14dae41..002d0b8 100644 --- a/wednesday.php +++ b/wednesday.php @@ -1,8 +1,7 @@