Comparar commits
53 Commits
v3.1.0
...
3.2.0-beta.1
| Autor | SHA1 | Data | |
|---|---|---|---|
| 6687eaa66c | |||
| 895cae067c | |||
| b0b3245e4e | |||
| 8f58a939fb | |||
| 068f60c64e | |||
| 240a257397 | |||
| bca7af73ec | |||
| 62f6ddbfbe | |||
| fa831e25ca | |||
| 3e7633d2c8 | |||
| 92e38a8abb | |||
| 7765b6b46f | |||
| d675401bc8 | |||
| 16e519d5ec | |||
| 62ca260ba3 | |||
| f1a83cd696 | |||
| 3d97567429 | |||
| 3226a3c940 | |||
| 31eba50c99 | |||
| ec0cec8a9e | |||
| 15c7948cb8 | |||
| 52588a1437 | |||
| 1d60187f98 | |||
| 81d84a02b9 | |||
| 2eb4dfdea2 | |||
| 0aa0d4d467 | |||
| f544b8d753 | |||
| 60afa8efeb | |||
| 413bfd8dc3 | |||
| 964de1637c | |||
| 684bd5b27a | |||
| 2cbc5b74a3 | |||
| 66a1ed906c | |||
| 55838a4724 | |||
| c8b6a7b1ba | |||
| d45a5e1fda | |||
| 95689c62b6 | |||
| 0f2960b1fb | |||
| 7552e5c73a | |||
| a6de6d6843 | |||
| eeab8355e5 | |||
| e95f61af25 | |||
| 4ec0656de6 | |||
| 687347ec09 | |||
| ace5fc585b | |||
| d38b45c441 | |||
| 3d408a51b9 | |||
| 78cb8426c3 | |||
| daa5d35d7a | |||
| daf6217a63 | |||
| 479ebb3a26 | |||
| 4961e7e8e7 | |||
| e953303002 |
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
Diferenças do arquivo suprimidas por serem muito extensas
Carregar Diff
externo
+9
-9
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
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
externo
+30
-29
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
@@ -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
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
+1
-1
Submodule lib/strophe.jinglejs updated: 651a2ba8d2...aac6d4610b
+4
-1
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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
@@ -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",
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
|
||||
.mfp-close {
|
||||
font-size: 23px;
|
||||
font-weight: normal;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,6 +115,12 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.jsxc_avatar {
|
||||
:before {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+77
-27
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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';
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
@@ -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
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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.
|
||||
*
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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
@@ -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', {
|
||||
|
||||
@@ -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
@@ -1 +1 @@
|
||||
}(jQuery));
|
||||
}(jQuery));
|
||||
|
||||
@@ -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,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,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" />
|
||||
|
||||
@@ -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>
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário