Parcourir la source

Add the ability to replay transcripts of chat logs.

JC Brand il y a 9 ans
Parent
commit
218000551d
5 fichiers modifiés avec 86 ajouts et 3 suppressions
  1. 2 0
      .gitignore
  2. 5 0
      converse-logs/converse-logs.js
  3. 76 0
      spec/transcripts.js
  4. 2 2
      src/converse-core.js
  5. 1 1
      tests/utils.js

+ 2 - 0
.gitignore

@@ -11,6 +11,8 @@
 analytics.js
 .idea
 
+converse-logs/*.html
+
 # Ruby/Sass/Bundler
 .bundle
 .sass-cache

+ 5 - 0
converse-logs/converse-logs.js

@@ -0,0 +1,5 @@
+define("transcripts", [
+    "tpl!converse-logs/conversejs.containers-1460718487729",
+], function () {
+    return arguments;
+});

+ 76 - 0
spec/transcripts.js

@@ -0,0 +1,76 @@
+/*global converse */
+(function (root, factory) {
+    define([
+        "jquery",
+        "underscore",
+        "mock",
+        "test_utils",
+        "utils",
+        "transcripts"
+        ], factory
+    );
+} (this, function ($, _, mock, test_utils, utils, transcripts) {
+    var Strophe = converse_api.env.Strophe;
+    var IGNORED_TAGS = [
+        'stream:features',
+        'auth',
+        'challenge',
+        'success',
+        'stream:features',
+        'response'
+    ];
+
+    function traverseElement (el, _stanza) {
+        if (typeof _stanza !== 'undefined') {
+            if (el.nodeType === 3) {
+                _stanza.t(el.nodeValue);
+                return _stanza;
+            } else {
+                _stanza = _stanza.c(el.nodeName.toLowerCase(), getAttributes(el));
+            }
+        } else {
+            _stanza = new Strophe.Builder(
+                el.nodeName.toLowerCase(),
+                getAttributes(el)
+            );
+        }
+        _.each(el.childNodes, _.partial(traverseElement, _, _stanza));
+        return _stanza.up();
+    }
+
+    function getAttributes (el) {
+        var attributes = {};
+        _.each(el.attributes, function (att) {
+            attributes[att.nodeName] = att.nodeValue;
+        });
+        return attributes;
+    }
+
+    return describe("Transcripts of chat logs", function () {
+        beforeEach(function () {
+            test_utils.openChatRoom("discuss", 'conference.conversejs.org', 'jc');
+            test_utils.openChatRoom("dummy", 'rooms.localhost', 'jc');
+            test_utils.openChatRoom("prosody", 'conference.prosody.im', 'jc');
+        });
+
+        it("can be used to replay conversations", function () {
+            spyOn(converse, 'areDesktopNotificationsEnabled').andReturn(true);
+            _.each(transcripts, function (transcript) {
+                var text = transcript();
+                var xml = Strophe.xmlHtmlNode(text);
+                $(xml).children('log').children('body').each(function (i, el) {
+                    $(el).children().each(function (i, el) {
+                        if (el.nodeType === 3) {
+                            return;  // Ignore text
+                        }
+                        if (_.contains(IGNORED_TAGS, el.nodeName.toLowerCase())) {
+                            return;
+                        }
+                        var _stanza = traverseElement(el);
+                        converse.connection._dataRecv(test_utils.createRequest(_stanza));
+                    });
+                });
+            });
+        });
+    });
+}));

+ 2 - 2
src/converse-core.js

@@ -1567,8 +1567,8 @@
 
         this.setUpXMLLogging = function () {
             if (this.debug) {
-                this.connection.xmlInput = function (body) { converse.log(body); };
-                this.connection.xmlOutput = function (body) { converse.log(body); };
+                this.connection.xmlInput = function (body) { converse.log(body.outerHTML); };
+                this.connection.xmlOutput = function (body) { converse.log(body.outerHTML); };
             }
         };
 

+ 1 - 1
tests/utils.js

@@ -13,7 +13,7 @@
     utils.createRequest = function (iq) {
         iq = typeof iq.tree == "function" ? iq.tree() : iq;
         var req = new Strophe.Request(iq, function() {});
-        req.getResponse = function() {
+        req.getResponse = function () {
             var env = new Strophe.Builder('env', {type: 'mock'}).tree();
             env.appendChild(iq);
             return env;