mirror of
https://codeberg.org/streams/streams.git
synced 2024-09-22 06:15:31 +00:00
Merge branch 'dev' of /home/macgirvin/z into dev
This commit is contained in:
commit
df723ce76a
32 changed files with 10105 additions and 9832 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -21,6 +21,7 @@ Thumbs.db
|
|||
|
||||
## Ignore site specific files and folders
|
||||
.htconfig.php
|
||||
.htstartup.php
|
||||
favicon.*
|
||||
addon/
|
||||
widget/
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<?php /** @file */
|
||||
<?php
|
||||
|
||||
namespace Zotlabs\Daemon;
|
||||
|
||||
|
@ -10,6 +10,8 @@ class Convo {
|
|||
|
||||
static public function run($argc,$argv) {
|
||||
|
||||
logger('convo invoked: ' . print_r($argv,true));
|
||||
|
||||
if($argc != 4) {
|
||||
killme();
|
||||
}
|
||||
|
@ -43,7 +45,9 @@ class Convo {
|
|||
if (is_string($message)) {
|
||||
$message = Activity::fetch($message,$channel);
|
||||
}
|
||||
$AS = new ActivityStreams($message);
|
||||
// set client flag because comments will probably just be objects and not full blown activities
|
||||
// and that lets us use implied_create
|
||||
$AS = new ActivityStreams($message, null, true);
|
||||
if ($AS->is_valid() && is_array($AS->obj)) {
|
||||
$item = Activity::decode_note($AS,true);
|
||||
Activity::store($channel,$contact['abook_xchan'],$AS,$item);
|
||||
|
|
|
@ -153,5 +153,6 @@ class ASCollection {
|
|||
$this->nextpage = false;
|
||||
}
|
||||
}
|
||||
logger('nextpage: ' . $this->nextpage, LOGGER_DEBUG);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ use Zotlabs\Lib\Config;
|
|||
use Zotlabs\Lib\LibBlock;
|
||||
use Zotlabs\Lib\Markdown;
|
||||
use Zotlabs\Lib\Libzotdir;
|
||||
use Zotlabs\Lib\Nodeinfo;
|
||||
use Emoji;
|
||||
|
||||
require_once('include/html2bbcode.php');
|
||||
|
@ -1689,13 +1690,13 @@ class Activity {
|
|||
return;
|
||||
}
|
||||
|
||||
$name = $person_obj['name'];
|
||||
$name = escape_tags($person_obj['name']);
|
||||
if (! $name)
|
||||
$name = $person_obj['preferredUsername'];
|
||||
$name = escape_tags($person_obj['preferredUsername']);
|
||||
if (! $name)
|
||||
$name = t('Unknown');
|
||||
$name = escape_tags( t('Unknown'));
|
||||
|
||||
$username = $person_obj['preferredUsername'];
|
||||
$username = escape_tags($person_obj['preferredUsername']);
|
||||
$h = parse_url($url);
|
||||
if ($h && $h['host']) {
|
||||
$username .= '@' . $h['host'];
|
||||
|
@ -1867,6 +1868,39 @@ class Activity {
|
|||
}
|
||||
}
|
||||
|
||||
$m = parse_url($url);
|
||||
if ($m['scheme'] && $m['host']) {
|
||||
$site_url = $m['scheme'] . '://' . $m['host'];
|
||||
$ni = Nodeinfo::fetch($site_url);
|
||||
if ($ni && is_array($ni)) {
|
||||
$software = ((array_path_exists('software/name',$ni)) ? $ni['software']['name'] : '');
|
||||
$version = ((array_path_exists('software/version',$ni)) ? $ni['software']['version'] : '');
|
||||
|
||||
$r = q("select * from site where site_url = '%s'",
|
||||
dbesc($site_url)
|
||||
);
|
||||
if ($r) {
|
||||
q("update site set site_project = '%s', site_version = '%s' where site_url = '%s'",
|
||||
dbesc($software),
|
||||
dbesc($version),
|
||||
dbesc($site_url)
|
||||
);
|
||||
}
|
||||
else {
|
||||
site_store_lowlevel(
|
||||
[
|
||||
'site_url' => $site_url,
|
||||
'site_update' => datetime_convert(),
|
||||
'site_dead' => 0,
|
||||
'site_type' => SITE_TYPE_NOTZOT,
|
||||
'site_project' => $software,
|
||||
'site_version' => $version
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Libzotdir::import_directory_profile($url,[ 'about' => $about, 'keywords' => $keywords, 'dob' => '0000-00-00' ], null,0,true);
|
||||
|
||||
if ($collections) {
|
||||
|
@ -2893,7 +2927,7 @@ class Activity {
|
|||
|
||||
if ($is_child_node) {
|
||||
|
||||
$parent = q("select parent_mid from item where mid = '%s' and uid = %d limit 1",
|
||||
$parent = q("select * from item where mid = '%s' and uid = %d limit 1",
|
||||
dbesc($item['parent_mid']),
|
||||
intval($item['uid'])
|
||||
);
|
||||
|
@ -2907,7 +2941,7 @@ class Activity {
|
|||
$fetch = (($fetch_parents) ? self::fetch_and_store_parents($channel,$observer_hash,$act,$item) : false);
|
||||
}
|
||||
if ($fetch) {
|
||||
$parent = q("select parent_mid from item where mid = '%s' and uid = %d limit 1",
|
||||
$parent = q("select * from item where mid = '%s' and uid = %d limit 1",
|
||||
dbesc($item['parent_mid']),
|
||||
intval($item['uid'])
|
||||
);
|
||||
|
@ -2948,6 +2982,7 @@ class Activity {
|
|||
}
|
||||
|
||||
if ($fetch_parents && $parent && ! intval($parent[0]['item_private'])) {
|
||||
logger('topfetch', LOGGER_DEBUG);
|
||||
// if the thread owner is a connnection, we will already receive any additional comments to their posts
|
||||
// but if they are not we can try to fetch others in the background
|
||||
$x = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook_xchan = xchan_hash
|
||||
|
@ -2956,12 +2991,17 @@ class Activity {
|
|||
dbesc($parent[0]['owner_xchan'])
|
||||
);
|
||||
if (! $x) {
|
||||
// determine if the top-level post provides a replies collection
|
||||
if ($parent[0]['obj']) {
|
||||
$parent[0]['obj'] = json_decode($parent[0]['obj'],true);
|
||||
}
|
||||
logger('topfetch: ' . print_r($parent[0],true), LOGGER_ALL);
|
||||
$id = ((array_path_exists('obj/replies/id',$parent[0])) ? $parent[0]['obj']['replies']['id'] : false);
|
||||
if (! $id) {
|
||||
$id = ((array_path_exists('obj/replies',$parent[0]) && is_string($parent[0]['obj']['replies'])) ? $parent[0]['obj']['replies'] : false);
|
||||
}
|
||||
if ($id) {
|
||||
Run::Summon( [ 'Convo',$id, $channel['channel_id'], $observer_hash ] );
|
||||
Run::Summon( [ 'Convo', $id, $channel['channel_id'], $observer_hash ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -344,6 +344,7 @@ class Apps {
|
|||
'Photomap' => t('Photomap'),
|
||||
'Events' => t('Events'),
|
||||
'Tasks' => t('Tasks'),
|
||||
'Tagadelic' => t('Tagadelic'),
|
||||
'No Comment' => t('No Comment'),
|
||||
'Directory' => t('Directory'),
|
||||
'Help' => t('Help'),
|
||||
|
|
|
@ -165,7 +165,7 @@ class Libzotdir {
|
|||
'$header' => t('Directory Options'),
|
||||
'$forumsurl' => $forumsurl,
|
||||
'$safemode' => array('safemode', t('Safe Mode'),$safe_mode,'',array(t('No'), t('Yes')),' onchange=\'window.location.href="' . $forumsurl . '&safe="+(this.checked ? 1 : 0)\''),
|
||||
'$pubforums' => array('pubforums', t('Public Groups Only'),(($pubforums == 1) ? true : false),'',array(t('No'), t('Yes')),' onchange=\'window.location.href="' . $forumsurl . '&type="+(this.checked ? 1 : 0)\''),
|
||||
'$pubforums' => array('pubforums', t('Groups Only'),(($pubforums == 1) ? true : false),'',array(t('No'), t('Yes')),' onchange=\'window.location.href="' . $forumsurl . '&type="+(this.checked ? 1 : 0)\''),
|
||||
'$collections' => array('collections', t('Collections Only'),(($pubforums == 2) ? true : false),'',array(t('No'), t('Yes')),' onchange=\'window.location.href="' . $forumsurl . '&type="+(this.checked ? 2 : 0)\''),
|
||||
'$hide_local' => $hide_local,
|
||||
'$globaldir' => array('globaldir', t('This Website Only'), 1-intval($globaldir),'',array(t('No'), t('Yes')),' onchange=\'window.location.href="' . $forumsurl . '&global="+(this.checked ? 0 : 1)\''),
|
||||
|
|
37
Zotlabs/Lib/Nodeinfo.php
Normal file
37
Zotlabs/Lib/Nodeinfo.php
Normal file
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
namespace Zotlabs\Lib;
|
||||
|
||||
|
||||
|
||||
class Nodeinfo {
|
||||
|
||||
static public function fetch($url) {
|
||||
$href = EMPTY_STR;
|
||||
$m = parse_url($url);
|
||||
if ($m['scheme'] && $m['host']) {
|
||||
$s = $m['scheme'] . '://' . $m['host'] . '/.well-known/nodeinfo';
|
||||
$n = z_fetch_url($s);
|
||||
if ($n['success']) {
|
||||
$j = json_decode($n['body'], true);
|
||||
if ($j && $j['links']) {
|
||||
foreach ($j['links'] as $l) {
|
||||
if ($l['rel'] === 'http://nodeinfo.diaspora.software/ns/schema/2.0' && $l['href']) {
|
||||
$href = $l['href'];
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($href) {
|
||||
$n = z_fetch_url($href);
|
||||
if ($n['success']) {
|
||||
return json_decode($n['body'],true);
|
||||
}
|
||||
}
|
||||
return [];
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -166,7 +166,7 @@ class Queue {
|
|||
'site_url' => $base,
|
||||
'site_update' => datetime_convert(),
|
||||
'site_dead' => 0,
|
||||
'site_type' => intval(($outq['outq_driver'] === 'post') ? SITE_TYPE_NOTZOT : SITE_TYPE_UNKNOWN),
|
||||
'site_type' => ((in_array($outq['outq_driver'], [ 'post', 'activitypub' ])) ? SITE_TYPE_NOTZOT : SITE_TYPE_UNKNOWN),
|
||||
'site_crypto' => ''
|
||||
]
|
||||
);
|
||||
|
|
|
@ -56,6 +56,7 @@ class Site {
|
|||
$disable_discover_tab = ((x($_POST,'disable_discover_tab')) ? False : True);
|
||||
$site_firehose = ((x($_POST,'site_firehose')) ? True : False);
|
||||
$open_pubstream = ((x($_POST,'open_pubstream')) ? True : False);
|
||||
$animations = ((x($_POST,'animations')) ? True : False);
|
||||
$login_on_homepage = ((x($_POST,'login_on_homepage')) ? True : False);
|
||||
$enable_context_help = ((x($_POST,'enable_context_help')) ? True : False);
|
||||
$global_directory = ((x($_POST,'directory_submit_url')) ? notags(trim($_POST['directory_submit_url'])) : '');
|
||||
|
@ -116,6 +117,8 @@ class Site {
|
|||
set_config('system', 'pubstream_excl',$pub_excl);
|
||||
set_config('system', 'block_public_directory', $block_public_dir);
|
||||
set_config('system', 'max_imported_follow', $max_imported_follow);
|
||||
set_config('system', 'animated_avatars', $animations);
|
||||
|
||||
|
||||
if ($directory_server) {
|
||||
set_config('system','directory_server',$directory_server);
|
||||
|
@ -315,6 +318,7 @@ class Site {
|
|||
'$site_firehose' => [ 'site_firehose', t('Site only Public stream'), get_config('system','site_firehose'), t('Provide access to public content originating only from this site if Public stream is disabled.') ],
|
||||
'$open_pubstream' => [ 'open_pubstream', t('Allow anybody on the internet to access the Public stream'), get_config('system','open_pubstream',0), t('Default is to only allow viewing by site members. Warning: this content is unmoderated.') ],
|
||||
'$show_like_counts' => [ 'show_like_counts', t('Show numbers of likes and dislikes in conversations'), get_config('system','show_like_counts',1), t('If disabled, the presence of likes and dislikes will be shown, but without totals.') ],
|
||||
'$animations' => [ 'animations', t('Permit animated profile photos'), get_config('system','animated_avatars',true), t('Changing this may take several days to work through the system') ],
|
||||
'$incl' => [ 'pub_incl',t('Only import Public stream posts with this text'), get_config('system','pubstream_incl'),t('words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts') ],
|
||||
'$excl' => [ 'pub_excl',t('Do not import Public stream posts with this text'), get_config('system','pubstream_excl'),t('words one per line or #tags or /patterns/ or lang=xx, leave blank to import all posts') ],
|
||||
'$max_imported_follow' => [ 'max_imported_follow', t('Maximum number of imported friends of friends'), get_config('system','max_imported_follow',10), t('Warning: higher numbers will improve the quality of friend suggestions and directory results but can exponentially increase resource usage') ],
|
||||
|
|
|
@ -1172,11 +1172,19 @@ class Item extends Controller {
|
|||
$obj = $this->extract_bb_poll_data($body,[ 'item_private' => $private, 'allow_cid' => $str_contact_allow, 'allow_gid' => $str_contact_deny ]);
|
||||
}
|
||||
|
||||
$comments_closed = NULL_DATE;
|
||||
|
||||
if ($obj) {
|
||||
$obj['url'] = $mid;
|
||||
$obj['attributedTo'] = channel_url($channel);
|
||||
$datarray['obj'] = $obj;
|
||||
$obj_type = 'Question';
|
||||
if ($obj['endTime']) {
|
||||
$d = datetime_convert('UTC','UTC', $obj['endTime']);
|
||||
if ($d > NULL_DATE) {
|
||||
$comments_closed = $d;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(! $parent_mid) {
|
||||
|
@ -1243,6 +1251,7 @@ class Item extends Controller {
|
|||
$datarray['commented'] = (($orig_post) ? datetime_convert() : $created);
|
||||
$datarray['received'] = (($orig_post) ? datetime_convert() : $created);
|
||||
$datarray['changed'] = (($orig_post) ? datetime_convert() : $created);
|
||||
$datarray['comments_closed'] = $comments_closed;
|
||||
$datarray['mid'] = $mid;
|
||||
$datarray['parent_mid'] = $parent_mid;
|
||||
$datarray['mimetype'] = $mimetype;
|
||||
|
|
|
@ -62,9 +62,28 @@ class Linkinfo extends Controller {
|
|||
killme();
|
||||
}
|
||||
|
||||
if ((substr($url,0,1) != '/') && (substr($url,0,4) != 'http'))
|
||||
$url = 'http://' . $url;
|
||||
$m = parse_url($url);
|
||||
|
||||
if (! $m['scheme']) {
|
||||
if (strpos($url,'@')) {
|
||||
$xc = discover_by_webbie($url);
|
||||
if ($xc) {
|
||||
$x = q("select * from xchan where xchan_hash = '%s'",
|
||||
dbesc($xc)
|
||||
);
|
||||
if ($x) {
|
||||
$url = $x[0]['xchan_url'];
|
||||
}
|
||||
}
|
||||
else {
|
||||
echo $br . '[url=mailto:' . $url . ']' . $url . '[/url]' . $br;
|
||||
killme();
|
||||
}
|
||||
}
|
||||
else {
|
||||
$url = 'http://' . $url;
|
||||
}
|
||||
}
|
||||
|
||||
if ($_GET['title'])
|
||||
$title = strip_tags(trim($_GET['title']));
|
||||
|
|
|
@ -120,20 +120,22 @@ class Profile_photo extends Controller {
|
|||
'edited' => $base_image['edited']
|
||||
];
|
||||
|
||||
$animated = get_config('system','animated_avatars',true);
|
||||
|
||||
$p['imgscale'] = PHOTO_RES_PROFILE_300;
|
||||
$p['photo_usage'] = (($is_default_profile) ? PHOTO_PROFILE : PHOTO_NORMAL);
|
||||
|
||||
$r1 = $im->storeThumbnail($p, PHOTO_RES_PROFILE_300);
|
||||
$r1 = $im->storeThumbnail($p, PHOTO_RES_PROFILE_300, $animated);
|
||||
|
||||
$im->scaleImage(80);
|
||||
$p['imgscale'] = PHOTO_RES_PROFILE_80;
|
||||
|
||||
$r2 = $im->storeThumbnail($p, PHOTO_RES_PROFILE_80);
|
||||
$r2 = $im->storeThumbnail($p, PHOTO_RES_PROFILE_80, $animated);
|
||||
|
||||
$im->scaleImage(48);
|
||||
$p['imgscale'] = PHOTO_RES_PROFILE_48;
|
||||
|
||||
$r3 = $im->storeThumbnail($p, PHOTO_RES_PROFILE_48);
|
||||
$r3 = $im->storeThumbnail($p, PHOTO_RES_PROFILE_48, $animated);
|
||||
|
||||
if ($r1 === false || $r2 === false || $r3 === false) {
|
||||
// if one failed, delete them all so we can start over.
|
||||
|
|
|
@ -674,7 +674,7 @@ class Channel {
|
|||
'$vnotify14' => array('vnotify14', t('Unseen likes and dislikes'), ($vnotify & VNOTIFY_LIKE), VNOTIFY_LIKE, '', $yes_no),
|
||||
'$vnotify15' => array('vnotify15', t('Unseen forum posts'), ($vnotify & VNOTIFY_FORUMS), VNOTIFY_FORUMS, '', $yes_no),
|
||||
'$vnotify16' => ((is_site_admin()) ? array('vnotify16', t('Reported content'), ($vnotify & VNOTIFY_REPORTS), VNOTIFY_REPORTS, '', $yes_no) : [] ),
|
||||
'$mailhost' => [ 'mailhost', t('Email notification hub (hostname)'), get_pconfig(local_channel(),'system','email_notify_host',App::get_hostname()), sprintf( t('If your channel is mirrored to multiple locations, set this to your preferred location. This will prevent duplicate email notifications. Example: %s'),App::get_hostname()) ],
|
||||
'$mailhost' => [ 'mailhost', t('Email notifications sent from (hostname)'), get_pconfig(local_channel(),'system','email_notify_host',App::get_hostname()), sprintf( t('If your channel is mirrored to multiple locations, set this to your preferred location. This will prevent duplicate email notifications. Example: %s'),App::get_hostname()) ],
|
||||
'$always_show_in_notices' => array('always_show_in_notices', t('Show new wall posts, private messages and connections under Notices'), $always_show_in_notices, 1, '', $yes_no),
|
||||
'$permit_all_mentions' => [ 'permit_all_mentions', t('Accept messages from strangers which mention me'), get_pconfig(local_channel(),'system','permit_all_mentions'), t('This setting bypasses normal permissions'), $yes_no ],
|
||||
'$followed_tags' => [ 'followed_tags', t('Accept messages from strangers which include any of the following hashtags'), $followed, t('comma separated, do not include the #') ],
|
||||
|
|
48
Zotlabs/Module/Tagadelic.php
Normal file
48
Zotlabs/Module/Tagadelic.php
Normal file
|
@ -0,0 +1,48 @@
|
|||
<?php
|
||||
|
||||
namespace Zotlabs\Module;
|
||||
|
||||
use App;
|
||||
use Zotlabs\Lib\Apps;
|
||||
use Zotlabs\Lib\Libsync;
|
||||
use Zotlabs\Lib\Libprofile;
|
||||
use Zotlabs\Web\Controller;
|
||||
use Zotlabs\Render\Comanche;
|
||||
|
||||
class Tagadelic extends Controller {
|
||||
|
||||
function init() {
|
||||
|
||||
if(local_channel()) {
|
||||
$channel = App::get_channel();
|
||||
if($channel && $channel['channel_address']) {
|
||||
$which = $channel['channel_address'];
|
||||
}
|
||||
Libprofile::load($which,0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
function get() {
|
||||
|
||||
$desc = t('This app displays a hashtag cloud on your channel homepage.');
|
||||
|
||||
$text = '<div class="section-content-info-wrapper">' . $desc . '</div>';
|
||||
|
||||
if(! ( local_channel() && Apps::system_app_installed(local_channel(),'Tagadelic'))) {
|
||||
return $text;
|
||||
}
|
||||
|
||||
$desc = t('This app is installed. It displays a hashtag cloud on your channel homepage.');
|
||||
|
||||
$text = '<div class="section-content-info-wrapper">' . $desc . '</div>';
|
||||
|
||||
|
||||
$c = new Comanche;
|
||||
return $text . EOL . EOL . $c->widget('tagcloud_wall',EMPTY_STR);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -11,30 +11,30 @@ class Zot_probe extends \Zotlabs\Web\Controller {
|
|||
|
||||
function get() {
|
||||
|
||||
$o .= '<h3>Zot6 Probe Diagnostic</h3>';
|
||||
$o = replace_macros(get_markup_template('zot_probe.tpl'), [
|
||||
'$page_title' => t('Zot6 Probe Diagnostic'),
|
||||
'$resource' => [ 'resource', t('Object URL') , $_REQUEST['resource'], EMPTY_STR ],
|
||||
'$authf' => [ 'authf', t('Authenticated fetch'), $_REQUEST['authf'], EMPTY_STR, [ t('No'), t('Yes') ] ],
|
||||
'$submit' => t('Submit')
|
||||
]);
|
||||
|
||||
$o .= '<form action="zot_probe" method="get">';
|
||||
$o .= 'Lookup URI: <input type="text" style="width: 250px;" name="addr" value="' . $_GET['addr'] .'" /><br>';
|
||||
$o .= '<input type="submit" name="submit" value="Submit" /></form>';
|
||||
|
||||
$o .= '<br><br>';
|
||||
if(x($_GET,'resource')) {
|
||||
$resource = $_GET['resource'];
|
||||
$channel = (($_GET['authf']) ? \App::get_channel() : null);
|
||||
|
||||
if(x($_GET,'addr')) {
|
||||
$addr = $_GET['addr'];
|
||||
$channel = (($_GET['auth']) ? \App::get_channel() : null);
|
||||
|
||||
if(strpos($addr,'x-zot:') === 0) {
|
||||
$x = ZotURL::fetch($addr,$channel);
|
||||
if(strpos($resource,'x-zot:') === 0) {
|
||||
$x = ZotURL::fetch($resource,$channel);
|
||||
}
|
||||
else {
|
||||
$x = Zotfinger::exec($addr,$channel);
|
||||
$x = Zotfinger::exec($resource,$channel);
|
||||
|
||||
$o .= '<pre>' . htmlspecialchars(print_array($x)) . '</pre>';
|
||||
|
||||
$headers = 'Accept: application/x-zot+json, application/jrd+json, application/json';
|
||||
|
||||
$redirects = 0;
|
||||
$x = z_fetch_url($addr,true,$redirects, [ 'headers' => [ $headers ]]);
|
||||
$x = z_fetch_url($resource,true,$redirects, [ 'headers' => [ $headers ]]);
|
||||
}
|
||||
|
||||
if($x['success']) {
|
||||
|
|
|
@ -103,7 +103,7 @@ abstract class PhotoDriver {
|
|||
*
|
||||
* @return string A Binary String.
|
||||
*/
|
||||
abstract public function imageString();
|
||||
abstract public function imageString($animations = true);
|
||||
|
||||
abstract public function clearexif();
|
||||
|
||||
|
@ -169,11 +169,11 @@ abstract class PhotoDriver {
|
|||
* @param string $path Path and filename where to save the image
|
||||
* @return boolean False on failure, otherwise true
|
||||
*/
|
||||
public function saveImage($path) {
|
||||
public function saveImage($path, $animated = true) {
|
||||
if (! $this->is_valid()) {
|
||||
return false;
|
||||
}
|
||||
return (file_put_contents($path, $this->imageString()) ? true : false);
|
||||
return (file_put_contents($path, $this->imageString($animated)) ? true : false);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -522,7 +522,7 @@ abstract class PhotoDriver {
|
|||
* @return boolean|array
|
||||
*/
|
||||
|
||||
public function storeThumbnail($arr, $scale = 0) {
|
||||
public function storeThumbnail($arr, $scale = 0, $animated = true) {
|
||||
|
||||
$arr['imgscale'] = $scale;
|
||||
|
||||
|
@ -530,7 +530,7 @@ abstract class PhotoDriver {
|
|||
$channel = channelx_by_n($arr['uid']);
|
||||
$arr['os_storage'] = 1;
|
||||
$arr['os_syspath'] = 'store/' . $channel['channel_address'] . '/' . $arr['os_path'] . '-' . $scale;
|
||||
if (! $this->saveImage($arr['os_syspath'])) {
|
||||
if (! $this->saveImage($arr['os_syspath'], $animated)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -157,7 +157,7 @@ class PhotoGd extends PhotoDriver {
|
|||
* {@inheritDoc}
|
||||
* @see \Zotlabs\Photo\PhotoDriver::imageString()
|
||||
*/
|
||||
public function imageString() {
|
||||
public function imageString($animated = true) {
|
||||
if (! $this->is_valid()) {
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -201,14 +201,17 @@ class PhotoImagick extends PhotoDriver {
|
|||
$this->doScaleImage($maxx, $maxy);
|
||||
}
|
||||
|
||||
public function imageString() {
|
||||
public function imageString($animated = true) {
|
||||
if (! $this->is_valid()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Clean it */
|
||||
$this->image = $this->image->deconstructImages();
|
||||
if ($animated) {
|
||||
return $this->image->getImagesBlob();
|
||||
}
|
||||
return $this->image->getImageBlob();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -2,18 +2,20 @@
|
|||
|
||||
namespace Zotlabs\Widget;
|
||||
|
||||
use App;
|
||||
|
||||
class Catcloud_wall {
|
||||
|
||||
function widget($arr) {
|
||||
|
||||
if((! \App::$profile['profile_uid']) || (! \App::$profile['channel_hash']))
|
||||
if((! App::$profile['profile_uid']) || (! App::$profile['channel_hash']))
|
||||
return '';
|
||||
if(! perm_is_allowed(\App::$profile['profile_uid'], get_observer_hash(), 'view_stream'))
|
||||
if(! perm_is_allowed(App::$profile['profile_uid'], get_observer_hash(), 'view_stream'))
|
||||
return '';
|
||||
|
||||
$limit = ((array_key_exists('limit',$arr)) ? intval($arr['limit']) : 50);
|
||||
|
||||
return catblock(\App::$profile['profile_uid'], $limit, '', \App::$profile['channel_hash'], 'wall');
|
||||
return catblock(App::$profile['profile_uid'], $limit, '', App::$profile['channel_hash'], 'wall');
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ class Site_projects {
|
|||
|
||||
|
||||
|
||||
$r = q("select site_project, count(site_project) as total from site where site_project != '' and site_flags != 256 and site_dead = 0 group by site_project order by site_project desc");
|
||||
$r = q("select site_project, count(site_project) as total from site where site_project != '' and site_flags != 256 and site_dead = 0 and site_type = 0 group by site_project order by site_project desc");
|
||||
|
||||
$results = [];
|
||||
|
||||
|
|
|
@ -2,18 +2,21 @@
|
|||
|
||||
namespace Zotlabs\Widget;
|
||||
|
||||
use App;
|
||||
use Zotlabs\Lib\Apps;
|
||||
|
||||
class Tagcloud_wall {
|
||||
|
||||
function widget($arr) {
|
||||
|
||||
if((! \App::$profile['profile_uid']) || (! \App::$profile['channel_hash']))
|
||||
if((! App::$profile['profile_uid']) || (! App::$profile['channel_hash']))
|
||||
return '';
|
||||
if(! perm_is_allowed(\App::$profile['profile_uid'], get_observer_hash(), 'view_stream'))
|
||||
return '';
|
||||
|
||||
$limit = ((array_key_exists('limit', $arr)) ? intval($arr['limit']) : 50);
|
||||
if(feature_enabled(\App::$profile['profile_uid'], 'tagadelic'))
|
||||
return wtagblock(\App::$profile['profile_uid'], $limit, '', \App::$profile['channel_hash'], 'wall');
|
||||
if(Apps::system_app_installed(App::$profile['profile_uid'], 'Tagadelic'))
|
||||
return wtagblock(App::$profile['profile_uid'], $limit, '', App::$profile['channel_hash'], 'wall');
|
||||
|
||||
return '';
|
||||
}
|
||||
|
|
6
app/tagadelic.apd
Normal file
6
app/tagadelic.apd
Normal file
|
@ -0,0 +1,6 @@
|
|||
version: 1
|
||||
url: $baseurl/tagadelic
|
||||
requires: local_channel
|
||||
name: Tagadelic
|
||||
photo: icon:tags
|
||||
categories: Networking
|
2
boot.php
2
boot.php
|
@ -16,7 +16,7 @@ use Zotlabs\Daemon\Run;
|
|||
* @brief This file defines some global constants and includes the central App class.
|
||||
*/
|
||||
|
||||
define ( 'STD_VERSION', '20.10.19' );
|
||||
define ( 'STD_VERSION', '20.10.26' );
|
||||
define ( 'ZOT_REVISION', '6.0' );
|
||||
|
||||
define ( 'DB_UPDATE_VERSION', 1243 );
|
||||
|
|
|
@ -1024,7 +1024,7 @@ function md_codeblock($content) {
|
|||
// Build one block so that we not create each paragraph.
|
||||
$content = str_replace("\n", '<br>', $content[4]);
|
||||
|
||||
return sprintf('<pre><code%s>%s</code></pre>', $class, $content);
|
||||
return sprintf('<pre><code%s>%s</code></pre>', $class, bb_code_protect($content));
|
||||
}
|
||||
|
||||
function md_italic($content) {
|
||||
|
@ -1302,7 +1302,6 @@ function bbcode($Text, $options = []) {
|
|||
$Text = preg_replace('#(?<!\\\)([*_]{2})([^\n]+?)\1#','<strong>$2</strong>',$Text);
|
||||
// The character check is so we don't mistake underscore in the middle of a code variable as an italic trigger.
|
||||
$Text = preg_replace_callback('#(^| )(?<!\\\)([*_])([^\n|`]+?)\2#m','md_italic',$Text);
|
||||
// $Text = preg_replace('#(?<!\\\)([*_])([^\n|`]+?)\1#','<em>$2</em>',$Text);
|
||||
$Text = preg_replace_callback('{ ^(.+?)[ ]*\n(=+|-+)[ ]*\n+ }mx','md_topheader', $Text);
|
||||
$Text = preg_replace_callback('#^(\#{1,6})\s+([^\#]+?)\s*\#*$#m','md_header', $Text);
|
||||
$Text = preg_replace_callback('#(^|\n)([`~]{3,})(?: *\.?([a-zA-Z0-9\-.]+))?\n+([\s\S]+?)\n+\2(\n|$)#','md_codeblock',$Text);
|
||||
|
|
|
@ -240,10 +240,17 @@ function relative_date($posted_date, $format = null) {
|
|||
return t('never');
|
||||
}
|
||||
|
||||
if ($abs > time()) {
|
||||
$direction = t('from now');
|
||||
$etime = $abs - time();
|
||||
}
|
||||
else {
|
||||
$direction = t('ago');
|
||||
$etime = time() - $abs;
|
||||
}
|
||||
|
||||
if ($etime < 1) {
|
||||
return t('less than a second ago');
|
||||
return sprintf( t('less than a second %s'), $direction);
|
||||
}
|
||||
|
||||
$a = array( 12 * 30 * 24 * 60 * 60 => 'y',
|
||||
|
@ -261,9 +268,9 @@ function relative_date($posted_date, $format = null) {
|
|||
if ($d >= 1) {
|
||||
$r = round($d);
|
||||
if (! $format)
|
||||
$format = t('%1$d %2$s ago', 'e.g. 22 hours ago, 1 minute ago');
|
||||
$format = t('%1$d %2$s %3$s', 'e.g. 22 hours ago, 1 minute ago');
|
||||
|
||||
return sprintf($format, $r, plural_dates($str,$r));
|
||||
return sprintf($format, $r, plural_dates($str,$r), $direction);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2991,6 +2991,12 @@ function start_delivery_chain($channel, $item, $item_id, $parent, $group = false
|
|||
if($post_id) {
|
||||
Run::Summon([ 'Notifier','tgroup',$post_id ]);
|
||||
}
|
||||
|
||||
q("update channel set channel_lastpost = '%s' where channel_id = %d",
|
||||
dbesc(datetime_convert()),
|
||||
intval($channel['channel_id'])
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -346,6 +346,8 @@ function import_remote_xchan_photo($photo, $xchan, $thing = false) {
|
|||
$hash = basename($path);
|
||||
|
||||
|
||||
$animated = get_config('system','animated_avatars',true);
|
||||
|
||||
$modified = ((file_exists($outfile)) ? @filemtime($outfile) : 0);
|
||||
|
||||
// Maybe it's already a cached xchan photo
|
||||
|
@ -415,7 +417,7 @@ function import_remote_xchan_photo($photo, $xchan, $thing = false) {
|
|||
|
||||
$savepath = $path . '-' . $p['imgscale'] . (($thing) ? '.obj' : EMPTY_STR);
|
||||
$photo = z_root() . '/xp/' . $hash . '-' . $p['imgscale'] . (($thing) ? '.obj' : EMPTY_STR);
|
||||
$r = $img->saveImage($savepath);
|
||||
$r = $img->saveImage($savepath,$animated);
|
||||
if ($r === false) {
|
||||
$failed = true;
|
||||
}
|
||||
|
@ -423,7 +425,7 @@ function import_remote_xchan_photo($photo, $xchan, $thing = false) {
|
|||
$p['imgscale'] = 5;
|
||||
$savepath = $path . '-' . $p['imgscale'] . (($thing) ? '.obj' : EMPTY_STR);
|
||||
$thumb = z_root() . '/xp/' . $hash . '-' . $p['imgscale'] . (($thing) ? '.obj' : EMPTY_STR);
|
||||
$r = $img->saveImage($savepath);
|
||||
$r = $img->saveImage($savepath,$animated);
|
||||
if ($r === false) {
|
||||
$failed = true;
|
||||
}
|
||||
|
@ -431,7 +433,7 @@ function import_remote_xchan_photo($photo, $xchan, $thing = false) {
|
|||
$p['imgscale'] = 6;
|
||||
$savepath = $path . '-' . $p['imgscale'] . (($thing) ? '.obj' : EMPTY_STR);
|
||||
$micro = z_root() . '/xp/' . $hash . '-' . $p['imgscale'] . (($thing) ? '.obj' : EMPTY_STR);
|
||||
$r = $img->saveImage($savepath);
|
||||
$r = $img->saveImage($savepath,$animated);
|
||||
if ($r === false) {
|
||||
$failed = true;
|
||||
}
|
||||
|
|
|
@ -1617,7 +1617,8 @@ function prepare_body(&$item,$attach = false,$opts = false) {
|
|||
}
|
||||
else {
|
||||
if($item['summary']) {
|
||||
$s .= prepare_text('[summary]' . $item['summary'] . '[/summary]' . $item['body'],$item['mimetype'],$opts);
|
||||
// 8203 is a zero-width space so as not to trigger a markdown link if the summary starts with parentheses
|
||||
$s .= prepare_text('[summary]​' . $item['summary'] . '[/summary]' . $item['body'],$item['mimetype'],$opts);
|
||||
}
|
||||
else {
|
||||
if ($item['html']) {
|
||||
|
@ -1781,7 +1782,7 @@ function format_poll($item,$s,$opts) {
|
|||
$output .= '<input type="checkbox" name="answer[]" value="' . htmlspecialchars($text) . '"> ' . $text . '</input>' . ' (' . $total . ')' . EOL;
|
||||
}
|
||||
else {
|
||||
$output .= '[ ] ' . $text . ' (' . $total . ')' . EOL;
|
||||
$output .= $text . ' (' . $total . ')' . EOL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1806,7 +1807,7 @@ function format_poll($item,$s,$opts) {
|
|||
$output .= '<input type="radio" name="answer" value="' . htmlspecialchars($text) . '"> ' . $text . '</input>' . ' (' . $total . ')' . (($totalResponses) ? ' ' . intval($total / $totalResponses * 100) . '%' : '') . EOL;
|
||||
}
|
||||
else {
|
||||
$output .= '( ) ' . $text . ' (' . $total . ')' . (($totalResponses) ? ' ' . intval($total / $totalResponses * 100) . '%' : '') . EOL;
|
||||
$output .= $text . ' (' . $total . ')' . (($totalResponses) ? ' ' . intval($total / $totalResponses * 100) . '%' : '') . EOL;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1816,7 +1817,7 @@ function format_poll($item,$s,$opts) {
|
|||
$message = t('Poll has ended.');
|
||||
}
|
||||
elseif ($closing) {
|
||||
$message = sprintf(t('Poll ends: %s'),$t);
|
||||
$message = sprintf(t('Poll ends: %1$s (%2$s)'),relative_date($t),$t);
|
||||
}
|
||||
$output .= EOL . '<div>' . $message . '</div>';
|
||||
|
||||
|
|
19599
util/messages.po
19599
util/messages.po
File diff suppressed because it is too large
Load diff
|
@ -5,7 +5,7 @@
|
|||
[widget=fullprofile][/widget]
|
||||
[widget=common_friends][/widget]
|
||||
[widget=archive][var=wall]1[/var][/widget]
|
||||
[widget=categories][/widget]
|
||||
[widget=catcloud_wall][/widget]
|
||||
[widget=tagcloud_wall][var=limit]24[/var][/widget]
|
||||
[/region]
|
||||
[region=right_aside]
|
||||
|
|
|
@ -110,6 +110,7 @@
|
|||
{{include file="field_checkbox.tpl" field=$verify_email}}
|
||||
{{include file="field_checkbox.tpl" field=$show_like_counts}}
|
||||
{{include file="field_checkbox.tpl" field=$ap_contacts}}
|
||||
{{include file="field_checkbox.tpl" field=$animations}}
|
||||
{{include file="field_checkbox.tpl" field=$block_public_dir}}
|
||||
{{include file="field_checkbox.tpl" field=$force_publish}}
|
||||
{{include file="field_checkbox.tpl" field=$disable_discover_tab}}
|
||||
|
|
10
view/tpl/zot_probe.tpl
Normal file
10
view/tpl/zot_probe.tpl
Normal file
|
@ -0,0 +1,10 @@
|
|||
<h3>{{$page_title}}</h3>
|
||||
|
||||
<form action="zot_probe" method="get">
|
||||
{{include file="field_input.tpl" field=$resource}}
|
||||
{{include file="field_checkbox.tpl" field=$authf}}
|
||||
<input type="submit" name="submit" value="{{$submit}}" >
|
||||
</form>
|
||||
<br>
|
||||
<br>
|
||||
|
Loading…
Reference in a new issue