Merge branch 'master' of https://github.com/friendica/red
This commit is contained in:
commit
91e9e3be91
@ -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",
|
||||
|
@ -628,7 +628,7 @@ function RedFileData($file, &$auth,$test = false) {
|
||||
}
|
||||
|
||||
if((! $file) || ($file === '/')) {
|
||||
return RedDirectory('/',$auth);
|
||||
return new RedDirectory('/',$auth);
|
||||
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
|
147
mod/chat.php
Normal file
147
mod/chat.php
Normal file
@ -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());
|
||||
|
||||
}
|
125
mod/chatsvc.php
Normal file
125
mod/chatsvc.php
Normal file
@ -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);
|
||||
|
||||
}
|
||||
|
16
view/js/mod_chat.js
Normal file
16
view/js/mod_chat.js
Normal file
@ -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');
|
||||
});
|
16
view/js/mod_filestorage.php
Normal file
16
view/js/mod_filestorage.php
Normal file
@ -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');
|
||||
});
|
3
view/pdl/mod_chat.pdl
Normal file
3
view/pdl/mod_chat.pdl
Normal file
@ -0,0 +1,3 @@
|
||||
[region=aside]
|
||||
[widget=profile][/widget]
|
||||
[/region]
|
43
view/tpl/chat.tpl
Normal file
43
view/tpl/chat.tpl
Normal file
@ -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>
|
12
view/tpl/chatroom_new.tpl
Normal file
12
view/tpl/chatroom_new.tpl
Normal file
@ -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>
|
||||
|
||||
|
@ -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}}
|
||||
|
Reference in New Issue
Block a user