Commit 114a25a1 authored by JC Brand's avatar JC Brand

Add initial text on writing a converse.js plugin.

parent b47069b4
......@@ -618,3 +618,102 @@ Here are the different events that are emitted:
+---------------------------------+---------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------+
| **contactStatusMessageChanged** | When a chat buddy's custom status message has changed. | ``converse.listen.on('contactStatusMessageChanged', function (event, buddy, messageText) { ... });`` |
+---------------------------------+---------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------+
Writing a converse.js plugin
============================
Converse.js exposes a plugin mechanism which allows developers to extend and
override its functionality.
You register a plugin as follows:
.. code-block:: javascript
converse.plugins.add('myplugin', {
// Your plugin code goes in here
});
Security and access to the inner workings
-----------------------------------------
The globally available ``converse`` object, which exposes the API methods, such
as ``initialize`` and ``plugins.add``, is a wrapper that encloses and protects
a sensitive inner object.
This inner object contains all the Backbone models and views, as well as
various other attributes and functions.
Within a plugin, you will have access to this internal
`"closured" <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures>`_
converse object, which is normally not exposed in the global variable scope. The
hiding of this inner object is due to the fact that it contains sensitive information,
such as the user's JID and password (if they logged in manually). You should
therefore make sure NOT to expose this object globally.
An example plugin
-----------------
.. code-block:: javascript
(function (root, factory) {
if (typeof define === 'function' && define.amd) {
define("myplugin", ["jquery", "strophe", "utils", "converse"], factory);
}
}(this, function ($, strophe, utils, converse_api) {
// Wrap your UI strings with the __ function for translation support.
var __ = $.proxy(utils.__, this);
// Strophe methods for building stanzas
var Strophe = strophe.Strophe;
$iq = strophe.$iq;
$msg = strophe.$msg;
$build = strophe.$build;
// The following line registers your plugin.
converse_api.plugins.add('myplugin', {
myFunction: function () {
// This is a function which does not override anything in
// converse.js itself, but in which you still have access to
// the protected "inner" converse object.
var converse = this.converse;
// Custom code comes here
// ...
},
overrides: {
// If you want to override some function or a Backbone model or
// view defined inside converse, then you do that under this
// "overrides" namespace.
// For example, the inner protected *converse* object has a
// method "onConnected". You can override that method as follows:
onConnected: function () {
// Override the onConnected method in converse.js
// You have access to the protected converse object via the
// _super attribute.
var converse = this._super.converse;
// Your custom code comes here.
// ...
// You can access the original function being overridden
// vai the _super attribute.
this._super.onConnected();
},
XMPPStatus: {
// Override converse.js's XMPPStatus Backbone model so that we can override the
// function that sends out the presence stanza.
sendPresence: function (type, status_message, jid) {
var converse = this._super.converse;
// Custom code can come here
// ...
this._super.sendPresence(type, status_message, jid);
}
},
}
});
}));
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment