Quellcode durchsuchen

Implements support for events for the API. Adds toggleChat and toggleContactList commands. Renames filmStrip to toggleFilmStrip command. Fixes issues with removing the embedded Jitsi Meet.

j8
hristoterezov vor 10 Jahren
Ursprung
Commit
a3d0050328
7 geänderte Dateien mit 407 neuen und 15 gelöschten Zeilen
  1. 104
    2
      api_connector.js
  2. 10
    0
      app.js
  3. 91
    2
      doc/api.md
  4. 177
    5
      external_api.js
  5. 4
    4
      index.html
  6. 10
    1
      muc.js
  7. 11
    1
      videolayout.js

+ 104
- 2
api_connector.js Datei anzeigen

21
         displayName: VideoLayout.inputDisplayNameHandler,
21
         displayName: VideoLayout.inputDisplayNameHandler,
22
         muteAudio: toggleAudio,
22
         muteAudio: toggleAudio,
23
         muteVideo: toggleVideo,
23
         muteVideo: toggleVideo,
24
-        filmStrip: BottomToolbar.toggleFilmStrip
24
+        toggleFilmStrip: BottomToolbar.toggleFilmStrip,
25
+        toggleChat: BottomToolbar.toggleChat,
26
+        toggleContactList: BottomToolbar.toggleContactList
27
+    };
28
+
29
+
30
+    /**
31
+     * Maps the supported events and their status
32
+     * (true it the event is enabled and false if it is disabled)
33
+     * @type {{
34
+     *              incommingMessage: boolean,
35
+     *              outgoingMessage: boolean,
36
+     *              displayNameChange: boolean,
37
+     *              participantJoined: boolean,
38
+     *              participantLeft: boolean
39
+     *      }}
40
+     */
41
+    var events =
42
+    {
43
+        incommingMessage: false,
44
+        outgoingMessage:false,
45
+        displayNameChange: false,
46
+        participantJoined: false,
47
+        participantLeft: false
25
     };
48
     };
26
 
49
 
27
     /**
50
     /**
51
         {
74
         {
52
             window.attachEvent('onmessage', APIConnector.processMessage);
75
             window.attachEvent('onmessage', APIConnector.processMessage);
53
         }
76
         }
54
-        APIConnector.sendMessage({loaded: true});
77
+        APIConnector.sendMessage({type: "system", loaded: true});
55
     };
78
     };
56
 
79
 
57
     /**
80
     /**
72
         try {
95
         try {
73
             message = JSON.parse(event.data);
96
             message = JSON.parse(event.data);
74
         } catch (e) {}
97
         } catch (e) {}
98
+
99
+        if(!message.type)
100
+            return;
101
+        switch (message.type)
102
+        {
103
+            case "command":
104
+                APIConnector.processCommand(message);
105
+                break;
106
+            case "event":
107
+                APIConnector.processEvent(message);
108
+                break;
109
+            default:
110
+                console.error("Unknown type of the message");
111
+                return;
112
+        }
113
+
114
+    };
115
+
116
+    /**
117
+     * Processes commands from external applicaiton.
118
+     * @param message the object with the command
119
+     */
120
+    APIConnector.processCommand = function (message)
121
+    {
122
+        if(message.action != "execute")
123
+        {
124
+            console.error("Unknown action of the message");
125
+            return;
126
+        }
75
         for(var key in message)
127
         for(var key in message)
76
         {
128
         {
77
             if(commands[key])
129
             if(commands[key])
78
                 commands[key].apply(null, message[key]);
130
                 commands[key].apply(null, message[key]);
79
         }
131
         }
132
+    };
133
+
134
+    /**
135
+     * Processes events objects from external applications
136
+     * @param event the event
137
+     */
138
+    APIConnector.processEvent = function (event) {
139
+        if(!event.action)
140
+        {
141
+            console.error("Event with no action is received.");
142
+            return;
143
+        }
144
+
145
+        switch(event.action)
146
+        {
147
+            case "add":
148
+                for(var i = 0; i < event.events.length; i++)
149
+                {
150
+                    events[event.events[i]] = true;
151
+                }
152
+                break;
153
+            case "remove":
154
+                for(var i = 0; i < event.events.length; i++)
155
+                {
156
+                    events[event.events[i]] = false;
157
+                }
158
+                break;
159
+            default:
160
+                console.error("Unknown action for event.");
161
+        }
80
 
162
 
81
     };
163
     };
82
 
164
 
165
+    /**
166
+     * Checks whether the event is enabled ot not.
167
+     * @param name the name of the event.
168
+     * @returns {*}
169
+     */
170
+    APIConnector.isEventEnabled = function (name) {
171
+        return events[name];
172
+    };
173
+
174
+    /**
175
+     * Sends event object to the external application that has been subscribed
176
+     * for that event.
177
+     * @param name the name event
178
+     * @param object data associated with the event
179
+     */
180
+    APIConnector.triggerEvent = function (name, object) {
181
+        APIConnector.sendMessage({
182
+            type: "event", action: "result", event: name, result: object});
183
+    };
184
+
83
     /**
185
     /**
84
      * Removes the listeners.
186
      * Removes the listeners.
85
      */
187
      */

+ 10
- 0
app.js Datei anzeigen

698
     // Add Peer's container
698
     // Add Peer's container
699
     VideoLayout.ensurePeerContainerExists(jid);
699
     VideoLayout.ensurePeerContainerExists(jid);
700
 
700
 
701
+    if(APIConnector.isEnabled() && APIConnector.isEventEnabled("participantJoined"))
702
+    {
703
+        APIConnector.triggerEvent("participantJoined",{jid: jid});
704
+    }
705
+
701
     if (focus !== null) {
706
     if (focus !== null) {
702
         // FIXME: this should prepare the video
707
         // FIXME: this should prepare the video
703
         if (focus.confid === null) {
708
         if (focus.confid === null) {
734
         }
739
         }
735
     }, 10);
740
     }, 10);
736
 
741
 
742
+    if(APIConnector.isEnabled() && APIConnector.isEventEnabled("participantLeft"))
743
+    {
744
+        APIConnector.triggerEvent("participantLeft",{jid: jid});
745
+    }
746
+
737
     // Unlock large video
747
     // Unlock large video
738
     if (focusedVideoSrc)
748
     if (focusedVideoSrc)
