Coder Social home page Coder Social logo

jabbercat / jabbercat Goto Github PK

View Code? Open in Web Editor NEW
39.0 12.0 8.0 1.25 MB

Qt-based Instant Messaging client for the Jabber (XMPP) network

Home Page: https://jabbercat.org

License: GNU General Public License v3.0

Makefile 0.48% QMake 0.08% Python 92.95% CSS 0.80% HTML 0.11% JavaScript 5.58%
instant-messaging xmpp-client xmpp qt5 jabber

jabbercat's Introduction

(The JabberCat Logo) JabberCat

The Jabber® client of the future! 🎉

If you are intrigued by the User Experience provided by modern, non-XMPP and/or non-free chat applications, this is for you. We aim to provide Conversations-like chat experience based on XMPP on the Desktop!

A screenshot

(The screenshot features content licensed under CC-BY-2.0: Romeo & Juliet.)

How to test

We have a Testing Guide which gives detailed instructions on how to install, how to do useful tests, which issues to (not) report and how to report them.

Get in touch

To get in touch with us, the best way is to join the MUC at [email protected]. Of course, issue reports are also somewhat a way to get in touch, but much more formal 😺. Tip: if you’re already connected with JabberCat, you can easily join the MUC from the Help menu.

Note: JABBER® is a registered trademark and its use is granted under a sublicense from the XMPP Standards Foundation.

jabbercat's People

Contributors

flowdalic avatar horazont avatar leonnnn avatar rom1dep avatar samwhited avatar sebastianriese avatar zash avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jabbercat's Issues

Reply to XMPP version requests

Currently, JabberCat does not reply to XMPP version requests.

I want to have that implemented in aioxmpp so we can reuse that easily.

python3-pyqt5.qtwebengine or python3-pyqt5.qtwebchannel missing on some Distributions

Ubuntu 16.04 has no install candidates for python3-pyqt5.qtwebengine or for python3-pyqt5.qtwebchannel.

I'm running Ubuntu 16.04, and had to install qt5-default to avoid the rcc-related issues. Then I did make again. Here's the output.

