You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

603 lines
17 KiB

<?php
/**
* @package Widgets
*
* @file Chat.php
* This file is part of MOVIM.
*
* @brief A jabber chat widget.
*
* @author Guillaume Pasquet <etenil@etenilsrealm.nl>
*
* @version 1.0
* @date 20 October 2010
*
* Copyright (C)2010 MOVIM project
*
* See COPYING for licensing information.
*/
class Chat extends WidgetBase
{
function WidgetLoad()
{
$this->addcss('chat.css');
$this->addjs('chat.js');
$this->registerEvent('message', 'onMessage');
$this->registerEvent('messagepublished', 'onMessagePublished');
$this->registerEvent('composing', 'onComposing');
$this->registerEvent('paused', 'onPaused');
$this->registerEvent('attention', 'onAttention');
$this->registerEvent('presence', 'onPresence');
$this->view->assign('chats', $this->prepareChats());
}
function onPresence($presence)
{
$arr = $presence->getPresence();
$rc = new \modl\ContactDAO();
$contact = $rc->getRosterItem(echapJid($presence->jid));
if(isset($contact) && $contact->chaton == 2) {
$txt = array(
1 => t('Online'),
2 => t('Away'),
3 => t('Do Not Disturb'),
4 => t('Extended Away'),
5 => t('Offline'),
);
$html = '
<div class="message presence">
<span class="date">'.date('G:i', time()).'</span>'.
prepareString(htmlentities($txt[$arr['presence']], ENT_COMPAT, "UTF-8")).'
</div>';
RPC::call('movim_append',
'messages'.$arr['jid'],
$html);
RPC::call('scrollTalk',
'messages'.$arr['jid']);
} elseif(!isset($contact)) {
//RPC::call('movim_fill', 'chats', $this->prepareChats());
//RPC::call('scrollAllTalks');
}
}
function onMessage($message)
{
if($message->session == $message->jidfrom) {
$key = $message->jidfrom;
$jid = $message->jidto;
} else {
$key = $message->jidto;
$jid = $message->jidfrom;
}
$rd = new \modl\RosterLinkDAO();
$rc = new \modl\ContactDAO();
$contact = $rc->getRosterItem(echapJid($jid));
if($message->session != $message->jidfrom)
RPC::call(
'notify',
$contact->getTrueName(),
$message->body,
$contact->getPhoto('m'));
if($contact != null && $contact->chaton == 0) {
$contact->chaton = 2;
$rd->setChat($jid, 2);
RPC::call('movim_prepend',
'chats',
$this->prepareChat($contact));
RPC::call('scrollAllTalks');
} elseif($contact != null && $message->body != '') {
$html = $this->prepareMessage($message);
if($contact->chaton == 1) {
RPC::call('colorTalk',
'messages'.$contact->jid);
}
RPC::call('movim_append',
'messages'.$contact->jid,
$html);
if($message->session != $message->jidfrom)
RPC::call('hideComposing',
$contact->jid);
if($message->session != $message->jidfrom)
RPC::call('hidePaused',
$contact->jid);
RPC::call('scrollTalk',
'messages'.$contact->jid);
}
// Muc case
elseif($message->ressource != '') {
$html = $this->prepareMessage($message, true);
RPC::call('movim_append',
'messages'.$message->jidfrom,
$html);
RPC::call('scrollTalk',
'messages'.$message->jidfrom);
}
}
function onMessagePublished($jid)
{
Notification::appendNotification(t('Message Published'), 'success');
}
function onComposing($jid)
{
$rd = new \modl\RosterLinkDAO();
$contact = $rd->get(echapJid($jid));
if(in_array($contact->chaton, array(1, 2))) {
RPC::call('showComposing',
$contact->jid);
RPC::call('scrollTalk',
'messages'.$contact->jid);
}
}
function onPaused($jid)
{
$rd = new \modl\RosterLinkDAO();
$contact = $rd->get(echapJid($jid));
if(in_array($contact->chaton, array(1, 2))) {
RPC::call('showPaused',
$contact->jid);
RPC::call('scrollTalk',
'messages'.$contact->jid);
}
}
function onAttention($jid)
{
$rc = new \modl\ContactDAO();
$contact = $rc->getRosterItem(echapJid($jid));
$html = '
<div style="font-weight: bold; color: black;" class="message" >
<span class="date">'.date('G:i', time()).'</span>'.
t('%s needs your attention', $contact->getTrueName()).'
</div>';
RPC::call('movim_append',
'messages'.$jid,
$html);
RPC::call('scrollTalk',
'messages'.$jid);
}
/**
* Open a new talk
*
* @param string $jid
* @return void
*/
function ajaxOpenTalk($jid)
{
$rc = new \modl\ContactDAO();
$contact = $rc->getRosterItem(echapJid($jid));
if(
isset($contact)
&& $contact->chaton == 0
&& !in_array($contact->presence, array(5, 6))) {
$contact->chaton = 2;
$rd = new \modl\RosterLinkDAO();
$rd->setChat(echapJid($jid), 2);
RPC::call('movim_prepend',
'chats',
$this->prepareChat($contact));
RPC::call('scrollAllTalks');
RPC::commit();
}
//$evt = new Event();
//$evt->runEvent('openchat');
}
/**
* Send an encrypted message
*
* @param string $to
* @param string $message
* @return void
*/
function ajaxSendEncryptedMessage($to, $message, $muc = false, $ressource = false)
{
$this->ajaxSendMessage($to, $message, $muc, $ressource, true);
}
/**
* Send a message
*
* @param string $to
* @param string $message
* @return void
*/
function ajaxSendMessage($to, $message, $muc = false, $ressource = false, $encrypted = false)
{
$m = new \modl\Message();
$m->session = $this->user->getLogin();
$m->jidto = echapJid($to);
$m->jidfrom = $this->user->getLogin();
$session = \Sessionx::start();
$m->type = 'chat';
$m->ressource = $session->ressource;
if($muc) {
$m->type = 'groupchat';
$m->ressource = $session->user;
$m->jidfrom = $to;
}
$m->body = rawurldecode($message);
$m->published = date('Y-m-d H:i:s');
$m->delivered = date('Y-m-d H:i:s');
$md = new \modl\MessageDAO();
$md->set($m);
$evt = new Event();
$evt->runEvent('message', $m);
if($ressource != false)
$to = $to.'/'.$ressource;
// We decode URL codes to send the correct message to the XMPP server
$m = new \moxl\MessagePublish();
$m->setTo($to)
//->setEncrypted($encrypted)
->setContent(htmlspecialchars(rawurldecode($message)));
if($muc)
$m->setMuc();
$m->request();
}
/**
* Send a "composing" message
*
* @param string $to
* @return void
*/
function ajaxSendComposing($to)
{
$mc = new \moxl\MessageComposing();
$mc->setTo($to)
->request();
}
/**
* Send a "paused" message
*
* @param string $to
* @return void
*/
function ajaxSendPaused($to)
{
$mp = new \moxl\MessagePaused();
$mp->setTo($to)
->request();
}
/**
* Close a talk
*
* @param string $jid
* @return void
*/
function ajaxCloseTalk($jid)
{
$rd = new \modl\RosterLinkDAO();
$contact = $rd->get(echapJid($jid));
/*foreach($contacts as $contact) {
if(
$contact->jid == echapJid($jid)
&& (
(int)$contact->chaton == 1
|| (int)$contact->chaton == 2)
) {
$contact->chaton = 0;
$rd->setNow($contact);
}
}*/
$contact->chaton = 0;
$rd->setNow($contact);
RPC::call('movim_delete',
'chat'.echapJid($jid));
RPC::commit();
//$evt = new Event();
//$evt->runEvent('closechat');
}
function ajaxHideTalk($jid)
{
$rd = new \modl\RosterLinkDAO();
$contact = $rd->get(echapJid($jid));
if($contact->chaton == 1)
$contact->chaton = 2;
else
$contact->chaton = 1;
$rd->setNow($contact);
RPC::call('scrollTalk',
'messages'.$contact->jid);
RPC::commit();
}
function prepareMessage($message, $muc = false) {
if($message->body != '') {
$html = '<div class="message ';
if($message->session == $message->jidfrom)
$html.= 'me';
$content = $message->body;
if(preg_match("#^/me#", $message->body)) {
$html .= ' own ';
$content = '** '.substr($message->body, 4);
}
if(preg_match("#^\?OTR:#", $message->body)) {
$html .= ' crypt ';
$content = t('Encrypted message');
}
$c = new \modl\Contact();
$html .= '">
<img class="avatar" src="'.$c->getPhoto('xs', $message->jidfrom).'" />
<span class="date">'.date('H:i', strtotime($message->published)).'</span>';
if($muc != false)
$html .= '
<span class="ressource '.$this->colorNameMuc($message->ressource).'">'.
$message->ressource.'
</span>';
$html.= prepareString(htmlentities($content, ENT_COMPAT, "UTF-8")).'</div>';
return $html;
} else {
return '';
}
}
function prepareChats()
{
$rc = new \modl\ContactDAO();
$contacts = $rc->getRosterChat();
$html = '';
// Another filter to fix the database request
$check = array();
if(isset($contacts)) {
foreach($contacts as $contact) {
if(!in_array($contact->jid,$check)) {
$html .= trim($this->prepareChat($contact));
//$jid = $contact->jid;
array_push($check, $contact->jid);
}
}
}
$bk = Cache::c('bookmark');
if(is_array($bk))
foreach($bk as $b) {
if($b['type'] == 'conference')
$html .= trim($this->prepareMuc($b['jid']));
}
return $html;
}
function prepareMuc($jid)
{
// Zeu messages
$md = new \modl\MessageDAO();
$messages = $md->getContact($jid, 0, 10);
$messageshtml = '';
if(!empty($messages)) {
$messages = array_reverse($messages);
$day = '';
foreach($messages as $m) {
if($day != date('d',strtotime($m->published))) {
$messageshtml .= '<div class="message presence">'.prepareDate(strtotime($m->published), false).'</div>';
$day = date('d',strtotime($m->published));
}
$messageshtml .= $this->prepareMessage($m, true);
}
}
// Zeu muc list
$pd = new \modl\PresenceDAO();
$presences = $pd->getJid($jid);
$mucview = $this->tpl();
$mucview->assign('jid', $jid);
$mucview->assign('messageshtml', $messageshtml);
$mucview->assign('muclist', $presences);
$mucview->assign('toggle',
$this->genCallAjax(
"ajaxToggleMuc", "'".$jid."'")
);
$mucview->assign('sendmessage',
$this->genCallAjax(
'ajaxSendMessage',
"'".$jid."'",
"sendMessage(this, '".$jid."')",
"true"
));
$sess = \Session::start(APP_NAME);
$state = $sess->get('muc'.$jid);
if($state == 1) {
$mucview->assign('tabstyle', 'style="display: none;"');
$mucview->assign('panelstyle', 'style="display: block;"');
} else {
$mucview->assign('tabstyle', '');
$mucview->assign('panelstyle', '');
}
$html = $mucview->draw('_chat_muc', true);
return $html;
}
function ajaxToggleMuc($jid)
{
$sess = \Session::start(APP_NAME);
$state = $sess->get('muc'.$jid);
if($state == 1)
$sess->set('muc'.$jid, 0);
else
$sess->set('muc'.$jid, 1);
}
function colorNameMuc($jid)
{
$colors = array(
0 => 'purple',
1 => 'purple',
2 => 'wine',
3 => 'yellow',
4 => 'orange',
5 => 'green',
6 => 'red',
7 => 'blue');
$s = base_convert($jid, 32, 8);
return $colors[$s[7]];
}
// Prepare Chat
function prepareChat($contact)
{
$md = new \modl\MessageDAO();
$messages = $md->getContact(echapJid($contact->jid), 0, 10);
$messageshtml = '';
if($messages != null) {
$messages = array_reverse($messages);
$day = '';
foreach($messages as $m) {
if($day != date('d',strtotime($m->published))) {
$messageshtml .= '<div class="message presence">'.prepareDate(strtotime($m->published), false).'</div>';
$day = date('d',strtotime($m->published));
}
$messageshtml .= $this->prepareMessage($m);
}
}
$style = '';
$panelstyle='';
$tabstyle ='';
if($contact->chaton == 2) {
$tabstyle = ' style="display: none;" ';
$panelstyle = ' style="display: block;" ';
}
$chatview = $this->tpl();
/*if($contact->publickey) {
$chatview->assign('publickey', $contact->publickey);
$chatview->assign(
'send',
$this->genCallAjax(
'ajaxSendEncryptedMessage',
"'".$contact->jid."'",
"sendEncryptedMessage(this, '".$contact->jid."')",
"false",
"'".$contact->ressource."'"
)
);
} else {*/
$chatview->assign(
'send',
$this->genCallAjax(
'ajaxSendMessage',
"'".$contact->jid."'",
"sendMessage(this, '".$contact->jid."')",
"false",
"'".$contact->ressource."'"
)
);
//}
$chatview->assign('contact', $contact);
$chatview->assign('tabstyle', $tabstyle);
$chatview->assign('panelstyle', $panelstyle);
$chatview->assign('messageshtml', $messageshtml);
$chatview->assign(
'closetalk',
$this->genCallAjax("ajaxCloseTalk", "'".$contact->jid."'")
);
$chatview->assign(
'hidetalk',
$this->genCallAjax("ajaxHideTalk", "'".$contact->jid."'")
);
$chatview->assign(
'composing',
$this->genCallAjax(
'ajaxSendComposing',
"'".$contact->jid."'"
)
);
$chatview->assign(
'paused',
$this->genCallAjax(
'ajaxSendPaused',
"'".$contact->jid."'"
)
);
$html = $chatview->draw('_chat_contact', true);
return $html;
}
}