aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarijus <mario@localhost.localdomain>2014-01-30 09:57:31 +0100
committermarijus <mario@localhost.localdomain>2014-01-30 09:57:31 +0100
commit91e9e3be91e9fd6ba73085066d34a4c6daf27ee9 (patch)
treeaa53cc5185c5b1a58f0bb8e30609da6bcdc0b5ad
parent5e952e3738293ce24309fddaff04350e735e449a (diff)
parent080928f214c9f83879f1578e05baa6032fa2b7b8 (diff)
downloadvolse-hubzilla-91e9e3be91e9fd6ba73085066d34a4c6daf27ee9.tar.gz
volse-hubzilla-91e9e3be91e9fd6ba73085066d34a4c6daf27ee9.tar.bz2
volse-hubzilla-91e9e3be91e9fd6ba73085066d34a4c6daf27ee9.zip
Merge branch 'master' of https://github.com/friendica/red
-rw-r--r--include/chat.php31
-rw-r--r--include/reddav.php2
-rw-r--r--include/widgets.php6
-rw-r--r--mod/chat.php147
-rw-r--r--mod/chatsvc.php125
-rw-r--r--view/js/mod_chat.js16
-rw-r--r--view/js/mod_filestorage.php16
-rw-r--r--view/pdl/mod_chat.pdl3
-rw-r--r--view/tpl/chat.tpl43
-rw-r--r--view/tpl/chatroom_new.tpl12
-rw-r--r--view/tpl/chatroomlist.tpl2
11 files changed, 392 insertions, 11 deletions
diff --git a/include/chat.php b/include/chat.php
index 6bcb003ff..aef154fe6 100644
--- a/include/chat.php
+++ b/include/chat.php
@@ -20,6 +20,18 @@ function chatroom_create($channel,$arr) {
return $ret;
}
+ $r = q("select count(cr_id) as total from chatroom where cr_aid = %d",
+ intval($channel['channel_account_id'])
+ );
+ if($r)
+ $limit = service_class_fetch($channel_id,'chatrooms');
+
+ if(($r) && ($limit !== false) && ($r[0]['total'] >= $limit)) {
+ $ret['message'] = upgrade_message();
+ 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 )
@@ -83,18 +95,20 @@ function chatroom_enter($observer_xchan,$room_id,$status,$client) {
$r = q("select * from chatroom where cr_id = %d limit 1",
intval($room_id)
);
- if(! $r)
- return;
+ if(! $r) {
+ notice( t('Room not found.') . EOL);
+ return false;
+ }
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)
+ $x = q("select * from chatroom where cr_id = %d and cr_uid = %d $sql_extra limit 1",
+ intval($room_id),
intval($r[0]['cr_uid'])
);
if(! $x) {
notice( t('Permission denied.') . EOL);
- return;
+ return false;
}
$r = q("select * from chatpresence where cp_xchan = '%s' and cp_room = %d limit 1",
@@ -122,12 +136,13 @@ function chatroom_enter($observer_xchan,$room_id,$status,$client) {
}
-function chatroom_leave($observer_xchan,$room_id,$status) {
+function chatroom_leave($observer_xchan,$room_id,$client) {
if(! $room_id || ! $observer_xchan)
return;
- $r = q("select * from chatpresence where cp_xchan = '%s' and cp_room = %d limit 1",
+ $r = q("select * from chatpresence where cp_xchan = '%s' and cp_room = %d and cp_client = '%s' limit 1",
dbesc($observer_xchan),
- intval($room_id)
+ intval($room_id),
+ dbesc($client)
);
if($r) {
q("delete from chatpresence where cp_id = %d limit 1",
diff --git a/include/reddav.php b/include/reddav.php
index c5ef39097..e6e066770 100644
--- a/include/reddav.php
+++ b/include/reddav.php
@@ -628,7 +628,7 @@ function RedFileData($file, &$auth,$test = false) {
}
if((! $file) || ($file === '/')) {
- return RedDirectory('/',$auth);
+ return new RedDirectory('/',$auth);
}
diff --git a/include/widgets.php b/include/widgets.php
index 8b22515b1..0151f7c27 100644
--- a/include/widgets.php
+++ b/include/widgets.php
@@ -580,8 +580,12 @@ function widget_menu_preview($arr) {
function widget_chatroom_list($arr) {
require_once("include/chat.php");
$r = chatroom_list(local_user());
+ $channel = get_app()->get_channel();
return replace_macros(get_markup_template('chatroomlist.tpl'),array(
'$header' => t('Chat Rooms'),
+ '$baseurl' => z_root(),
+ '$nickname' => $channel['channel_address'],
'$items' => $r,
));
-} \ No newline at end of file
+}
+
diff --git a/mod/chat.php b/mod/chat.php
new file mode 100644
index 000000000..54fa58092
--- /dev/null
+++ b/mod/chat.php
@@ -0,0 +1,147 @@
+<?php /** @file */
+
+require_once('include/chat.php');
+
+function chat_init(&$a) {
+
+ $which = null;
+ if(argc() > 1)
+ $which = argv(1);
+ if(! $which) {
+ if(local_user()) {
+ $channel = $a->get_channel();
+ if($channel && $channel['channel_address'])
+ $which = $channel['channel_address'];
+ }
+ }
+ if(! $which) {
+ notice( t('You must be logged in to see this page.') . EOL );
+ return;
+ }
+
+ $profile = 0;
+ $channel = $a->get_channel();
+
+ if((local_user()) && (argc() > 2) && (argv(2) === 'view')) {
+ $which = $channel['channel_address'];
+ $profile = argv(1);
+ }
+
+ $a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/feed/' . $which .'" />' . "\r\n" ;
+
+ // Run profile_load() here to make sure the theme is set before
+ // we start loading content
+
+ profile_load($a,$which,$profile);
+
+}
+
+function chat_post(&$a) {
+
+ if($_POST['room_name'])
+ $room = strip_tags(trim($_POST['room_name']));
+
+ if((! $room) || (! local_user()))
+ return;
+
+ $channel = $a->get_channel();
+
+
+ if($_POST['action'] === 'drop') {
+ chatroom_destroy($channel,array('cr_name' => $room));
+ goaway(z_root() . '/chat/' . $channel['channel_address']);
+ }
+
+
+ $arr = array('name' => $room);
+ $arr['allow_gid'] = perms2str($_REQUEST['group_allow']);
+ $arr['allow_cid'] = perms2str($_REQUEST['contact_allow']);
+ $arr['deny_gid'] = perms2str($_REQUEST['group_deny']);
+ $arr['deny_cid'] = perms2str($_REQUEST['contact_deny']);
+
+ chatroom_create($channel,$arr);
+
+ $x = q("select cr_id from chatroom where cr_name = '%s' and cr_uid = %d limit 1",
+ dbesc($room),
+ intval(local_user())
+ );
+
+ if($x)
+ goaway(z_root() . '/chat/' . $channel['channel_address'] . '/' . $x[0]['cr_id']);
+
+ // that failed. Try again perhaps?
+
+ goaway(z_root() . '/chat/' . $channel['channel_address'] . '/new');
+
+
+}
+
+
+function chat_content(&$a) {
+
+ $observer = get_observer_hash();
+ if(! $observer) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if(! perm_is_allowed($a->profile['profile_uid'],$observer,'chat')) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if((argc() > 3) && intval(argv(2)) && (argv(3) === 'leave')) {
+ chatroom_leave($observer,$room_id,$_SERVER['REMOTE_ADDR']);
+ goaway(z_root() . '/channel/' . argv(1));
+ }
+
+
+ if(argc() > 2 && intval(argv(2))) {
+ $room_id = intval(argv(2));
+ $x = chatroom_enter($observer,$room_id,'online',$_SERVER['REMOTE_ADDR']);
+ if(! $x)
+ return;
+ $o = replace_macros(get_markup_template('chat.tpl'),array(
+ '$room_name' => '', // should we get this from the API?
+ '$room_id' => $room_id,
+ '$submit' => t('Submit')
+ ));
+ return $o;
+ }
+
+
+
+
+
+ if(local_user() && argc() > 2 && argv(2) === 'new') {
+
+
+ $channel = $a->get_channel();
+ $channel_acl = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+
+ require_once('include/acl_selectors.php');
+
+ $o = replace_macros(get_markup_template('chatroom_new.tpl'),array(
+ '$header' => t('New Chatroom'),
+ '$name' => array('room_name',t('Chatroom Name'),'', ''),
+ '$acl' => populate_acl($channel_acl),
+ '$submit' => t('Submit')
+ ));
+ return $o;
+ }
+
+
+
+
+
+
+ require_once('include/widgets.php');
+
+ return widget_chatroom_list(array());
+
+} \ No newline at end of file
diff --git a/mod/chatsvc.php b/mod/chatsvc.php
new file mode 100644
index 000000000..39161b5a7
--- /dev/null
+++ b/mod/chatsvc.php
@@ -0,0 +1,125 @@
+<?php /** @file */
+
+require_once('include/security.php');
+
+function chatsvc_init(&$a) {
+
+//logger('chatsvc');
+
+ $ret = array('success' => false);
+
+ $a->data['chat']['room_id'] = intval($_REQUEST['room_id']);
+ $x = q("select cr_uid from chatroom where cr_id = %d and cr_id != 0 limit 1",
+ intval($a->data['chat']['room_id'])
+ );
+ if(! $x)
+ json_return_and_die($ret);
+
+ $a->data['chat']['uid'] = $x[0]['cr_uid'];
+
+ if(! perm_is_allowed($a->data['chat']['uid'],get_observer_hash(),'chat')) {
+ json_return_and_die($ret);
+ }
+
+}
+
+function chatsvc_post(&$a) {
+
+ $ret = array('success' => false);
+
+ $room_id = $a->data['chat']['room_id'];
+ $text = escape_tags($_REQUEST['chat_text']);
+ $status = strip_tags($_REQUEST['status']);
+
+ if($status && $room_id) {
+ $r = q("update chatpresence set cp_status = '%s', cp_last = '%s' where cp_room = %d and cp_xchan = '%s' and cp_client = '%s' limit 1",
+ dbesc($status),
+ dbesc(datetime_convert()),
+ intval($room_id),
+ dbesc(get_observer_hash()),
+ dbesc($_SERVER['REMOTE_ADDR'])
+ );
+ }
+ if(! $text)
+ return;
+
+ $sql_extra = permissions_sql($a->data['chat']['uid']);
+
+ $r = q("select * from chatroom where cr_uid = %d and cr_id = %d $sql_extra",
+ intval($a->data['chat']['uid']),
+ intval($a->data['chat']['room_id'])
+ );
+ if(! $r)
+ json_return_and_die($ret);
+
+ $x = q("insert into chat ( chat_room, chat_xchan, created, chat_text )
+ values( %d, '%s', '%s', '%s' )",
+ intval($a->data['chat']['room_id']),
+ dbesc(get_observer_hash()),
+ dbesc(datetime_convert()),
+ dbesc($text)
+ );
+
+}
+
+function chatsvc_content(&$a) {
+
+ $lastseen = intval($_REQUEST['last']);
+
+ $ret = array('success' => false);
+
+ $sql_extra = permissions_sql($a->data['chat']['uid']);
+
+ $r = q("select * from chatroom where cr_uid = %d and cr_id = %d $sql_extra",
+ intval($a->data['chat']['uid']),
+ intval($a->data['chat']['room_id'])
+ );
+ if(! $r)
+ json_return_and_die($ret);
+
+ $inroom = array();
+
+ $r = q("select * from chatpresence left join xchan on xchan_hash = cp_xchan where cp_room = %d order by xchan_name",
+ intval($a->data['chat']['room_id'])
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $inroom[] = array('img' => zid($rr['xchan_photo_m']), 'img_type' => $rr['xchan_photo_mimetype'],'name' => $rr['xchan_name']);
+ }
+ }
+
+ $chats = array();
+
+ $r = q("select * from chat left join xchan on chat_xchan = xchan_hash where chat_room = %d and chat_id > %d",
+ intval($a->data['chat']['room_id']),
+ intval($lastseen)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $chats[] = array(
+ 'id' => $rr['chat_id'],
+ 'img' => zid($rr['xchan_photo_m']),
+ 'img_type' => $rr['xchan_photo_mimetype'],
+ 'name' => $rr['xchan_name'],
+ 'isotime' => datetime_convert('UTC', date_default_timezone_get(), $rr['created'], 'c'),
+ 'localtime' => datetime_convert('UTC', date_default_timezone_get(), $rr['created'], 'r'),
+ 'text' => smilies(bbcode($rr['chat_text']))
+ );
+ }
+ }
+
+ $r = q("update chatpresence set cp_last = '%s' where cp_room = %d and cp_xchan = '%s' and cp_client = '%s' limit 1",
+ dbesc(datetime_convert()),
+ intval($room_id),
+ dbesc(get_observer_hash()),
+ dbesc($_SERVER['REMOTE_ADDR'])
+ );
+
+ $ret['success'] = true;
+ $ret['inroom'] = $inroom;
+ $ret['chats'] = $chats;
+
+ json_return_and_die($ret);
+
+}
+ \ No newline at end of file
diff --git a/view/js/mod_chat.js b/view/js/mod_chat.js
new file mode 100644
index 000000000..82957ae44
--- /dev/null
+++ b/view/js/mod_chat.js
@@ -0,0 +1,16 @@
+$(document).ready(function() {
+
+ $('#contact_allow, #contact_deny, #group_allow, #group_deny').change(function() {
+ var selstr;
+ $('#contact_allow option:selected, #contact_deny option:selected, #group_allow option:selected, #group_deny option:selected').each( function() {
+ selstr = $(this).text();
+ $('#jot-perms-icon').removeClass('unlock').addClass('lock');
+ $('#jot-public').hide();
+ });
+ if(selstr == null) {
+ $('#jot-perms-icon').removeClass('lock').addClass('unlock');
+ $('#jot-public').show();
+ }
+
+ }).trigger('change');
+});
diff --git a/view/js/mod_filestorage.php b/view/js/mod_filestorage.php
new file mode 100644
index 000000000..82957ae44
--- /dev/null
+++ b/view/js/mod_filestorage.php
@@ -0,0 +1,16 @@
+$(document).ready(function() {
+
+ $('#contact_allow, #contact_deny, #group_allow, #group_deny').change(function() {
+ var selstr;
+ $('#contact_allow option:selected, #contact_deny option:selected, #group_allow option:selected, #group_deny option:selected').each( function() {
+ selstr = $(this).text();
+ $('#jot-perms-icon').removeClass('unlock').addClass('lock');
+ $('#jot-public').hide();
+ });
+ if(selstr == null) {
+ $('#jot-perms-icon').removeClass('lock').addClass('unlock');
+ $('#jot-public').show();
+ }
+
+ }).trigger('change');
+});
diff --git a/view/pdl/mod_chat.pdl b/view/pdl/mod_chat.pdl
new file mode 100644
index 000000000..6b1d2a15e
--- /dev/null
+++ b/view/pdl/mod_chat.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=profile][/widget]
+[/region]
diff --git a/view/tpl/chat.tpl b/view/tpl/chat.tpl
new file mode 100644
index 000000000..d0f9418a0
--- /dev/null
+++ b/view/tpl/chat.tpl
@@ -0,0 +1,43 @@
+<div id="chatContainer">
+
+ <div id="chatTopBar" class="rounded"></div>
+ <div id="chatLineHolder"></div>
+
+ <div id="chatUsers" class="rounded"></div>
+
+ <div id="chatBottomBar" class="rounded">
+ <div class="tip"></div>
+
+ <form id="chat-form" method="post" action="#">
+ <input type="hidden" name="room_id" value="{{$room_id}}" />
+ <textarea id="chatText" name="chat_text" rows=3 cols=80></textarea><br />
+ <input type="submit" name="submit" value="{{$submit}}" />
+ </form>
+
+ </div>
+
+</div>
+
+<script>
+var room_id = {{$room_id}};
+
+$('#chat-form').submit(function(ev) {
+ $('body').css('cursor','wait');
+ $.post("chatsvc", $('#chat-form').serialize(),function(data) {
+ load_chats(data);
+ $('body').css('cursor','auto');
+ },'json');
+ ev.preventDefault();
+});
+
+function load_chats(data) {
+ var chat_data = data;
+ if(! data) {
+ $.get("chatsvc?f=&room_id=" + room_id,function(data) {
+ chat_data = $this;
+ });
+ }
+
+
+}
+</script>
diff --git a/view/tpl/chatroom_new.tpl b/view/tpl/chatroom_new.tpl
new file mode 100644
index 000000000..86eadb132
--- /dev/null
+++ b/view/tpl/chatroom_new.tpl
@@ -0,0 +1,12 @@
+<h1>{{$header}}</h1>
+
+<form action="chat" method="post" >
+{{include file="field_input.tpl" field=$name}}
+<br />
+<br />
+{{$acl}}
+<div class="clear"></div>
+<input type="submit" name="submit" value="{{$submit}}" />
+</form>
+
+
diff --git a/view/tpl/chatroomlist.tpl b/view/tpl/chatroomlist.tpl
index d2cf4d7b0..c26ba0c33 100644
--- a/view/tpl/chatroomlist.tpl
+++ b/view/tpl/chatroomlist.tpl
@@ -3,7 +3,7 @@
{{if $items}}
<table>
{{foreach $items as $item}}
-<tr><td>{{$item.cr_name}}</td><td>{{$item.cr_inroom}}</td></tr>
+<tr><td align="left"><a href="{{$baseurl}}/chat/{{$nickname}}/{{$item.cr_id}}">{{$item.cr_name}}</a></td><td align="right">{{$item.cr_inroom}}</td></tr>
{{/foreach}}
</table>
{{/if}}