(env) sol@spica:~/code/.jctest/jabbercat$ make
./utils/buildui.py -5 data/tasks_status_widget.ui jabbercat/ui/tasks_status_widget.py
./utils/buildui.py -5 data/dlg_presence_modes.ui jabbercat/ui/dlg_presence_modes.py
./utils/buildui.py -5 data/dlg_input_jid.ui jabbercat/ui/dlg_input_jid.py
./utils/buildui.py -5 data/roster_tags.ui jabbercat/ui/roster_tags.py
./utils/buildui.py -5 data/dlg_join_muc.ui jabbercat/ui/dlg_join_muc.py
./utils/buildui.py -5 data/dlg_password_prompt.ui jabbercat/ui/dlg_password_prompt.py
./utils/buildui.py -5 data/p2p_conversation.ui jabbercat/ui/p2p_conversation.py
./utils/buildui.py -5 data/dlg_account_manager.ui jabbercat/ui/dlg_account_manager.py
./utils/buildui.py -5 data/roster_msg_box_stack.ui jabbercat/ui/roster_msg_box_stack.py
./utils/buildui.py -5 data/dlg_custom_presence_states.ui jabbercat/ui/dlg_custom_presence_states.py
./utils/buildui.py -5 data/dlg_data_form.ui jabbercat/ui/dlg_data_form.py
./utils/buildui.py -5 data/dlg_edit_custom_presence.ui jabbercat/ui/dlg_edit_custom_presence.py
./utils/buildui.py -5 data/roster_msg_box.ui jabbercat/ui/roster_msg_box.py
./utils/buildui.py -5 data/roster_tags_box.ui jabbercat/ui/roster_tags_box.py
./utils/buildui.py -5 data/dlg_account_editor.ui jabbercat/ui/dlg_account_editor.py
./utils/buildui.py -5 data/dlg_check_certificate.ui jabbercat/ui/dlg_check_certificate.py
./utils/buildui.py -5 data/account_manager.ui jabbercat/ui/account_manager.py
./utils/buildui.py -5 data/dlg_add_contact.ui jabbercat/ui/dlg_add_contact.py
./utils/buildui.py -5 data/tag_bubble.ui jabbercat/ui/tag_bubble.py
./utils/buildui.py -5 data/dlg_add_account_page_credentials.ui jabbercat/ui/dlg_add_account_page_credentials.py
./utils/buildui.py -5 data/dlg_add_account.ui jabbercat/ui/dlg_add_account.py
./utils/buildui.py -5 data/tasks_popup_frame.ui jabbercat/ui/tasks_popup_frame.py
./utils/buildui.py -5 data/tags_input.ui jabbercat/ui/tags_input.py
./utils/buildui.py -5 data/dlg_add_account_page_connecting.ui jabbercat/ui/dlg_add_account_page_connecting.py
./utils/buildui.py -5 data/main.ui jabbercat/ui/main.py
cd data; rcc --binary -o ../resources.rcc resources.qrc
(env) sol@spica:~/code/.jctest/jabbercat$ python3 -m jabbercat 
Traceback (most recent call last):
  File "/usr/lib/python3.5/runpy.py", line 184, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.5/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/home/sol/code/.jctest/jabbercat/jabbercat/__main__.py", line 15, in <module>
    import jabbercat.main
  File "/home/sol/code/.jctest/jabbercat/jabbercat/main.py", line 18, in <module>
    from . import (
  File "/home/sol/code/.jctest/jabbercat/jabbercat/conversation.py", line 84, in <module>
    class MessageViewPage(Qt.QWebEnginePage):
AttributeError: module 'jabbercat.Qt' has no attribute 'QWebEnginePage'

No indication of a problem when a MUC join fails

I tried to join a private MUC where my account is not on the members list and I tried to join a not existing MUC on my server (MUC creation only allowed to local users, used account was not from my server). In both cases an empty chat window was opened instead of showing an error.

Show joins and parts in multi-user chats

Some notes:

  • we don’t want to clutter the UI
  • make it rather bland
  • but fancy at the same time: group multiple joins and leaves, make it expandable to see the whole and exact history

opentype: Missing dependency?

After successful make I get the following result to make run-debug:

Platform: Linux-4.9.0-6-amd64-x86_64-with-debian-9.3
Python: 3.5.3 (default, Jan 19 2017, 14:11:04) 
[GCC 6.3.0 20170118]
PyQt5: 5.9 (Qt: 5.9.1)
Quamash: 0.6.0 (git: N/A)
aiosasl: 0.3.1 (git: N/A)
aioopenssl: 0.3.1 (git: N/A)
Traceback (most recent call last):
File "/usr/lib/python3.5/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
File "/usr/lib/python3.5/runpy.py", line 85, in _run_code
    exec(code, run_globals)
File "/media/workcard/workstickdir/stick_tmp/jctest/jabbercat/jabbercat/__main__.py", line 157, in <module>
    main()
File "/media/workcard/workstickdir/stick_tmp/jctest/jabbercat/jabbercat/__main__.py", line 111, in main
    import jabbercat.main
File "/media/workcard/workstickdir/stick_tmp/jctest/jabbercat/jabbercat/main.py", line 6, in <module>
    import aioxmpp
File "/media/workcard/workstickdir/stick_tmp/jctest/aioxmpp/aioxmpp/__init__.py", line 114, in <module>
    from .security_layer import make as make_security_layer  # NOQA
File "/media/workcard/workstickdir/stick_tmp/jctest/aioxmpp/aioxmpp/security_layer.py", line 128, in <module>
    import pyasn1_modules.rfc2459
File "/media/workcard/workstickdir/stick_tmp/jctest/env/lib/python3.5/site-packages/pyasn1_modules/rfc2459.py", line 20, in <module>
    from pyasn1.type import opentype
ImportError: cannot import name 'opentype'

I can try to install it on my own but for the sake of testing the sanity of the install procedure, a fix in the repo would be better, I guess.

Implement in-memory history/logging

This is similar to #26, but messages are only stored in-memory and not on disk. MAM synchronization with in-memory storage is out-of-scope for this issue.

This is a first step towards #26. Since #26 turns out to be needed for things like #29, we need a short-term solution.

Chat: new conversations steal focus

When you receive messages from somebody you are not talking to yet, they will replace the active chat window, stealing focus and potentially confusing the user.

Double-clicking a roster item doesn't always open chat

When double-clicking a roster item, I expect the respective chat to be opened.

That works when there is no open chat with that contact. The contact is added to the chats list (though not marked as selected) and the chat is opened.

If there is already an open chat, no action is performed, however. There is no change to the chats list nor to the chat tab.

Add a Help -> Join support group menu item

Could be useful :-)

Probably just show MUC join dialogue with JabberCat MUC address prefilled.

Discarded ideas

  • Join immediately (after triggering the menu action) if exactly one account is enabled. Issues: nickname selection; don’t want to use localpart (privacy), don’t want to use random nickname (recognizability) -> need to show a dialogue anyways, can use full join dialogue in that case.

Changing active chat needs a double click

Changing the active chat needs a double click. Most applications use a single click for that which is also what I'd prefer. Maybe this could be changed or made configurable.

Installation fails on Debian 9 (1)

I did everything as described at https://jabbercat.org/testing/ and got the following

19:26 $ make
./utils/buildui.py -5 data/roster_msg_box_stack.ui jabbercat/ui/roster_msg_box_stack.py
Traceback (most recent call last):
File "./utils/buildui.py", line 29, in <module>
    uic.compileUi(args.uifile, f)
File "/home/ck/.local/lib/python3.5/site-packages/PyQt5/uic/__init__.py", line 164, in compileUi
    winfo = compiler.UICompiler().compileUi(uifile, pyfile, from_imports, resource_suffix, import_from)
File "/home/ck/.local/lib/python3.5/site-packages/PyQt5/uic/Compiler/compiler.py", line 110, in compileUi
    w = self.parse(input_stream, resource_suffix)
File "/home/ck/.local/lib/python3.5/site-packages/PyQt5/uic/uiparser.py", line 1012, in parse
    self.finalize()
File "/home/ck/.local/lib/python3.5/site-packages/PyQt5/uic/Compiler/compiler.py", line 96, in finalize
    indenter.write(s)
File "/home/ck/.local/lib/python3.5/site-packages/PyQt5/uic/Compiler/indenter.py", line 64, in write
    self.output.write("%s%s\n" % (indent * self.level, line))
UnicodeEncodeError: 'ascii' codec can't encode character '\u2718' in position 69: ordinal not in range(128)
Makefile:22: recipe for target 'jabbercat/ui/roster_msg_box_stack.py' failed
make: *** [jabbercat/ui/roster_msg_box_stack.py] Error 1

Search bar: pre-select current text when selecting search bar

When I press Ctrl+L, I typically want to search for a contact. If I already have a search string in there, I will end up at the last cursor position that was active before switching away from the search tab. To search for a different name, I first need to delete the current content of the search bar.

It would be great if on selecting the search bar / pressing Ctrl+L, the current content of the search bar would be put into a selection, so that typing a letter would replace the selection with what I type.

Roster and Chats list should look more similar

You should show the same item info you have in the roster also in the chats view. Maybe you can even get away with merging the two or provide some tabs/switch buttons to toggle between "alphabetical sort" and "recent activity sort"?

I'm not yet sure how that could interact with the search/filter inputbox...

Auto-focus input box when opening chat

When you open a chat, you usually want to write a message.

Please make the chat message input box auto-focused when opening a chat / switching chats.

The UI lacks a lot of groupchat controls

  • You can't leave a groupchat
  • You can't see the groupchat participants
  • You can't change affiliation or role
  • You can't destroy or configure groupchat

A lot of other things I can't really remember.

Search input: better key bindings

It would be great to have the following key bindings:

  • A shortcut for the [Search...] input box, which is also displayed in the hint. Wireshark is a great example, albeit [Ctrl][ / ] is a bit cumbersome on non-QWERTY.
  • Use the [Down] arrow from the search input to get directly into the (filtered) roster list

Roster: do not show contacts without mutual subscription in roster

Having "contacts" where the subscription state is not "both" (i.e. where either you or your contact cannot see your presence, with all what it entails) is confusing.

To make this less confusing, I propose to factor out these contacts from the normal roster, and only show them:

  • If they match search terms (but sort them lowest in the list and mark them as pending) (note: tag filters are not enough!)
  • In a separate window where "pending requests" can be handled. This will also help with subscription spam. A big "deny all" button would be neat, too.