739
     {
749
     {

+ 91
- 2
doc/api.md Datei anzeigen

33
 =========
33
 =========
34
 
34
 
35
 You can control the embedded Jitsi Meet conference using the JitsiMeetExternalAPI object.
35
 You can control the embedded Jitsi Meet conference using the JitsiMeetExternalAPI object.
36
+
36
 You can send command to Jitsi Meet conference using ```executeCommand```. 
37
 You can send command to Jitsi Meet conference using ```executeCommand```. 
37
 ```
38
 ```
38
 api.executeCommand(command, arguments)
39
 api.executeCommand(command, arguments)
56
 ```
57
 ```
57
 api.executeCommand('muteVideo', [])
58
 api.executeCommand('muteVideo', [])
58
 ```
59
 ```
59
-* **filmStrip** - hides / shows the film strip. No arguments are required.
60
+* **toggleFilmStrip** - hides / shows the film strip. No arguments are required.
60
 ```
61
 ```
61
 api.executeCommand('filmStrip', [])
62
 api.executeCommand('filmStrip', [])
62
 ```
63
 ```
64
+* **toggleChat** - hides / shows the chat. No arguments are required.
65
+```
66
+api.executeCommand('toggleChat', [])
67
+```
68
+* **toggleContactList** - hides / shows the contact list. No arguments are required.
69
+```
70
+api.executeCommand('toggleContactList', [])
71
+```
63
 
72
 
64
 You can also execute multiple commands using the method ```executeCommands```. 
73
 You can also execute multiple commands using the method ```executeCommands```. 
65
 ```
74
 ```
72
 api.executeCommands({displayName: ['nickname'], muteAudio: []});
81
 api.executeCommands({displayName: ['nickname'], muteAudio: []});
73
 ```
82
 ```
74
 
83
 
75
-You can also remove the embedded Jitsi Meet Conference with the following code:
84
+You can add event listeners to the embedded Jitsi Meet using ```addEventListener``` method.
85
+```
86
+api.addEventListener(event, listener)
87
+```
88
+The ```event``` parameter is String object with the name of the event.
89
+The ```listener``` paramenter is Function object with one argument that will be notified when the event occurs
90
+with data related to the event.
91
+
92
+Currently we support the following events:
93
+
94
+* **incommingMessage** - event notifications about incomming
95
+messages. The listener will receive object with the following structure:
96
+```
97
+{
98
+"from": from,//JID of the user that sent the message
99
+"nick": nick,//the nickname of the user that sent the message
100
+"message": txt//the text of the message
101
+}
102
+```
103
+* **outgoingMessage** - event notifications about outgoing
104
+messages. The listener will receive object with the following structure:
105
+```
106
+{
107
+"message": txt//the text of the message
108
+}
109
+```
110
+* **displayNameChanged** - event notifications about display name
111
+change. The listener will receive object with the following structure:
112
+```
113
+{
114
+jid: jid,//the JID of the participant that changed his display name
115
+displayname: displayName //the new display name
116
+}
117
+```
118
+* **participantJoined** - event notifications about new participant.
119
+The listener will receive object with the following structure:
120
+```
121
+{
122
+jid: jid //the jid of the participant
123
+}
124
+```
125
+* **participantLeft** - event notifications about participant that left room.
126
+The listener will receive object with the following structure:
127
+```
128
+{
129
+jid: jid //the jid of the participant
130
+}
131
+```
132
+
133
+You can also add multiple event listeners by using ```addEventListeners```.
134
+This method requires one argument of type Object. The object argument must 
135
+have keys with the names of the events and values the listeners of the events.
136
+
137
+```
138
+function incommingMessageListener(object)
139
+{
140
+...
141
+}
142
+
143
+function outgoingMessageListener(object)
144
+{
145
+...
146
+}
147
+
148
+api.addEventListeners({
149
+    incommingMessage: incommingMessageListener,
150
+    outgoingMessage: outgoingMessageListener})
151
+```
152
+
153
+If you want to remove a listener you can use ```removeEventListener``` method with argument the name of the event.
154
+```
155
+api.removeEventListener("incommingMessage");
156
+```
157
+
158
+If you want to remove more than one event you can use ```removeEventListeners``` method with argument
159
+ array with the names of the events.
160
+```
161
+api.removeEventListeners(["incommingMessage", "outgoingMessageListener"]);
162
+```
163
+
164
+You can remove the embedded Jitsi Meet Conference with the following code:
76
 ```
165
 ```
77
 api.dispose()
166
 api.dispose()
78
 ```
167
 ```

+ 177
- 5
external_api.js Datei anzeigen

48
         this.iframeHolder.style.width = width + "px";
48
         this.iframeHolder.style.width = width + "px";
49
         this.iframeHolder.style.height = height + "px";
49
         this.iframeHolder.style.height = height + "px";
50
         this.frameName = "jitsiConferenceFrame" + JitsiMeetExternalAPI.id;
50
         this.frameName = "jitsiConferenceFrame" + JitsiMeetExternalAPI.id;
51
-        this.url = "https://" + domain + "/";
51
+        this.url = "http://" + domain + "/";
52
         if(room_name)
52
         if(room_name)
53
             this.url += room_name;
53
             this.url += room_name;
54
         this.url += "#external";
54
         this.url += "#external";
57
         this.frame = document.createElement("iframe");
57
         this.frame = document.createElement("iframe");
58
         this.frame.src = this.url;
58
         this.frame.src = this.url;
59
         this.frame.name = this.frameName;
59
         this.frame.name = this.frameName;
60
+        this.frame.id = this.frameName;
60
         this.frame.width = "100%";
61
         this.frame.width = "100%";
61
         this.frame.height = "100%";
62
         this.frame.height = "100%";
63
+        this.frame.setAttribute("allowFullScreen","true");
62
         this.frame = this.iframeHolder.appendChild(this.frame);
64
         this.frame = this.iframeHolder.appendChild(this.frame);
63
 
65
 
66
+
64
         this.frameLoaded = false;
67
         this.frameLoaded = false;
65
         this.initialCommands = [];
68
         this.initialCommands = [];
69
+        this.eventHandlers = {};
66
         this.initListeners();
70
         this.initListeners();
67
     }
71
     }
