Refactor readEmails script
[SonOfLokstallBot.git] / common.php
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']
                 ];
             },