In addition, we need some UI to indicate that subscriptions are pending.

Installation fails on Debian 9 (2)

Same procedure as in #40 but different behavior:

If I use LANG=de_DE.UTF-8 (as it is currently default on my system) I get the following error on make

19:30 $ make
./utils/buildui.py -5 data/tasks_status_widget.ui jabbercat/ui/tasks_status_widget.py
./utils/buildui.py -5 data/dlg_presence_modes.ui jabbercat/ui/dlg_presence_modes.py
./utils/buildui.py -5 data/dlg_input_jid.ui jabbercat/ui/dlg_input_jid.py
./utils/buildui.py -5 data/roster_tags.ui jabbercat/ui/roster_tags.py
./utils/buildui.py -5 data/dlg_account_manager.ui jabbercat/ui/dlg_account_manager.py
./utils/buildui.py -5 data/dlg_password_prompt.ui jabbercat/ui/dlg_password_prompt.py
./utils/buildui.py -5 data/p2p_conversation.ui jabbercat/ui/p2p_conversation.py
./utils/buildui.py -5 data/roster_msg_box_stack.ui jabbercat/ui/roster_msg_box_stack.py
./utils/buildui.py -5 data/dlg_python_console.ui jabbercat/ui/dlg_python_console.py
./utils/buildui.py -5 data/dlg_custom_presence_states.ui jabbercat/ui/dlg_custom_presence_states.py
./utils/buildui.py -5 data/dlg_add_account.ui jabbercat/ui/dlg_add_account.py
./utils/buildui.py -5 data/dlg_data_form.ui jabbercat/ui/dlg_data_form.py
./utils/buildui.py -5 data/dlg_edit_custom_presence.ui jabbercat/ui/dlg_edit_custom_presence.py
./utils/buildui.py -5 data/roster_msg_box.ui jabbercat/ui/roster_msg_box.py
./utils/buildui.py -5 data/dlg_join_muc.ui jabbercat/ui/dlg_join_muc.py
./utils/buildui.py -5 data/roster_tags_box.ui jabbercat/ui/roster_tags_box.py
./utils/buildui.py -5 data/dlg_account_editor.ui jabbercat/ui/dlg_account_editor.py
./utils/buildui.py -5 data/account_manager.ui jabbercat/ui/account_manager.py
./utils/buildui.py -5 data/dlg_add_contact.ui jabbercat/ui/dlg_add_contact.py
./utils/buildui.py -5 data/tag_bubble.ui jabbercat/ui/tag_bubble.py
./utils/buildui.py -5 data/dlg_add_account_page_credentials.ui jabbercat/ui/dlg_add_account_page_credentials.py
./utils/buildui.py -5 data/tasks_popup_frame.ui jabbercat/ui/tasks_popup_frame.py
./utils/buildui.py -5 data/tags_input.ui jabbercat/ui/tags_input.py
./utils/buildui.py -5 data/dlg_add_account_page_connecting.ui jabbercat/ui/dlg_add_account_page_connecting.py
./utils/buildui.py -5 data/main.ui jabbercat/ui/main.py
./utils/buildui.py -5 data/dlg_check_certificate.ui jabbercat/ui/dlg_check_certificate.py
cd data; qtchooser -run-tool=rcc -qt=5 --binary -o ../resources.rcc resources.qrc
RCC: Error in 'resources.qrc': Cannot find file 'js/emoji.json'
Makefile:25: die Regel für Ziel „resources.rcc“ scheiterte
make: *** [resources.rcc] Fehler 1
(env) ✘-2 ~/tmp/0_stick_tmp/jctest/jabbercat [devel|✔] 
19:30 $ echo $LANG
de_DE.UTF-8

Double-clicking a contact leads to rename

Sometimes double-clicking a contact inadvertently makes the name editable and then cancels the action again, leading to a "Renaming contact 'foo' to 'foo'" action.

