e5424ae1bb2cb33c2a2add5d7e466754c419529d
1 <?php
declare(strict_types
=1);
3 require_once('vendor/autoload.php');
4 require_once(__DIR__
. '/config.php');
8 function getTelegram() {
10 return $tg = $tg ??
new \Telegram\Bot\
Api(BOT_TOKEN
);
13 function splitBill($amount) {
14 return floor($amount/2);
17 function identity($x) {
21 function getMessageSender($update) {
22 return PARTICIPANT_IDS
[$update->get('message')->get('from')->get('id')];
25 function getMessageSenderDisplayName($update) {
26 return $update->get('message')->get('from')->get('first_name');
29 function canChatWith($update) {
30 return in_array($update->get('message')->get('from')->get('id'), array_keys(PARTICIPANT_IDS
));
33 function debug($whatever) {
39 function getInbox($inbox) {
42 if (!isset($inboxes[$inbox])) {
43 $inboxes[$inbox] = imap_open(
44 '{imap.gmail.com:993/debug/imap/ssl/novalidate-cert}' . $inbox,
50 return $inboxes[$inbox];
55 return $rules = $rules ??
require 'rules.php';
58 function getString($identifier, ...$vars) {
60 $strings = $strings ??
require 'strings.php';
62 return sprintf($strings[$identifier], ...$vars);
65 function formatDate($date) {
66 return $date->format(DATE_FORMAT
);
69 function ssort($comparitor) {
70 return function($array) use ($comparitor) {
71 uasort($array, uncurry($comparitor));
76 function uncurry($f) {
77 return function($a, $b) use ($f) {
82 const sendToGroupChat
= 'sendToGroupChat';
83 function sendToGroupChat(string $message) {
84 return getTelegram()->sendMessage(['chat_id' => CHAT_ID
, 'text' => $message]);
87 const generateReminderText
= 'generateReminderText';
88 function generateReminderText($message) {
89 return getString('billreminder', REMIND_THRESHOLD
, $message['service'], splitBill($message['amount']), formatDate($message['due']));
92 const generateNewBillText
= 'generateNewBillText';
93 function generateNewBillText($message) {
94 return getString('newbill', $message['service'], splitBill($message['amount']), formatDate($message['due']));
97 const messageNeedsReminder
= 'messageNeedsReminder';
98 function messageNeedsReminder($message) {
99 return $message['due']->diff(new DateTimeImmutable
)->d
== REMIND_THRESHOLD
;
102 const unlines
= 'unlines';
103 function unlines($lines) {
104 return implode("\n", $lines);
107 function field($field) {
108 return function($array) use ($field) {
109 return $array[$field];
115 return function($b) use ($a) {
122 return function($arg) use ($fs) {
123 return array_reduce(array_reverse($fs), function($c, $f) {
129 function map($callable) {
130 return function($list) use ($callable) {
131 return array_map($callable, $list);
135 function aaray_column($column) {
136 return function($array) use ($column) {
137 return array_column($array, $column);
141 function aaray_slice($start) {
142 return function($length) use ($start) {
143 return function($array) use ($length, $start) {
144 return array_slice($array, $start, $length);
149 function filter($callable) {
150 return function($list) use ($callable) {
151 return array_filter($list, $callable);
155 function f∘
(callable
$f) {
156 return function(callable
$g) use ($f) {
157 return function($arg) use($g, $f) {
163 function ∘
f(callable
$f) {
164 return function(callable
$g) use ($f) {
165 return function($arg) use($g, $f) {
172 return array_merge($a, $b);
175 function getMessagesFromInbox($inbox, array $rules, $unseenOnly = true
) {
178 function($rule, $service) use ($inbox, $unseenOnly) {
179 $emails = imap_search($inbox, ['SEEN ', 'UNSEEN '][$unseenOnly] . $rule['imapQuery'], SE_UID
);
185 $messageTransform = $rule['messageTransform'] ??
'identity';
186 $dateTransform = $rule['dateTransform'] ??
'identity';
188 $body = imap_fetchbody($inbox, $emails[0], '1', FT_UID
);
189 preg_match($rule['regex'], $messageTransform($body), $matches);
192 'service' => $service,
193 'id' => substr(md5($body), 0, 6),
195 'due' => new DateTimeImmutable($dateTransform($matches['due'])),
196 'amount' => $matches['amount']