Browse Source

- Merge with nodpounod

- Add a little icon in the resfresh button in News
- Add XMPP Websocket test in AdminTest
pull/16/head
Jaussoin Timothée 11 years ago
parent
commit
700b1c3015
  1. 1
      app/assets/js/movim_websocket.js
  2. 15
      app/helpers/StringHelper.php
  3. 4
      app/widgets/AdminTest/AdminTest.php
  4. 16
      app/widgets/AdminTest/admintest.js
  5. 8
      app/widgets/AdminTest/admintest.tpl
  6. 4
      app/widgets/News/News.php
  7. 20
      app/widgets/Roster/Roster.php
  8. 119
      app/widgets/Roster/roster.js
  9. 1
      app/widgets/Roster/roster.tpl
  10. 9
      linker.php

1
app/assets/js/movim_websocket.js

@ -43,7 +43,6 @@ var MovimWebsocket = {
if(obj.id) {
localStorage.movimSession = obj.id;
console.log('GNAP');
document.cookie = 'MOVIM_SESSION_ID=' + obj.id;
this.register();
}

15
app/helpers/StringHelper.php

@ -204,6 +204,21 @@ function cleanJid($jid)
return reset(explode('/', $jid));
}
/*
* Explode JID
*/
function explodeJid($jid)
{
list($jid, $resource) = explode('/', $jid);
list($username, $server) = explode('@', $jid);
return array(
'username' => $username,
'server' => $server,
'ressource' => $resource
);
}
/**
* Return a URIfied string
* @param string

4
app/widgets/AdminTest/AdminTest.php

@ -42,8 +42,12 @@ class AdminTest extends WidgetBase
$md = \modl\Modl::getInstance();
$supported = $md->getSupportedDatabases();
$cd = new \Modl\ConfigDAO();
$config = $cd->get();
$this->view->assign('dbconnected', $md->_connected);
$this->view->assign('dbtype', $supported[$conf['type']]);
$this->view->assign('dbinfos', sizeof($md->check()));
$this->view->assign('websocketurl', $config->websocketurl);
}
}

16
app/widgets/AdminTest/admintest.js

@ -20,8 +20,9 @@ var AdminTest = {
movim_remove_class('figure #browser-daemon', 'error');
movim_add_class('figure #browser-daemon', 'success');
movim_remove_class('li.admindb', 'disabled');
movim_toggle_display('#websocket_error');
movim_get_node('#websocket_error').style.display = 'none';
},
enableAPI : function() {
@ -35,14 +36,25 @@ var AdminTest = {
this.movimOK = false;
movim_add_class('figure #movim_block', 'error');
},
testXMPPWebsocket : function(url) {
this.connection = new WebSocket(url);
this.connection.onopen = function(e) {
movim_remove_class('figure #daemon-xmpp', 'error');
movim_add_class('figure #daemon-xmpp', 'success');
movim_get_node('#xmpp_websocket_error').style.display = 'none';
};
}
}
MovimWebsocket.attach(function() {
AdminTest.enableWebsocket();
AdminTest.toggleConfiguration();
});
movim_add_onload(function() {
AdminTest.toggleConfiguration();
movim_toggle_display('#websocket_error');
movim_add_class('li.admindb', 'disabled');
});

8
app/widgets/AdminTest/admintest.tpl

@ -7,7 +7,7 @@
<div id="movim-daemon" class="link vertical disabled"><i class="fa fa-cog"></i></div>
<div id="movim-browser" class="link horizontal success"><i class="fa fa-globe"></i></div>
<div id="browser-daemon" class="link horizontal error"><i class="fa fa-plug"></i></div>
<div id="daemon-xmpp" class="link horizontal success"><i class="fa fa-code"></i></div>
<div id="daemon-xmpp" class="link horizontal error"><i class="fa fa-code"></i></div>
<div id="movim-database" class="link vertical {if="$dbconnected"}success {if="$dbinfos > 0"}warning{/if} {else}error{/if}">
<i class="fa fa-database"></i>
</div>
@ -55,6 +55,10 @@
<div id="websocket_error" class="message error">
<i class="fa fa-plug"></i> WebSocket connection error, check if the Movim Daemon is running and is reacheable
</div>
<div id="xmpp_websocket_error" class="message error">
<i class="fa fa-plug"></i> XMPP Websocket connection error, please check the validity of the URL given in the General Configuration. <code>{$websocketurl}</code>
</div>
{if="!$c->version()"}
<div class="message error">
@ -83,5 +87,5 @@
</div>
{/if}
</div>
<script type="text/javascript">AdminTest.testXMPPWebsocket('{$websocketurl}');</script>
</div>

4
app/widgets/News/News.php

@ -85,8 +85,8 @@ class News extends WidgetCommon {
$html = '
<a class="button color green icon refresh"
onclick="'.$this->genCallAjax('ajaxRefresh').'"
>'.
__('post.new_items', $count).' - '.__('button.refresh').'
>
<i class="fa fa-refresh"></i> '.__('post.new_items', $count).' - '.__('button.refresh').'
</a>';
RPC::call('movim_posts_unread', $count);

20
app/widgets/Roster/Roster.php

@ -30,10 +30,10 @@ class Roster extends WidgetBase
$this->addjs('angular.js');
$this->addjs('roster.js');
$this->registerEvent('roster_getlist_handle', 'onRoster');
$this->registerEvent('roster_additem_handle', 'onRoster');
$this->registerEvent('roster_removeitem_handle', 'onRoster');
$this->registerEvent('roster_updateitem_handle', 'onRoster');
$this->registerEvent('presence', 'onPresence');
$this->registerEvent('roster_additem_handle', 'onUpdate');
$this->registerEvent('roster_removeitem_handle', 'onDelete');
$this->registerEvent('roster_updateitem_handle', 'onUpdate');
$this->registerEvent('presence', 'onUpdate');
}
function display()
@ -41,7 +41,15 @@ class Roster extends WidgetBase
}
function onPresence($packet)
function onDelete($packet)
{
$jid = $packet->content;
if($jid != null){
RPC::call('deleteContact', $jid);
}
}
function onUpdate($packet)
{
$contacts = $packet->content;
if($contacts != null){
@ -53,7 +61,7 @@ class Roster extends WidgetBase
$this->prepareContact($ac, $c, $this->getCaps());
$c = $ac;
}
RPC::call('updatePresence', json_encode($contacts));
RPC::call('updateContact', json_encode($contacts));
}
}

119
app/widgets/Roster/roster.js

@ -1,6 +1,7 @@
(function(){
var app = angular.module("roster", []);
/* Controller for Rostermenu */
app.controller("RosterMenuController", function(){
this.checkoutAddJid = function(event){
if(event.key == "Enter")
@ -8,24 +9,28 @@
};
});
/* Controller for Rosterlist */
app.controller("RosterController", function($scope){
$scope.contacts = /*localStorage.getObject('rosterContacts') ||*/ [];
$scope.groups = /*localStorage.getObject('rosterGroups') ||*/ [];
$scope.list = [];
/* Dictionaries */
$scope.lookupgroups = {};
$scope.lookupjid = {};
$scope.lookupressource = {};
$scope.initContacts = function(list){
console.log("initContacts");
//$scope.contacts = [];
//$scope.list = list;
for(i=0; i<list.length; i++){
/* New group */
if(!(list[i].groupname in $scope.lookupgroups)){
l = $scope.contacts.length;
$scope.contacts.push({
'agroup': list[i].groupname,
'agroupitems': []
'agroup': list[i].groupname,
'agroupitems': [],
});
$scope.lookupgroups[list[i].groupname] = $scope.contacts[l];
}
@ -33,9 +38,10 @@
if(!(list[i].jid in $scope.lookupjid)){
l = $scope.lookupgroups[list[i].groupname].agroupitems.length;
$scope.lookupgroups[list[i].groupname].agroupitems.push({
'ajid': list[i].jid,
'ajid': list[i].jid,
'aval': list[i].value,
'ajiditems': []
'ajiditems': [],
'tombstone': false,
});
$scope.lookupjid[list[i].jid] = $scope.lookupgroups[list[i].groupname].agroupitems[l];
}
@ -54,8 +60,9 @@
$scope.lookupjid[jid] = $scope.contacts[i].agroupitems[j];
}
}
/* Sort groups alphabetically */
$scope.contacts.sort(function(a, b){return a.agroup.localeCompare(b.agroup);});
localStorage.setObject('rosterContacts', $scope.contacts);
$scope.$apply();
};
@ -69,30 +76,80 @@
else list[i] = localStorage.getItem("rosterGroup_"+i);
}
$scope.groups = list;
localStorage.setObject('rosterGroups', $scope.groups);
$scope.$apply();
};
$scope.deleteContact = function(jid){
$scope.lookupjid[jid].tombstone = true;
$scope.$apply();
};
$scope.updatePresence = function(list){
$scope.updateContact = function(list){
console.log("updateContact");
$scope.list.push(list);
/* New group */
if(!(list[0].groupname in $scope.lookupgroups)){
if(!(list[0].groupname in $scope.lookupgroups)) {
l = $scope.contacts.length;
$scope.contacts.push({
'agroup': list[0].groupname,
'agroupitems': []
});
$scope.lookupgroups[list[0].groupname] = $scope.contacts[l];
/* A known jid has been moved to a new group */
if (list[0].jid in $scope.lookupjid){
/* Create the group and put the jid in it */
$scope.contacts.push({
'agroup': list[0].groupname,
'agroupitems': [{
'ajid': list[0].jid,
'aval': list[0].value,
'ajiditems': list,
'tombstone': false,
}]
});
/* Kill jid from old location */
$scope.lookupjid[list[0].jid].tombstone = true;
/* Update dictionaries */
$scope.lookupgroups[list[0].groupname] = $scope.contacts[l];
$scope.lookupjid[list[0].jid] = $scope.lookupgroups[list[0].groupname].agroupitems[0];
}
/* An unknown jid in an unknown group */
else {
$scope.contacts.push({
'agroup': list[0].groupname,
'agroupitems': [],
});
$scope.lookupgroups[list[0].groupname] = $scope.contacts[l];
}
}
/* New jid */
if(!(list[0].jid in $scope.lookupjid)){
l = $scope.lookupgroups[list[0].groupname].agroupitems.length;
$scope.lookupgroups[list[0].groupname].agroupitems.push({
'ajid': list[0].jid,
'aval': list[0].value,
'ajiditems': []
'ajiditems': [],
'tombstone': false,
});
$scope.lookupjid[list[0].jid] = $scope.lookupgroups[list[0].groupname].agroupitems[l];
}
/* Known jid in another existing group */
else if(!($scope.lookupjid[list[0].jid].ajiditem[0].groupname == list[i].groupname)){
/* Kill jid from old location */
$scope.lookupjid[list[0].jid].tombstone = true;
/* Add to new group */
l = $scope.lookupgroups[list[0].groupname].agroupitems.length;
$scope.lookupgroups[list[0].groupname].agroupitems.push({
'ajid': list[0].jid,
'aval': list[0].value,
'ajiditems': list,
'tombstone': false,
});
/* Update JID dictionary */
$scope.lookupjid[list[0].jid] = $scope.lookupgroups[list[0].groupname].agroupitems[l];
}
/* Replace the ajiditems by the new list of ressource */
$scope.lookupjid[list[0].jid].ajiditems = list;
@ -199,10 +256,38 @@ function initGroups(tab){
angular.element(roster).scope().initGroups(JSON.parse(tab));
}
function updatePresence(tab){
angular.element(roster).scope().updatePresence(JSON.parse(tab));
function updateContact(tab){
console.log("updateContact out");
angular.element(roster).scope().updateContact(JSON.parse(tab));
}
function deleteContact(jid){
angular.element(roster).scope().deleteContact(jid);
}
function locationOf(element, array, comparer, start, end) {
if (array.length === 0)
return -1;
start = start || 0;
end = end || array.length;
var pivot = (start + end) >> 1; // should be faster than the above calculation
var c = comparer(element, array[pivot]);
if (end - start <= 1) return c == -1 ? pivot - 1 : pivot;
switch (c) {
case -1: return locationOf(element, array, comparer, start, pivot);
case 0: return pivot;
case 1: return locationOf(element, array, comparer, pivot, end);
};
};
// sample for objects like {lastName: 'Miller', ...}
var groupnameCompare = function (a, b) {
return a.agroup.localeCompare(b.agroup);
};
function showHideOffline() {
if(localStorage.getItem("rosterShow_offline") != "true" ){
document.querySelector('ul#rosterlist').className = 'offlineshown';

1
app/widgets/Roster/roster.tpl

@ -11,6 +11,7 @@
<div ng-show="contacts.length" ng-repeat="group in contacts" id="group{{group.agroup}}" ng-class="{groupshown: rosterCtrl.groupIsShown(group.agroup) == 'true'}">
<h1 ng-click="rosterCtrl.showHideGroup(group.agroup)">{{group.agroup}}</h1>
<!--ng-hide="myjid.tombstone == 'true'" -->
<li ng-repeat="myjid in group.agroupitems" id="{{myjid.ajid}}" class="{{myjid.ajiditems[0].rosterview.presencetxt}}" ng-attr-title="{{rosterCtrl.getContactTitle(myjid.ajiditems[0])}}">
<!-- Rostersearch look this way for an angularJS solution http://www.bennadel.com/blog/2487-filter-vs-nghide-with-ngrepeat-in-angularjs.htm -->
<ul class="contact">

9
linker.php

@ -14,13 +14,16 @@ $dns = $dnsResolverFactory->createCached('8.8.8.8', $loop);
$connector = new Ratchet\Client\Factory($loop);
$cd = new \Modl\ConfigDAO();
$config = $cd->get();
//setcookie('PHPENV', getenv('sid'), time()+3600);
/*
$connector_xmpp = new React\SocketClient\Connector($loop, $dns);
$secure_connector_xmpp = new React\SocketClient\SecureConnector($connector_xmpp, $loop);
* $secure_connector_xmpp->create('movim.eu', 5222)*/
React\Promise\all([$connector('ws://127.0.0.1:8080'), $connector('ws://movim.eu:5290/', ['xmpp'])])->then(function($conns) use ($loop) {
React\Promise\all([$connector('ws://127.0.0.1:8080'), $connector($config->websocketurl, ['xmpp'])])->then(function($conns) use ($loop) {
list($conn1, $conn2) = $conns;
$logger = new \Zend\Log\Logger();
@ -96,8 +99,8 @@ React\Promise\all([$connector('ws://127.0.0.1:8080'), $connector('ws://movim.eu:
$conn2->on('close', function($msg) use ($logger) {
$logger->notice("XMPP : Got close");
if(isset($conn1)) $conn1->close();
if(isset($loop)) $loop->stop();
if($conn1 != null) $conn1->close();
if($loop != null) $loop->stop();
});
$obj = new \StdClass;

Loading…
Cancel
Save