[SàT dev] [en] messages refactoring

Goffi goffi at goffi.org
Mar 24 Mai 22:26:05 CEST 2016


Hi there,

I have started a refactoring of messages handling, it's not finished yet but 
the basis is functionnal.

Message handling was here since the beginning of SàT and relatively basic, it 
was used in a "send/receive and forget" way, meaning that once a message was 
received or sent, we couldn't access it anymore. Also it was not handling all 
the elements found in core XMPP (the RFC), and badly handling  duplicate 
messages (which happen often with backlogs in MUC for instance) among other 
issues.

So here are the novelties:

- each message has now an unique id, internal to SàT. It can be used to modify 
a message after receiving it. That was a missing feature blocking us for the 
implementation of many exciting stuff like MAM (message history on server), 
delivery receipt, last message correction etc. You can expect these features 
for 0.7 release

- duplicate messages are checked and ignored in backend.

- message body and message subject now handle languages. They are received in 
a dict where the key is the language and the value is the body/subject in the 
given language. empty string is used when language is unknown. This a native 
XMPP feature that I was willing to implement for years, I think the ability to 
flag a message language is a killer feature which is largely underexploited in 
current XMPP clients. I'm looking forward to implement it in frontends
To send a message from frontend a dict is now needed too, with language as key 
or empty string if unknown.

- thread which were not handled at all are now added in extra dictionary if 
they are present, with thread and thread_parent keys. Threads are a way to 
follow a specific discussion in a conversation.

- delayed messages (e.g.: messages from backlog in MUC) are now saved in 
history, it was not the case before

- when using historyGet, message are always sorted in chronological order by 
backend, so frontend doesn't need to sort them again

- a timestamp is always sent with message. A received_timestamp can also be 
present in extra, that means that the message was delayed. In this case 
timestamp is the declared time of emission, and received_timestamp the time of 
reception.

Note that if a "received_timestamp" is present in a message, a frontend should 
check that the message is not already present in its buffer, specially just 
after a historyGet

- "info" messages can now be archived in backend, and will be mostly handled 
there (messages like join/leave in MUC).
This way we can keep track of what happened in history (a conversation can 
make more sense if we know than somebody joined or left). Also info messages 
will have subtype, so we can trigger a specific behaviour on some of them, 
or group/hide/separate repetitive info messages (like a user with bad 
connection which join/leave a lot of time in a short delay)

- I plan to use info messages in frontends to handle stuff like a last focus 
bar (i.e. displaying a line under the last displayed message, so it's easy to 
track new messages, it's a common feature in messaging softwares)

- in the backend we follow 2 new conventions: client is used to keep track of 
session, instead of profile, this avoid to do a host.getClient(profile) each 
time, and limit the need of C.PROF_KEY_NONE. Client is always the first 
parameter (while profile or profile_key was always the last before). You can get 
profile with client.profile. On the bridge and frontends this doesn't change 
anything
The second new convention is that we  use main category of a method (specially 
in bridge methods) first, then the verb. So getHistory and sendMessage are now 
named historyGet and messageSend, this way the methods are naturally grouped 
when sorted by name.
The code will be slowly refactored to follow these new conventions.

I think that's all. There may be other changes before the 0.7 release (and 
anyways as long as we don't have a 1.0, the API and bridge can change a lot).

I have done the main refactoring but lot of things are deactivated or broken, 
and the frontends are not taking profit of the novelties yet (actually Libervia 
is not updated, so it is broken at the moment).
There will be a refactoring in QuickFrontend too to handle uid, languages, 
etc.

This refactoring was a step necessary before implementing messages in Cagou.

The current code is available in the 0.7-dev branch (bookmark). Save your 
database before trying, as the schema change may result in data loss. Also 
once on refactoring_messages bookmark, you're database can't go back to 
previous schema, so it will not be usable anymore with 0.6.x version.

feedbacks welcome

Goffi




Plus d'informations sur la liste de diffusion dev