diff options
-rwxr-xr-x | boot.php | 2 | ||||
-rw-r--r-- | doc/To-Do-Code.md | 4 | ||||
-rw-r--r-- | include/bbcode.php | 8 | ||||
-rw-r--r-- | include/chat.php | 148 | ||||
-rw-r--r-- | include/identity.php | 50 | ||||
-rwxr-xr-x | include/text.php | 2 | ||||
-rw-r--r-- | include/widgets.php | 9 | ||||
-rw-r--r-- | install/database.sql | 1 | ||||
-rwxr-xr-x | install/htconfig.sample.php | 2 | ||||
-rw-r--r-- | install/update.php | 8 | ||||
-rw-r--r-- | mod/dirprofile.php | 4 | ||||
-rw-r--r-- | mod/online.php | 11 | ||||
-rw-r--r-- | mod/ping.php | 29 | ||||
-rw-r--r-- | mod/settings.php | 7 | ||||
-rw-r--r-- | version.inc | 2 | ||||
-rw-r--r-- | view/js/icon_translate.js | 1 | ||||
-rw-r--r-- | view/theme/redbasic/css/style.css | 4 | ||||
-rw-r--r-- | view/tpl/chatroomlist.tpl | 11 | ||||
-rwxr-xr-x | view/tpl/direntry_large.tpl | 2 | ||||
-rwxr-xr-x | view/tpl/profile_vcard.tpl | 2 | ||||
-rwxr-xr-x | view/tpl/settings.tpl | 3 |
21 files changed, 293 insertions, 17 deletions
@@ -46,7 +46,7 @@ define ( 'RED_PLATFORM', 'Red Matrix' ); define ( 'RED_VERSION', trim(file_get_contents('version.inc')) . 'R'); define ( 'ZOT_REVISION', 1 ); -define ( 'DB_UPDATE_VERSION', 1093 ); +define ( 'DB_UPDATE_VERSION', 1094 ); define ( 'EOL', '<br />' . "\r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); diff --git a/doc/To-Do-Code.md b/doc/To-Do-Code.md index 3baf08d40..5804801b4 100644 --- a/doc/To-Do-Code.md +++ b/doc/To-Do-Code.md @@ -17,7 +17,7 @@ We need much more than this, but here are areas where developers can help. Pleas * (Advanced) create a UI for building Comanche pages -* Help with WebDAV and file storage implementation, especially replacing the fugly Sabre web UI. +* templatise and translate the Web interface to webDAV * Extend WebDAV to provide desktop access to photo albums @@ -25,7 +25,7 @@ We need much more than this, but here are areas where developers can help. Pleas * service classes - account overview page showing resources consumed by channel. With special consideration this page can also be accessed at a meta level by the site admin to drill down on problematic accounts/channels. -* Events module - bring back birthday reminders for friends, fix permissions on events, and provide JS translation support for the calendar overview +* Events module - bring back birthday reminders for friends, fix permissions on events, and provide JS translation support for the calendar overview; integrate with calDAV * Events module - event followups and RSVP diff --git a/include/bbcode.php b/include/bbcode.php index 084c02125..fec8750e9 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -442,14 +442,6 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) { // Check for list text $Text = str_replace("[*]", "<li>", $Text); - // Check for style sheet commands - if (strpos($Text,'[/style]') !== false) { - $Text = preg_replace("(\[style=(.*?)\](.*?)\[\/style\])ism","<span style=\"$1;\">$2</span>",$Text); - } - // Check for CSS classes - if (strpos($Text,'[/class]') !== false) { - $Text = preg_replace("(\[class=(.*?)\](.*?)\[\/class\])ism","<span class=\"$1\">$2</span>",$Text); - } // handle nested lists $endlessloop = 0; diff --git a/include/chat.php b/include/chat.php new file mode 100644 index 000000000..6bcb003ff --- /dev/null +++ b/include/chat.php @@ -0,0 +1,148 @@ +<?php /** @file */ + + +function chatroom_create($channel,$arr) { + + $ret = array('success' => false); + + $name = trim($arr['name']); + if(! $name) { + $ret['message'] = t('Missing room name'); + return $ret; + } + + $r = q("select cr_id from chatroom where cr_uid = %d and cr_name = '%s' limit 1", + intval($channel['channel_id']), + dbesc($name) + ); + if($r) { + $ret['message'] = t('Duplicate room name'); + return $ret; + } + + $created = datetime_convert(); + + $x = q("insert into chatroom ( cr_aid, cr_uid, cr_name, cr_created, cr_edited, allow_cid, allow_gid, deny_cid, deny_gid ) + values ( %d, %d , '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ", + intval($channel['channel_account_id']), + intval($channel['channel_id']), + dbesc($name), + dbesc($created), + dbesc($created), + dbesc($arr['allow_cid']), + dbesc($arr['allow_gid']), + dbesc($arr['deny_cid']), + dbesc($arr['deny_gid']) + ); + + if($x) + $ret['success'] = true; + + return $ret; +} + + +function chatroom_destroy($channel,$arr) { + + $ret = array('success' => false); + if(intval($arr['cr_id'])) + $sql_extra = " and cr_id = " . intval($arr['cr_id']) . " "; + elseif(trim($arr['cr_name'])) + $sql_extra = " and cr_name = '" . protect_sprintf(dbesc(trim($arr['cr_name']))) . "' "; + else { + $ret['message'] = t('Invalid room specifier.'); + return $ret; + } + + $r = q("select * from chatroom where cr_uid = %d $sql_extra limit 1", + intval($channel['channel_id']) + ); + if(! $r) { + $ret['message'] = t('Invalid room specifier.'); + return $ret; + } + + q("delete from chatroom where cr_id = %d limit 1", + intval($r[0]['cr_id']) + ); + if($r[0]['cr_id']) { + q("delete from chatpresence where cp_room = %d", + intval($r[0]['cr_id']) + ); + } + $ret['success'] = true; + return $ret; +} + + +function chatroom_enter($observer_xchan,$room_id,$status,$client) { + + if(! $room_id || ! $observer_xchan) + return; + + $r = q("select * from chatroom where cr_id = %d limit 1", + intval($room_id) + ); + if(! $r) + return; + require_once('include/security.php'); + $sql_extra = permissions_sql($r[0]['cr_uid']); + + $x = q("select * from chatroom where cr_id = %d and uid = %d $sql_extra limit 1", + intval($room_id) + intval($r[0]['cr_uid']) + ); + if(! $x) { + notice( t('Permission denied.') . EOL); + return; + } + + $r = q("select * from chatpresence where cp_xchan = '%s' and cp_room = %d limit 1", + dbesc($observer_xchan), + intval($room_id) + ); + if($r) { + q("update chatpresence set cp_status = %d and cp_last = '%s' where cp_id = %d limit 1", + dbesc($status), + dbesc(datetime_convert()), + intval($r[0]['cp_id']) + ); + return true; + } + + $r = q("insert into chatpresence ( cp_room, cp_xchan, cp_last, cp_status, cp_client ) + values ( %d, '%s', '%s', '%s', '%s' )", + intval($room_id), + dbesc($observer_xchan), + dbesc(datetime_convert()), + dbesc($status), + dbesc($client) + ); + return $r; +} + + +function chatroom_leave($observer_xchan,$room_id,$status) { + if(! $room_id || ! $observer_xchan) + return; + $r = q("select * from chatpresence where cp_xchan = '%s' and cp_room = %d limit 1", + dbesc($observer_xchan), + intval($room_id) + ); + if($r) { + q("delete from chatpresence where cp_id = %d limit 1", + intval($r[0]['cp_id']) + ); + } + return true; +} + + +function chatroom_list($uid) { + + $r = q("select cr_name, cr_id, count(cp_id) as cr_inroom from chatroom left join chatpresence on cr_id = cp_room where cr_uid = %d group by cp_id order by cr_name", + intval($uid) + ); + + return $r; +}
\ No newline at end of file diff --git a/include/identity.php b/include/identity.php index a99474d42..2db5d8ece 100644 --- a/include/identity.php +++ b/include/identity.php @@ -544,6 +544,9 @@ function profile_load(&$a, $nickname, $profile = '') { } $a->profile = $r[0]; + $online = get_online_status($nickname); + $a->profile['online_status'] = $online['result']; + $a->profile_uid = $r[0]['profile_uid']; $a->page['title'] = $a->profile['channel_name'] . " - " . $a->profile['channel_address'] . "@" . $a->get_hostname(); @@ -678,13 +681,15 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) { $gender = ((x($profile,'gender') == 1) ? t('Gender:') : False); $marital = ((x($profile,'marital') == 1) ? t('Status:') : False); $homepage = ((x($profile,'homepage') == 1) ? t('Homepage:') : False); + $profile['online'] = (($profile['online_status'] === 'online') ? t('Online Now') : False); +logger('online: ' . $profile['online']); if(! perm_is_allowed($profile['uid'],((is_array($observer)) ? $observer['xchan_hash'] : ''),'view_profile')) { $block = true; } if(($profile['hidewall'] || $block) && (! local_user()) && (! remote_user())) { - $location = $pdesc = $gender = $marital = $homepage = False; + $location = $pdesc = $gender = $marital = $homepage = $online = False; } $firstname = ((strpos($profile['name'],' ')) @@ -1144,3 +1149,46 @@ function is_foreigner($s) { function is_member($s) { return((is_foreigner($s)) ? false : true); } + +function get_online_status($nick) { + + $ret = array('result' => false); + + $r = q("select channel_id, channel_hash from channel where channel_address = '%s' limit 1", + dbesc(argv(1)) + ); + if($r) { + $hide = get_pconfig($r[0]['channel_id'],'system','hide_online_status'); + if($hide) + return $ret; + $x = q("select cp_status from chatpresence where cp_xchan = '%s' and cp_room = 0 limit 1", + dbesc($r[0]['channel_hash']) + ); + if($x) + $ret['result'] = $x[0]['cp_status']; + } + + return $ret; +} + + +function remote_online_status($webbie) { + + $result = false; + $r = q("select * from hubloc where hubloc_addr = '%s' limit 1", + dbesc($webbie) + ); + if(! $r) + return $result; + + $url = $r[0]['hubloc_url'] . '/online/' . substr($webbie,0,strpos($webbie,'@')); + + $x = z_fetch_url($url); + if($x['success']) { + $j = json_decode($x['body'],true); + if($j) + $result = (($j['result']) ? $j['result'] : false); + } + return $result; + +} diff --git a/include/text.php b/include/text.php index f5c440e4a..a459296cb 100755 --- a/include/text.php +++ b/include/text.php @@ -891,6 +891,7 @@ function smilies($s, $sample = false) { $s = preg_replace_callback('/<pre>(.*?)<\/pre>/ism','smile_encode',$s); $s = preg_replace_callback('/<code>(.*?)<\/code>/ism','smile_encode',$s); +// $s = preg_replace_callback('/<(.*?)>/ism','smile_encode',$s); $texts = array( '<3', @@ -983,6 +984,7 @@ function smilies($s, $sample = false) { $s = preg_replace_callback('/<pre>(.*?)<\/pre>/ism','smile_decode',$s); $s = preg_replace_callback('/<code>(.*?)<\/code>/ism','smile_decode',$s); +// $s = preg_replace_callback('/<(.*?)>/s','smile_decode',$s); return $s; diff --git a/include/widgets.php b/include/widgets.php index efa350785..8b22515b1 100644 --- a/include/widgets.php +++ b/include/widgets.php @@ -576,3 +576,12 @@ function widget_menu_preview($arr) { require_once('include/menu.php'); return menu_render(get_app()->data['menu_item']); } + +function widget_chatroom_list($arr) { + require_once("include/chat.php"); + $r = chatroom_list(local_user()); + return replace_macros(get_markup_template('chatroomlist.tpl'),array( + '$header' => t('Chat Rooms'), + '$items' => $r, + )); +}
\ No newline at end of file diff --git a/install/database.sql b/install/database.sql index 1c87b725b..dba03da65 100644 --- a/install/database.sql +++ b/install/database.sql @@ -232,6 +232,7 @@ CREATE TABLE IF NOT EXISTS `chatpresence` ( `cp_xchan` char(255) NOT NULL DEFAULT '', `cp_last` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `cp_status` char(255) NOT NULL, + `cp_client` char(128) NOT NULL DEFAULT '', PRIMARY KEY (`cp_id`), KEY `cp_room` (`cp_room`), KEY `cp_xchan` (`cp_xchan`), diff --git a/install/htconfig.sample.php b/install/htconfig.sample.php index 33258cf41..b23dfe3b6 100755 --- a/install/htconfig.sample.php +++ b/install/htconfig.sample.php @@ -3,7 +3,7 @@ // If automatic system installation fails: // Copy or rename this file to .htconfig.php in the top level -// Friendica directory +// Red Matrix directory // Why .htconfig.php? Because it contains sensitive information which could // give somebody complete control of your database. Apache's default diff --git a/install/update.php b/install/update.php index 9ab5db8c6..180b8d5a0 100644 --- a/install/update.php +++ b/install/update.php @@ -1,6 +1,6 @@ <?php -define( 'UPDATE_VERSION' , 1093 ); +define( 'UPDATE_VERSION' , 1094 ); /** * @@ -1054,3 +1054,9 @@ function update_r1092() { +function update_r1093() { + $r = q("ALTER TABLE `chatpresence` ADD `cp_client` CHAR( 128 ) NOT NULL DEFAULT ''"); + if($r) + return UPDATE_SUCCESS; + return UPDATE_FAILED; +} diff --git a/mod/dirprofile.php b/mod/dirprofile.php index 1593b014a..d88144f52 100644 --- a/mod/dirprofile.php +++ b/mod/dirprofile.php @@ -74,6 +74,9 @@ function dirprofile_init(&$a) { $qrlink = zid($rr['url']); $connect_link = ((local_user()) ? z_root() . '/follow?f=&url=' . urlencode($rr['address']) : ''); + $online = remote_online_status($rr['address']); + + if(in_array($rr['hash'],$contacts)) $connect_link = ''; @@ -151,6 +154,7 @@ function dirprofile_init(&$a) { '$photo' => $rr['photo_l'], '$alttext' => $rr['name'] . ' ' . $rr['address'], '$name' => $rr['name'], + '$online' => (($online) ? t('Online Now') : ''), '$details' => $pdesc . $details, '$profile' => $profile, '$address' => $rr['address'], diff --git a/mod/online.php b/mod/online.php new file mode 100644 index 000000000..c6500347a --- /dev/null +++ b/mod/online.php @@ -0,0 +1,11 @@ +<?php /** @file */ + +function online_init(&$a) { + + $ret = array('result' => false); + if(argc() != 2) + json_return_and_die($ret); + + $ret = get_online_status(argv(1)); + json_return_and_die($ret); +} diff --git a/mod/ping.php b/mod/ping.php index dda87dec2..2d5deb9ad 100644 --- a/mod/ping.php +++ b/mod/ping.php @@ -43,6 +43,35 @@ function ping_init(&$a) { unset($_SESSION['sysmsg_info']); } + if(get_observer_hash() && (! $result['invalid'])) { + $r = q("select cp_id, cp_room from chatpresence where cp_xchan = '%s' and cp_client = '%s'", + dbesc(get_observer_hash()), + dbesc($_SERVER['REMOTE_ADDR']) + ); + $basic_presence = false; + if($r) { + foreach($r as $rr) { + if($rr['cp_room'] == 0) + $basic_presence = true; + q("update chatpresence set cp_last = '%s' where cp_id = %d limit 1", + dbesc(datetime_convert()), + intval($rr['cp_id']) + ); + } + } + if(! $basic_presence) { + q("insert into chatpresence ( cp_xchan, cp_last, cp_status, cp_client) + values( '%s', '%s', '%s', '%s' ) ", + dbesc(get_observer_hash()), + dbesc(datetime_convert()), + dbesc('online'), + dbesc($_SERVER['REMOTE_ADDR']) + ); + } + } + + q("delete from chatpresence where cp_last < UTC_TIMESTAMP() - INTERVAL 3 MINUTE"); + if((! local_user()) || ($result['invalid'])) { echo json_encode($result); killme(); diff --git a/mod/settings.php b/mod/settings.php index ee6ef45de..7ff76cd3e 100644 --- a/mod/settings.php +++ b/mod/settings.php @@ -266,6 +266,7 @@ function settings_post(&$a) { $expire_network_only = ((x($_POST,'expire_network_only'))? intval($_POST['expire_network_only']) : 0); $allow_location = (((x($_POST,'allow_location')) && (intval($_POST['allow_location']) == 1)) ? 1: 0); + $hide_presence = (((x($_POST,'hide_presence')) && (intval($_POST['hide_presence']) == 1)) ? 1: 0); $publish = (((x($_POST,'profile_in_directory')) && (intval($_POST['profile_in_directory']) == 1)) ? 1: 0); $page_flags = (((x($_POST,'page-flags')) && (intval($_POST['page-flags']))) ? intval($_POST['page-flags']) : 0); @@ -395,6 +396,7 @@ function settings_post(&$a) { set_pconfig(local_user(),'system','post_joingroup', $post_joingroup); set_pconfig(local_user(),'system','post_profilechange', $post_profilechange); set_pconfig(local_user(),'system','blocktags',$blocktags); + set_pconfig(local_user(),'system','hide_online_status',$hide_presence); $r = q("update channel set channel_name = '%s', channel_pageflags = %d, channel_timezone = '%s', channel_location = '%s', channel_notifyflags = %d, channel_max_anon_mail = %d, channel_max_friend_req = %d, channel_expire_days = %d, channel_default_group = '%s', channel_r_stream = %d, channel_r_profile = %d, channel_r_photos = %d, channel_r_abook = %d, channel_w_stream = %d, channel_w_wall = %d, channel_w_tagwall = %d, channel_w_comment = %d, channel_w_mail = %d, channel_w_photos = %d, channel_w_chat = %d, channel_a_delegate = %d, channel_r_storage = %d, channel_w_storage = %d, channel_r_pages = %d, channel_w_pages = %d, channel_a_republish = %d, channel_allow_cid = '%s', channel_allow_gid = '%s', channel_deny_cid = '%s', channel_deny_gid = '%s' where channel_id = %d limit 1", @@ -821,6 +823,9 @@ function settings_content(&$a) { $unkmail = $a->user['unkmail']; $cntunkmail = $a->user['cntunkmail']; + $hide_presence = intval(get_pconfig(local_user(), 'system','hide_online_status')); + + $expire_items = get_pconfig(local_user(), 'expire','items'); $expire_items = (($expire_items===false)? '1' : $expire_items); // default if not set: 1 @@ -918,6 +923,8 @@ function settings_content(&$a) { '$h_prv' => t('Security and Privacy Settings'), + '$hide_presence' => array('hide_presence', t('Hide my online presence'),$hide_presence, t('Prevents showing if you are available for chat')), + '$lbl_pmacro' => t('Quick Privacy Settings:'), '$pmacro3' => t('Very Public - extremely permissive'), '$pmacro2' => t('Typical - default public, privacy when desired'), diff --git a/version.inc b/version.inc index d1638dd7d..36c8c7342 100644 --- a/version.inc +++ b/version.inc @@ -1 +1 @@ -2014-01-27.570 +2014-01-29.572 diff --git a/view/js/icon_translate.js b/view/js/icon_translate.js index 9e69e0b7d..838ff899f 100644 --- a/view/js/icon_translate.js +++ b/view/js/icon_translate.js @@ -50,4 +50,5 @@ $(document).ready(function() { $('.icon-check').addClass(''); $('.icon-globe').addClass(''); $('.icon-circle-blank').addClass(''); + $('.icon-circle').addClass(''); });
\ No newline at end of file diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css index b2f90cbc1..02832b5f0 100644 --- a/view/theme/redbasic/css/style.css +++ b/view/theme/redbasic/css/style.css @@ -2445,4 +2445,8 @@ img.mail-list-sender-photo { .abook-self { background-color: #ffdddd; +} +.online-now { + color: red; + cursor: pointer; }
\ No newline at end of file diff --git a/view/tpl/chatroomlist.tpl b/view/tpl/chatroomlist.tpl new file mode 100644 index 000000000..d2cf4d7b0 --- /dev/null +++ b/view/tpl/chatroomlist.tpl @@ -0,0 +1,11 @@ +<div class="widget"> +<h3>{{$header}}</h3> +{{if $items}} +<table> +{{foreach $items as $item}} +<tr><td>{{$item.cr_name}}</td><td>{{$item.cr_inroom}}</td></tr> +{{/foreach}} +</table> +{{/if}} +</div> + diff --git a/view/tpl/direntry_large.tpl b/view/tpl/direntry_large.tpl index a3fa7e4c3..f00448175 100755 --- a/view/tpl/direntry_large.tpl +++ b/view/tpl/direntry_large.tpl @@ -13,7 +13,7 @@ <div class="clear"></div> -<div class="contact-name" id="directory-name-{{$id}}" >{{$name}}</div> +<div class="contact-name" id="directory-name-{{$id}}" >{{$name}}{{if $online}} <i class="icon-asterisk online-now" title="{{$online}}"></i>{{/if}}</div> {{if $connect}} <div class="directory-connect"><a href="{{$connect}}">{{$conn_label}}</a></div> {{/if}} diff --git a/view/tpl/profile_vcard.tpl b/view/tpl/profile_vcard.tpl index aaee02ab5..7a857fd67 100755 --- a/view/tpl/profile_vcard.tpl +++ b/view/tpl/profile_vcard.tpl @@ -16,7 +16,7 @@ </div> {{/if}} - <div class="fn label">{{$profile.name}}</div> + <div class="fn label">{{$profile.name}}{{if $profile.online}} <i class="icon-asterisk online-now" title="{{$profile.online}}"></i>{{/if}}</div> {{if $pdesc}}<div class="title">{{$profile.pdesc}}</div>{{/if}} <div id="profile-photo-wrapper"><img class="photo" width="175" height="175" src="{{$profile.photo}}?rev={{$profile.picdate}}" alt="{{$profile.name}}"></div> diff --git a/view/tpl/settings.tpl b/view/tpl/settings.tpl index 7b6add231..b1a4f956d 100755 --- a/view/tpl/settings.tpl +++ b/view/tpl/settings.tpl @@ -22,6 +22,9 @@ <h3 class="settings-heading">{{$h_prv}}</h3> +{{include file="field_checkbox.tpl" field=$hide_presence}} + + <div id="settings-privacy-macros">{{$lbl_pmacro}}</div> <ul> <li><a href="#" onclick="channel_privacy_macro(3); return false" id="settings_pmacro3">{{$pmacro3}}</a></li> |