Added /room kick command
This commit is contained in:
@@ -1251,6 +1251,7 @@ cmd_init(void)
|
|||||||
autocomplete_add(room_ac, "config");
|
autocomplete_add(room_ac, "config");
|
||||||
autocomplete_add(room_ac, "info");
|
autocomplete_add(room_ac, "info");
|
||||||
autocomplete_add(room_ac, "subject");
|
autocomplete_add(room_ac, "subject");
|
||||||
|
autocomplete_add(room_ac, "kick");
|
||||||
autocomplete_add(room_ac, "role");
|
autocomplete_add(room_ac, "role");
|
||||||
autocomplete_add(room_ac, "affiliation");
|
autocomplete_add(room_ac, "affiliation");
|
||||||
|
|
||||||
@@ -2311,6 +2312,15 @@ _room_autocomplete(char *input, int *size)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *recipient = ui_current_recipient();
|
||||||
|
Autocomplete nick_ac = muc_roster_ac(recipient);
|
||||||
|
if (nick_ac != NULL) {
|
||||||
|
result = autocomplete_param_with_ac(input, size, "/room kick", nick_ac, TRUE);
|
||||||
|
if (result != NULL) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
result = autocomplete_param_with_ac(input, size, "/room", room_ac, TRUE);
|
result = autocomplete_param_with_ac(input, size, "/room", room_ac, TRUE);
|
||||||
if (result != NULL) {
|
if (result != NULL) {
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
@@ -2127,6 +2127,7 @@ cmd_room(gchar **args, struct cmd_help_t help)
|
|||||||
(g_strcmp0(args[0], "destroy") != 0) &&
|
(g_strcmp0(args[0], "destroy") != 0) &&
|
||||||
(g_strcmp0(args[0], "config") != 0) &&
|
(g_strcmp0(args[0], "config") != 0) &&
|
||||||
(g_strcmp0(args[0], "subject") != 0) &&
|
(g_strcmp0(args[0], "subject") != 0) &&
|
||||||
|
(g_strcmp0(args[0], "kick") != 0) &&
|
||||||
(g_strcmp0(args[0], "role") != 0) &&
|
(g_strcmp0(args[0], "role") != 0) &&
|
||||||
(g_strcmp0(args[0], "affiliation") != 0) &&
|
(g_strcmp0(args[0], "affiliation") != 0) &&
|
||||||
(g_strcmp0(args[0], "info") != 0)) {
|
(g_strcmp0(args[0], "info") != 0)) {
|
||||||
@@ -2179,6 +2180,21 @@ cmd_room(gchar **args, struct cmd_help_t help)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (g_strcmp0(args[0], "kick") == 0) {
|
||||||
|
char *nick = args[1];
|
||||||
|
if (nick) {
|
||||||
|
if (muc_roster_contains_nick(room, nick)) {
|
||||||
|
char *reason = args[2];
|
||||||
|
iq_room_kick_occupant(room, nick, reason);
|
||||||
|
} else {
|
||||||
|
win_save_vprint(window, '!', NULL, 0, 0, "", "Occupant does not exist: %s", nick);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
cons_show("Usage: %s", help.usage);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if (g_strcmp0(args[0], "affiliation") == 0) {
|
if (g_strcmp0(args[0], "affiliation") == 0) {
|
||||||
char *cmd = args[1];
|
char *cmd = args[1];
|
||||||
if (cmd == NULL) {
|
if (cmd == NULL) {
|
||||||
|
|||||||
@@ -538,6 +538,18 @@ handle_room_config_submit_result_error(const char * const room, const char * con
|
|||||||
ui_handle_room_config_submit_result_error(room, message);
|
ui_handle_room_config_submit_result_error(room, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
handle_room_kick(const char * const room, const char * const nick)
|
||||||
|
{
|
||||||
|
ui_handle_room_kick(room, nick);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
handle_room_kick_result_error(const char * const room, const char * const nick, const char * const error)
|
||||||
|
{
|
||||||
|
ui_handle_room_kick_error(room, nick, error);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
handle_room_roster_complete(const char * const room)
|
handle_room_roster_complete(const char * const room)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -65,6 +65,8 @@ void handle_room_affiliation_list(const char * const room, const char * const af
|
|||||||
void handle_room_affiliation_set_error(const char * const room, const char * const jid, const char * const affiliation,
|
void handle_room_affiliation_set_error(const char * const room, const char * const jid, const char * const affiliation,
|
||||||
const char * const error);
|
const char * const error);
|
||||||
void handle_room_affiliation_set(const char * const room, const char * const jid, const char * const affiliation);
|
void handle_room_affiliation_set(const char * const room, const char * const jid, const char * const affiliation);
|
||||||
|
void handle_room_kick(const char * const room, const char * const nick);
|
||||||
|
void handle_room_kick_result_error(const char * const room, const char * const nick, const char * const error);
|
||||||
void handle_duck_result(const char * const result);
|
void handle_duck_result(const char * const result);
|
||||||
void handle_incoming_message(char *from, char *message, gboolean priv);
|
void handle_incoming_message(char *from, char *message, gboolean priv);
|
||||||
void handle_delayed_message(char *from, char *message, GTimeVal tv_stamp,
|
void handle_delayed_message(char *from, char *message, GTimeVal tv_stamp,
|
||||||
|
|||||||
@@ -1739,6 +1739,28 @@ _ui_room_subject(const char * const room, const char * const nick, const char *
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ui_handle_room_kick_error(const char * const room, const char * const nick, const char * const error)
|
||||||
|
{
|
||||||
|
ProfWin *window = wins_get_by_recipient(room);
|
||||||
|
if (window == NULL) {
|
||||||
|
log_error("Kick error received for %s, but no window open for %s.", nick, room);
|
||||||
|
} else {
|
||||||
|
win_save_vprint(window, '!', NULL, 0, COLOUR_ERROR, "", "Error kicking %s: %s", nick, error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ui_handle_room_kick(const char * const room, const char * const nick)
|
||||||
|
{
|
||||||
|
ProfWin *window = wins_get_by_recipient(room);
|
||||||
|
if (window == NULL) {
|
||||||
|
log_error("Kick result received for %s, but no window open for %s.", nick, room);
|
||||||
|
} else {
|
||||||
|
win_save_vprint(window, '!', NULL, 0, 0, "", "%s has been kicked from the room", nick);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_ui_room_broadcast(const char * const room_jid, const char * const message)
|
_ui_room_broadcast(const char * const room_jid, const char * const message)
|
||||||
{
|
{
|
||||||
@@ -2764,5 +2786,6 @@ ui_init_module(void)
|
|||||||
ui_handle_room_affiliation_list =_ui_handle_room_affiliation_list;
|
ui_handle_room_affiliation_list =_ui_handle_room_affiliation_list;
|
||||||
ui_handle_room_affiliation_set_error =_ui_handle_room_affiliation_set_error;
|
ui_handle_room_affiliation_set_error =_ui_handle_room_affiliation_set_error;
|
||||||
ui_handle_room_affiliation_set = _ui_handle_room_affiliation_set;
|
ui_handle_room_affiliation_set = _ui_handle_room_affiliation_set;
|
||||||
|
ui_handle_room_kick_error =_ui_handle_room_kick_error;
|
||||||
|
ui_handle_room_kick = _ui_handle_room_kick;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -175,6 +175,8 @@ void (*ui_handle_room_affiliation_list)(const char * const room, const char * co
|
|||||||
void (*ui_handle_room_affiliation_set_error)(const char * const room, const char * const jid,
|
void (*ui_handle_room_affiliation_set_error)(const char * const room, const char * const jid,
|
||||||
const char * const affiliation, const char * const error);
|
const char * const affiliation, const char * const error);
|
||||||
void (*ui_handle_room_affiliation_set)(const char * const room, const char * const jid, const char * const affiliation);
|
void (*ui_handle_room_affiliation_set)(const char * const room, const char * const jid, const char * const affiliation);
|
||||||
|
void (*ui_handle_room_kick_error)(const char * const room, const char * const nick, const char * const error);
|
||||||
|
void (*ui_handle_room_kick)(const char * const room, const char * const nick);
|
||||||
void (*ui_show_form)(ProfWin *window, const char * const room, DataForm *form);
|
void (*ui_show_form)(ProfWin *window, const char * const room, DataForm *form);
|
||||||
void (*ui_show_form_field)(ProfWin *window, DataForm *form, char *tag);
|
void (*ui_show_form_field)(ProfWin *window, DataForm *form, char *tag);
|
||||||
void (*ui_show_form_help)(ProfWin *window, DataForm *form);
|
void (*ui_show_form_help)(ProfWin *window, DataForm *form);
|
||||||
|
|||||||
@@ -84,6 +84,8 @@ static int _room_affiliation_list_result_handler(xmpp_conn_t * const conn,
|
|||||||
xmpp_stanza_t * const stanza, void * const userdata);
|
xmpp_stanza_t * const stanza, void * const userdata);
|
||||||
static int _room_affiliation_set_result_handler(xmpp_conn_t * const conn,
|
static int _room_affiliation_set_result_handler(xmpp_conn_t * const conn,
|
||||||
xmpp_stanza_t * const stanza, void * const userdata);
|
xmpp_stanza_t * const stanza, void * const userdata);
|
||||||
|
static int _room_kick_result_handler(xmpp_conn_t * const conn,
|
||||||
|
xmpp_stanza_t * const stanza, void * const userdata);
|
||||||
static int _manual_pong_handler(xmpp_conn_t *const conn,
|
static int _manual_pong_handler(xmpp_conn_t *const conn,
|
||||||
xmpp_stanza_t * const stanza, void * const userdata);
|
xmpp_stanza_t * const stanza, void * const userdata);
|
||||||
static int _ping_timed_handler(xmpp_conn_t * const conn,
|
static int _ping_timed_handler(xmpp_conn_t * const conn,
|
||||||
@@ -293,6 +295,20 @@ _iq_room_affiliation_list(const char * const room, char *affiliation)
|
|||||||
xmpp_stanza_release(iq);
|
xmpp_stanza_release(iq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_iq_room_kick_occupant(const char * const room, const char * const nick, const char * const reason)
|
||||||
|
{
|
||||||
|
xmpp_conn_t * const conn = connection_get_conn();
|
||||||
|
xmpp_ctx_t * const ctx = connection_get_ctx();
|
||||||
|
xmpp_stanza_t *iq = stanza_create_room_kick_iq(ctx, room, nick, reason);
|
||||||
|
|
||||||
|
char *id = xmpp_stanza_get_id(iq);
|
||||||
|
xmpp_id_handler_add(conn, _room_kick_result_handler, id, strdup(nick));
|
||||||
|
|
||||||
|
xmpp_send(conn, iq);
|
||||||
|
xmpp_stanza_release(iq);
|
||||||
|
}
|
||||||
|
|
||||||
struct affiliation_set_t {
|
struct affiliation_set_t {
|
||||||
char *jid;
|
char *jid;
|
||||||
char *affiliation;
|
char *affiliation;
|
||||||
@@ -921,6 +937,35 @@ _room_config_submit_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stan
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
_room_kick_result_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata)
|
||||||
|
{
|
||||||
|
const char *id = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_ID);
|
||||||
|
const char *type = xmpp_stanza_get_type(stanza);
|
||||||
|
const char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
|
||||||
|
char *nick = (char *)userdata;
|
||||||
|
|
||||||
|
if (id != NULL) {
|
||||||
|
log_debug("IQ kick result handler fired, id: %s.", id);
|
||||||
|
} else {
|
||||||
|
log_debug("IQ kick result handler fired.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle error responses
|
||||||
|
if (g_strcmp0(type, STANZA_TYPE_ERROR) == 0) {
|
||||||
|
char *error_message = stanza_get_error_message(stanza);
|
||||||
|
handle_room_kick_result_error(from, nick, error_message);
|
||||||
|
free(error_message);
|
||||||
|
free(nick);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
handle_room_kick(from, nick);
|
||||||
|
free(nick);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_identity_destroy(DiscoIdentity *identity)
|
_identity_destroy(DiscoIdentity *identity)
|
||||||
{
|
{
|
||||||
@@ -1097,4 +1142,5 @@ iq_init_module(void)
|
|||||||
iq_room_info_request = _iq_room_info_request;
|
iq_room_info_request = _iq_room_info_request;
|
||||||
iq_room_affiliation_set = _iq_room_affiliation_set;
|
iq_room_affiliation_set = _iq_room_affiliation_set;
|
||||||
iq_room_affiliation_list = _iq_room_affiliation_list;
|
iq_room_affiliation_list = _iq_room_affiliation_list;
|
||||||
|
iq_room_kick_occupant = _iq_room_kick_occupant;
|
||||||
}
|
}
|
||||||
@@ -619,6 +619,47 @@ stanza_create_room_affiliation_set_iq(xmpp_ctx_t *ctx, const char * const room,
|
|||||||
return iq;
|
return iq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xmpp_stanza_t *
|
||||||
|
stanza_create_room_kick_iq(xmpp_ctx_t * const ctx, const char * const room, const char * const nick,
|
||||||
|
const char * const reason)
|
||||||
|
{
|
||||||
|
xmpp_stanza_t *iq = xmpp_stanza_new(ctx);
|
||||||
|
xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
|
||||||
|
xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
|
||||||
|
xmpp_stanza_set_attribute(iq, STANZA_ATTR_TO, room);
|
||||||
|
char *id = create_unique_id("room_kick");
|
||||||
|
xmpp_stanza_set_id(iq, id);
|
||||||
|
free(id);
|
||||||
|
|
||||||
|
xmpp_stanza_t *query = xmpp_stanza_new(ctx);
|
||||||
|
xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
|
||||||
|
xmpp_stanza_set_ns(query, STANZA_NS_MUC_ADMIN);
|
||||||
|
|
||||||
|
xmpp_stanza_t *item = xmpp_stanza_new(ctx);
|
||||||
|
xmpp_stanza_set_name(item, STANZA_NAME_ITEM);
|
||||||
|
xmpp_stanza_set_attribute(item, STANZA_ATTR_NICK, nick);
|
||||||
|
xmpp_stanza_set_attribute(item, "role", "none");
|
||||||
|
|
||||||
|
if (reason) {
|
||||||
|
xmpp_stanza_t *reason_st = xmpp_stanza_new(ctx);
|
||||||
|
xmpp_stanza_set_name(reason_st, STANZA_NAME_REASON);
|
||||||
|
xmpp_stanza_t *reason_text = xmpp_stanza_new(ctx);
|
||||||
|
xmpp_stanza_set_text(reason_text, reason);
|
||||||
|
xmpp_stanza_add_child(reason_st, reason_text);
|
||||||
|
xmpp_stanza_release(reason_text);
|
||||||
|
|
||||||
|
xmpp_stanza_add_child(item, reason_st);
|
||||||
|
xmpp_stanza_release(reason_st);
|
||||||
|
}
|
||||||
|
|
||||||
|
xmpp_stanza_add_child(query, item);
|
||||||
|
xmpp_stanza_release(item);
|
||||||
|
xmpp_stanza_add_child(iq, query);
|
||||||
|
xmpp_stanza_release(query);
|
||||||
|
|
||||||
|
return iq;
|
||||||
|
}
|
||||||
|
|
||||||
xmpp_stanza_t *
|
xmpp_stanza_t *
|
||||||
stanza_create_presence(xmpp_ctx_t * const ctx)
|
stanza_create_presence(xmpp_ctx_t * const ctx)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -210,6 +210,8 @@ xmpp_stanza_t* stanza_create_room_affiliation_list_iq(xmpp_ctx_t *ctx, const cha
|
|||||||
xmpp_stanza_t* stanza_create_room_affiliation_set_iq(xmpp_ctx_t *ctx, const char * const room, const char * const jid,
|
xmpp_stanza_t* stanza_create_room_affiliation_set_iq(xmpp_ctx_t *ctx, const char * const room, const char * const jid,
|
||||||
const char * const affiliation, const char * const reason);
|
const char * const affiliation, const char * const reason);
|
||||||
xmpp_stanza_t* stanza_create_room_subject_message(xmpp_ctx_t *ctx, const char * const room, const char * const subject);
|
xmpp_stanza_t* stanza_create_room_subject_message(xmpp_ctx_t *ctx, const char * const room, const char * const subject);
|
||||||
|
xmpp_stanza_t* stanza_create_room_kick_iq(xmpp_ctx_t * const ctx, const char * const room, const char * const nick,
|
||||||
|
const char * const reason);
|
||||||
|
|
||||||
int stanza_get_idle_time(xmpp_stanza_t * const stanza);
|
int stanza_get_idle_time(xmpp_stanza_t * const stanza);
|
||||||
char * stanza_get_caps_str(xmpp_stanza_t * const stanza);
|
char * stanza_get_caps_str(xmpp_stanza_t * const stanza);
|
||||||
|
|||||||
@@ -197,6 +197,7 @@ void (*iq_room_info_request)(gchar *room);
|
|||||||
void (*iq_room_affiliation_list)(const char * const room, char *affiliation);
|
void (*iq_room_affiliation_list)(const char * const room, char *affiliation);
|
||||||
void (*iq_room_affiliation_set)(const char * const room, const char * const jid, char *affiliation,
|
void (*iq_room_affiliation_set)(const char * const room, const char * const jid, char *affiliation,
|
||||||
const char * const reason);
|
const char * const reason);
|
||||||
|
void (*iq_room_kick_occupant)(const char * const room, const char * const nick, const char * const reason);
|
||||||
|
|
||||||
// caps functions
|
// caps functions
|
||||||
Capabilities* (*caps_lookup)(const char * const jid);
|
Capabilities* (*caps_lookup)(const char * const jid);
|
||||||
|
|||||||
Reference in New Issue
Block a user