mirror of
https://github.com/profanity-im/profanity.git
synced 2024-12-04 14:46:46 -05:00
Support for XEP-0249 Direct MUC Invitations
Commands /invite, /invites, /decline and /join
This commit is contained in:
parent
da84aec513
commit
17757c86e6
@ -102,6 +102,8 @@ static gboolean _cmd_close(gchar **args, struct cmd_help_t help);
|
|||||||
static gboolean _cmd_clear(gchar **args, struct cmd_help_t help);
|
static gboolean _cmd_clear(gchar **args, struct cmd_help_t help);
|
||||||
static gboolean _cmd_join(gchar **args, struct cmd_help_t help);
|
static gboolean _cmd_join(gchar **args, struct cmd_help_t help);
|
||||||
static gboolean _cmd_invite(gchar **args, struct cmd_help_t help);
|
static gboolean _cmd_invite(gchar **args, struct cmd_help_t help);
|
||||||
|
static gboolean _cmd_invites(gchar **args, struct cmd_help_t help);
|
||||||
|
static gboolean _cmd_decline(gchar **args, struct cmd_help_t help);
|
||||||
static gboolean _cmd_rooms(gchar **args, struct cmd_help_t help);
|
static gboolean _cmd_rooms(gchar **args, struct cmd_help_t help);
|
||||||
static gboolean _cmd_disco(gchar **args, struct cmd_help_t help);
|
static gboolean _cmd_disco(gchar **args, struct cmd_help_t help);
|
||||||
static gboolean _cmd_set_beep(gchar **args, struct cmd_help_t help);
|
static gboolean _cmd_set_beep(gchar **args, struct cmd_help_t help);
|
||||||
@ -349,6 +351,24 @@ static struct cmd_t main_commands[] =
|
|||||||
"If a message is supplied it will be send as the reason for the invite.",
|
"If a message is supplied it will be send as the reason for the invite.",
|
||||||
NULL } } },
|
NULL } } },
|
||||||
|
|
||||||
|
{ "/invites",
|
||||||
|
_cmd_invites, parse_args_with_freetext, 0, 0,
|
||||||
|
{ "/invites", "Show outstanding chat room invites.",
|
||||||
|
{ "/invites",
|
||||||
|
"--------",
|
||||||
|
"Show all rooms that you have been invited to, and have not yet been accepted or declind.",
|
||||||
|
"Use \"/join <room>\" to accept a room invitation.",
|
||||||
|
"Use \"/decline <room>\" to decline a room invitation.",
|
||||||
|
NULL } } },
|
||||||
|
|
||||||
|
{ "/decline",
|
||||||
|
_cmd_decline, parse_args_with_freetext, 1, 1,
|
||||||
|
{ "/decline room", "Decline a chat room invite.",
|
||||||
|
{ "/decline room",
|
||||||
|
"-------------",
|
||||||
|
"Decline invitation to a chat room, the room will no longer be in the list of outstanding invites.",
|
||||||
|
NULL } } },
|
||||||
|
|
||||||
{ "/rooms",
|
{ "/rooms",
|
||||||
_cmd_rooms, parse_args, 0, 1,
|
_cmd_rooms, parse_args, 0, 1,
|
||||||
{ "/rooms [conference-service]", "List chat rooms.",
|
{ "/rooms [conference-service]", "List chat rooms.",
|
||||||
@ -914,6 +934,7 @@ void
|
|||||||
cmd_reset_autocomplete()
|
cmd_reset_autocomplete()
|
||||||
{
|
{
|
||||||
contact_list_reset_search_attempts();
|
contact_list_reset_search_attempts();
|
||||||
|
muc_reset_invites_ac();
|
||||||
accounts_reset_all_search();
|
accounts_reset_all_search();
|
||||||
accounts_reset_enabled_search();
|
accounts_reset_enabled_search();
|
||||||
prefs_reset_boolean_choice();
|
prefs_reset_boolean_choice();
|
||||||
@ -1114,6 +1135,9 @@ _cmd_complete_parameters(char *input, int *size)
|
|||||||
}
|
}
|
||||||
|
|
||||||
_parameter_autocomplete(input, size, "/invite", contact_list_find_contact);
|
_parameter_autocomplete(input, size, "/invite", contact_list_find_contact);
|
||||||
|
_parameter_autocomplete(input, size, "/decline", muc_find_invite);
|
||||||
|
_parameter_autocomplete(input, size, "/join", muc_find_invite);
|
||||||
|
|
||||||
|
|
||||||
_parameter_autocomplete(input, size, "/connect",
|
_parameter_autocomplete(input, size, "/connect",
|
||||||
accounts_find_enabled);
|
accounts_find_enabled);
|
||||||
@ -2201,6 +2225,7 @@ _cmd_join(gchar **args, struct cmd_help_t help)
|
|||||||
presence_join_room(room_jid);
|
presence_join_room(room_jid);
|
||||||
}
|
}
|
||||||
ui_room_join(room_jid);
|
ui_room_join(room_jid);
|
||||||
|
muc_remove_invite(room);
|
||||||
|
|
||||||
jid_destroy(room_jid);
|
jid_destroy(room_jid);
|
||||||
jid_destroy(my_jid);
|
jid_destroy(my_jid);
|
||||||
@ -2240,6 +2265,28 @@ _cmd_invite(gchar **args, struct cmd_help_t help)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
_cmd_invites(gchar **args, struct cmd_help_t help)
|
||||||
|
{
|
||||||
|
GSList *invites = muc_get_invites();
|
||||||
|
cons_show_room_invites(invites);
|
||||||
|
g_slist_free_full(invites, g_free);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
_cmd_decline(gchar **args, struct cmd_help_t help)
|
||||||
|
{
|
||||||
|
if (!muc_invites_include(args[0])) {
|
||||||
|
cons_show("No such invite exists.");
|
||||||
|
} else {
|
||||||
|
muc_remove_invite(args[0]);
|
||||||
|
cons_show("Declined invite to %s.", args[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
_cmd_rooms(gchar **args, struct cmd_help_t help)
|
_cmd_rooms(gchar **args, struct cmd_help_t help)
|
||||||
{
|
{
|
||||||
|
68
src/muc.c
68
src/muc.c
@ -29,6 +29,8 @@
|
|||||||
#include "jid.h"
|
#include "jid.h"
|
||||||
#include "tools/autocomplete.h"
|
#include "tools/autocomplete.h"
|
||||||
|
|
||||||
|
#include "ui/ui.h"
|
||||||
|
|
||||||
typedef struct _muc_room_t {
|
typedef struct _muc_room_t {
|
||||||
char *room; // e.g. test@conference.server
|
char *room; // e.g. test@conference.server
|
||||||
char *nick; // e.g. Some User
|
char *nick; // e.g. Some User
|
||||||
@ -41,9 +43,75 @@ typedef struct _muc_room_t {
|
|||||||
} ChatRoom;
|
} ChatRoom;
|
||||||
|
|
||||||
GHashTable *rooms = NULL;
|
GHashTable *rooms = NULL;
|
||||||
|
Autocomplete invite_ac;
|
||||||
|
|
||||||
static void _free_room(ChatRoom *room);
|
static void _free_room(ChatRoom *room);
|
||||||
|
|
||||||
|
void
|
||||||
|
muc_init(void)
|
||||||
|
{
|
||||||
|
invite_ac = autocomplete_new();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
muc_add_invite(char *room)
|
||||||
|
{
|
||||||
|
autocomplete_add(invite_ac, strdup(room));
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
muc_remove_invite(char *room)
|
||||||
|
{
|
||||||
|
autocomplete_remove(invite_ac, room);
|
||||||
|
}
|
||||||
|
|
||||||
|
gint
|
||||||
|
muc_invite_count(void)
|
||||||
|
{
|
||||||
|
return autocomplete_length(invite_ac);
|
||||||
|
}
|
||||||
|
|
||||||
|
GSList *
|
||||||
|
muc_get_invites(void)
|
||||||
|
{
|
||||||
|
return autocomplete_get_list(invite_ac);
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
muc_invites_include(const char * const room)
|
||||||
|
{
|
||||||
|
GSList *invites = autocomplete_get_list(invite_ac);
|
||||||
|
GSList *curr = invites;
|
||||||
|
while (curr != NULL) {
|
||||||
|
if (strcmp(curr->data, room) == 0) {
|
||||||
|
g_slist_free_full(invites, g_free);
|
||||||
|
return TRUE;
|
||||||
|
} else {
|
||||||
|
curr = g_slist_next(curr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g_slist_free_full(invites, g_free);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
muc_reset_invites_ac(void)
|
||||||
|
{
|
||||||
|
autocomplete_reset(invite_ac);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
muc_find_invite(char *search_str)
|
||||||
|
{
|
||||||
|
return autocomplete_complete(invite_ac, search_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
muc_clear_invites(void)
|
||||||
|
{
|
||||||
|
autocomplete_clear(invite_ac);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Join the chat room with the specified nickname
|
* Join the chat room with the specified nickname
|
||||||
*/
|
*/
|
||||||
|
10
src/muc.h
10
src/muc.h
@ -29,6 +29,7 @@
|
|||||||
#include "jid.h"
|
#include "jid.h"
|
||||||
#include "tools/autocomplete.h"
|
#include "tools/autocomplete.h"
|
||||||
|
|
||||||
|
void muc_init(void);
|
||||||
void muc_join_room(const char * const room, const char * const nick);
|
void muc_join_room(const char * const room, const char * const nick);
|
||||||
void muc_leave_room(const char * const room);
|
void muc_leave_room(const char * const room);
|
||||||
gboolean muc_room_is_active(Jid *jid);
|
gboolean muc_room_is_active(Jid *jid);
|
||||||
@ -56,4 +57,13 @@ void muc_set_roster_pending_nick_change(const char * const room,
|
|||||||
char* muc_complete_roster_nick_change(const char * const room,
|
char* muc_complete_roster_nick_change(const char * const room,
|
||||||
const char * const nick);
|
const char * const nick);
|
||||||
|
|
||||||
|
void muc_add_invite(const char *room);
|
||||||
|
void muc_remove_invite(const char * const room);
|
||||||
|
gint muc_invite_count(void);
|
||||||
|
GSList* muc_get_invites(void);
|
||||||
|
gboolean muc_invites_include(const char * const room);
|
||||||
|
void muc_reset_invites_ac(void);
|
||||||
|
char* muc_find_invite(char *search_str);
|
||||||
|
void muc_clear_invites(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -224,6 +224,7 @@ prof_handle_lost_connection(void)
|
|||||||
{
|
{
|
||||||
cons_show_error("Lost connection.");
|
cons_show_error("Lost connection.");
|
||||||
contact_list_clear();
|
contact_list_clear();
|
||||||
|
muc_clear_invites();
|
||||||
chat_sessions_clear();
|
chat_sessions_clear();
|
||||||
ui_disconnected();
|
ui_disconnected();
|
||||||
ui_current_page_off();
|
ui_current_page_off();
|
||||||
@ -235,6 +236,7 @@ prof_handle_disconnect(const char * const jid)
|
|||||||
cons_show("%s logged out successfully.", jid);
|
cons_show("%s logged out successfully.", jid);
|
||||||
jabber_disconnect();
|
jabber_disconnect();
|
||||||
contact_list_clear();
|
contact_list_clear();
|
||||||
|
muc_clear_invites();
|
||||||
chat_sessions_clear();
|
chat_sessions_clear();
|
||||||
ui_disconnected();
|
ui_disconnected();
|
||||||
ui_current_page_off();
|
ui_current_page_off();
|
||||||
@ -322,8 +324,13 @@ void prof_handle_room_invite(jabber_invite_t invite_type,
|
|||||||
const char * const invitor, const char * const room,
|
const char * const invitor, const char * const room,
|
||||||
const char * const reason)
|
const char * const reason)
|
||||||
{
|
{
|
||||||
cons_show_room_invite(invitor, room, reason);
|
Jid *room_jid = jid_create(room);
|
||||||
ui_current_page_off();
|
if (!muc_room_is_active(room_jid) && !muc_invites_include(room)) {
|
||||||
|
cons_show_room_invite(invitor, room, reason);
|
||||||
|
muc_add_invite(room);
|
||||||
|
ui_current_page_off();
|
||||||
|
}
|
||||||
|
jid_destroy(room_jid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -557,6 +564,7 @@ _init(const int disable_tls, char *log_level)
|
|||||||
cmd_init();
|
cmd_init();
|
||||||
log_info("Initialising contact list");
|
log_info("Initialising contact list");
|
||||||
contact_list_init();
|
contact_list_init();
|
||||||
|
muc_init();
|
||||||
atexit(_shutdown);
|
atexit(_shutdown);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,6 +71,12 @@ autocomplete_free(Autocomplete ac)
|
|||||||
ac = NULL;
|
ac = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gint
|
||||||
|
autocomplete_length(Autocomplete ac)
|
||||||
|
{
|
||||||
|
return g_slist_length(ac->items);
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
autocomplete_add(Autocomplete ac, void *item)
|
autocomplete_add(Autocomplete ac, void *item)
|
||||||
{
|
{
|
||||||
|
@ -41,5 +41,6 @@ gboolean autocomplete_add(Autocomplete ac, void *item);
|
|||||||
gboolean autocomplete_remove(Autocomplete ac, const char * const item);
|
gboolean autocomplete_remove(Autocomplete ac, const char * const item);
|
||||||
GSList * autocomplete_get_list(Autocomplete ac);
|
GSList * autocomplete_get_list(Autocomplete ac);
|
||||||
gchar * autocomplete_complete(Autocomplete ac, gchar *search_str);
|
gchar * autocomplete_complete(Autocomplete ac, gchar *search_str);
|
||||||
|
gint autocomplete_length(Autocomplete ac);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -313,6 +313,24 @@ cons_show_wins(void)
|
|||||||
_cons_alert();
|
_cons_alert();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cons_show_room_invites(GSList *invites)
|
||||||
|
{
|
||||||
|
cons_show("");
|
||||||
|
if (invites == NULL) {
|
||||||
|
cons_show("No outstanding chat room invites.");
|
||||||
|
} else {
|
||||||
|
cons_show("Chat room invites, use /join or /decline commands:");
|
||||||
|
while (invites != NULL) {
|
||||||
|
cons_show(" %s", invites->data);
|
||||||
|
invites = g_slist_next(invites);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ui_console_dirty();
|
||||||
|
_cons_alert();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
cons_show_info(PContact pcontact)
|
cons_show_info(PContact pcontact)
|
||||||
{
|
{
|
||||||
@ -653,12 +671,6 @@ void
|
|||||||
cons_show_room_invite(const char * const invitor, const char * const room,
|
cons_show_room_invite(const char * const invitor, const char * const room,
|
||||||
const char * const reason)
|
const char * const reason)
|
||||||
{
|
{
|
||||||
char *display_room = NULL;
|
|
||||||
char *domain = strdup(jabber_get_domain());
|
|
||||||
Jid *room_jid = jid_create(room);
|
|
||||||
GString *default_service = g_string_new("conference.");
|
|
||||||
g_string_append(default_service, domain);
|
|
||||||
|
|
||||||
cons_show("");
|
cons_show("");
|
||||||
cons_show("Chat room invite received:");
|
cons_show("Chat room invite received:");
|
||||||
cons_show(" From : %s", invitor);
|
cons_show(" From : %s", invitor);
|
||||||
@ -668,21 +680,12 @@ cons_show_room_invite(const char * const invitor, const char * const room,
|
|||||||
cons_show(" Message: %s", reason);
|
cons_show(" Message: %s", reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(room_jid->domainpart, default_service->str) == 0) {
|
cons_show("Use /join or /decline");
|
||||||
display_room = room_jid->localpart;
|
|
||||||
} else {
|
|
||||||
display_room = room_jid->barejid;
|
|
||||||
}
|
|
||||||
|
|
||||||
cons_show("Type \"/join %s\" to accept the invitation", display_room);
|
|
||||||
|
|
||||||
if (prefs_get_boolean(PREF_NOTIFY_INVITE)) {
|
if (prefs_get_boolean(PREF_NOTIFY_INVITE)) {
|
||||||
notify_invite(invitor, room);
|
notify_invite(invitor, room, reason);
|
||||||
}
|
}
|
||||||
|
|
||||||
jid_destroy(room_jid);
|
|
||||||
g_string_free(default_service, TRUE);
|
|
||||||
|
|
||||||
ui_console_dirty();
|
ui_console_dirty();
|
||||||
_cons_alert();
|
_cons_alert();
|
||||||
}
|
}
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "muc.h"
|
||||||
#include "ui/ui.h"
|
#include "ui/ui.h"
|
||||||
|
|
||||||
static void _notify(const char * const message, int timeout,
|
static void _notify(const char * const message, int timeout,
|
||||||
@ -66,12 +67,16 @@ notify_typing(const char * const from)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
notify_invite(const char * const from, const char * const room)
|
notify_invite(const char * const from, const char * const room,
|
||||||
|
const char * const reason)
|
||||||
{
|
{
|
||||||
GString *message = g_string_new("Room invite\nfrom: ");
|
GString *message = g_string_new("Room invite\nfrom: ");
|
||||||
g_string_append(message, from);
|
g_string_append(message, from);
|
||||||
g_string_append(message, "\nto: ");
|
g_string_append(message, "\nto: ");
|
||||||
g_string_append(message, room);
|
g_string_append(message, room);
|
||||||
|
if (reason != NULL) {
|
||||||
|
g_string_append_printf(message, "\n\"%s\"", reason);
|
||||||
|
}
|
||||||
|
|
||||||
_notify(message->str, 10000, "Incoming message");
|
_notify(message->str, 10000, "Incoming message");
|
||||||
|
|
||||||
@ -91,8 +96,7 @@ void
|
|||||||
notify_remind(void)
|
notify_remind(void)
|
||||||
{
|
{
|
||||||
gint unread = ui_unread();
|
gint unread = ui_unread();
|
||||||
//gint open = jabber_open_invites();
|
gint open = muc_invite_count();
|
||||||
gint open = 0;
|
|
||||||
|
|
||||||
GString *text = g_string_new("");
|
GString *text = g_string_new("");
|
||||||
|
|
||||||
@ -109,9 +113,9 @@ notify_remind(void)
|
|||||||
g_string_append(text, "\n");
|
g_string_append(text, "\n");
|
||||||
}
|
}
|
||||||
if (open == 1) {
|
if (open == 1) {
|
||||||
g_string_append(text, "1 open invite");
|
g_string_append(text, "1 room invite");
|
||||||
} else {
|
} else {
|
||||||
g_string_append_printf(text, "%d open invites", open);
|
g_string_append_printf(text, "%d room invites", open);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,4 +26,5 @@ void notifier_uninit(void);
|
|||||||
void notify_typing(const char * const from);
|
void notify_typing(const char * const from);
|
||||||
void notify_message(const char * const short_from);
|
void notify_message(const char * const short_from);
|
||||||
void notify_remind(void);
|
void notify_remind(void);
|
||||||
void notify_invite(const char * const from, const char * const room);
|
void notify_invite(const char * const from, const char * const room,
|
||||||
|
const char * const reason);
|
||||||
|
@ -166,6 +166,7 @@ void cons_show_room_invite(const char * const invitor, const char * const room,
|
|||||||
void cons_check_version(gboolean not_available_msg);
|
void cons_check_version(gboolean not_available_msg);
|
||||||
void cons_show_typing(const char * const short_from);
|
void cons_show_typing(const char * const short_from);
|
||||||
void cons_show_incoming_message(const char * const short_from, const int win_index);
|
void cons_show_incoming_message(const char * const short_from, const int win_index);
|
||||||
|
void cons_show_room_invites(GSList *invites);
|
||||||
|
|
||||||
// status bar actions
|
// status bar actions
|
||||||
void status_bar_refresh(void);
|
void status_bar_refresh(void);
|
||||||
|
Loading…
Reference in New Issue
Block a user