Replace dba::select(limit => 1) by dba::selectOne()
[friendica-addons.git] / libertree / libertree.php
1 <?php
2
3 /**
4  * Name: Libertree Post Connector
5  * Description: Post to libertree accounts
6  * Version: 1.0
7  * Author: Tony Baldwin <https://free-haven.org/u/tony>
8  */
9
10 use Friendica\Core\PConfig;
11
12 function libertree_install() {
13     register_hook('post_local',           'addon/libertree/libertree.php', 'libertree_post_local');
14     register_hook('notifier_normal',      'addon/libertree/libertree.php', 'libertree_send');
15     register_hook('jot_networks',         'addon/libertree/libertree.php', 'libertree_jot_nets');
16     register_hook('connector_settings',      'addon/libertree/libertree.php', 'libertree_settings');
17     register_hook('connector_settings_post', 'addon/libertree/libertree.php', 'libertree_settings_post');
18
19 }
20 function libertree_uninstall() {
21     unregister_hook('post_local',       'addon/libertree/libertree.php', 'libertree_post_local');
22     unregister_hook('notifier_normal',  'addon/libertree/libertree.php', 'libertree_send');
23     unregister_hook('jot_networks',     'addon/libertree/libertree.php', 'libertree_jot_nets');
24     unregister_hook('connector_settings',      'addon/libertree/libertree.php', 'libertree_settings');
25     unregister_hook('connector_settings_post', 'addon/libertree/libertree.php', 'libertree_settings_post');
26 }
27
28
29 function libertree_jot_nets(&$a,&$b) {
30     if(! local_user())
31         return;
32
33     $ltree_post = PConfig::get(local_user(),'libertree','post');
34     if(intval($ltree_post) == 1) {
35         $ltree_defpost = PConfig::get(local_user(),'libertree','post_by_default');
36         $selected = ((intval($ltree_defpost) == 1) ? ' checked="checked" ' : '');
37         $b .= '<div class="profile-jot-net"><input type="checkbox" name="libertree_enable"' . $selected . ' value="1" /> '
38             . t('Post to libertree') . '</div>';
39     }
40 }
41
42
43 function libertree_settings(&$a,&$s) {
44
45     if(! local_user())
46         return;
47
48     /* Add our stylesheet to the page so we can make our settings look nice */
49
50     $a->page['htmlhead'] .= '<link rel="stylesheet"  type="text/css" href="' . $a->get_baseurl() . '/addon/libertree/libertree.css' . '" media="all" />' . "\r\n";
51
52     /* Get the current state of our config variables */
53
54     $enabled = PConfig::get(local_user(),'libertree','post');
55     $checked = (($enabled) ? ' checked="checked" ' : '');
56     $css = (($enabled) ? '' : '-disabled');
57
58     $def_enabled = PConfig::get(local_user(),'libertree','post_by_default');
59
60     $def_checked = (($def_enabled) ? ' checked="checked" ' : '');
61
62     $ltree_api_token = PConfig::get(local_user(), 'libertree', 'libertree_api_token');
63     $ltree_url = PConfig::get(local_user(), 'libertree', 'libertree_url');
64
65
66     /* Add some HTML to the existing form */
67
68     $s .= '<span id="settings_libertree_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_libertree_expanded\'); openClose(\'settings_libertree_inflated\');">';
69     $s .= '<img class="connector'.$css.'" src="images/libertree.png" /><h3 class="connector">'. t('libertree Export').'</h3>';
70     $s .= '</span>';
71     $s .= '<div id="settings_libertree_expanded" class="settings-block" style="display: none;">';
72     $s .= '<span class="fakelink" onclick="openClose(\'settings_libertree_expanded\'); openClose(\'settings_libertree_inflated\');">';
73     $s .= '<img class="connector'.$css.'" src="images/libertree.png" /><h3 class="connector">'. t('libertree Export').'</h3>';
74     $s .= '</span>';
75
76     $s .= '<div id="libertree-enable-wrapper">';
77     $s .= '<label id="libertree-enable-label" for="libertree-checkbox">' . t('Enable Libertree Post Plugin') . '</label>';
78     $s .= '<input id="libertree-checkbox" type="checkbox" name="libertree" value="1" ' . $checked . '/>';
79     $s .= '</div><div class="clear"></div>';
80
81     $s .= '<div id="libertree-api_token-wrapper">';
82     $s .= '<label id="libertree-api_token-label" for="libertree-api_token">' . t('Libertree API token') . '</label>';
83     $s .= '<input id="libertree-api_token" type="text" name="libertree_api_token" value="' . $ltree_api_token . '" />';
84     $s .= '</div><div class="clear"></div>';
85
86     $s .= '<div id="libertree-url-wrapper">';
87     $s .= '<label id="libertree-url-label" for="libertree-url">' . t('Libertree site URL') . '</label>';
88     $s .= '<input id="libertree-url" type="text" name="libertree_url" value="' . $ltree_url . '" />';
89     $s .= '</div><div class="clear"></div>';
90
91     $s .= '<div id="libertree-bydefault-wrapper">';
92     $s .= '<label id="libertree-bydefault-label" for="libertree-bydefault">' . t('Post to Libertree by default') . '</label>';
93     $s .= '<input id="libertree-bydefault" type="checkbox" name="libertree_bydefault" value="1" ' . $def_checked . '/>';
94     $s .= '</div><div class="clear"></div>';
95
96     /* provide a submit button */
97
98     $s .= '<div class="settings-submit-wrapper" ><input type="submit" id="libertree-submit" name="libertree-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div></div>';
99
100 }
101
102
103 function libertree_settings_post(&$a,&$b) {
104
105         if(x($_POST,'libertree-submit')) {
106
107                 PConfig::set(local_user(),'libertree','post',intval($_POST['libertree']));
108                 PConfig::set(local_user(),'libertree','post_by_default',intval($_POST['libertree_bydefault']));
109                 PConfig::set(local_user(),'libertree','libertree_api_token',trim($_POST['libertree_api_token']));
110                 PConfig::set(local_user(),'libertree','libertree_url',trim($_POST['libertree_url']));
111
112         }
113
114 }
115
116 function libertree_post_local(&$a,&$b) {
117
118         // This can probably be changed to allow editing by pointing to a different API endpoint
119
120         if ($b['edit']) {
121                 return;
122         }
123
124         if ((! local_user()) || (local_user() != $b['uid'])) {
125                 return;
126         }
127
128         if ($b['private'] || $b['parent']) {
129                 return;
130         }
131
132         $ltree_post   = intval(PConfig::get(local_user(),'libertree','post'));
133
134         $ltree_enable = (($ltree_post && x($_REQUEST,'libertree_enable')) ? intval($_REQUEST['libertree_enable']) : 0);
135
136         if ($b['api_source'] && intval(PConfig::get(local_user(),'libertree','post_by_default'))) {
137                 $ltree_enable = 1;
138         }
139
140         if (!$ltree_enable) {
141                 return;
142         }
143
144         if (strlen($b['postopts'])) {
145                 $b['postopts'] .= ',';
146         }
147
148         $b['postopts'] .= 'libertree';
149 }
150
151
152
153
154 function libertree_send(&$a,&$b) {
155
156         logger('libertree_send: invoked');
157
158         if ($b['deleted'] || $b['private'] || ($b['created'] !== $b['edited']))
159                 return;
160
161         if (! strstr($b['postopts'],'libertree'))
162                 return;
163
164         if ($b['parent'] != $b['id'])
165                 return;
166
167         // Dont't post if the post doesn't belong to us.
168         // This is a check for forum postings
169         $self = dba::selectOne('contact', ['id'], ['uid' => $b['uid'], 'self' => true]);
170         if ($b['contact-id'] != $self['id']) {
171                 return;
172         }
173
174         $ltree_api_token = PConfig::get($b['uid'],'libertree','libertree_api_token');
175         $ltree_url = PConfig::get($b['uid'],'libertree','libertree_url');
176         $ltree_blog = "$ltree_url/api/v1/posts/create/?token=$ltree_api_token";
177         $ltree_source = $a->get_hostname();
178
179         if ($b['app'] != "")
180                 $ltree_source .= " (".$b['app'].")";
181
182         if($ltree_url && $ltree_api_token && $ltree_blog && $ltree_source) {
183
184                 require_once('include/bb2diaspora.php');
185                 $tag_arr = array();
186                 $tags = '';
187                 $x = preg_match_all('/\#\[(.*?)\](.*?)\[/',$b['tag'],$matches,PREG_SET_ORDER);
188
189                 if($x) {
190                         foreach($matches as $mtch) {
191                                 $tag_arr[] = $mtch[2];
192                         }
193                 }
194                 if(count($tag_arr))
195                         $tags = implode(',',$tag_arr);
196
197                 $title = $b['title'];
198                 $body = $b['body'];
199                 // Insert a newline before and after a quote
200                 $body = str_ireplace("[quote", "\n\n[quote", $body);
201                 $body = str_ireplace("[/quote]", "[/quote]\n\n", $body);
202
203                 // Removal of tags and mentions
204                 // #-tags
205                 $body = preg_replace('/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '#$2', $body);
206                 // @-mentions
207                 $body = preg_replace('/@\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '@$2', $body);
208
209                 // remove multiple newlines
210                 do {
211                         $oldbody = $body;
212                         $body = str_replace("\n\n\n", "\n\n", $body);
213                 } while ($oldbody != $body);
214
215                 // convert to markdown
216                 $body = bb2diaspora($body, false, false);
217
218                 // Adding the title
219                 if(strlen($title))
220                         $body = "## ".html_entity_decode($title)."\n\n".$body;
221
222
223                 $params = array(
224                         'text' => $body,
225                         'source' => $ltree_source
226                 //      'token' => $ltree_api_token
227                 );
228
229                 $result = post_url($ltree_blog,$params);
230                 logger('libertree: ' . $result);
231
232         }
233 }
234