summaryrefslogtreecommitdiff
path: root/controllers/hooks.php
diff options
context:
space:
mode:
authorAaron Parecki <aaron@parecki.com>2015-07-25 05:44:10 -0700
committerAaron Parecki <aaron@parecki.com>2015-07-25 05:44:10 -0700
commitc3fb722ad4bade9c4027c04de9b8dee511ab5756 (patch)
treeda4711f4ea9b4d1b79003c1c3d28acadeba9f781 /controllers/hooks.php
parent92b55f2636a82c5eafc24d1e2adc84b61258161e (diff)
add post-by-email support to quill
Diffstat (limited to 'controllers/hooks.php')
-rw-r--r--controllers/hooks.php73
1 files changed, 73 insertions, 0 deletions
diff --git a/controllers/hooks.php b/controllers/hooks.php
new file mode 100644
index 0000000..b597c7b
--- /dev/null
+++ b/controllers/hooks.php
@@ -0,0 +1,73 @@
+<?php
+
+$app->post('/mailgun', function() use($app) {
+ $params = $app->request()->params();
+
+ // Find the user for this email
+ if(!preg_match('/([^ <>]+)@'.Config::$hostname.'/', $params['To'], $match)) {
+ $app->response()->body('invalid recipient');
+ return;
+ }
+
+ $user = ORM::for_table('users')->where('email_username', $match[1])->find_one();
+ if(!$user) {
+ $app->response()->body('user not found');
+ return;
+ }
+
+ if(!$user->micropub_access_token) {
+ $app->response()->body('user has no access token');
+ return;
+ }
+
+ $data = array(
+ 'published' => (k($params, 'Date') ? date('c', strtotime(k($params, 'Date'))) : date('c'))
+ );
+
+ if(k($params, 'Subject'))
+ $data['name'] = k($params, 'Subject');
+
+ if(k($params['body-plain'])
+ $data['content'] = k($params, 'body-plain');
+
+ // Set tags for any hashtags used in the body
+ if(preg_match_all('/#([^ ]+)/', $data['content'], $matches)) {
+ $tags = array();
+ foreach($matches[1] as $m)
+ $tags[] = $m;
+ if($tags) {
+ if($user->send_category_as_array != 1) {
+ $data['category'] = $tags;
+ } else {
+ $data['category'] = implode(',', $tags);
+ }
+ }
+ }
+
+ // Handle attachments
+ $filename = false;
+
+ foreach($_FILES as $file) {
+ // If a photo was included, set the filename to the downloaded file
+ if(preg_match('/image/', $file['type'])) {
+ $filename = $file['tmp_name'];
+ }
+
+ // Sometimes MMSs are sent with a txt file attached instead of in the body
+ if(preg_match('/text\/plain/', $file['type'])) {
+ $content = trim(file_get_contents($file['tmp_name']));
+ if($content) {
+ $data['content'] = $content;
+ }
+ }
+ }
+
+ $r = micropub_post_for_user($user, $data, $filename);
+
+ if(k($r, 'location'))
+ $result = 'created post at ' . $r['location'];
+ else
+ $result = 'error creating post';
+
+ $app->response()->body($result);
+});