mirror of
https://github.com/profanity-im/profanity.git
synced 2024-12-04 14:46:46 -05:00
Leaving chat rooms on /close
This commit is contained in:
parent
517bc30360
commit
fb3d7a47d2
@ -1082,6 +1082,10 @@ _cmd_tiny(const char * const inp, struct cmd_help_t help)
|
|||||||
static gboolean
|
static gboolean
|
||||||
_cmd_close(const char * const inp, struct cmd_help_t help)
|
_cmd_close(const char * const inp, struct cmd_help_t help)
|
||||||
{
|
{
|
||||||
|
if (win_in_groupchat()) {
|
||||||
|
char *room_jid = win_get_recipient();
|
||||||
|
jabber_leave_chat_room(room_jid);
|
||||||
|
}
|
||||||
if (win_in_chat()) {
|
if (win_in_chat()) {
|
||||||
|
|
||||||
if (prefs_get_states()) {
|
if (prefs_get_states()) {
|
||||||
|
19
src/jabber.c
19
src/jabber.c
@ -330,6 +330,25 @@ jabber_join(const char * const room_jid, const char * const nick)
|
|||||||
room_join(room_jid, nick);
|
room_join(room_jid, nick);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
jabber_leave_chat_room(const char * const room_jid)
|
||||||
|
{
|
||||||
|
char *nick = room_get_nick_for_room(room_jid);
|
||||||
|
GString *full_jid = g_string_new(room_jid);
|
||||||
|
g_string_append(full_jid, "/");
|
||||||
|
g_string_append(full_jid, nick);
|
||||||
|
|
||||||
|
xmpp_stanza_t *presence = xmpp_stanza_new(jabber_conn.ctx);
|
||||||
|
xmpp_stanza_set_name(presence, "presence");
|
||||||
|
xmpp_stanza_set_type(presence, "unavailable");
|
||||||
|
xmpp_send(jabber_conn.conn, presence);
|
||||||
|
xmpp_stanza_release(presence);
|
||||||
|
|
||||||
|
g_string_free(full_jid, TRUE);
|
||||||
|
|
||||||
|
room_leave(room_jid);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
jabber_update_presence(jabber_presence_t status, const char * const msg)
|
jabber_update_presence(jabber_presence_t status, const char * const msg)
|
||||||
{
|
{
|
||||||
|
@ -47,6 +47,7 @@ void jabber_disconnect(void);
|
|||||||
void jabber_process_events(void);
|
void jabber_process_events(void);
|
||||||
void jabber_subscribe(const char * const recipient);
|
void jabber_subscribe(const char * const recipient);
|
||||||
void jabber_join(const char * const room_jid, const char * const nick);
|
void jabber_join(const char * const room_jid, const char * const nick);
|
||||||
|
void jabber_leave_chat_room(const char * const room_jid);
|
||||||
void jabber_send(const char * const msg, const char * const recipient);
|
void jabber_send(const char * const msg, const char * const recipient);
|
||||||
void jabber_send_groupchat(const char * const msg, const char * const recipient);
|
void jabber_send_groupchat(const char * const msg, const char * const recipient);
|
||||||
void jabber_send_inactive(const char * const recipient);
|
void jabber_send_inactive(const char * const recipient);
|
||||||
|
@ -30,45 +30,79 @@ typedef struct _muc_room_t {
|
|||||||
char *nick;
|
char *nick;
|
||||||
} muc_room;
|
} muc_room;
|
||||||
|
|
||||||
GSList *rooms;
|
GHashTable *rooms = NULL;
|
||||||
|
|
||||||
|
static void _room_free(muc_room *room);
|
||||||
|
|
||||||
void
|
void
|
||||||
room_join(const char * const jid, const char * const nick)
|
room_join(const char * const jid, const char * const nick)
|
||||||
{
|
{
|
||||||
|
if (rooms == NULL) {
|
||||||
|
rooms = g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
|
||||||
|
(GDestroyNotify)_room_free);
|
||||||
|
}
|
||||||
|
|
||||||
muc_room *new_room = malloc(sizeof(muc_room));
|
muc_room *new_room = malloc(sizeof(muc_room));
|
||||||
new_room->jid = strdup(jid);
|
new_room->jid = strdup(jid);
|
||||||
new_room->nick = strdup(nick);
|
new_room->nick = strdup(nick);
|
||||||
|
|
||||||
rooms = g_slist_append(rooms, new_room);
|
g_hash_table_insert(rooms, strdup(jid), new_room);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
room_leave(const char * const jid)
|
||||||
|
{
|
||||||
|
g_hash_table_remove(rooms, jid);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
room_jid_is_room_chat(const char * const jid)
|
room_jid_is_room_chat(const char * const jid)
|
||||||
{
|
{
|
||||||
GSList *current = rooms;
|
char **tokens = g_strsplit(jid, "/", 0);
|
||||||
while (current != NULL) {
|
char *jid_part = tokens[0];
|
||||||
muc_room *room = current->data;
|
|
||||||
if (g_str_has_prefix(jid, room->jid)) {
|
if (rooms != NULL) {
|
||||||
|
muc_room *room = g_hash_table_lookup(rooms, jid_part);
|
||||||
|
|
||||||
|
if (room != NULL) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
} else {
|
||||||
current = g_slist_next(current);
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
room_get_nick_for_room(const char * const jid)
|
room_get_nick_for_room(const char * const jid)
|
||||||
{
|
{
|
||||||
GSList *current = rooms;
|
if (rooms != NULL) {
|
||||||
while (current != NULL) {
|
muc_room *room = g_hash_table_lookup(rooms, jid);
|
||||||
muc_room *room = current->data;
|
|
||||||
if (strcmp(jid, room->jid) == 0) {
|
|
||||||
return room->nick;
|
|
||||||
}
|
|
||||||
current = g_slist_next(current);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (room != NULL) {
|
||||||
|
return room->nick;
|
||||||
|
} else {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_room_free(muc_room *room)
|
||||||
|
{
|
||||||
|
if (room != NULL) {
|
||||||
|
if (room->jid != NULL) {
|
||||||
|
g_free(room->jid);
|
||||||
|
room->jid = NULL;
|
||||||
|
}
|
||||||
|
if (room->nick != NULL) {
|
||||||
|
g_free(room->nick);
|
||||||
|
room->nick = NULL;
|
||||||
|
}
|
||||||
|
g_free(room);
|
||||||
|
}
|
||||||
|
room = NULL;
|
||||||
|
}
|
||||||
|
@ -23,5 +23,6 @@
|
|||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
void room_join(const char * const jid, const char * const nick);
|
void room_join(const char * const jid, const char * const nick);
|
||||||
|
void room_leave(const char * const jid);
|
||||||
gboolean room_jid_is_room_chat(const char * const jid);
|
gboolean room_jid_is_room_chat(const char * const jid);
|
||||||
char * room_get_nick_for_room(const char * const jid);
|
char * room_get_nick_for_room(const char * const jid);
|
||||||
|
Loading…
Reference in New Issue
Block a user