Refactor readEmails script
authorCameron Ball <cameron@cameron1729.xyz>
Tue, 20 Nov 2018 03:02:09 +0000 (11:02 +0800)
committerCameron Ball <cameron@cameron1729.xyz>
Tue, 20 Nov 2018 03:10:41 +0000 (11:10 +0800)
Additionally:

- Update the other scripts as the Common namespace is gone
- A few strings added
- Catch-all protection added to purjolok

bins.php
common.php
purjolok.php
readEmailsAndSendMessages.php
rules.php
strings.php [new file with mode: 0644]
wednesday.php

index 8473ea4..f590952 100644 (file)
--- a/bins.php
+++ b/bins.php
@@ -1,12 +1,5 @@
 <?php declare(strict_types=1);
 
-require 'common.php';
+require_once('common.php');
 
-use function Common\getTelegram;
-
-getTelegram()->sendMessage(
-    [
-        'chat_id' => CHAT_ID,
-        'text' => 'Take out that BINZ #TrashSLAM ðŸš®'
-    ]
-);
+sendToGroupChat(getString('takeoutthebins'));
index 7b88a67..a32339d 100644 (file)
@@ -1,12 +1,9 @@
 <?php declare(strict_types=1);
 
-namespace Common;
-
-require 'vendor/autoload.php';
-require __DIR__ . '/config.php';
+require_once('vendor/autoload.php');
+require_once(__DIR__ . '/config.php');
 
 use Telegram\Bot\Api;
-use DateTimeImmutable;
 
 function getTelegram() {
     STATIC $tg;
@@ -53,6 +50,67 @@ function getInbox($inbox) {
     return $inboxes[$inbox];
 }
 
+function getRules() {
+    STATIC $rules;
+    return $rules = $rules ?? require 'rules.php';
+}
+
+function getString($identifier, ...$vars) {
+    STATIC $strings;
+    $strings = $strings ?? require 'strings.php';
+
+    return sprintf($strings[$identifier], ...$vars);
+}
+
+function formatDate($date) {
+    return $date->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']
                 ];
             },
index 1678cb2..185da44 100644 (file)
@@ -1,19 +1,17 @@
 <?php declare(strict_types=1);
 
-require 'common.php';
-
-use function Common\{
-        getTelegram,
-        getMessagesFromInbox,
-        getInbox,
-        splitBill,
-        getMessageSender,
-        getMessageSenderDisplayName,
-        canChatWith
-};
+require_once('common.php');
+
 use Telegram\Bot\Actions;
 use Telegram\Bot\Commands\Command;
 
+if(!canChatWith(getTelegram()->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');
index 2280fe7..e574aba 100644 (file)
@@ -1,44 +1,12 @@
 <?php declare(strict_types=1);
 
-require 'common.php';
+require_once('common.php');
 
-use function Common\{getTelegram, getInbox, getMessagesFromInbox, splitBill};
+function ggetMessagesFromInbox($unread) {
+    return getMessagesFromInbox(getInbox('Multiple Inboxes/Needs Action'), getRules(), $unread);
+};
 
-array_map(
-    function($message) {
-        return getTelegram()->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))
 );
index e31341c..807e1f9 100644 (file)
--- a/rules.php
+++ b/rules.php
@@ -3,10 +3,7 @@
 return [
     'Electricity' => [
         'imapQuery' => 'FROM "@synergy.net.au"',
-        'regex' => '/New charges: \$(?<amount>[0-9]+(\.[0-9]{2})?)  Due (?<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: \$(?<amount>[0-9]+(\.[0-9]{2})?)  Due (?<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 \$(?<amount>[0-9]+(\.[0-9]{2})?).*?Due Date (?<due>\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: \$(?<amount>[0-9]+(\.[0-9]{2})?).*?Direct Debit date: (?<due>\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 (file)
index 0000000..f9908dc
--- /dev/null
@@ -0,0 +1,7 @@
+<?php declare(strict_types=1);
+
+return [
+    'takeoutthebins' => '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
index 14dae41..002d0b8 100644 (file)
@@ -1,8 +1,7 @@
 <?php declare(strict_types=1);
 
-require 'common.php';
+require_once('common.php');
 
-use function Common\getTelegram;
 use Telegram\Bot\Actions;
 
 $wednesdays = [