get('message')->get('from')->get('id')]; } function getMessageSenderDisplayName($update) { return $update->get('message')->get('from')->get('first_name'); } function canChatWith($update) { return in_array($update->get('message')->get('from')->get('id'), array_keys(PARTICIPANT_IDS)); } function debug($whatever) { echo '
';
    print_r($whatever);
    echo '
'; } function getInbox($inbox) { STATIC $inboxes; if (!isset($inboxes[$inbox])) { $inboxes[$inbox] = imap_open( '{imap.gmail.com:993/debug/imap/ssl/novalidate-cert}' . $inbox, EMAIL, PASSWORD ); } 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); } function ssort($comparitor) { return function($array) use ($comparitor) { uasort($array, uncurry($comparitor)); return $array; }; } function uncurry($f) { return function($a, $b) use ($f) { return $f($a)($b); }; } 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; } const lines = 'lines'; function lines(string $string): array { return explode("\n", $string); } const glue = 'glue'; function glue(string $delim): callable { return function(array $strings) use ($delim): string { return implode($delim, $strings); }; } const unlines = 'unlines'; function unlines($lines) { return implode("\n", $lines); } function field($field) { return function($array) use ($field) { return $array[$field]; }; } const ⬄ = '⬄'; function ⬄($a) { return function($b) use ($a) { return $a <=> $b; }; } 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 aaray_column($column) { return function($array) use ($column) { return array_column($array, $column); }; } function aaray_slice($start) { return function($length) use ($start) { return function($array) use ($length, $start) { return array_slice($array, $start, $length); }; }; } function filter($callable) { return function($list) use ($callable) { return array_filter($list, $callable); }; } function f∘(callable $f) { return function(callable $g) use ($f) { return function($arg) use($g, $f) { return $f($g($arg)); }; }; } function ∘f(callable $f) { return function(callable $g) use ($f) { return function($arg) use($g, $f) { return $g($f($arg)); }; }; } function ∪($a, $b) { return array_merge($a, $b); } function getMessagesFromInbox($inbox, array $rules, $unseenOnly = true) { return array_filter( array_map( function($rule, $service) use ($inbox, $unseenOnly) { $emails = imap_search($inbox, ['SEEN ', 'UNSEEN '][$unseenOnly] . $rule['imapQuery'], SE_UID); if(!$emails) { return []; } $messageTransform = $rule['messageTransform'] ?? 'identity'; $dateTransform = $rule['dateTransform'] ?? 'identity'; $body = quoted_printable_decode(imap_fetchbody($inbox, $emails[0], '1', FT_UID)); preg_match($rule['regex'], $messageTransform($body), $matches); return [ 'service' => $service, 'id' => substr(md5($body), 0, 6), 'uid' => $emails[0], 'due' => new DateTimeImmutable($dateTransform($matches['due'])), 'amount' => $matches['amount'] ]; }, $rules, array_keys($rules) ), function($e) { return !!$e; } ); }