mirror of
https://github.com/profanity-im/profanity.git
synced 2024-11-03 19:37:16 -05:00
Use direct messages instead of MUC-PMs for non-anon MUCs
In https://github.com/profanity-im/profanity/issues/1070 we have: `OMEMO encryption for MUC PM (OMEMO MUCs are not anonymous, so we should start a regular 1:1 in this case instead of MUC PM. A discussion started to make this a general feature #1531)` In https://github.com/profanity-im/profanity/issues/1531 we have the general issue to start regular 1:1 messages instead of MUC PMs if the room is non-anonymous. This is like suggested in https://docs.modernxmpp.org/client/groupchat/.
This commit is contained in:
parent
5906c4ade1
commit
722d07adf6
@ -2108,6 +2108,33 @@ cmd_who(ProfWin* window, const char* const command, gchar** args)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cmd_msg_chatwin(const char* const barejid, const char* const msg)
|
||||||
|
{
|
||||||
|
ProfChatWin* chatwin = wins_get_chat(barejid);
|
||||||
|
if (!chatwin) {
|
||||||
|
// NOTE: This will also start the new OMEMO session and send a MAM request.
|
||||||
|
chatwin = chatwin_new(barejid);
|
||||||
|
}
|
||||||
|
ui_focus_win((ProfWin*)chatwin);
|
||||||
|
|
||||||
|
if (msg) {
|
||||||
|
// NOTE: In case the message is OMEMO encrypted, we can't be sure
|
||||||
|
// whether the key bundles of the recipient have already been
|
||||||
|
// received. In the case that *no* bundles have been received yet,
|
||||||
|
// the message won't be sent, and an error is shown to the user.
|
||||||
|
// Other cases are not handled here.
|
||||||
|
cl_ev_send_msg(chatwin, msg, NULL);
|
||||||
|
} else {
|
||||||
|
#ifdef HAVE_LIBOTR
|
||||||
|
// Start the OTR session after this (i.e. the first) message was sent
|
||||||
|
if (otr_is_secure(barejid)) {
|
||||||
|
chatwin_otr_secured(chatwin, otr_is_trusted(barejid));
|
||||||
|
}
|
||||||
|
#endif // HAVE_LIBOTR
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
cmd_msg(ProfWin* window, const char* const command, gchar** args)
|
cmd_msg(ProfWin* window, const char* const command, gchar** args)
|
||||||
{
|
{
|
||||||
@ -2125,22 +2152,32 @@ cmd_msg(ProfWin* window, const char* const command, gchar** args)
|
|||||||
if (window->type == WIN_MUC) {
|
if (window->type == WIN_MUC) {
|
||||||
ProfMucWin* mucwin = (ProfMucWin*)window;
|
ProfMucWin* mucwin = (ProfMucWin*)window;
|
||||||
assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK);
|
assert(mucwin->memcheck == PROFMUCWIN_MEMCHECK);
|
||||||
if (muc_roster_contains_nick(mucwin->roomjid, usr)) {
|
|
||||||
GString* full_jid = g_string_new(mucwin->roomjid);
|
|
||||||
g_string_append(full_jid, "/");
|
|
||||||
g_string_append(full_jid, usr);
|
|
||||||
|
|
||||||
ProfPrivateWin* privwin = wins_get_private(full_jid->str);
|
Occupant* occupant = muc_roster_item(mucwin->roomjid, usr);
|
||||||
if (!privwin) {
|
if (occupant) {
|
||||||
privwin = (ProfPrivateWin*)wins_new_private(full_jid->str);
|
// in case of non-anon muc send regular chatmessage
|
||||||
|
if (muc_anonymity_type(mucwin->roomjid) == MUC_ANONYMITY_TYPE_NONANONYMOUS) {
|
||||||
|
Jid* jidp = jid_create(occupant->jid);
|
||||||
|
_cmd_msg_chatwin(jidp->barejid, msg);
|
||||||
|
jid_destroy(jidp);
|
||||||
|
} else {
|
||||||
|
// otherwise send mucpm
|
||||||
|
GString* full_jid = g_string_new(mucwin->roomjid);
|
||||||
|
g_string_append(full_jid, "/");
|
||||||
|
g_string_append(full_jid, usr);
|
||||||
|
|
||||||
|
ProfPrivateWin* privwin = wins_get_private(full_jid->str);
|
||||||
|
if (!privwin) {
|
||||||
|
privwin = (ProfPrivateWin*)wins_new_private(full_jid->str);
|
||||||
|
}
|
||||||
|
ui_focus_win((ProfWin*)privwin);
|
||||||
|
|
||||||
|
if (msg) {
|
||||||
|
cl_ev_send_priv_msg(privwin, msg, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_string_free(full_jid, TRUE);
|
||||||
}
|
}
|
||||||
ui_focus_win((ProfWin*)privwin);
|
|
||||||
|
|
||||||
if (msg) {
|
|
||||||
cl_ev_send_priv_msg(privwin, msg, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_string_free(full_jid, TRUE);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
win_println(window, THEME_DEFAULT, "-", "No such participant \"%s\" in room.", usr);
|
win_println(window, THEME_DEFAULT, "-", "No such participant \"%s\" in room.", usr);
|
||||||
@ -2155,28 +2192,7 @@ cmd_msg(ProfWin* window, const char* const command, gchar** args)
|
|||||||
barejid = usr;
|
barejid = usr;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProfChatWin* chatwin = wins_get_chat(barejid);
|
_cmd_msg_chatwin(barejid, msg);
|
||||||
if (!chatwin) {
|
|
||||||
// NOTE: This will also start the new OMEMO session and send a MAM request.
|
|
||||||
chatwin = chatwin_new(barejid);
|
|
||||||
}
|
|
||||||
ui_focus_win((ProfWin*)chatwin);
|
|
||||||
|
|
||||||
if (msg) {
|
|
||||||
// NOTE: In case the message is OMEMO encrypted, we can't be sure
|
|
||||||
// whether the key bundles of the recipient have already been
|
|
||||||
// received. In the case that *no* bundles have been received yet,
|
|
||||||
// the message won't be sent, and an error is shown to the user.
|
|
||||||
// Other cases are not handled here.
|
|
||||||
cl_ev_send_msg(chatwin, msg, NULL);
|
|
||||||
} else {
|
|
||||||
#ifdef HAVE_LIBOTR
|
|
||||||
// Start the OTR session after this (i.e. the first) message was sent
|
|
||||||
if (otr_is_secure(barejid)) {
|
|
||||||
chatwin_otr_secured(chatwin, otr_is_trusted(barejid));
|
|
||||||
}
|
|
||||||
#endif // HAVE_LIBOTR
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user