68
 
72
 
108
         var argumentsArray = argumentsList;
112
         var argumentsArray = argumentsList;
109
         if(!argumentsArray)
113
         if(!argumentsArray)
110
             argumentsArray = [];
114
             argumentsArray = [];
111
-        var object = {};
115
+        var object = {type: "command", action: "execute"};
112
         object[name] = argumentsArray;
116
         object[name] = argumentsArray;
113
         this.sendMessage(object);
117
         this.sendMessage(object);
114
     };
118
     };
125
      * arguments for the command.
129
      * arguments for the command.
126
      */
130
      */
127
     JitsiMeetExternalAPI.prototype.executeCommands = function (object) {
131
     JitsiMeetExternalAPI.prototype.executeCommands = function (object) {
132
+        object.type = "command";
133
+        object.action = "execute";
128
         this.sendMessage(object);
134
         this.sendMessage(object);
129
     };
135
     };
130
 
136
 
137
+    /**
138
+     * Adds event listeners to Meet Jitsi. The object key should be the name of the
139
+     * event and value - the listener.
140
+     * Currently we support the following
141
+     * events:
142
+     * incommingMessage - receives event notifications about incomming
143
+     * messages. The listener will receive object with the following structure:
144
+     * {{
145
+     *  "from": from,//JID of the user that sent the message
146
+     *  "nick": nick,//the nickname of the user that sent the message
147
+     *  "message": txt//the text of the message
148
+     * }}
149
+     * outgoingMessage - receives event notifications about outgoing
150
+     * messages. The listener will receive object with the following structure:
151
+     * {{
152
+     *  "message": txt//the text of the message
153
+     * }}
154
+     * displayNameChanged - receives event notifications about display name
155
+     * change. The listener will receive object with the following structure:
156
+     * {{
157
+     * jid: jid,//the JID of the participant that changed his display name
158
+     * displayname: displayName //the new display name
159
+     * }}
160
+     * participantJoined - receives event notifications about new participant.
161
+     * The listener will receive object with the following structure:
162
+     * {{
163
+     * jid: jid //the jid of the participant
164
+     * }}
165
+     * participantLeft - receives event notifications about participant that left room.
166
+     * The listener will receive object with the following structure:
167
+     * {{
168
+     * jid: jid //the jid of the participant
169
+     * }}
170
+     * @param object
171
+     */
172
+    JitsiMeetExternalAPI.prototype.addEventListeners
173
+        = function (object)
174
+    {
175
+
176
+        var message = {type: "event", action: "add", events: []};
177
+        for(var i in object)
178
+        {
179
+            message.events.push(i);
180
+            this.eventHandlers[i] = object[i];
181
+        }
182
+        this.sendMessage(message);
183
+    };
184
+
185
+    /**
186
+     * Adds event listeners to Meet Jitsi. Currently we support the following
187
+     * events:
188
+     * incommingMessage - receives event notifications about incomming
189
+     * messages. The listener will receive object with the following structure:
190
+     * {{
191
+     *  "from": from,//JID of the user that sent the message
192
+     *  "nick": nick,//the nickname of the user that sent the message
193
+     *  "message": txt//the text of the message
194
+     * }}
195
+     * outgoingMessage - receives event notifications about outgoing
196
+     * messages. The listener will receive object with the following structure:
197
+     * {{
198
+     *  "message": txt//the text of the message
199
+     * }}
200
+     * displayNameChanged - receives event notifications about display name
201
+     * change. The listener will receive object with the following structure:
202
+     * {{
203
+     * jid: jid,//the JID of the participant that changed his display name
204
+     * displayname: displayName //the new display name
205
+     * }}
206
+     * participantJoined - receives event notifications about new participant.
207
+     * The listener will receive object with the following structure:
208
+     * {{
209
+     * jid: jid //the jid of the participant
210
+     * }}
211
+     * participantLeft - receives event notifications about participant that left room.
212
+     * The listener will receive object with the following structure:
213
+     * {{
214
+     * jid: jid //the jid of the participant
215
+     * }}
216
+     * @param event the name of the event
217
+     * @param listener the listener
218
+     */
219
+    JitsiMeetExternalAPI.prototype.addEventListener
220
+        = function (event, listener)
221
+    {
222
+
223
+        var message = {type: "event", action: "add", events: [event]};
224
+        this.eventHandlers[event] = listener;
225
+        this.sendMessage(message);
226
+    };
227
+
228
+    /**
229
+     * Removes event listener.
230
+     * @param event the name of the event.
231
+     */
232
+    JitsiMeetExternalAPI.prototype.removeEventListener
233
+        = function (event)
234
+    {
235
+        if(!this.eventHandlers[event])
236
+        {
237
+            console.error("The event " + event + " is not registered.");
238
+            return;
239
+        }
240
+        var message = {type: "event", action: "remove", events: [event]};
241
+        delete this.eventHandlers[event];
242
+        this.sendMessage(message);
243
+    };
244
+
245
+    /**
246
+     * Removes event listeners.
247
+     * @param events array with the names of the events.
248
+     */
249
+    JitsiMeetExternalAPI.prototype.removeEventListeners
250
+        = function (events)
251
+    {
252
+        var eventsArray = [];
253
+        for(var i = 0; i < events.length; i++)
254
+        {
255
+            var event = events[i];
256
+            if(!this.eventHandlers[event])
257
+            {
258
+                console.error("The event " + event + " is not registered.");
259
+                continue;
260
+            }
261
+            delete this.eventHandlers[event];
262
+            eventsArray.push(event);
263
+        }
264
+
265
+        if(eventsArray.length > 0)
266
+        {
267
+            this.sendMessage(
268
+                {type: "event", action: "remove", events: eventsArray});
269
+        }
270
+
271
+    };
272
+
131
     /**
273
     /**
132
      * Processes message events sent from Jitsi Meet
274
      * Processes message events sent from Jitsi Meet
133
      * @param event the event
275
      * @param event the event
138
         try {
280
         try {
139
             message = JSON.parse(event.data);
281
             message = JSON.parse(event.data);
140
         } catch (e) {}
282
         } catch (e) {}
141
-        if(message.loaded)
283
+
284
+        if(!message.type) {
285
+            console.error("Message without type is received.");
286
+            return;
287
+        }
288
+        switch (message.type)
142
         {
289
         {
143
-            this.onFrameLoaded();
290
+            case "system":
291
+                if(message.loaded)
292
+                {
293
+                    this.onFrameLoaded();
294
+                }
295
+                break;
296
+            case "event":
297
+                if(message.action != "result" ||
298
+                    !message.event || !this.eventHandlers[message.event])
299
+                {
300
+                    console.warn("The received event cannot be parsed.");
301
+                    return;
302
+                }
303
+                this.eventHandlers[message.event](message.result);
304
+                break;
305
+            default :
306
+                console.error("Unknown message type.");
307
+                return;
144
         }
308
         }
145
 
309
 
310
+
146
     };
311
     };
147
 
312
 
148
     /**
313
     /**
191
             window.detachEvent('onmessage',
356
             window.detachEvent('onmessage',
192
                 this.eventListener);
357
                 this.eventListener);
193
         }
358
         }
194
-        this.iframeHolder.parentNode.removeChild(this.iframeHolder);
359
+        var frame = document.getElementById(this.frameName);
360
+        if(frame)
361
+            frame.src = 'about:blank';
362
+        var self = this;
363
+        window.setTimeout(function () {
364
+                self.iframeHolder.removeChild(self.frame);
365
+                self.iframeHolder.parentNode.removeChild(self.iframeHolder);
366
+        }, 10);
195
     };
367
     };
196
 
368
 
197
     return JitsiMeetExternalAPI;
369
     return JitsiMeetExternalAPI;

+ 4
- 4
index.html Datei anzeigen

30
     <script src="libs/popover.js?v=1"></script><!-- bootstrap tooltip lib -->
30
     <script src="libs/popover.js?v=1"></script><!-- bootstrap tooltip lib -->
31
     <script src="interface_config.js?v=2"></script>
31
     <script src="interface_config.js?v=2"></script>
32
     <script src="brand.js?v=1"></script>
32
     <script src="brand.js?v=1"></script>
33
-    <script src="muc.js?v=15"></script><!-- simple MUC library -->
33
+    <script src="muc.js?v=16"></script><!-- simple MUC library -->
34
     <script src="estos_log.js?v=2"></script><!-- simple stanza logger -->
34
     <script src="estos_log.js?v=2"></script><!-- simple stanza logger -->
35
     <script src="desktopsharing.js?v=3"></script><!-- desktop sharing -->
35
     <script src="desktopsharing.js?v=3"></script><!-- desktop sharing -->
36
     <script src="data_channels.js?v=3"></script><!-- data channels -->
36
     <script src="data_channels.js?v=3"></script><!-- data channels -->
37
-    <script src="app.js?v=18"></script><!-- application logic -->
37
+    <script src="app.js?v=19"></script><!-- application logic -->
38
     <script src="commands.js?v=1"></script><!-- application logic -->
38
     <script src="commands.js?v=1"></script><!-- application logic -->
39
     <script src="chat.js?v=13"></script><!-- chat logic -->
39
     <script src="chat.js?v=13"></script><!-- chat logic -->
40
     <script src="contact_list.js?v=5"></script><!-- contact list logic -->
40
     <script src="contact_list.js?v=5"></script><!-- contact list logic -->
47
     <script src="analytics.js?v=1"></script><!-- google analytics plugin -->
47
     <script src="analytics.js?v=1"></script><!-- google analytics plugin -->
48
     <script src="rtp_sts.js?v=4"></script><!-- RTP stats processing -->
48
     <script src="rtp_sts.js?v=4"></script><!-- RTP stats processing -->
49
     <script src="local_sts.js?v=2"></script><!-- Local stats processing -->
49
     <script src="local_sts.js?v=2"></script><!-- Local stats processing -->
50
-    <script src="videolayout.js?v=22"></script><!-- video ui -->
50
+    <script src="videolayout.js?v=23"></script><!-- video ui -->
51
     <script src="connectionquality.js?v=1"></script>
51
     <script src="connectionquality.js?v=1"></script>
52
     <script src="toolbar.js?v=6"></script><!-- toolbar ui -->
52
     <script src="toolbar.js?v=6"></script><!-- toolbar ui -->
53
     <script src="toolbar_toggler.js?v=2"></script>
53
     <script src="toolbar_toggler.js?v=2"></script>
60
     <script src="tracking.js?v=1"></script><!-- tracking -->
60
     <script src="tracking.js?v=1"></script><!-- tracking -->
61
     <script src="jitsipopover.js?v=3"></script>
61
     <script src="jitsipopover.js?v=3"></script>
62
     <script src="message_handler.js?v=1"></script>
62
     <script src="message_handler.js?v=1"></script>
63
-    <script src="api_connector.js?v=1"></script>
63
+    <script src="api_connector.js?v=2"></script>
64
     <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
64
     <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
65
     <link rel="stylesheet" href="css/font.css?v=5"/>
65
     <link rel="stylesheet" href="css/font.css?v=5"/>
66
     <link rel="stylesheet" type="text/css" media="screen" href="css/main.css?v=28"/>
66
     <link rel="stylesheet" type="text/css" media="screen" href="css/main.css?v=28"/>

+ 10
- 1
muc.js Datei anzeigen

201
             msg.c('nick', {xmlns: 'http://jabber.org/protocol/nick'}).t(nickname).up().up();
201
             msg.c('nick', {xmlns: 'http://jabber.org/protocol/nick'}).t(nickname).up().up();
202
         }
202
         }
203
         this.connection.send(msg);
203
         this.connection.send(msg);
204
+        if(APIConnector.isEnabled() && APIConnector.isEventEnabled("outgoingMessage"))
205
+        {
206
+            APIConnector.triggerEvent("outgoingMessage", {"message": body});
207
+        }
204
     },
208
     },
205
     setSubject: function (subject){
209
     setSubject: function (subject){
206
         var msg = $msg({to: this.roomjid, type: 'groupchat'});
210
         var msg = $msg({to: this.roomjid, type: 'groupchat'});
234
 
238
 
235
         if (txt) {
239
         if (txt) {
236
             console.log('chat', nick, txt);
240
             console.log('chat', nick, txt);
237
-
238
             Chat.updateChatConversation(from, nick, txt);
241
             Chat.updateChatConversation(from, nick, txt);
242
+            if(APIConnector.isEnabled() && APIConnector.isEventEnabled("incommingMessage"))
243
+            {
244
+                if(from != this.myroomjid)
245
+                    APIConnector.triggerEvent("incommingMessage",
246
+                        {"from": from, "nick": nick, "message": txt});
247
+            }
239
         }
248
         }
240
         return true;
249
         return true;
241
     },
250
     },

+ 11
- 1
videolayout.js Datei anzeigen

1274
      */
