<?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'));
<?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;
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(
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']
];
},
<?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 {
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([
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');
<?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))
);
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"',
},
'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"
+ }
]
];
--- /dev/null
+<?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
<?php declare(strict_types=1);
-require 'common.php';
+require_once('common.php');
-use function Common\getTelegram;
use Telegram\Bot\Actions;
$wednesdays = [