Please do not cause roster pushes for such events (when the name didn't really change), or even better: have a smarter behavior that doesn't misinterpret double-clicks as rename-abort.

Search bar doesn't search tags

When using the search bar only the matching JIDs and nicknames are shown. You should also consider searching the tags. If you have a lot of contacts in the roster and none of the contacts in the visible area have the tag you want to filter for, you have to scroll first to be able to click the tag.

Add a way to add custom CAs

For those of us who have to deal with CACert-certified servers or something else in that direction.

I think we don’t need an UI way to do this. Having a file where CAs can be put should be enough.

Cache is corrupt after unclean shutdown

Manifests in traceback like:

DEBUG:jclib.storage.frontends.XMLFrontend:opening storage for type <StorageType.CACHE: 'cache'> at level AccountLevel(account=JID([redacted])), looking for XSO class <class 'jclib.xso.RosterContact'>
ERROR:aioxmpp.callbacks:listener attached to signal raised
Traceback (most recent call last):
  File "/home/<redacted>/build/jclib/jclib/storage/frontends.py", line 786, in _open
    return self.__open_storages[type_, cache_key]
KeyError: (<StorageType.CACHE: 'cache'>, (<StorageLevel.ACCOUNT: 'account'>,))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.5/xml/sax/expatreader.py", line 210, in feed
    self._parser.Parse(data, isFinal)
xml.parsers.expat.ExpatError: no element found: line 1, column 0

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/<redacted>/build/aioxmpp/aioxmpp/callbacks.py", line 536, in fire
    keep = wrapper(args, kwargs)
  File "/home/<redacted>/build/aioxmpp/aioxmpp/callbacks.py", line 470, in _strong_wrapper
    return not f(*args, **kwargs)
  File "/home/<redacted>/build/jclib/jclib/roster.py", line 738, in _prepare_client
    instance.load()
  File "/home/<redacted>/build/jclib/jclib/roster.py", line 576, in load
    jclib.xso.RosterContact,
  File "/home/<redacted>/build/jclib/jclib/storage/frontends.py", line 853, in get_all
    data = self._open(type_, level)
  File "/home/<redacted>/build/jclib/jclib/storage/frontends.py", line 788, in _open
    data = self._load(type_, level)
  File "/home/<redacted>/build/jclib/jclib/storage/frontends.py", line 758, in _load
    storage_cls,
  File "/home/<redacted>/build/aioxmpp/aioxmpp/xml.py", line 1101, in read_single_xso
    read_xso(src, {type_: cb})
  File "/home/<redacted>/build/aioxmpp/aioxmpp/xml.py", line 1086, in read_xso
    parser.parse(src)
  File "/usr/lib/python3.5/xml/sax/expatreader.py", line 110, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/usr/lib/python3.5/xml/sax/xmlreader.py", line 127, in parse
    self.close()
  File "/usr/lib/python3.5/xml/sax/expatreader.py", line 222, in close
    self.feed("", isFinal = 1)
  File "/usr/lib/python3.5/xml/sax/expatreader.py", line 214, in feed
    self._err_handler.fatalError(exc)
  File "/usr/lib/python3.5/xml/sax/handler.py", line 38, in fatalError
    raise exception
xml.sax._exceptions.SAXParseException: /home/<redacted>/.cache/jabbercat.org/global/dns%3Ajabbercat.org/xml-storage/account.xml:1:0: no element found

And also empty window (no roster).

  • Reproducer: truncate account.xml in cache.
  • Workaround: delete ~/.cache/jabbercat.org recursively (everything in ~/.cache/jabbercat.org is disposable an can safely be deleted)
  1. The cache should never become corrupt in the first place.
  2. A corrupt cache should not hinder operations. We should catch any parsing errors and discard the cache if they occur (as the cache is disposable).

Thanks to @mdosch for discovering this.

Testing Guide not listing all deps

When the virtualenv package is missing on Debian, the documented virtualenv call fails.

Please move the "Installing dependencies" section to before "Setting up a virtual environment" and add virtualenv to the list of Debian packages that are required.

Implement local history/logging

In a first iteration, we only need local history (but we have to keep future MAM integration in mind!)

Things to keep in mind:

  • Searchability
  • Not only messages, but also join/leave events in group chats
  • Message corrections and other attachment relations between messages
  • Obtaining the number of unseen messages for any conversation should be O(1)
  • Ideally, this implements some kind of subscription mechanism so that we only need to pull messages once and subscribe to new messages from within the message view.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.