1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
'use strict';
/* App Controllers */
function ConnectCtl($scope, StropheSrv, $log, $rootScope) {
$rootScope.username = $scope.username;
$rootScope.is_connected = function () {
return $rootScope.status == Strophe.Status.CONNECTED;
};
function connect_callback(status){
$rootScope.status = status;
switch(status) {
case Strophe.Status.CONNECTING:
$log.log('Strophe is connecting.');
break;
case Strophe.Status.CONNFAIL:
$log.log('Strophe failed to connect.');
break;
case Strophe.Status.DISCONNECTING:
$log.log('Strophe is disconnecting.');
break;
case Strophe.Status.DISCONNECTED:
$log.log('Strophe is disconnected.');
break;
case Strophe.Status.CONNECTED:
$log.log('Strophe is connected.');
$rootScope.$broadcast('connected', true);
}
};
$scope.login = function () {
StropheSrv.login($scope.username, $scope.password, connect_callback);
};
$scope.disconnect = function() {
StropheSrv.disconnect();
};
}
ConnectCtl.$inject = ['$scope', 'StropheSrv', '$log', '$rootScope'];
function RosterCtl($scope, StropheSrv, $log, $rootScope) {
$scope.contacts = {};
$scope.get_contacts = function() {
return _.toArray($scope.contacts);
};
function onRoster(iq) {
var elems = iq.getElementsByTagName('query');
var query = elems[0];
Strophe.forEachChild(query, 'item', function(item){
var jid = item.getAttribute('jid');
var name = item.getAttribute('name')||'';
//contacts are offline by default
$scope.contacts[jid] = {jid: jid, name: name, status: 'offline'};
});
//make sure the roster is populated before sending presence request
StropheSrv.send($pres());
};
function onPresence(presence) {
var who = $(presence).attr('from');
var jid = Strophe.getBareJidFromJid(who);
var type = $(presence).attr('type');
// if (jid in $scope.contacts) {
if(_.has($scope.contacts, jid)){
if (type !== 'error') {
if (type === 'unavailable') {
$log.log(jid +' is offline');
$scope.contacts[jid]['status'] = 'offline';
}else{
var show = $(presence).find('show').text();
if (show === '') {
$scope.contacts[jid]['status'] = 'online';
}else{
$log.log(jid +' is away');
$scope.contacts[jid]['status'] = 'away';
}
}
}
}
}
$scope.$on('connected', function() {
StropheSrv.addHandler(onPresence, 'presence');
$scope.getRoster();
});
$scope.getRoster = function() {
var query = $iq({type : 'get'}).c('query', {xmlns : Strophe.NS.ROSTER});
StropheSrv.sendIQ(query, onRoster);
};
$scope.chatWith = function(contact) {
$rootScope.$broadcast('msgrequest', contact.name||contact.jid);
};
}
RosterCtl.$inject = ['$scope','StropheSrv','$log', '$rootScope'];
function MsgCtl($scope, $log) {
$scope.conversations = [];
$scope.activeConversation = '';
$scope.$on('msgrequest', function(event, contact) {
$log.log(contact);
if (_.indexOf($scope.conversations, contact)==-1) {
$scope.conversations.push(contact);
$scope.activeConversation = contact;
}
});
$scope.isActive = function(conversation) {
return ($scope.activeConversation == conversation) ? 'active' : '';
};
$scope.delete = function(conversation) {
$scope.conversations.splice(_.indexOf($scope.conversations, conversation),1);
};
$scope.activate = function(conversation) {
$log.log(conversation+' was clicked');
$scope.activeConversation = conversation;
};
}
MsgCtl.$inject = ['$scope','$log'];
|