Comparar commits

...

53 Commits

Autor SHA1 Mensagem Data
sualko 6687eaa66c v3.2.0-beta.1 2017-04-04 14:12:09 +02:00
sualko 895cae067c add github release task 2017-04-03 17:13:32 +02:00
Klaus b0b3245e4e Merge pull request #502 from mmoqui/master
A little bug: user name missing in the composing message
2017-04-03 16:06:08 +02:00
Klaus 8f58a939fb Merge pull request #493 from jsxc/feature-mam
Message Archive Management (XEP-0313)
2017-04-03 15:54:33 +02:00
sualko 068f60c64e update locales 2017-04-03 15:51:38 +02:00
Miguel Moquillon 240a257397 When one user is composing a message in a groupchat, its name appears in the composing notification in the groupchat window of the others users.
When more than one user are composing simultaneously in a groupchat, their names appear in the composing notification in the groupchat window of the others users.
In a peer-to-peer chat, no name appears in the composing notification in the chat window as the name of the buddy is already displayed in the chat window header
2017-03-31 10:23:58 +02:00
sualko bca7af73ec update lang
add nl
2017-03-30 15:01:35 +02:00
sualko 62f6ddbfbe enable screen sharing for ff 52 even without extension (fix #488) 2017-03-30 14:29:44 +02:00
sualko fa831e25ca disable mam by default and add setting 2017-03-30 14:19:12 +02:00
sualko 3e7633d2c8 build v3.2.0-nightly.1 2017-03-20 17:43:33 +01:00
sualko 92e38a8abb update change log 2017-03-20 17:40:26 +01:00
sualko 7765b6b46f Merge branch 'master' into feature-mam 2017-03-20 17:30:16 +01:00
sualko d675401bc8 move composing message to window header (fix #468) 2017-03-20 17:26:59 +01:00
sualko 16e519d5ec fix state reset after disconnect 2017-03-20 16:31:03 +01:00
sualko 62ca260ba3 force features reload on log in 2017-03-20 16:20:58 +01:00
sualko f1a83cd696 fix mam feature detection 2017-03-20 16:17:54 +01:00
sualko 3d97567429 add no permanent store processing hint
XEP-0334
2017-03-20 15:09:21 +01:00
sualko 3226a3c940 make mam slave safe 2017-03-20 14:54:18 +01:00
sualko 31eba50c99 update locales 2017-03-20 14:52:59 +01:00
sualko ec0cec8a9e fix message dispatch from slave tab 2017-03-20 12:55:27 +01:00
sualko 15c7948cb8 fix mam button in empty windows 2017-03-20 10:53:42 +01:00
sualko 52588a1437 add mam support for master tab 2017-03-17 15:59:41 +01:00
sualko 1d60187f98 prefer xmpp password from settings over login form
nextcloud/jsxc.nextcloud#6
2017-03-16 13:20:04 +01:00
Klaus 81d84a02b9 Merge pull request #447 from jsxc/fix-muc-presence
[WIP] fix muc presence

fix #447
2017-03-14 12:32:24 +01:00
sualko 2eb4dfdea2 use new avatar namespace in muc 2017-03-14 12:31:27 +01:00
sualko 0aa0d4d467 define room as online after successful join 2017-03-14 12:31:08 +01:00
sualko f544b8d753 fix status indicator regression 2017-03-14 12:30:11 +01:00
sualko 60afa8efeb Merge branch 'master' into fix-muc-presence 2017-03-14 12:11:53 +01:00
Klaus 413bfd8dc3 Merge pull request #484 from jsxc/roster-enhancements
Roster enhancements
2017-03-14 10:56:31 +01:00
sualko 964de1637c catch quota exceeded errors
e.g. Safari in private mode has a quota of 0.
2017-03-14 10:47:08 +01:00
sualko 684bd5b27a support roster versioning (fix #478) 2017-03-09 15:43:02 +01:00
sualko 2cbc5b74a3 split avatar loading into chunks (fix #480) 2017-03-09 14:18:11 +01:00
sualko 66a1ed906c fix unclickable space (#483) 2017-03-08 14:10:11 +01:00
sualko 55838a4724 remove whitespace 2017-03-08 14:06:57 +01:00
sualko c8b6a7b1ba fix receiving message from unknown sender (fix #470) 2017-03-07 16:26:33 +01:00
sualko d45a5e1fda fix change of bosh url in example 2017-03-07 15:29:25 +01:00
Klaus 95689c62b6 Merge pull request #466 from jsxc/fix-bookmarks
Fix remote bookmark storage
2017-03-02 17:38:27 +01:00
Klaus 0f2960b1fb Merge pull request #465 from jsxc/fix-upload-discovery
- fix http upload discovery
- make max file size optional
2017-03-02 17:24:43 +01:00
sualko 7552e5c73a make max file size optional 2017-03-02 17:21:55 +01:00
sualko a6de6d6843 update strophe.jinglejs 2017-03-02 16:45:01 +01:00
sualko eeab8355e5 respond to software version request
implements XEP-0092, fix #464
2017-02-22 13:47:44 +01:00
sualko e95f61af25 fix vcard retrieval for rooms 2017-02-22 13:16:13 +01:00
sualko 4ec0656de6 minor dialog style fix 2017-02-22 13:09:35 +01:00
sualko 687347ec09 update strophe.bookmarks 2017-02-22 10:51:27 +01:00
sualko ace5fc585b Merge branch 'master' into fix-upload-discovery 2017-02-22 10:14:14 +01:00
sualko d38b45c441 beautify Gruntfile 2017-02-22 10:11:37 +01:00
sualko 3d408a51b9 fix http upload discovery 2017-02-22 10:05:52 +01:00
sualko 78cb8426c3 build v3.1.1 2017-02-14 16:19:51 +01:00
sualko daa5d35d7a check for missing files in build process 2017-02-14 16:19:38 +01:00
sualko daf6217a63 update documentation 2017-02-14 16:17:50 +01:00
sualko 479ebb3a26 update change log 2017-02-14 16:15:30 +01:00
sualko 4961e7e8e7 fix path to dependencies 2017-02-14 16:11:43 +01:00
sualko e953303002 decouple room and member presence 2017-02-02 16:54:19 +01:00
97 arquivos alterados com 6637 adições e 3277 exclusões
+3
Ver Arquivo
@@ -25,3 +25,6 @@ lib/i18next/
lib/jquery-i18next/
lib/magnific-popup/
.idea
/lib/strophejs-plugin-mam
/lib/strophejs-plugin-rsm
.github.json
+1 -1
Ver Arquivo
@@ -6,4 +6,4 @@
url = https://github.com/twbs/bootstrap-sass/
[submodule "lib/strophe.jinglejs"]
path = lib/strophe.jinglejs
url = https://github.com/sualko/strophe.jinglejs
url = https://github.com/jsxc/strophe.jinglejs
+24
Ver Arquivo
@@ -5,6 +5,30 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
## [Unreleased]
### Added
- [#150](https://github.com/jsxc/jsxc/issues/150) add Message Archive Management (XEP-0313)
- [#464](https://github.com/jsxc/jsxc/issues/464) respond to software version request (XEP-0092)
### Fixed
- [#447](https://github.com/jsxc/jsxc/pull/447) fix muc member presence
- fix http upload discovery
- fix vcard retrieval for rooms
- fix bookmarks
- [#470](https://github.com/jsxc/jsxc/issues/470) fix receiving message from unknown sender
- [#483](https://github.com/jsxc/jsxc/issues/483) fix unclickable space
- catch quota exceeded errors (e.g. Safari in private mode has a quota of 0)
### Changed
- update strophe.jinglejs
- make max file size optional for http upload service
- [#480](https://github.com/jsxc/jsxc/issues/480) split avatar loading into chunks
- [#478](https://github.com/jsxc/jsxc/issues/478) support roster versioning
- prefer xmpp password from settings over login form
- [#468](https://github.com/jsxc/jsxc/issues/468) move composing message to window header
## 3.1.1 - 2017-02-14
### Fixed
- fix path to dependencies
## 3.1.0 - 2017-02-14
### Added
+39 -2
Ver Arquivo
@@ -9,6 +9,7 @@ module.exports = function(grunt) {
// Project configuration.
grunt.initConfig({
github: grunt.file.readJSON('.github.json'),
app: grunt.file.readJSON('package.json'),
meta: {
banner: grunt.file.read('banner.js')
@@ -155,14 +156,23 @@ module.exports = function(grunt) {
}
},
src: dep_files,
dest: '<%= target %>/lib/jsxc.dep.js'
dest: '<%= target %>/lib/jsxc.dep.js',
filter: function(filepath) {
if (!grunt.file.exists(filepath)) {
grunt.fail.warn('Could not find: ' + filepath);
} else {
return true;
}
},
nonull: true,
},
jsxc: {
options: {
banner: '/*! This file is concatenated for the browser. */\n\n'
},
src: ['src/jsxc.intro.js', 'src/jsxc.lib.js', 'src/jsxc.lib.xmpp.js',
'src/jsxc.lib.*.js', 'tmp/template.js', 'src/jsxc.outro.js'
'src/jsxc.lib.gui.js', 'src/jsxc.lib.*.js',
'tmp/template.js', 'src/jsxc.outro.js'
],
dest: '<%= target %>/jsxc.js'
}
@@ -339,6 +349,29 @@ module.exports = function(grunt) {
options: {
config: '.scss-lint.yml'
}
},
github_releaser2: {
options: {
repository: 'jsxc/jsxc',
authentication: {
type: 'token',
token: '<%= github.token %>'
},
release: {
body: 'see https://github.com/jsxc/jsxc/blob/master/CHANGELOG.md'
}
},
release: {
src: ['archives/jsxc-archives/jsxc-<%= app.version %>.zip', 'archives/jsxc-archives/jsxc-<%= app.version %>.zip.sig']
},
prerelease: {
options: {
release: {
prerelease: true
}
},
src: ['archives/jsxc-archives/jsxc-<%= app.version %>.zip', 'archives/jsxc-archives/jsxc-<%= app.version %>.zip.sig']
}
}
});
@@ -363,6 +396,7 @@ module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-prettysass');
grunt.loadNpmTasks('grunt-html-convert');
grunt.loadNpmTasks('grunt-scss-lint');
grunt.loadNpmTasks('grunt-github-releaser2');
//Default task
grunt.registerTask('default', ['build', 'watch']);
@@ -387,6 +421,9 @@ module.exports = function(grunt) {
grunt.task.run(['search:changelog', 'build:prerelease', 'jsdoc']);
});
grunt.registerTask('publish:release', ['github_releaser2:release']);
grunt.registerTask('publish:prerelease', ['github_releaser2:prerelease']);
// before commit
grunt.registerTask('pre-commit', ['search:console', 'jsbeautifier:pre-commit', 'scsslint', 'jshint']);
+5 -3
Ver Arquivo
@@ -1,6 +1,6 @@
{
"name": "jsxc",
"version": "3.1.0",
"version": "3.2.0-beta.1",
"homepage": "https://www.jsxc.org",
"authors": [
"sualko <klaus@jsxc.org>"
@@ -27,13 +27,15 @@
"devDependencies": {
"emojione": "~2.2.7",
"favico.js": "^0.3.10",
"strophe.bookmarks": "strophe/strophejs-plugin-bookmarks#f51c60629cb0ad278f92bfb8d8dbb8cb455d9c98",
"strophe.bookmarks": "strophe/strophejs-plugin-bookmarks#ff9e95a1a823b927f8c4c45453aaa534857a37b4",
"strophe.js": "strophejs#a11ebefa3db1b6712d51d0d309b9f68f8e391d1b",
"strophe.vcard": "strophe/strophejs-plugin-vcard#de3a0c97a2c520ed900ee15b04a0c16d5c663891",
"strophe.x": "strophe/strophejs-plugin-dataforms",
"strophe.chatstates": "strophe/strophejs-plugin-chatstates",
"jquery-i18next": "^1.2.0",
"i18next": "^5.0.0",
"magnific-popup": "^1.1.0"
"magnific-popup": "^1.1.0",
"strophejs-plugin-mam": "strophe/strophejs-plugin-mam#27e8d25",
"strophejs-plugin-rsm": "strophe/strophejs-plugin-rsm#fa16b3b"
}
}
+70 -25
Ver Arquivo
@@ -2168,7 +2168,8 @@ fieldset[disabled]
width: 100%; }
#jsxc_dialog .mfp-close, #jsxc_webrtc .mfp-close {
font-size: 23px; }
font-size: 23px;
font-weight: normal; }
.mfp-bg {
z-index: 9000; }
@@ -2763,15 +2764,14 @@ fieldset[disabled]
position: fixed;
left: 0;
bottom: 0;
width: 30px;
height: 30px; }
width: 30px; }
@media (max-width: 768px) {
#jsxc_windowListSB {
display: none; } }
#jsxc_windowListSB > div {
box-sizing: border-box;
width: 14px;
height: 100%;
height: 30px;
background-color: #cccccc;
color: #807f7f;
text-align: center;
@@ -2881,7 +2881,8 @@ fieldset[disabled]
.jsxc_window .jsxc_emoticons:hover:after {
opacity: 0.5; }
.jsxc_window .jsxc_fade {
position: relative; }
position: relative;
overflow: hidden; }
.jsxc_window .jsxc_fade .jsxc_overlay {
display: none;
background-color: rgba(0, 0, 0, 0.5);
@@ -2931,6 +2932,31 @@ fieldset[disabled]
text-overflow: ellipsis; }
.jsxc_window .jsxc_fade .jsxc_overlay > div a:hover {
text-decoration: underline; }
.jsxc_window .jsxc_fade .jsxc_mam-load-more {
display: none;
text-align: center;
font-size: 0.8em;
font-style: italic;
position: absolute;
top: -42px;
left: 0;
right: 0;
height: 42px;
cursor: pointer;
z-index: 80;
line-height: 42px;
opacity: 0;
-webkit-transition: opacity 0.5s, top 0.5s;
transition: opacity 0.5s, top 0.5s; }
.jsxc_window .jsxc_fade .jsxc_mam-load-more.jsxc_show {
top: 0;
opacity: 0.7; }
.jsxc_window .jsxc_fade .jsxc_mam-load-more.jsxc_show:hover {
opacity: 1; }
.jsxc_window .jsxc_fade.jsxc_mam-enable .jsxc_textarea {
padding-top: 42px; }
.jsxc_window .jsxc_fade.jsxc_mam-enable .jsxc_mam-load-more {
display: block; }
.jsxc_window .jsxc_avatar {
margin-top: 1px; }
.jsxc_window .jsxc_textarea {
@@ -3176,26 +3202,6 @@ fieldset[disabled]
width: 1.2em;
height: 1.2em;
vertical-align: middle; }
.jsxc_sys.jsxc_composing {
text-align: center;
font-size: 0.9em;
font-style: italic;
display: block;
opacity: 0;
overflow: hidden;
-webkit-transition: opacity 0.6s;
transition: opacity 0.6s; }
.jsxc_sys.jsxc_composing:before {
content: " ";
width: 1.5em;
height: 1em;
display: inline-block;
background-size: 80%;
background-repeat: no-repeat;
margin: 0 3px 0 0;
background-image: url('../img/composing.png'); }
.jsxc_sys.jsxc_composing.jsxc_fadein {
opacity: 1; }
div.jsxc_settings {
position: relative; }
@@ -3232,6 +3238,35 @@ div.jsxc_transfer {
div.jsxc_transfer.jsxc_enc.jsxc_trust {
background-image: url('../img/padlock_close_green.svg'); }
.jsxc_status-msg {
font-size: 12px;
display: none;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
height: 50%;
line-height: 17.5px;
opacity: 0.7; }
.jsxc_status-msg.jsxc_composing:before {
content: " ";
width: 1em;
height: 1em;
display: inline-block;
background-size: cover;
vertical-align: middle;
background-repeat: no-repeat;
background-image: url('../img/composing.png'); }
.jsxc_status-msg-show .jsxc_name {
height: 50%;
line-height: 20px; }
.jsxc_status-msg-show .jsxc_status-msg {
display: block; }
.jsxc_status-msg-show .jsxc_lastmsg {
display: none !important; }
.jsxc_windowItem.jsxc_groupchat.jsxc_normal .jsxc_bar .jsxc_avatar, li[data-type='groupchat'] .jsxc_avatar {
text-indent: 999px;
background-image: url('../img/group_white.svg');
@@ -3309,6 +3344,8 @@ div.jsxc_transfer {
color: inherit; }
.jsxc_windowItem .jsxc_memberlist.jsxc_expand ul > li .jsxc_avatar {
margin-right: 4px; }
.jsxc_windowItem .jsxc_memberlist .jsxc_avatar :before {
display: none; }
li[data-type='groupchat'] .jsxc_video {
display: none; }
@@ -3394,6 +3431,14 @@ li[data-type='groupchat'] .jsxc_video {
background-color: #f2f2f2;
padding: 10px;
margin: 0 -30px 10px; }
#jsxc_dialog form fieldset h3.jsxc_experimental:after {
content: "experimental";
font-size: 0.7em;
border-radius: 2px;
padding: 1px 5px;
background-color: orange;
margin-left: 5px;
font-weight: normal; }
#jsxc_dialog legend {
border: 0;
font-size: 20px; }
+892 -453
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+9 -9
Ver Arquivo
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
+4368 -2443
Ver Arquivo
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
+30 -29
Ver Arquivo
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
+16 -4
Ver Arquivo
@@ -25,28 +25,40 @@
},
{
"name": "strophe.js/vcard",
"file": "lib/strophe.vcard/index.js",
"file": "lib/strophe.vcard/strophe.vcard.js",
"license": "MIT",
"url": "https://github.com/strophe/strophejs-plugins"
},
{
"name": "strophe.js/bookmarks",
"file": "lib/strophe.bookmarks/index.js",
"file": "lib/strophe.bookmarks/strophe.bookmarks.js",
"license": "MIT",
"url": "https://github.com/strophe/strophejs-plugins/tree/master/bookmarks"
},
{
"name": "strophe.js/x",
"file": "lib/strophe.x/index.js",
"file": "lib/strophe.x/src/strophe.x.js",
"license": "MIT",
"url": "https://github.com/strophe/strophejs-plugins/tree/master/dataforms"
},
{
"name": "strophe.js/chatstates",
"file": "lib/strophe.chatstates/index.js",
"file": "lib/strophe.chatstates/strophe.chatstates.js",
"license": "MIT",
"url": "https://github.com/strophe/strophejs-plugins/tree/master/chatstates"
},
{
"name": "strophe.js/mam",
"file": "lib/strophejs-plugin-mam/strophe.mam.js",
"license": "MIT",
"url": "https://github.com/strophe/strophejs-plugin-mam"
},
{
"name": "strophe.js/rsm",
"file": "lib/strophejs-plugin-rsm/strophe.rsm.js",
"license": "MIT",
"url": "https://github.com/strophe/strophejs-plugin-rsm"
},
{
"name": "strophe.jinglejs",
"file": "lib/strophe.jinglejs/strophe.jinglejs-bundle.js",
+1 -1
Ver Arquivo
@@ -458,7 +458,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -56,7 +56,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -3620,7 +3620,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1020,7 +1020,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -658,7 +658,7 @@ otherwise only dialog with given name is closed.
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -4148,7 +4148,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -536,7 +536,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1707,7 +1707,7 @@ alphabetical of the name
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -3441,7 +3441,7 @@ and save. Check border cases and remove html.
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -5073,7 +5073,7 @@ normal signal
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -309,7 +309,7 @@ jsxc.Message.PLAIN = 'plain';
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -291,7 +291,7 @@ $(document).on('update.gui.jsxc', function(ev, bid) {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -3169,7 +3169,7 @@ jsxc.gui.template.get = function(name, bid, msg) {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1007,7 +1007,7 @@ jsxc = {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1720,7 +1720,7 @@ $(document).one('connected.jsxc', function() {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -195,7 +195,7 @@ jsxc.notice = {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -319,7 +319,7 @@ jsxc.notification = {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -349,7 +349,7 @@ jsxc.options = {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -574,7 +574,7 @@ jsxc.otr = {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -660,7 +660,7 @@ jsxc.storage = {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -102,7 +102,7 @@ jsxc.tab = {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1524,7 +1524,7 @@ $(document).ready(function() {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -387,7 +387,7 @@ jsxc.xmpp.bookmarks.showDialog = function(room) {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -290,7 +290,7 @@ $(document).on('attached.jsxc', jsxc.xmpp.chatState.init);
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -372,7 +372,7 @@ $(document).on('stateChange.jsxc', function(ev, state) {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1396,7 +1396,7 @@ jsxc.xmpp.carbons = {
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -2446,7 +2446,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1405,7 +1405,7 @@ messages.
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -2760,7 +2760,7 @@ modification is done to it.
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -2220,7 +2220,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -2332,7 +2332,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -434,7 +434,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -3444,7 +3444,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1022,7 +1022,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -504,7 +504,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1185,7 +1185,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1620,7 +1620,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1 -1
Ver Arquivo
@@ -1316,7 +1316,7 @@
<br class="clear">
<footer>
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 13:39:34 GMT+0100 (CET)
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.3</a> on Tue Feb 14 2017 16:15:49 GMT+0100 (CET)
</footer>
<script> prettyPrint(); </script>
+1
Ver Arquivo
@@ -117,6 +117,7 @@ $(function() {
localStorage.setItem('bosh-url', url);
localStorage.setItem('xmpp-domain', domain);
jsxc.options.xmpp.url = url;
settings.xmpp.url = url;
settings.xmpp.domain = domain;
+4 -1
Ver Arquivo
@@ -301,6 +301,9 @@
"Stream_terminated": null,
"Close_all": null,
"Notification": null,
"Unreadable_OTR_message": null
"Unreadable_OTR_message": null,
"Load_older_messages": null,
"Message_history": null,
"setting-mam-enable": null
}
}
+4 -1
Ver Arquivo
@@ -301,6 +301,9 @@
"Stream_terminated": null,
"Close_all": null,
"Notification": null,
"Unreadable_OTR_message": null
"Unreadable_OTR_message": null,
"Load_older_messages": null,
"Message_history": null,
"setting-mam-enable": null
}
}
+10 -7
Ver Arquivo
@@ -56,7 +56,7 @@
"Deny": "Ablehnen",
"Approve": "Bestätigen",
"Remove_buddy": "Kontakt entfernen",
"You_are_about_to_remove_": "Du bist gerade dabei __bid_name__ (<b>__bid_jid__</b>) von deiner Kontaktliste zu entfernen. Alle Chats werden geschlossen.",
"You_are_about_to_remove_": "Du bist gerade dabei __bid_name__ (<b>__bid_jid__</b>) von deiner Kontaktliste zu entfernen. Alle zugehörigen Chats werden geschlossen.",
"Continue_without_chat": "Weiter ohne Chat",
"Please_wait": "Bitte warten",
"Login_failed": "Chat-Anmeldung fehlgeschlagen",
@@ -265,10 +265,10 @@
"Use_local_audio_device": "Nutze eigenes Audio Gerät",
"Use_local_video_device": "Benutze eigene Webcam",
"is_": "ist __status__",
"You_received_a_message_from_an_unknown_sender_": "Du hast eine Nachricht von einem unbekannten Sender erhalten (__sender__) Möchtest du sie sehen?",
"You_received_a_message_from_an_unknown_sender_": "Du hast eine Nachricht von einem unbekannten Absender erhalten (__sender__). Möchtest du sie sehen?",
"Your_roster_is_empty_add_": "Deine Kontaktliste ist leer, füge einen neuen Kontakt <a>hinzu</a>",
"onsmp_explanation_question": "Dein Kontakt versucht herauszufinden ob er wirklich mit dir redet. Um dich gegenüber deinem Kontakt zu verifizieren gib die Antwort ein und klick auf Antworten.",
"onsmp_explanation_secret": "Dein Kontakt versucht herauszufinden ob er wirklich mit dir redet. Um dich gegenüber deinem Kontakt zu verifizieren gib das Geheimnis ein.",
"onsmp_explanation_secret": "Dein Kontakt versucht herauszufinden ob er wirklich mit dir redet. Um dich gegenüber deinem Kontakt zu verifizieren gib das Geheimnis ein.",
"from_sender": "von __sender__",
"Verified_private_conversation_started": "Verifizierte private Konversation gestartet.",
"Unverified_private_conversation_started": "Unverifizierte private Konversation gestartet.",
@@ -283,9 +283,9 @@
"Change": "Ändern",
"Send_file": "Datei senden",
"setting-explanation-carbon": "Wenn Kopien aktiviert sind, werden alle eingehenden Nachrichten zu allen angemeldeten Clients gesendet.",
"setting-explanation-login": "Wenn diese Option aktiviert ist, wird der Chat beim anmelden automatisch gestartet.",
"setting-explanation-login": "Wenn diese Option aktiviert ist, wird der Chat beim Anmelden automatisch gestartet.",
"setting-explanation-priority": "Wenn du mit deinem XMPP Konto mehrfach angemeldet bist, werden Nachrichten zu dem Client mit der höchsten Priorität zugestellt.",
"setting-explanation-xmpp": "Diese Optionen werden für die Verbindung zum XMPP server genutzt.",
"setting-explanation-xmpp": "Diese Optionen werden für die Verbindung zum XMPP Server genutzt.",
"_is_composing": " tippt gerade...",
"_are_composing": " tippen gerade...",
"Chat_state_notifications": "Statusbenachrichtigungen",
@@ -300,7 +300,10 @@
"Connection_accepted": "Verbindung angenommen",
"Stream_terminated": "Stream beendet",
"Close_all": "Schließe alle",
"Notification": null,
"Unreadable_OTR_message": null
"Notification": "Benachrichtigung",
"Unreadable_OTR_message": "Unlesbare OTR Nachricht verworfen",
"Load_older_messages": "Ältere Nachrichten laden",
"Message_history": "Nachrichten Verlauf",
"setting-mam-enable": null
}
}
+4 -1
Ver Arquivo
@@ -301,6 +301,9 @@
"Stream_terminated": null,
"Close_all": null,
"Notification": null,
"Unreadable_OTR_message": null
"Unreadable_OTR_message": null,
"Load_older_messages": null,
"Message_history": null,
"setting-mam-enable": null
}
}
+10 -7
Ver Arquivo
@@ -265,13 +265,13 @@
"Use_local_audio_device": "Use local audio device.",
"Use_local_video_device": "Use local video device.",
"is_": "is __status__",
"You_received_a_message_from_an_unknown_sender_": "You received a message from an unknown sender (__sender__) Do you want to display them?",
"You_received_a_message_from_an_unknown_sender_": "You received a message from an unknown sender (__sender__). Do you want to display them?",
"Your_roster_is_empty_add_": "Your roster is empty, add a <a>new contact</a>",
"onsmp_explanation_question": "You contact is attempting to determine if they are really talking to you. To authenticate to your contact, enter the answer and click Answer.",
"onsmp_explanation_secret": "You contact is attempting to determine if they are really talking to you. To authenticate to your contact, enter the secret.",
"onsmp_explanation_question": "Your contact is attempting to determine if they are really talking to you. To authenticate to your contact, enter the answer and click Answer.",
"onsmp_explanation_secret": "Your contact is attempting to determine if they are really talking to you. To authenticate to your contact, enter the secret.",
"from_sender": "from __sender__",
"Verified_private_conversation_started": "Verified Private conversation started.",
"Unverified_private_conversation_started": "Unverified Private conversation started.",
"Verified_private_conversation_started": "Verified private conversation started.",
"Unverified_private_conversation_started": "Unverified private conversation started.",
"Bookmark": "Bookmark",
"Auto-join": "Auto-join",
"Edit_bookmark": "Edit bookmark",
@@ -301,6 +301,9 @@
"Stream_terminated": "Stream terminated",
"Close_all": "Close all",
"Notification": "Notification",
"Unreadable_OTR_message": "Unreadable OTR message omitted"
"Unreadable_OTR_message": "Unreadable OTR message omitted",
"Load_older_messages": "Load older messages",
"Message_history": "Message history",
"setting-mam-enable": "If enabled you are able to retrieve stored message from the server."
}
}
}
+4 -1
Ver Arquivo
@@ -301,6 +301,9 @@
"Stream_terminated": null,
"Close_all": null,
"Notification": null,
"Unreadable_OTR_message": null
"Unreadable_OTR_message": null,
"Load_older_messages": null,
"Message_history": null,
"setting-mam-enable": null
}
}
+4 -1
Ver Arquivo
@@ -301,6 +301,9 @@
"Stream_terminated": null,
"Close_all": null,
"Notification": null,
"Unreadable_OTR_message": null
"Unreadable_OTR_message": null,
"Load_older_messages": null,
"Message_history": null,
"setting-mam-enable": null
}
}
+6 -3
Ver Arquivo
@@ -267,7 +267,7 @@
"is_": "est __status__",
"You_received_a_message_from_an_unknown_sender_": "Vous avez reçu un message d'un expéditeur inconnu (__sender__) Voulez-vous les afficher ?",
"Your_roster_is_empty_add_": "Votre liste est vide, ajouter <a>Nouveau contact</a>",
"onsmp_explanation_question": "Votre contact tente de déterminer si il ou elle parle vraiment à vous. Pour vous authentifier auprès de votre contact, saisissez une réponse et cliquez sur Répondre.",
"onsmp_explanation_question": "Votre contact tente de déterminer si il ou elle vous parle vraiment. Pour vous authentifier auprès de votre contact, saisissez une réponse et cliquez sur Répondre.",
"onsmp_explanation_secret": "Votre contact tente de déterminer si il ou elle parle vraiment à vous. Pour vous authentifier auprès de votre contact, entrez le mot secret",
"from_sender": "de __sender__",
"Verified_private_conversation_started": "La conversation privée vérifiée a démarré.",
@@ -300,7 +300,10 @@
"Connection_accepted": "Connexion acceptée",
"Stream_terminated": "Flux terminé",
"Close_all": "Tout fermer",
"Notification": null,
"Unreadable_OTR_message": null
"Notification": "Notification",
"Unreadable_OTR_message": "Message OTR illisible omis",
"Load_older_messages": "Charger des messages plus anciens",
"Message_history": null,
"setting-mam-enable": null
}
}
+4 -1
Ver Arquivo
@@ -301,6 +301,9 @@
"Stream_terminated": null,
"Close_all": null,
"Notification": null,
"Unreadable_OTR_message": null
"Unreadable_OTR_message": null,
"Load_older_messages": null,
"Message_history": null,
"setting-mam-enable": null
}
}
+4 -1
Ver Arquivo
@@ -301,6 +301,9 @@
"Stream_terminated": null,
"Close_all": null,
"Notification": null,
"Unreadable_OTR_message": null
"Unreadable_OTR_message": null,
"Load_older_messages": null,
"Message_history": null,
"setting-mam-enable": null
}
}
+309
Ver Arquivo
@@ -0,0 +1,309 @@
{
"translation": {
"Logging_in": "Inloggen…",
"your_connection_is_unencrypted": "Je verbinding is niet versleuteld.",
"your_connection_is_encrypted": "Je verbinding is versleuteld.",
"your_buddy_closed_the_private_connection": "Je contactpersoon sloot de prive-verbinding.",
"start_private": "start privé",
"close_private": "Sluit privé",
"your_buddy_is_verificated": "Je contactpersoon is geverifieerd.",
"you_have_only_a_subscription_in_one_way": "Je hebt een eenrichtingsabonnement.",
"authentication_query_sent": "Verificatie vraag gestuurd.",
"your_message_wasnt_send_please_end_your_private_conversation": "Je bericht is niet verzonden. Beëindig prive gesprek.",
"unencrypted_message_received": "Ongecodeerde bericht ontvangen",
"not_available": "Niet beschikbaar",
"no_connection": "Geen Niet verbinding!",
"relogin": "opnieuw inloggen",
"trying_to_start_private_conversation": "Proberen om privé-gesprek te beginnen!",
"Verified": "Geverifieerd",
"Unverified": "Ongeverifieerd",
"private_conversation_aborted": "Privé-gesprek afgebroken!",
"your_buddy_closed_the_private_conversation_you_should_do_the_same": "Je contact sloot het Privé-gesprek! Doe hetzelfde.",
"conversation_is_now_verified": "Gesprek is geverifieerd.",
"authentication_failed": "Verificatie mislukt.",
"Creating_your_private_key_": "Een persoonlijke sleutel maken. Dit kan een tijdje duren.",
"Authenticating_a_buddy_helps_": "Authenticatie met een contact helpt ervoor te zorgen dat de persoon met wie u praat echt de persoon is die ze beweert te zijn.",
"How_do_you_want_to_authenticate_your_buddy": "Hoe wilt u verificeren __bid_name__ (<b>__bid_jid__</b>)?",
"Select_method": "Selectie methode...",
"Manual": "Handleiding",
"Question": "Vraag",
"Secret": "Geheim",
"To_verify_the_fingerprint_": "Neem via een ander betrouwbaar kanaal, contact op met uw gesprekspartner om de vingerafdruk te controleren. Bijvoorbeeld per telefoon.",
"Your_fingerprint": "Jou vingerafdruk",
"Buddy_fingerprint": "Contact vingerafdruk",
"Close": "Sluiten",
"Compared": "Vergeleken",
"To_authenticate_using_a_question_": "Gebruik een vraag om te verificeren, neem een antwoord alleen bekend bij u en uw contact.",
"Ask": "Vraag",
"To_authenticate_pick_a_secret_": "Voor verificatie, kies een geheim alleen bekend is bij u en uw contact.",
"Compare": "Vergelijk",
"Fingerprints": "Vingerafdrukken",
"Authentication": "Verificatie",
"Message": "Bericht",
"Add_buddy": "Contact toevoegen",
"rename_buddy": "contact hernoemen",
"delete_buddy": "contact verwijderen",
"Login": "Login",
"Username": "Gebruikersnaam",
"Password": "Paswoord",
"Cancel": "Annuleer",
"Connect": "Verbind",
"Type_in_the_full_username_": "Vul de volledige gebruikersnaam en een optionele alias in.",
"Alias": "Alias",
"Add": "Voeg toe",
"Subscription_request": "Abonnementsverzoek",
"You_have_a_request_from": "Je hebt een uitnodiging van",
"Deny": "Ontken",
"Approve": "Toestaan",
"Remove_buddy": "contact verwijderen",
"You_are_about_to_remove_": null,
"Continue_without_chat": "Doorgaan zonder chat",
"Please_wait": "Even geduld",
"Login_failed": "Chat login mislukt",
"Sorry_we_cant_authentikate_": "Verificatie is mislukt met de chatserver. Is het paswoord fout?",
"Retry": "Terug",
"clear_history": "Wis geschiedenis",
"New_message_from": "Nieuw bericht van__name__",
"Should_we_notify_you_": "Zullen wij u notificeren over nieuwe berichten in de toekomst?",
"Please_accept_": "Klik op \"Toestaan\" aan de bovenkant.",
"Hide_offline": "Offline contacten verbergen",
"Show_offline": "Offline contacten weergeven",
"About": "Over",
"dnd": "Niet storen",
"Mute": "Dempen aan",
"Unmute": "Dempen uit",
"Subscription": "Abonnement",
"both": "Beide",
"Status": "Status",
"online": "online",
"chat": "chat",
"away": "Afwezig",
"xa": "langer afwezig",
"offline": "offline",
"none": "geen",
"Unknown_instance_tag": "Voorbeeld tag onbekend.",
"Not_one_of_our_latest_keys": "Niet één van onze laatste sleutels.",
"Received_an_unreadable_encrypted_message": "Een niet leesbare versleuteld bericht ontvangen.",
"Online": "Online",
"Chatty": "Spraakzaam",
"Away": "Afwezig",
"Extended_away": "Langer afwezig",
"Offline": "Offline",
"Friendship_request": "Contact verzoek",
"Confirm": "Bevestig",
"Dismiss": "Afwijzen",
"Remove": "Verwijder",
"Online_help": "Online hulp",
"FN": "Volledige naam",
"N": null,
"FAMILY": "Familienaam",
"GIVEN": "Voornaam",
"NICKNAME": "Bijnaam",
"URL": "URL",
"ADR": "Adres",
"STREET": "Adres",
"EXTADD": "Uitgebreid adres",
"LOCALITY": "Plaats",
"REGION": "Regio",
"PCODE": "Postcode",
"CTRY": "Land",
"TEL": "Telefoon",
"NUMBER": "Nummer",
"EMAIL": "E-mail",
"USERID": null,
"ORG": "Organisatie",
"ORGNAME": "Naam",
"ORGUNIT": "Afdeling",
"TITLE": "functietitel",
"ROLE": "Functie",
"BDAY": "Verjaardag",
"DESC": "Beschrijving",
"PHOTO": null,
"send_message": "Zend bericht",
"get_info": "Gegevens weergeven",
"Settings": "Instellingen",
"Priority": "Prioriteit",
"Save": "Opslaan",
"User_settings": "Gebruikersinstellingen",
"A_fingerprint_": "Een vingerafdruk wordt gebruikt om er zeker van te zijn dat uw gesprekspartner ook is wie hij of zij zegt te zijn.",
"is": "is",
"Login_options": "Login options",
"BOSH_url": "BOSH URL",
"Domain": "Domein",
"Resource": "Bron",
"On_login": "Tijdens login",
"Received_an_unencrypted_message": "Een niet-versleuteld bericht ontvangen",
"Sorry_your_buddy_doesnt_provide_any_information": "Sorry, je contact verschaft geen informatie.",
"Info_about": "Gegevens van",
"Authentication_aborted": "Verificatie afgebroken.",
"Authentication_request_received": "Authenticatie verzoek ontvangen.",
"Log_in_without_chat": "Zonder chat inloggen",
"has_come_online": "is online gekomen",
"Unknown_sender": "Afzender onbekend",
"Please_allow_access_to_microphone_and_camera": "Klik op \"Toestaan\" aan de bovenkant voor de microfoon en camera.",
"Incoming_call": "Inkomend gesprek",
"from": "van",
"Do_you_want_to_accept_the_call_from": "Wilt u het gesprek accepteren",
"Reject": "Weiger",
"Accept": "Aanvaard",
"hang_up": "ophangen",
"snapshot": "momentopname",
"mute_my_audio": "mijn geluid dempen",
"pause_my_video": "mijn video pauzeren",
"fullscreen": "volledige scherm",
"Info": "Info",
"Local_IP": "Lokaal IP",
"Remote_IP": "Extern IP",
"Local_Fingerprint": "Lokale vingerafdruk",
"Remote_Fingerprint": "Afstand vingerafdruk",
"Video_call_not_possible": null,
"Start_video_call": "Video gesprek starten",
"Join_chat": "Neem deel aan chat",
"Join": "Meedoen",
"Room": "Kamer",
"Nickname": "Bijnaam",
"left_the_building": "__nickname__heeft het gebouw verlaten",
"entered_the_room": "__nickname__kwam de kamer binnen",
"is_now_known_as": "__newNickname__ is bekend als __oldNickname__",
"This_room_is": "Deze kamer is",
"muc_hidden": {
"keyword": "verborgen",
"description": "kan niet worden gevonden via zoeken"
},
"muc_membersonly": {
"keyword": "Alleen leden",
"description": null
},
"muc_moderated": {
"keyword": null,
"description": null
},
"muc_nonanonymous": {
"keyword": null,
"description": null
},
"muc_open": {
"keyword": "open",
"description": null
},
"muc_passwordprotected": {
"keyword": "paswoord beschermd",
"description": null
},
"muc_persistent": {
"keyword": null,
"description": null
},
"muc_public": {
"keyword": "publiek",
"description": null
},
"muc_semianonymous": {
"keyword": null,
"description": "Je Jabber id is alleen vrijgegeven voor kamer beheerders"
},
"muc_temporary": {
"keyword": "tijdelijk",
"description": null
},
"muc_unmoderated": {
"keyword": null,
"description": null
},
"muc_unsecured": {
"keyword": "niet beveiligd",
"description": null
},
"Continue": "Doorgaan",
"Server": "Server",
"Rooms_are_loaded": "Kamers zijn geladen",
"Could_load_only": "Alleen aanvullen voor__count__kamers",
"muc_explanation": "Vul de kamernaam, optioneel een bijnaam en wachtwoord in om deel te nemen een chat",
"You_already_joined_this_room": "Je bent al verbonden met deze kamer",
"This_room_will_be_closed": "De kamer wordt gesloten",
"Room_not_found_": "Een nieuwe kamer wordt aangemaakt",
"Loading_room_information": "Kamer informatie laden",
"Destroy": "Vernietigen",
"Leave": "Vertrekken",
"changed_subject_to": "__nickname__veranderde het onderwerp van de kamer naar \"__subject__\"",
"muc_removed_kicked": "Je bent afgemeld van de kamer",
"muc_removed_info_kicked": "__nickname__is uit de kamer gegooid",
"muc_removed_banned": "Je bent uit de kamer gezet",
"muc_removed_info_banned": "__nickname__is uit de kamer gezet",
"muc_removed_affiliation": "Je bent verwijderd van de kamer door een verwantschap wijziging",
"muc_removed_info_affiliation": "__nickname__is verwijderd van de kamer door een verwantschap wijziging",
"muc_removed_membersonly": null,
"muc_removed_info_membersonly": "__nickname__is verwijderd van de kamer, door de wijziging naar alleen voor leden. Je hebt geen lidmaatschap.",
"muc_removed_shutdown": null,
"Reason": "Reden",
"message_not_send": null,
"message_not_send_item-not-found": null,
"message_not_send_forbidden": null,
"message_not_send_not-acceptable": null,
"This_room_has_been_closed": "Deze kamer is gesloten",
"Room_logging_is_enabled": "Kamerlog is ingeschakeld",
"A_password_is_required": "Een paswoord is vereist",
"You_are_not_on_the_member_list": "Je staat niet op de ledenlijst",
"You_are_banned_from_this_room": "Je bent uit deze kamer gezet",
"Your_desired_nickname_": null,
"The_maximum_number_": null,
"This_room_is_locked_": "Deze kamer is afgesloten",
"You_are_not_allowed_to_create_": null,
"Alert": null,
"Call_started": "Gesprek gestart",
"Call_terminated": "Gesprek beëindigd",
"Carbon_copy": "Carbon kopie",
"Enable": "Inschakelen",
"jingle_reason_busy": "bezet",
"jingle_reason_decline": "afwijzen",
"jingle_reason_success": "opgehangen",
"Media_failure": null,
"No_local_audio_device": "Lokaal audioapparaat niet aanwezig.",
"No_local_video_device": "Lokaal videoapparaat niet aanwezig.",
"Ok": "Ok",
"PermissionDeniedError": null,
"Use_local_audio_device": "Lokaal audioapparaat gebruiken.",
"Use_local_video_device": "Lokaal videoapparaat gebruiken.",
"is_": "is __status__",
"You_received_a_message_from_an_unknown_sender_": "U ontvangt een bericht van een onbekende afzender (__sender__). Wilt u om het weergeven?",
"Your_roster_is_empty_add_": null,
"onsmp_explanation_question": "Je contact probeert te bepalen of ze echt met jou praten. Voer om te verifiëren naar uw contact het antwoord in.",
"onsmp_explanation_secret": "U contact probeert te bepalen of ze echt met jou praten. Voer om te verifiëren naar uw contact het geheim in.",
"from_sender": "van__sender__",
"Verified_private_conversation_started": "Privé-gesprek geverifieerd gestart.",
"Unverified_private_conversation_started": "Privé-gesprek ongeverifieerd gestart.",
"Bookmark": "Favorieten",
"Auto-join": null,
"Edit_bookmark": "Favorieten bewerken",
"Room_logging_is_disabled": "Kamerlog is uitgeschakeld",
"Room_is_now_non-anoymous": null,
"Room_is_now_semi-anonymous": null,
"Do_you_want_to_change_the_default_room_configuration": null,
"Default": "Standaard",
"Change": null,
"Send_file": "Bestand zenden",
"setting-explanation-carbon": "Met ingeschakeld carbon kopie zal de XMPP server een kopie van elk inkomend bericht doorsturen naar deze cliënt, zelfs als het niet aan haar is gericht.",
"setting-explanation-login": "Wanneer ingeschakeld zal de chat starten bij het inloggen.",
"setting-explanation-priority": "Je XMPP dienst zal een prioriteitsbericht verzenden wanneer je meerdere keren ingelogd bent met hetzelfde account.",
"setting-explanation-xmpp": null,
"_is_composing": null,
"_are_composing": null,
"Chat_state_notifications": null,
"setting-explanation-chat-state": null,
"Share_screen": "Scherm delen",
"Incoming_stream": "Stream inkomend",
"Stream_started": "Stream gestart",
"HTTPS_REQUIRED": null,
"EXTENSION_UNAVAILABLE": "Je hebt een browser extensie/addon nodig.",
"UNKNOWN_ERROR": null,
"Install_extension": "Installeer extensie om scherm delen te gebruiken: ",
"Connection_accepted": null,
"Stream_terminated": "Stream beëindigd",
"Close_all": "Alle sluiten",
"Notification": "Notificatie",
"Unreadable_OTR_message": null,
"Load_older_messages": "Oudere berichten laden",
"Message_history": null,
"setting-mam-enable": null
}
}
+4 -1
Ver Arquivo
@@ -301,6 +301,9 @@
"Stream_terminated": null,
"Close_all": null,
"Notification": null,
"Unreadable_OTR_message": null
"Unreadable_OTR_message": null,
"Load_older_messages": null,
"Message_history": null,
"setting-mam-enable": null
}
}
+4 -1
Ver Arquivo
@@ -301,6 +301,9 @@
"Stream_terminated": null,
"Close_all": null,
"Notification": null,
"Unreadable_OTR_message": null
"Unreadable_OTR_message": null,
"Load_older_messages": null,
"Message_history": null,
"setting-mam-enable": null
}
}
+4 -1
Ver Arquivo
@@ -301,6 +301,9 @@
"Stream_terminated": null,
"Close_all": null,
"Notification": null,
"Unreadable_OTR_message": null
"Unreadable_OTR_message": null,
"Load_older_messages": null,
"Message_history": null,
"setting-mam-enable": null
}
}
+4 -1
Ver Arquivo
@@ -301,6 +301,9 @@
"Stream_terminated": null,
"Close_all": null,
"Notification": null,
"Unreadable_OTR_message": null
"Unreadable_OTR_message": null,
"Load_older_messages": null,
"Message_history": null,
"setting-mam-enable": null
}
}
+4 -1
Ver Arquivo
@@ -301,6 +301,9 @@
"Stream_terminated": null,
"Close_all": null,
"Notification": null,
"Unreadable_OTR_message": null
"Unreadable_OTR_message": null,
"Load_older_messages": null,
"Message_history": null,
"setting-mam-enable": null
}
}
+8 -5
Ver Arquivo
@@ -23,7 +23,7 @@
"authentication_failed": "Kimlik doğrulama başarısız.",
"Creating_your_private_key_": "Özel anahtarınız oluşturuluyor; bu işlem biraz sürebilir.",
"Authenticating_a_buddy_helps_": "Kimlik doğrulaması, konuşmakta olduğunuz kişinin gerçekten o kişi olduğundan emin olmanıza yardımcı olur.",
"How_do_you_want_to_authenticate_your_buddy": "Kimlik doğrulasını nasıl yapmak istersiniz __bid_name__ (<b>__bid_jid__</b>)?",
"How_do_you_want_to_authenticate_your_buddy": "Kimlik doğrulamasını nasıl yapmak istersiniz __bid_name__ (<b>__bid_jid__</b>)?",
"Select_method": "Yöntemi seçin...",
"Manual": "Elle",
"Question": "Soru",
@@ -261,13 +261,13 @@
"No_local_audio_device": "Yerel ses cihazı bulunamadı.",
"No_local_video_device": "Yerel video cihazı bulunamadı.",
"Ok": "Tamam",
"PermissionDeniedError": "Siz veya tarayıcınız sesli/görüntülü izni reddetti",
"PermissionDeniedError": "Siz veya tarayıcınız medya iznini reddetti",
"Use_local_audio_device": "Yerel video cihazını kullan.",
"Use_local_video_device": "Yerel video cihazını kullanın.",
"is_": "__status__",
"You_received_a_message_from_an_unknown_sender_": "Bilinmeyen bir gönderenden bir ileti aldınız (__sender__) İletiyi görüntülemek istiyor musunuz?",
"Your_roster_is_empty_add_": "Listeniz boş, yeni bir <a>kişi ekleyin</a>",
"onsmp_explanation_question": "Karşınızdaki kişi, konuştuğu kişinin gerçekten siz olduğunuzu belirlemeye çalışıyor. Karşınızdaki kişiye kimliğinizi kanıtlamak için, yanıtı girin ve Yanıtla'yı tıklayın.",
"onsmp_explanation_question": "Karşınızdaki kişi, konuştuğu kişinin gerçekten siz olup olmadığınızı belirlemeye çalışıyor. Kimliğinizi doğrulamak için yanıtı girin ve Yanıtla'yı tıklayın.",
"onsmp_explanation_secret": "Karşınızdaki kişi, konuştuğu kişinin gerçekten siz olduğunuzu belirlemeye çalışıyor. Karşınızdaki kişiye kimliğinizi kanıtlamak için, parolayı girin.",
"from_sender": "__sender__'den",
"Verified_private_conversation_started": "Doğrulanmış Özel görüşme başladı.",
@@ -300,7 +300,10 @@
"Connection_accepted": "Bağlantı kabul edildi",
"Stream_terminated": "Akış sonlandırıldı",
"Close_all": "Hepsini kapat",
"Notification": null,
"Unreadable_OTR_message": null
"Notification": "Bildirim",
"Unreadable_OTR_message": "Okunamayan OTR iletisi atlandı",
"Load_older_messages": "Eski iletileri yükle",
"Message_history": null,
"setting-mam-enable": null
}
}
+4 -1
Ver Arquivo
@@ -301,6 +301,9 @@
"Stream_terminated": null,
"Close_all": null,
"Notification": null,
"Unreadable_OTR_message": null
"Unreadable_OTR_message": null,
"Load_older_messages": null,
"Message_history": null,
"setting-mam-enable": null
}
}
+5 -2
Ver Arquivo
@@ -300,7 +300,10 @@
"Connection_accepted": "連線接受了",
"Stream_terminated": "串流結束了",
"Close_all": "全部關掉",
"Notification": null,
"Unreadable_OTR_message": null
"Notification": "通知",
"Unreadable_OTR_message": "忽略無法解讀的 OTR 訊息",
"Load_older_messages": "下載舊訊息",
"Message_history": null,
"setting-mam-enable": null
}
}
+4 -1
Ver Arquivo
@@ -301,6 +301,9 @@
"Stream_terminated": null,
"Close_all": null,
"Notification": null,
"Unreadable_OTR_message": null
"Unreadable_OTR_message": null,
"Load_older_messages": null,
"Message_history": null,
"setting-mam-enable": null
}
}
+2 -1
Ver Arquivo
@@ -1,6 +1,6 @@
{
"name": "jsxc",
"version": "3.1.0",
"version": "3.2.0-beta.1",
"description": "Real-time xmpp chat application with video calls, file transfer and encrypted communication",
"homepage": "http://www.jsxc.org/",
"bugs": "https://github.com/jsxc/jsxc/issues",
@@ -25,6 +25,7 @@
"grunt-contrib-uglify": "^2.0.0",
"grunt-contrib-watch": "^1.0.0",
"grunt-data-uri": "^0.3.0",
"grunt-github-releaser2": "^0.1.1",
"grunt-html-convert": "0.0.2",
"grunt-jsbeautifier": "^0.2.13",
"grunt-jsdoc": "^2.1.0",
+1
Ver Arquivo
@@ -39,6 +39,7 @@
.mfp-close {
font-size: 23px;
font-weight: normal;
}
}
+10
Ver Arquivo
@@ -111,6 +111,16 @@
background-color: #f2f2f2;
padding: 10px;
margin: 0 -30px 10px;
&.jsxc_experimental:after {
content: "experimental";
font-size: 0.7em;
border-radius: 2px;
padding: 1px 5px;
background-color: orange;
margin-left: 5px;
font-weight: normal;
}
}
}
}
+6
Ver Arquivo
@@ -115,6 +115,12 @@
}
}
}
.jsxc_avatar {
:before {
display: none;
}
}
}
}
+77 -27
Ver Arquivo
@@ -70,7 +70,6 @@
left: 0;
bottom: 0;
width: 30px;
height: 30px;
@media (max-width: 768px) {
display: none;
@@ -80,7 +79,7 @@
div {
box-sizing: border-box;
width: 14px;
height: 100%;
height: 30px;
background-color: $windowListSB_bg;
color: $windowListSB_color;
text-align: center;
@@ -233,6 +232,7 @@
.jsxc_fade {
position: relative;
overflow: hidden;
.jsxc_overlay {
display: none;
@@ -303,6 +303,42 @@
}
}
}
.jsxc_mam-load-more {
display: none;
text-align: center;
font-size: 0.8em;
font-style: italic;
position: absolute;
top: -42px;
left: 0;
right: 0;
height: 42px;
cursor: pointer;
z-index: 80;
line-height: 42px;
opacity: 0;
transition: opacity 0.5s, top 0.5s;
&.jsxc_show {
top: 0;
opacity: 0.7;
&:hover {
opacity: 1;
}
}
}
&.jsxc_mam-enable {
.jsxc_textarea {
padding-top: 42px;
}
.jsxc_mam-load-more {
display: block;
}
}
}
.jsxc_avatar {
@@ -627,31 +663,6 @@
height: 1.2em;
vertical-align: middle;
}
&.jsxc_composing {
text-align: center;
font-size: 0.9em;
font-style: italic;
display: block;
opacity: 0;
overflow: hidden;
transition: opacity 0.6s;
&:before {
content: " ";
width: 1.5em;
height: 1em;
display: inline-block;
background-size: 80%;
background-repeat: no-repeat;
margin: 0 3px 0 0;
background-image: image-url("composing.png");
}
&.jsxc_fadein {
opacity: 1;
}
}
}
div.jsxc_settings {
@@ -704,3 +715,42 @@ div.jsxc_transfer {
}
}
}
.jsxc_status-msg {
font-size: 12px;
display: none;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
height: 50%;
line-height: 17.5px;
opacity: 0.7;
&.jsxc_composing {
&:before {
content: " ";
width: 1em;
height: 1em;
display: inline-block;
background-size: cover;
vertical-align: middle;
background-repeat: no-repeat;
background-image: image-url("composing.png");
}
}
}
.jsxc_status-msg-show {
.jsxc_name {
height: 50%;
line-height: 20px;
}
.jsxc_status-msg {
display: block;
}
.jsxc_lastmsg {
display: none !important;
}
}
+2 -1
Ver Arquivo
@@ -122,8 +122,9 @@ jsxc.fileTransfer.showFileSelection = function(jid) {
*/
jsxc.fileTransfer.fileSelected = function(jid, msg, file) {
var bid = jsxc.jidToBid(jid);
var maxSize = jsxc.options.get('httpUpload').maxSize;
if (file.transportMethod !== 'webrtc' && jsxc.xmpp.httpUpload.ready && file.size > jsxc.options.get('httpUpload').maxSize) {
if (file.transportMethod !== 'webrtc' && jsxc.xmpp.httpUpload.ready && maxSize >= 0 && file.size > maxSize) {
jsxc.debug('File too large for http upload.');
file.transportMethod = 'webrtc';
+165
Ver Arquivo
@@ -0,0 +1,165 @@
jsxc.gui.avatar = {
queue: [],
PLACEHOLDER: 0,
DELAY: 300,
CHUNKSIZE: 20,
timeout: null,
lastRun: 0
};
/**
* Update avatar on all given elements.
*
* @memberOf jsxc.gui
* @param {jQuery} el Elements with subelement .jsxc_avatar
* @param {string} jid Jid
* @param {string} aid Avatar id (sha1 hash of image)
*/
jsxc.gui.avatar.update = function(el, jid, aid) {
var self = jsxc.gui.avatar;
if (typeof aid === 'undefined') {
self.set(jid, el, self.PLACEHOLDER);
return;
}
var avatarSrc = jsxc.storage.getUserItem('avatar', aid);
if (!jsxc.master && !avatarSrc) {
// force avatar placeholder for slave tab, until master tab requested vCard
avatarSrc = self.PLACEHOLDER;
}
if (avatarSrc !== null) {
self.set(jid, el, avatarSrc);
} else {
var handler_cb = function(stanza) {
var src = jsxc.gui.avatar.getPhotoFromVcard(stanza);
jsxc.storage.setUserItem('avatar', aid, src);
self.set(jid, el, src);
};
var error_cb = function(msg) {
jsxc.warn('Could not load vcard.', msg);
jsxc.storage.setUserItem('avatar', aid, self.PLACEHOLDER);
self.set(jid, el, self.PLACEHOLDER);
};
var args = [];
// workaround for https://github.com/strophe/strophejs/issues/172
if (Strophe.getBareJidFromJid(jid) === Strophe.getBareJidFromJid(jsxc.xmpp.conn.jid)) {
args = [handler_cb, error_cb];
} else {
args = [handler_cb, Strophe.getBareJidFromJid(jid), error_cb];
}
jsxc.gui.avatar.queueAction(jid, jsxc.xmpp.conn.vcard.get, args, jsxc.xmpp.conn.vcard);
}
};
jsxc.gui.avatar.getPhotoFromVcard = function(stanza) {
jsxc.debug('vCard', stanza);
var vCard = $(stanza).find("vCard > PHOTO");
var src;
if (vCard.length === 0) {
jsxc.debug('No photo provided');
src = '0';
} else if (vCard.find('EXTVAL').length > 0) {
src = vCard.find('EXTVAL').text();
} else {
var img = vCard.find('BINVAL').text();
var type = vCard.find('TYPE').text();
src = 'data:' + type + ';base64,' + img;
}
// concat chunks
src = src.replace(/[\t\r\n\f]/gi, '');
return src;
};
jsxc.gui.avatar.set = function(jid, el, src) {
var self = jsxc.gui.avatar;
if (src === self.PLACEHOLDER || src === '0') {
if (typeof jsxc.options.defaultAvatar === 'function') {
jsxc.gui.avatar.queueAction(jid, function() {
jsxc.options.defaultAvatar.call(el, jid);
});
return;
}
jsxc.gui.avatarPlaceholder(el.find('.jsxc_avatar'), jid);
return;
}
el.find('.jsxc_avatar').removeAttr('style');
el.find('.jsxc_avatar').css({
'background-image': 'url(' + src + ')',
'text-indent': '999px'
});
};
jsxc.gui.avatar.queueAction = function(jid, fn, args, context) {
var self = jsxc.gui.avatar;
var bid = jsxc.jidToBid(jid);
var data = jsxc.storage.getUserItem('buddy', bid) || {};
var state = data.status;
var index = self.queue.indexOf(bid);
if (index > -1) {
self.queue.splice(index, 1);
}
var action = {
fn: fn,
args: args || [],
context: context || this
};
if (state === 0) {
self.queue.push(action);
} else {
self.queue.unshift(action);
}
jsxc.gui.avatar.processQueue();
};
jsxc.gui.avatar.processQueue = function() {
var self = jsxc.gui.avatar;
var currentTime = (new Date()).getTime();
if (currentTime - self.lastRun < self.DELAY) {
if (!self.timeout) {
self.timeout = setTimeout(self.processQueue, self.DELAY);
}
return;
}
self.lastRun = currentTime;
var i, action;
for (i = 0; i < self.CHUNKSIZE; i++) {
if (self.queue.length > 0) {
action = self.queue.shift();
action.fn.apply(action.context, action.args);
}
}
if (self.queue.length > 0) {
self.timeout = setTimeout(self.processQueue, self.DELAY);
} else {
self.timeout = null;
}
};
+22 -93
Ver Arquivo
@@ -238,94 +238,11 @@ jsxc.gui = {
ri.find('.jsxc_name').attr('title', info);
jsxc.gui.updateAvatar(ri.add(we.find('.jsxc_bar')), data.jid, data.avatar);
jsxc.gui.avatar.update(ri.add(we.find('.jsxc_bar')), data.jid, data.avatar);
$(document).trigger('update.gui.jsxc', [bid]);
},
/**
* Update avatar on all given elements.
*
* @memberOf jsxc.gui
* @param {jQuery} el Elements with subelement .jsxc_avatar
* @param {string} jid Jid
* @param {string} aid Avatar id (sha1 hash of image)
*/
updateAvatar: function(el, jid, aid) {
var setAvatar = function(src) {
if (src === 0 || src === '0') {
if (typeof jsxc.options.defaultAvatar === 'function') {
jsxc.options.defaultAvatar.call(el, jid);
return;
}
jsxc.gui.avatarPlaceholder(el.find('.jsxc_avatar'), jid);
return;
}
el.find('.jsxc_avatar').removeAttr('style');
el.find('.jsxc_avatar').css({
'background-image': 'url(' + src + ')',
'text-indent': '999px'
});
};
if (typeof aid === 'undefined') {
setAvatar(0);
return;
}
var avatarSrc = jsxc.storage.getUserItem('avatar', aid);
if (!jsxc.master && !avatarSrc) {
// force avatar placeholder for slave tab, until master tab requested vCard
avatarSrc = 0;
}
if (avatarSrc !== null) {
setAvatar(avatarSrc);
} else {
var handler_cb = function(stanza) {
jsxc.debug('vCard', stanza);
var vCard = $(stanza).find("vCard > PHOTO");
var src;
if (vCard.length === 0) {
jsxc.debug('No photo provided');
src = '0';
} else if (vCard.find('EXTVAL').length > 0) {
src = vCard.find('EXTVAL').text();
} else {
var img = vCard.find('BINVAL').text();
var type = vCard.find('TYPE').text();
src = 'data:' + type + ';base64,' + img;
}
// concat chunks
src = src.replace(/[\t\r\n\f]/gi, '');
jsxc.storage.setUserItem('avatar', aid, src);
setAvatar(src);
};
var error_cb = function(msg) {
jsxc.warn('Could not load vcard.', msg);
jsxc.storage.setUserItem('avatar', aid, 0);
setAvatar(0);
};
// workaround for https://github.com/strophe/strophejs/issues/172
if (Strophe.getBareJidFromJid(jid) === Strophe.getBareJidFromJid(jsxc.xmpp.conn.jid)) {
jsxc.xmpp.conn.vcard.get(handler_cb, error_cb);
} else {
jsxc.xmpp.conn.vcard.get(handler_cb, Strophe.getBareJidFromJid(jid), error_cb);
}
}
},
/**
* Updates scrollbar handlers.
*
@@ -877,7 +794,7 @@ jsxc.gui = {
var data = jsxc.storage.getUserItem('buddy', bid);
if (data) {
if (data && data.res) {
// Display resources and corresponding information
var i, j, res, identities, identity = null,
cap, client;
@@ -1262,12 +1179,12 @@ jsxc.gui = {
$('[data-bid="' + bid + '"]').each(function() {
var el = $(this);
el.attr('data-status', pres);
if (el.find('.jsxc_avatar').length > 0) {
el = el.find('.jsxc_avatar');
if (!el.hasClass('jsxc_statusIndicator')) {
el = el.find('.jsxc_statusIndicator');
}
el.attr('data-status', pres);
el.removeClass('jsxc_' + jsxc.CONST.STATUS.join(' jsxc_')).addClass('jsxc_' + pres);
});
},
@@ -2800,8 +2717,12 @@ jsxc.gui.window = {
$('[data-bid="' + bid + '"]').find('.jsxc_lastmsg .jsxc_text').html(msg);
}
if (jsxc.Message.getDOM(uid).length > 0) {
jsxc.Message.getDOM(uid).replaceWith(msgDiv);
var currentMessageElement = jsxc.Message.getDOM(uid);
if (currentMessageElement.length > 0) {
if (currentMessageElement.attr('data-queryId')) {
msgDiv.attr('data-queryId', currentMessageElement.attr('data-queryId'));
}
currentMessageElement.replaceWith(msgDiv);
} else {
win.find('.jsxc_textarea').append(msgDiv);
}
@@ -2815,7 +2736,7 @@ jsxc.gui.window = {
msgDiv.attr('data-bid', jsxc.jidToBid(message.sender.jid));
var data = jsxc.storage.getUserItem('buddy', jsxc.jidToBid(message.sender.jid)) || {};
jsxc.gui.updateAvatar(msgDiv, jsxc.jidToBid(message.sender.jid), data.avatar);
jsxc.gui.avatar.update(msgDiv, jsxc.jidToBid(message.sender.jid), data.avatar);
title = jsxc.jidToBid(message.sender.jid);
}
@@ -2846,7 +2767,9 @@ jsxc.gui.window = {
jsxc.gui.detectUriScheme(win);
jsxc.gui.detectEmail(win);
jsxc.gui.window.scrollDown(bid);
if (!message.forwarded) {
jsxc.gui.window.scrollDown(bid);
}
},
/**
@@ -2914,10 +2837,16 @@ jsxc.gui.window = {
jsxc.storage.setUserItem('history', bid, []);
var buddyData = jsxc.storage.getUserItem('buddy', bid) || {};
delete buddyData.lastArchiveUid;
delete buddyData.archiveExhausted;
jsxc.storage.setUserItem('buddy', bid, buddyData);
var win = jsxc.gui.window.get(bid);
if (win.length > 0) {
win.find('.jsxc_textarea').empty();
win.find('.jsxc_textarea').scroll();
}
},
+10 -5
Ver Arquivo
@@ -81,7 +81,8 @@ jsxc = {
},
NS: {
CARBONS: 'urn:xmpp:carbons:2',
FORWARD: 'urn:xmpp:forward:0'
FORWARD: 'urn:xmpp:forward:0',
HINTS: 'urn:xmpp:hints'
},
HIDDEN: 'hidden',
SHOWN: 'shown',
@@ -222,8 +223,8 @@ jsxc = {
}
// Check localStorage
if (typeof(localStorage) === 'undefined') {
jsxc.warn("Browser doesn't support localStorage.");
if (!jsxc.storage.hasSupport()) {
jsxc.error("Browser doesn't support localStorage. JSXC will be disabled.");
return;
}
@@ -531,6 +532,10 @@ jsxc = {
username = settings.xmpp.username;
}
if (typeof settings.xmpp.password === 'string') {
password = settings.xmpp.password;
}
var resource = (settings.xmpp.resource) ? '/' + settings.xmpp.resource : '';
var domain = settings.xmpp.domain;
var jid;
@@ -584,7 +589,7 @@ jsxc = {
$('#jsxc_roster').removeClass('jsxc_noConnection');
jsxc.registerLogout();
jsxc.gui.updateAvatar($('#jsxc_roster > .jsxc_bottom'), jsxc.jidToBid(jsxc.storage.getItem('jid')), 'own');
jsxc.gui.avatar.update($('#jsxc_roster > .jsxc_bottom'), jsxc.jidToBid(jsxc.storage.getItem('jid')), 'own');
jsxc.gui.restore();
},
@@ -652,7 +657,7 @@ jsxc = {
jsxc.otr.createDSA();
}
jsxc.gui.updateAvatar($('#jsxc_roster > .jsxc_bottom'), jsxc.jidToBid(jsxc.storage.getItem('jid')), 'own');
jsxc.gui.avatar.update($('#jsxc_roster > .jsxc_bottom'), jsxc.jidToBid(jsxc.storage.getItem('jid')), 'own');
},
/**
+7 -10
Ver Arquivo
@@ -826,7 +826,6 @@ jsxc.muc = {
var nickname = Strophe.unescapeNode(res);
var own = jsxc.storage.getUserItem('ownNicknames') || {};
var member = jsxc.storage.getUserItem('member', room) || {};
var openWindow = false;
var codes = [];
xdata.find('status').each(function() {
@@ -840,6 +839,9 @@ jsxc.muc = {
if (roomdata.state === self.CONST.ROOMSTATE.INIT) {
// successfully joined
roomdata.status = jsxc.CONST.STATUS.indexOf('online');
jsxc.storage.setUserItem('buddy', room, roomdata);
jsxc.storage.setUserItem('roomNames', jsxc.xmpp.conn.muc.roomNames);
if (jsxc.gui.roster.getItem(room).length === 0) {
@@ -852,8 +854,9 @@ jsxc.muc = {
if ($('#jsxc_dialog').length > 0) {
// User joined the room manually
openWindow = true;
jsxc.gui.dialog.close();
jsxc.gui.window.open(room);
}
}
@@ -944,11 +947,6 @@ jsxc.muc = {
$(document).trigger('status.muc.jsxc', [code, room, nickname, member[nickname] || {}, presence]);
});
if (openWindow) {
// we wait until all parameters are set up correctly (e.g. state)
jsxc.gui.window.open(room);
}
return true;
},
@@ -1244,15 +1242,14 @@ jsxc.muc = {
if (typeof jid === 'string') {
m.find('.jsxc_name').text(jsxc.jidToBid(jid));
m.attr('data-bid', jsxc.jidToBid(jid));
title = title + '\n' + jsxc.jidToBid(jid);
var data = jsxc.storage.getUserItem('buddy', jsxc.jidToBid(jid));
if (data !== null && typeof data === 'object') {
jsxc.gui.updateAvatar(m, jsxc.jidToBid(jid), data.avatar);
jsxc.gui.avatar.update(m, jsxc.jidToBid(jid), data.avatar);
} else if (jsxc.jidToBid(jid) === ownBid) {
jsxc.gui.updateAvatar(m, jsxc.jidToBid(jid), 'own');
jsxc.gui.avatar.update(m, jsxc.jidToBid(jid), 'own');
}
} else {
m.find('.jsxc_name').text(nickname);
+9 -3
Ver Arquivo
@@ -174,9 +174,7 @@ jsxc.options = {
* @param jid Jid of that user.
* @this {jQuery} Elements to update with probable .jsxc_avatar elements
*/
defaultAvatar: function(jid) {
jsxc.gui.avatarPlaceholder($(this).find('.jsxc_avatar'), jid);
},
defaultAvatar: null,
/**
* This callback processes all settings.
@@ -303,5 +301,13 @@ jsxc.options = {
screenMediaExtension: {
firefox: '',
chrome: ''
},
/**
* Options for Message Archive Management (XEP-0313)
*/
mam: {
enable: false,
max: null
}
};
+2
Ver Arquivo
@@ -35,6 +35,7 @@ jsxc.otr = {
});
} else {
jsxc.gui.window.postMessage({
_uid: d._uid,
bid: bid,
direction: jsxc.Message.IN,
msg: d.msg,
@@ -209,6 +210,7 @@ jsxc.otr = {
// Receive message
jsxc.otr.objects[bid].on('ui', function(msg, encrypted, meta) {
jsxc.otr.receiveMessage({
_uid: meta._uid,
bid: bid,
msg: msg,
encrypted: encrypted === true,
+27 -2
Ver Arquivo
@@ -13,6 +13,22 @@ jsxc.storage = {
SEP: ':',
hasSupport: function() {
if (typeof localStorage === 'undefined' || localStorage === null) {
return false;
}
try {
localStorage.setItem('jsxc:storage:test', 'jsxc');
localStorage.removeItem('jsxc:storage:test');
} catch (err) {
jsxc.warn('Can not save any data. Probably your quota exceeded or you use Safari in private Mode:', (err) ? err.message : undefined);
return false;
}
return true;
},
/**
* @param {type} uk Should we generate a user prefix?
* @returns {String} prefix
@@ -62,7 +78,11 @@ jsxc.storage = {
});
}
localStorage.setItem(jsxc.storage.getPrefix(uk) + key, value);
try {
localStorage.setItem(jsxc.storage.getPrefix(uk) + key, value);
} catch (err) {
jsxc.error('An error occured while saving data.', (err) ? err.message : undefined);
}
},
setUserItem: function(type, key, value) {
@@ -394,6 +414,11 @@ jsxc.storage = {
var history = JSON.parse(e.newValue);
var uid, el, message;
if (!jsxc.master) {
var win = jsxc.gui.window.get(bid);
win.find('.jsxc_textarea').empty();
}
while (history.length > 0) {
uid = history.pop();
@@ -402,7 +427,7 @@ jsxc.storage = {
if (el.length === 0) {
if (jsxc.master && message.direction === jsxc.Message.OUT) {
jsxc.xmpp.sendMessage(message.bid, message.msg, message._uid);
jsxc.xmpp.sendMessage(message);
}
jsxc.gui.window._postMessage(message, true);
+17 -14
Ver Arquivo
@@ -248,8 +248,10 @@ jsxc.webrtc = {
win.find('.jsxc_tools .jsxc_settings').after(div);
var screenMediaExtension = jsxc.options.get('screenMediaExtension') || {};
var browser = self.conn.jingle.RTC.webrtcDetectedBrowser;
if (screenMediaExtension[browser] || jsxc.storage.getItem('debug')) {
var browserDetails = self.conn.jingle.RTC.browserDetails || {};
var browser = browserDetails.browser;
var version = browserDetails.version;
if (screenMediaExtension[browser] || jsxc.storage.getItem('debug') || (browser === 'firefox' && version >= 52)) {
// Add screen sharing button if extension is available or we are in debug mode
var a = $('<a>');
a.text($.t('Share_screen'));
@@ -794,9 +796,8 @@ jsxc.webrtc = {
* @param stream {mediastream}
*/
attachMediaStream: function(element, stream) {
var self = jsxc.webrtc;
self.conn.jingle.RTC.attachMediaStream((element instanceof jQuery) ? element.get(0) : element, stream);
var el = (element instanceof jQuery) ? element.get(0) : element;
el.srcObject = stream;
$(element).show();
},
@@ -1111,21 +1112,23 @@ jsxc.webrtc = {
}
try {
self.conn.jingle.RTC.getUserMedia(constraints,
function(stream) {
jsxc.debug('onUserMediaSuccess');
$(document).trigger('mediaready.jingle', [stream]);
},
function(error) {
jsxc.warn('Failed to get access to local media. Error ', error);
$(document).trigger('mediafailure.jingle', [error]);
});
self.conn.jingle.getUserMedia(constraints, self.userMediaCallback);
} catch (e) {
jsxc.error('GUM failed: ', e);
$(document).trigger('mediafailure.jingle');
}
},
userMediaCallback: function(err, stream) {
if (err) {
jsxc.warn('Failed to get access to local media. Error ', err);
$(document).trigger('mediafailure.jingle', [err]);
} else if (stream) {
jsxc.debug('onUserMediaSuccess');
$(document).trigger('mediaready.jingle', [stream]);
}
},
/**
* Get screen media from local browser.
*
+29 -43
Ver Arquivo
@@ -67,8 +67,6 @@ jsxc.xmpp.chatState.onComposing = function(ev, jid) {
return;
}
clearTimeout(win.data('composing-timeout'));
// add user in array if necessary
var usersComposing = win.data('composing') || [];
if (usersComposing.indexOf(user) === -1) {
@@ -76,25 +74,8 @@ jsxc.xmpp.chatState.onComposing = function(ev, jid) {
win.data('composing', usersComposing);
}
var textarea = win.find('.jsxc_textarea');
var composingNotif = textarea.find('.jsxc_composing');
if (composingNotif.length < 1) {
// notification not present, add it
composingNotif = $('<div>').addClass('jsxc_composing')
.addClass('jsxc_chatmessage')
.addClass('jsxc_sys')
.appendTo(textarea);
}
var msg = self._genComposingMsg(usersComposing);
composingNotif.text(msg);
// scroll to bottom
jsxc.gui.window.scrollDown(bid);
// show message
composingNotif.addClass('jsxc_fadein');
var msg = self._genComposingMsg(data.type, usersComposing);
jsxc.xmpp.chatState.setStatus(win, msg);
};
/**
@@ -120,7 +101,6 @@ jsxc.xmpp.chatState.onPaused = function(ev, jid) {
return;
}
var el = win.find('.jsxc_composing');
var usersComposing = win.data('composing') || [];
if (usersComposing.indexOf(user) >= 0) {
@@ -129,25 +109,12 @@ jsxc.xmpp.chatState.onPaused = function(ev, jid) {
win.data('composing', usersComposing);
}
if (usersComposing.length === 0) {
var durationValue = el.css('transition-duration') || '0s';
var duration = parseFloat(durationValue) || 0;
if (durationValue.match(/[^m]s$/)) {
duration *= 1000;
}
el.removeClass('jsxc_fadein');
var to = setTimeout(function() {
el.remove();
}, duration);
win.data('composing-timeout', to);
} else {
// update message
el.text(self._genComposingMsg(usersComposing));
var composingMsg;
if (usersComposing.length !== 0) {
composingMsg = self._genComposingMsg(data.type, usersComposing);
}
jsxc.xmpp.chatState.setStatus(win, composingMsg);
};
/**
@@ -226,16 +193,35 @@ jsxc.xmpp.chatState.endComposing = function(bid) {
* Generate composing message.
*
* @memberOf jsxc.xmpp.chatState
* @param {String} the type of the chat ('groupchat' or 'chat')
* @param {Array} usersComposing List of users which are currently composing a message
*/
jsxc.xmpp.chatState._genComposingMsg = function(usersComposing) {
jsxc.xmpp.chatState._genComposingMsg = function(chatType, usersComposing) {
if (!usersComposing || usersComposing.length === 0) {
jsxc.debug('usersComposing array is empty?');
return '';
} else {
return usersComposing.length > 1 ? usersComposing.join(', ') + $.t('_are_composing') :
usersComposing[0] + $.t('_is_composing');
if (chatType === 'groupchat') {
return usersComposing.length > 1 ? usersComposing.join(', ') + $.t('_are_composing') :
usersComposing[0] + $.t('_is_composing');
}
return $.t('_is_composing');
}
};
jsxc.xmpp.chatState.setStatus = function(win, msg) {
var statusMsgElement = win.find('.jsxc_status-msg');
statusMsgElement.text(msg || '');
statusMsgElement.attr('title', msg || '');
if (msg) {
statusMsgElement.addClass('jsxc_composing');
win.addClass('jsxc_status-msg-show');
} else {
statusMsgElement.removeClass('jsxc_composing');
win.removeClass('jsxc_status-msg-show');
}
};
+7 -8
Ver Arquivo
@@ -63,11 +63,7 @@ jsxc.xmpp.httpUpload.init = function(o) {
return;
}
if (caps.hasFeatureByJid(domain, self.CONST.NS.HTTPUPLOAD)) {
self.discoverUploadService();
} else {
jsxc.debug(domain + ' does not support http upload');
}
self.discoverUploadService();
};
/**
@@ -77,12 +73,15 @@ jsxc.xmpp.httpUpload.init = function(o) {
*/
jsxc.xmpp.httpUpload.discoverUploadService = function() {
var self = jsxc.xmpp.httpUpload;
var domain = self.conn.domain;
jsxc.debug('discover http upload service');
self.queryItemForUploadService(self.conn.domain);
if (jsxc.xmpp.conn.caps.hasFeatureByJid(domain, self.CONST.NS.HTTPUPLOAD)) {
self.queryItemForUploadService(domain);
}
self.conn.disco.items(self.conn.domain, null, function(items) {
self.conn.disco.items(domain, null, function(items) {
$(items).find('item').each(function() {
var jid = $(this).attr('jid');
@@ -118,7 +117,7 @@ jsxc.xmpp.httpUpload.queryItemForUploadService = function(jid, cb) {
jsxc.options.set('httpUpload', {
server: jid,
name: $(info).find('identity').attr('name'),
maxSize: parseInt(httpUploadMaxSize.text())
maxSize: parseInt(httpUploadMaxSize.text()) || -1
});
self.ready = true;
+97 -17
Ver Arquivo
@@ -94,6 +94,7 @@ jsxc.xmpp = {
$(document).on('authfail.jsxc', jsxc.xmpp.onAuthFail);
Strophe.addNamespace('RECEIPTS', 'urn:xmpp:receipts');
Strophe.addNamespace('VERSION', 'jabber:iq:version');
}
// Create new connection (no login)
@@ -156,6 +157,7 @@ jsxc.xmpp = {
if (jsxc.xmpp.conn.caps) {
// Add system handler, because user handler isn't called before
// we are authenticated
// @REVIEW this could maybe retrieved from jsxc.xmpp.conn.features
jsxc.xmpp.conn._addSysHandler(function(stanza) {
var from = jsxc.xmpp.conn.domain,
c = stanza.querySelector('c'),
@@ -196,7 +198,6 @@ jsxc.xmpp = {
// REVIEW: this should maybe moved to xmpp.disconnected
// clean up
jsxc.storage.removeUserItem('buddylist');
jsxc.storage.removeUserItem('windowlist');
jsxc.storage.removeUserItem('unreadMsg');
@@ -256,6 +257,9 @@ jsxc.xmpp = {
jsxc.xmpp.saveSessionParameter();
var rosterVerSupport = $(jsxc.xmpp.conn.features).find('[xmlns="urn:xmpp:features:rosterver"]').length > 0;
jsxc.storage.setUserItem('rosterVerSupport', rosterVerSupport);
if (jsxc.options.loginForm.triggered) {
switch (jsxc.options.loginForm.onConnected || 'submit') {
case 'submit':
@@ -286,11 +290,14 @@ jsxc.xmpp = {
$('#jsxc_roster').removeClass('jsxc_noConnection');
Strophe.addNamespace('VERSION', 'jabber:iq:version');
jsxc.xmpp.conn.addHandler(jsxc.xmpp.onRosterChanged, 'jabber:iq:roster', 'iq', 'set');
jsxc.xmpp.conn.addHandler(jsxc.xmpp.onChatMessage, null, 'message', 'chat');
jsxc.xmpp.conn.addHandler(jsxc.xmpp.onHeadlineMessage, null, 'message', 'headline');
jsxc.xmpp.conn.addHandler(jsxc.xmpp.onReceived, null, 'message');
jsxc.xmpp.conn.addHandler(jsxc.xmpp.onPresence, null, 'presence');
jsxc.xmpp.conn.addHandler(jsxc.xmpp.onVersionRequest, Strophe.NS.VERSION, 'iq', 'get');
jsxc.gui.init();
@@ -332,18 +339,25 @@ jsxc.xmpp = {
}
// Only load roaster if necessary
if (!jsxc.reconnect || !jsxc.storage.getUserItem('buddylist')) {
if (!jsxc.reconnect) {
// in order to not overide existing presence information, we send
// pres first after roster is ready
$(document).one('cloaded.roster.jsxc', jsxc.xmpp.sendPres);
$('#jsxc_roster > p:first').remove();
var queryAttr = {
xmlns: 'jabber:iq:roster'
};
if (jsxc.storage.getUserItem('rosterVerSupport')) {
// @TODO check if we really cached the roster
queryAttr.ver = jsxc.storage.getUserItem('rosterVer') || '';
}
var iq = $iq({
type: 'get'
}).c('query', {
xmlns: 'jabber:iq:roster'
});
}).c('query', queryAttr);
jsxc.xmpp.conn.sendIQ(iq, jsxc.xmpp.onRoster);
} else {
@@ -371,14 +385,12 @@ jsxc.xmpp = {
},
initNewConnection: function() {
// make shure roster will be reloaded
jsxc.storage.removeUserItem('buddylist');
jsxc.storage.removeUserItem('windowlist');
jsxc.storage.removeUserItem('own');
jsxc.storage.removeUserItem('avatar', 'own');
jsxc.storage.removeUserItem('otrlist');
jsxc.storage.removeUserItem('unreadMsg');
jsxc.storage.removeUserItem('features');
// reset user options
jsxc.storage.removeUserElement('options', 'RTCPeerConfig');
@@ -393,6 +405,7 @@ jsxc.xmpp = {
jsxc.xmpp.conn.disco.addIdentity('client', 'web', 'JSXC');
jsxc.xmpp.conn.disco.addFeature(Strophe.NS.DISCO_INFO);
jsxc.xmpp.conn.disco.addFeature(Strophe.NS.RECEIPTS);
jsxc.xmpp.conn.disco.addFeature(Strophe.NS.VERSION);
}
// create presence stanza
@@ -415,6 +428,23 @@ jsxc.xmpp = {
jsxc.debug('Send presence', pres.toString());
jsxc.xmpp.conn.send(pres);
if (!jsxc.storage.getUserItem('features')) {
jsxc.xmpp.conn.flush();
var barJid = Strophe.getBareJidFromJid(jsxc.xmpp.conn.jid);
jsxc.xmpp.conn.disco.info(barJid, undefined, function(stanza) {
var features = $(stanza).find('feature').map(function() {
return $(this).attr('var');
});
jsxc.storage.setUserItem('features', features.toArray());
$(document).trigger('features.jsxc');
});
} else {
$(document).trigger('features.jsxc');
}
},
/**
@@ -431,6 +461,7 @@ jsxc.xmpp = {
jsxc.storage.removeItem('hidden');
jsxc.storage.removeUserItem('avatar', 'own');
jsxc.storage.removeUserItem('otrlist');
jsxc.storage.removeUserItem('features');
$(document).off('connected.jsxc', jsxc.xmpp.connected);
$(document).off('attached.jsxc', jsxc.xmpp.attached);
@@ -458,6 +489,7 @@ jsxc.xmpp = {
window.clearInterval(jsxc.keepaliveInterval);
jsxc.role_allocation = false;
jsxc.master = false;
jsxc.reconnect = false;
jsxc.storage.removeItem('alive');
jsxc.changeState(jsxc.CONST.STATE.SUSPEND);
@@ -506,13 +538,15 @@ jsxc.xmpp = {
* @private
*/
onRoster: function(iq) {
/*
* <iq from='' type='get' id=''> <query xmlns='jabber:iq:roster'> <item
* jid='' name='' subscription='' /> ... </query> </iq>
*/
jsxc.debug('Load roster', iq);
if ($(iq).find('query').length === 0) {
jsxc.debug('Use cached roster');
jsxc.restoreRoster();
return;
}
var buddies = [];
$(iq).find('item').each(function() {
@@ -543,6 +577,10 @@ jsxc.xmpp = {
jsxc.storage.setUserItem('buddylist', buddies);
if ($(iq).find('query').attr('ver')) {
jsxc.storage.setUserItem('rosterVer', $(iq).find('query').attr('ver'));
}
// load bookmarks
jsxc.xmpp.bookmarks.load();
@@ -622,6 +660,10 @@ jsxc.xmpp = {
}
});
if ($(iq).find('query').attr('ver')) {
jsxc.storage.setUserItem('rosterVer', $(iq).find('query').attr('ver'));
}
if (!jsxc.storage.getUserItem('buddylist') || jsxc.storage.getUserItem('buddylist').length === 0) {
jsxc.gui.roster.empty();
} else {
@@ -745,9 +787,7 @@ jsxc.xmpp = {
});
}
if (data.type === 'groupchat') {
data.status = status;
} else {
if (data.type !== 'groupchat') {
data.status = max;
}
@@ -876,7 +916,15 @@ jsxc.xmpp = {
var msg = jsxc.removeHTML(body);
msg = jsxc.escapeHTML(msg);
jsxc.storage.saveMessage(bid, 'in', msg, false, forwarded, stamp);
var messageObj = new jsxc.Message({
bid: bid,
msg: msg,
direction: jsxc.Message.IN,
encrypted: false,
forwarded: forwarded,
stamp: stamp
});
messageObj.save();
return true;
}
@@ -939,12 +987,15 @@ jsxc.xmpp = {
if (jsxc.otr.objects.hasOwnProperty(bid) && body) {
// @TODO check for file upload url after decryption
jsxc.otr.objects[bid].receiveMsg(body, {
_uid: mid,
foo: 'bar',
stamp: stamp,
forwarded: forwarded,
attachment: attachment
});
} else {
jsxc.gui.window.postMessage({
_uid: mid,
bid: bid,
direction: jsxc.Message.IN,
msg: body,
@@ -991,6 +1042,29 @@ jsxc.xmpp = {
return true;
},
/**
* Respond to version request (XEP-0092).
*/
onVersionRequest: function(stanza) {
stanza = $(stanza);
var from = stanza.attr('from');
var id = stanza.attr('id');
var iq = $iq({
type: 'result',
to: from,
id: id
}).c('query', {
xmlns: Strophe.NS.VERSION
}).c('name').t('JSXC').up()
.c('version').t(jsxc.version);
jsxc.xmpp.conn.sendIQ(iq);
return true;
},
/**
* Triggerd if the rid changed
*
@@ -1159,6 +1233,12 @@ jsxc.xmpp = {
});
}
if (msg.match(/^\?OTR/)) {
xmlMsg.up().c("no-permanent-store", {
xmlns: jsxc.CONST.NS.HINTS
});
}
if (type === 'chat' && (isBar || jsxc.xmpp.conn.caps.hasFeatureByJid(jid, Strophe.NS.RECEIPTS))) {
// Add request according to XEP-0184
xmlMsg.up().c('request', {
+217
Ver Arquivo
@@ -0,0 +1,217 @@
/**
* Implements XEP-0313: Message Archive Management.
*
* @namespace jsxc.xmpp.mam
* @see {@link https://xmpp.org/extensions/xep-0313.html}
*/
jsxc.xmpp.mam = {
conn: null
};
jsxc.xmpp.mam.init = function() {
var self = jsxc.xmpp.mam;
self.conn = jsxc.xmpp.conn;
};
jsxc.xmpp.mam.isEnabled = function() {
var mamOptions = jsxc.options.get('mam') || {};
var features = jsxc.storage.getUserItem('features') || [];
var hasFeatureMam2 = features.indexOf(Strophe.NS.MAM) >= 0;
return hasFeatureMam2 && mamOptions.enable;
};
jsxc.xmpp.mam.nextMessages = function(bid) {
var self = jsxc.xmpp.mam;
var buddyData = jsxc.storage.getUserItem('buddy', bid) || {};
var lastArchiveUid = buddyData.lastArchiveUid;
var queryId = self.conn.getUniqueId();
var mamOptions = jsxc.options.get('mam') || {};
var history = jsxc.storage.getUserItem('history', bid) || [];
if (buddyData.archiveExhausted) {
jsxc.debug('No more archived messages.');
return;
}
var queryOptions = {
queryid: queryId,
before: lastArchiveUid || '',
with: bid,
onMessage: function() {
var args = Array.from(arguments);
args.unshift(bid);
self.onMessage.apply(this, args);
return true;
},
onComplete: function() {
var args = Array.from(arguments);
args.unshift(bid);
self.onComplete.apply(this, args);
return true;
}
};
var oldestMessageId = history[history.length - 1];
if (oldestMessageId && !lastArchiveUid) {
var oldestMessage = new jsxc.Message(oldestMessageId);
queryOptions.end = (new Date(oldestMessage.stamp)).toISOString();
}
if (mamOptions.max) {
queryOptions.max = mamOptions.max;
}
self.conn.mam.query(undefined, queryOptions);
};
jsxc.xmpp.mam.onMessage = function(bid, stanza) {
stanza = $(stanza);
var result = stanza.find('result[xmlns="' + Strophe.NS.MAM + '"]');
var queryId = result.attr('queryid');
if (result.length !== 1) {
return;
}
var forwarded = result.find('forwarded[xmlns="' + jsxc.CONST.NS.FORWARD + '"]');
var message = forwarded.find('message');
var messageId = $(message).attr('id');
if (message.length !== 1) {
return;
}
var from = message.attr('from');
var to = message.attr('to');
if (jsxc.jidToBid(from) !== bid && jsxc.jidToBid(to) !== bid) {
return;
}
var delay = forwarded.find('delay[xmlns="urn:xmpp:delay"]');
var stamp = (delay.length > 0) ? new Date(delay.attr('stamp')) : new Date();
stamp = stamp.getTime();
var body = $(message).find('body:first').text();
if (!body || body.match(/\?OTR/i)) {
return true;
}
var direction = (jsxc.jidToBid(to) === bid) ? jsxc.Message.OUT : jsxc.Message.IN;
var win = jsxc.gui.window.get(bid);
var textarea = win.find('.jsxc_textarea');
if (textarea.find('[id="' + messageId + '"]').length === 0) {
var pseudoChatElement = $('<div>');
pseudoChatElement.attr('id', messageId.replace(/:/g, '-'));
pseudoChatElement.attr('data-queryId', queryId);
var lastMessage = textarea.find('[data-queryId="' + queryId + '"]').last();
var history = jsxc.storage.getUserItem('history', bid) || [];
if (history.indexOf(messageId) < 0) {
if (lastMessage.length === 0) {
textarea.prepend(pseudoChatElement);
history.push(messageId);
} else {
lastMessage.after(pseudoChatElement);
history.splice(history.indexOf(lastMessage.attr('id').replace(/-/g, ':')), 0, messageId);
}
}
jsxc.storage.setUserItem('history', bid, history);
}
jsxc.gui.window.postMessage({
_uid: messageId,
bid: bid,
direction: direction,
msg: body,
encrypted: false,
forwarded: true,
stamp: stamp
});
};
jsxc.xmpp.mam.onComplete = function(bid, stanza) {
stanza = $(stanza);
var fin = stanza.find('fin[xmlns="' + Strophe.NS.MAM + '"]');
var buddyData = jsxc.storage.getUserItem('buddy', bid) || {};
var win = jsxc.gui.window.get(bid);
buddyData.archiveExhausted = fin.attr('complete') === 'true';
buddyData.lastArchiveUid = fin.find('first').text();
if (buddyData.archiveExhausted) {
win.find('.jsxc_fade').removeClass('jsxc_mam-enable');
}
jsxc.storage.setUserItem('buddy', bid, buddyData);
};
jsxc.xmpp.mam.initWindow = function(ev, win) {
var self = jsxc.xmpp.mam;
if (!jsxc.xmpp.conn && jsxc.master) {
$(document).one('attached.jsxc', function() {
self.initWindow(null, win);
});
return;
}
if (!jsxc.master) {
return;
}
$(document).on('features.jsxc', function() {
jsxc.xmpp.mam.addLoadButton(win);
});
var features = jsxc.storage.getUserItem('features');
if (features !== null) {
// features.jsxc was already fired
jsxc.xmpp.mam.addLoadButton(win);
}
};
jsxc.xmpp.mam.addLoadButton = function(win) {
if (!jsxc.xmpp.mam.isEnabled()) {
return;
}
var classNameShow = 'jsxc_show';
var classNameMamEnable = 'jsxc_mam-enable';
var bid = win.attr('data-bid');
var element = $('<div>');
element.addClass('jsxc_mam-load-more');
element.appendTo(win.find('.slimScrollDiv'));
element.click(function() {
jsxc.xmpp.mam.nextMessages(bid);
});
element.text($.t('Load_older_messages'));
win.find('.jsxc_textarea').scroll(function() {
var buddyData = jsxc.storage.getUserItem('buddy', bid) || {};
if (this.scrollTop < 42 && !buddyData.archiveExhausted) {
element.addClass(classNameShow);
} else {
element.removeClass(classNameShow);
}
if (!buddyData.archiveExhausted) {
win.find('.jsxc_fade').addClass(classNameMamEnable);
}
});
win.find('.jsxc_textarea').scroll();
};
$(document).on('attached.jsxc', jsxc.xmpp.mam.init);
$(document).on('init.window.jsxc', jsxc.xmpp.mam.initWindow);
+1 -1
Ver Arquivo
@@ -1 +1 @@
}(jQuery));
}(jQuery));
+2 -1
Ver Arquivo
@@ -1,7 +1,7 @@
<li class="jsxc_windowItem">
<div class="jsxc_window">
<div class="jsxc_bar">
<div class="jsxc_avatar"></div>
<div class="jsxc_avatar jsxc_statusIndicator"></div>
<div class="jsxc_tools">
<div class="jsxc_settings">
<div class="jsxc_more"></div>
@@ -33,6 +33,7 @@
<span class="jsxc_unread" />
<span class="jsxc_text" />
</div>
<div class="jsxc_status-msg" />
</div>
</div>
<div class="jsxc_fade">
+1 -1
Ver Arquivo
@@ -1,7 +1,7 @@
<div id="jsxc_roster">
<ul id="jsxc_buddylist"></ul>
<div class="jsxc_bottom jsxc_presence jsxc_rosteritem" data-bid="own">
<div id="jsxc_avatar" class="jsxc_avatar" />
<div id="jsxc_avatar" class="jsxc_avatar jsxc_statusIndicator" />
<div id="jsxc_menu">
<span></span>
<div class="jsxc_inner">
+1 -1
Ver Arquivo
@@ -1,5 +1,5 @@
<li class="jsxc_rosteritem">
<div class="jsxc_avatar"></div>
<div class="jsxc_avatar jsxc_statusIndicator"></div>
<div class="jsxc_more" />
<div class="jsxc_caption">
<div class="jsxc_name" />
+21
Ver Arquivo
@@ -97,6 +97,27 @@
</fieldset>
</form>
<form class="form-horizontal col-sm-6">
<fieldset class="jsxc_fieldsetMam jsxc_fieldset">
<h3 class="jsxc_experimental" data-i18n="Message_history"></h3>
<p data-i18n="setting-mam-enable"></p>
<div class="form-group">
<div class="col-sm-12">
<div class="checkbox">
<label>
<input type="checkbox" id="mam-enable"><span data-i18n="Enable"></span>
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-12">
<button class="btn btn-primary jsxc_continue" type="submit" data-i18n="Save"></button>
</div>
</div>
</fieldset>
</form>
<form class="form-horizontal col-sm-6" data-onsubmit="xmpp.carbons.refresh">
<fieldset class="jsxc_fieldsetCarbons jsxc_fieldset">
<h3 data-i18n="Carbon_copy"></h3>