1274
      */
1275
     $(document).bind('displaynamechanged',
1275
     $(document).bind('displaynamechanged',
1276
                     function (event, jid, displayName, status) {
1276
                     function (event, jid, displayName, status) {
1277
+        var name = null;
1277
         if (jid === 'localVideoContainer'
1278
         if (jid === 'localVideoContainer'
1278
             || jid === connection.emuc.myroomjid) {
1279
             || jid === connection.emuc.myroomjid) {
1280
+            name = nickname;
1279
             setDisplayName('localVideoContainer',
1281
             setDisplayName('localVideoContainer',
1280
                            displayName);
1282
                            displayName);
1281
         } else {
1283
         } else {
1282
             VideoLayout.ensurePeerContainerExists(jid);
1284
             VideoLayout.ensurePeerContainerExists(jid);
1283
-
1285
+            name = $('#participant_' + Strophe.getResourceFromJid(jid) + "_name").text();
1284
             setDisplayName(
1286
             setDisplayName(
1285
                 'participant_' + Strophe.getResourceFromJid(jid),
1287
                 'participant_' + Strophe.getResourceFromJid(jid),
1286
                 displayName,
1288
                 displayName,
1287
                 status);
1289
                 status);
1288
         }
1290
         }
1291
+
1292
+        if(APIConnector.isEnabled() && APIConnector.isEventEnabled("displayNameChange"))
1293
+        {
1294
+            if(jid === 'localVideoContainer')
1295
+                jid = connection.emuc.myroomjid;
1296
+            if(!name || name != displayName)
1297
+                APIConnector.triggerEvent("displayNameChange",{jid: jid, displayname: displayName});
1298
+        }
1289
     });
1299
     });
1290
 
1300
 
1291
     /**
1301
     /**

Laden…
Abbrechen
Speichern