static void cmd_msg(const char *data) { DCC_REC *dcc; char *text, *target; void *free_arg; g_return_if_fail(data != NULL); if (*data != '=') { /* handle only DCC messages */ return; } if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST, &target, &text)) return; target++; dcc = dcc_find_item(DCC_TYPE_CHAT, target, NULL); if (dcc == NULL || dcc->sendbuf == NULL) { printformat(NULL, NULL, MSGLEVEL_CLIENTERROR, IRCTXT_DCC_CHAT_NOT_FOUND, target+1); } else { printformat(NULL, target, MSGLEVEL_DCCMSGS | MSGLEVEL_NOHILIGHT, query_find(NULL, target) ? IRCTXT_OWN_DCC_QUERY : IRCTXT_OWN_DCC, dcc->mynick, target, text); } cmd_params_free(free_arg); }
static void cmd_action(const char *data, SERVER_REC *server, WI_ITEM_REC *item) { CHAT_DCC_REC *dcc; char *target, *text; void *free_arg; g_return_if_fail(data != NULL); if (*data != '=') { /* handle only DCC actions */ return; } if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST, &target, &text)) return; if (*target == '\0' || *text == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); dcc = dcc_chat_find_id(target+1); if (dcc == NULL || dcc->sendbuf == NULL) { printformat(NULL, NULL, MSGLEVEL_CLIENTERROR, IRCTXT_DCC_CHAT_NOT_FOUND, target+1); } else { if (query_find(NULL, target) == NULL) completion_last_message_add(target); signal_emit("message dcc own_action", 2, dcc, text); } cmd_params_free(free_arg); }
/* SYNTAX: UNQUERY [<nick>] */ static void cmd_unquery(const char *data, SERVER_REC *server, WI_ITEM_REC *item) { QUERY_REC *query; char *nick; void *free_arg; g_return_if_fail(data != NULL); if (!cmd_get_params(data, &free_arg, 1, &nick)) return; if (*nick == '\0') { /* remove current query */ query = QUERY(item); } else { query = query_find(server, nick); if (query == NULL) { printformat(server, NULL, MSGLEVEL_CLIENTERROR, TXT_NO_QUERY, nick); } } if (query != NULL) query_destroy(query); cmd_params_free(free_arg); }
static void dcc_connected(DCC_REC *dcc) { char *sender; g_return_if_fail(dcc != NULL); switch (dcc->type) { case DCC_TYPE_CHAT: sender = g_strconcat("=", dcc->nick, NULL); printformat(dcc->server, sender, MSGLEVEL_DCC, IRCTXT_DCC_CHAT_CONNECTED, dcc->nick, dcc->addrstr, dcc->port); if (query_find(NULL, sender) == NULL) query_create(dcc->server, sender, TRUE); g_free(sender); break; case DCC_TYPE_SEND: printformat(dcc->server, dcc->nick, MSGLEVEL_DCC, IRCTXT_DCC_SEND_CONNECTED, dcc->arg, dcc->nick, dcc->addrstr, dcc->port); break; case DCC_TYPE_GET: printformat(dcc->server, dcc->nick, MSGLEVEL_DCC, IRCTXT_DCC_GET_CONNECTED, dcc->arg, dcc->nick, dcc->addrstr, dcc->port); break; } }
static void cmd_query(gchar *data, IRC_SERVER_REC *server, WI_IRC_REC *item) { WINDOW_REC *window; QUERY_REC *query; g_return_if_fail(data != NULL); if (*data == '\0') { /* remove current query */ cmd_unquery("", server, item); return; } if (*data != '=' && (server == NULL || !server->connected)) cmd_return_error(CMDERR_NOT_CONNECTED); query = query_find(server, data); if (query != NULL) { /* query already existed - change to query window */ window = window_item_window((WI_ITEM_REC *) query); g_return_if_fail(window != NULL); window_set_active(window); window_item_set_active(window, (WI_ITEM_REC *) query); return; } query_create(server, data, FALSE); }
static void sig_message_private(SERVER_REC *server, const char *msg, const char *nick, const char *address, const char *target) { QUERY_REC *query; char *freemsg = NULL; int level = MSGLEVEL_MSGS; /* own message returned by bouncer? */ int own = (!g_strcmp0(nick, server->nick)); query = query_find(server, own ? target : nick); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis((WI_ITEM_REC *) query, msg); ignore_check_plus(server, nick, address, NULL, msg, &level, FALSE); if (own) { printformat(server, target, level, query == NULL ? TXT_OWN_MSG_PRIVATE : TXT_OWN_MSG_PRIVATE_QUERY, target, msg, server->nick); } else { printformat(server, nick, level, query == NULL ? TXT_MSG_PRIVATE : TXT_MSG_PRIVATE_QUERY, nick, address, msg); } g_free_not_null(freemsg); }
static void cmd_msg(const char *data) { DCC_REC *dcc; char *params, *text, *target; g_return_if_fail(data != NULL); if (*data != '=') { /* handle only DCC messages */ return; } params = cmd_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &text); dcc = dcc_find_item(DCC_TYPE_CHAT, target+1, NULL); if (dcc == NULL) { printformat(NULL, NULL, MSGLEVEL_CLIENTERROR, IRCTXT_DCC_CHAT_NOT_FOUND, target+1); } else { printformat(NULL, target, MSGLEVEL_DCC, query_find(NULL, target) ? IRCTXT_OWN_DCC_QUERY : IRCTXT_OWN_DCC, dcc->mynick, text); } g_free(params); }
static void cmd_msg(const char *data, SERVER_REC *server, WI_ITEM_REC *item) { CHAT_DCC_REC *dcc; GHashTable *optlist; char *text, *target; void *free_arg; g_return_if_fail(data != NULL); if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_UNKNOWN_OPTIONS | PARAM_FLAG_OPTIONS | PARAM_FLAG_GETREST, "msg", &optlist, &target, &text)) return; /* handle only DCC messages */ if (strcmp(target, "*") == 0) dcc = item_get_dcc(item); else if (*target == '=') dcc = dcc_chat_find_id(target+1); else dcc = NULL; if (dcc == NULL && *target == '=') { printformat(NULL, NULL, MSGLEVEL_CLIENTERROR, IRCTXT_DCC_CHAT_NOT_FOUND, target+1); } else if (dcc != NULL) { if (query_find(NULL, target) == NULL) completion_last_message_add(target); signal_emit("message dcc own", 2, dcc, text); } cmd_params_free(free_arg); }
static void sig_message_own_private(SERVER_REC *server, const char *msg, const char *target, const char *origtarget) { g_return_if_fail(server != NULL); if (target != NULL && query_find(server, target) == NULL) SERVER_LAST_MSG_ADD(server, target); }
void DH1080_received(SERVER_REC * server, char *msg, char *nick, char *address, char *target) { int i; char hisPubKey[300], contactName[CONTACT_SIZE] = "", encryptedKey[KEYBUF_SIZE] = ""; if (ischannel(*target) || ischannel(*nick)) return; // no KeyXchange for channels... i = strlen(msg); if (i < 191 || i > 195) return; if (strncmp(msg, "DH1080_INIT ", 12) == 0) { strcpy(hisPubKey, msg + 12); if (strspn(hisPubKey, B64ABC) != strlen(hisPubKey)) return; if (query_find(server, nick) == NULL) { // query window not found, lets create one keyx_query_created = 1; irc_query_create(server->tag, nick, TRUE); keyx_query_created = 0; } printtext(server, nick, MSGLEVEL_CRAP, "\002FiSH:\002 Received DH1080 public key from %s, sending mine...", nick); DH1080_gen(g_myPrivKey, g_myPubKey); irc_send_cmdv((IRC_SERVER_REC *) server, "NOTICE %s :%s %s", nick, "DH1080_FINISH", g_myPubKey); } else if (strncmp(msg, "DH1080_FINISH ", 14) == 0) strcpy(hisPubKey, msg + 14); else return; if (DH1080_comp(g_myPrivKey, hisPubKey) == 0) return; signal_stop(); encrypt_key(hisPubKey, encryptedKey); ZeroMemory(hisPubKey, sizeof(hisPubKey)); if (getIniSectionForContact(server, nick, contactName) == FALSE) return; if (setIniValue(contactName, "key", encryptedKey, iniPath) == -1) { ZeroMemory(encryptedKey, KEYBUF_SIZE); printtext(server, nick, MSGLEVEL_CRAP, "\002FiSH ERROR:\002 Unable to write to blow.ini, probably out of space or permission denied."); return; } ZeroMemory(encryptedKey, KEYBUF_SIZE); printtext(server, nick, MSGLEVEL_CRAP, "\002FiSH:\002 Key for %s successfully set!", nick); }
/* Return query where to put the private message. */ QUERY_REC *privmsg_get_query(IRC_SERVER_REC *server, const char *nick, int own) { QUERY_REC *query; query = query_find(server, nick); if (query == NULL && settings_get_bool("autocreate_query") && (!own || settings_get_bool("autocreate_own_query"))) query = query_create(server, nick, TRUE); return query; }
static void dcc_chat_msg(DCC_REC *dcc, const char *msg) { char *sender; g_return_if_fail(dcc != NULL); g_return_if_fail(msg != NULL); sender = g_strconcat("=", dcc->nick, NULL); printformat(NULL, sender, MSGLEVEL_DCC, query_find(NULL, sender) ? IRCTXT_DCC_MSG_QUERY : IRCTXT_DCC_MSG, dcc->nick, msg); g_free(sender); }
static PyObject *PyServer_query_find(PyServer *self, PyObject *args, PyObject *kwds) { static char *kwlist[] = {"nick", NULL}; char *nick = ""; RET_NULL_IF_INVALID(self->data); if (!PyArg_ParseTupleAndKeywords(args, kwds, "s", kwlist, &nick)) return NULL; return py_irssi_chat_new(query_find(self->data, nick), 1); }
/* SYNTAX: QUERY [-window] <nick> */ static void cmd_query(const char *data, SERVER_REC *server, WI_ITEM_REC *item) { GHashTable *optlist; QUERY_REC *query; char *nick; void *free_arg; g_return_if_fail(data != NULL); if (*data == '\0') { /* remove current query */ cmd_unquery("", server, item); return; } if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS | PARAM_FLAG_UNKNOWN_OPTIONS, "query", &optlist, &nick)) return; if (*nick == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); server = cmd_options_get_server("query", optlist, server); if (server == NULL) { cmd_params_free(free_arg); return; } if (*nick != '=' && (server == NULL || !server->connected)) cmd_param_error(CMDERR_NOT_CONNECTED); if (g_hash_table_lookup(optlist, "window") != NULL) { signal_add("query created", (SIGNAL_FUNC) signal_query_created_curwin); } query = query_find(server, nick); if (query == NULL) CHAT_PROTOCOL(server)->query_create(server->tag, nick, FALSE); else { /* query already existed - set query active / move it to this window */ window_item_set_active(active_win, (WI_ITEM_REC *) query); } if (g_hash_table_lookup(optlist, "window") != NULL) { signal_remove("query created", (SIGNAL_FUNC) signal_query_created_curwin); } cmd_params_free(free_arg); }
static void sig_history(SERVER_REC *server, const char *msg, const char *nick, const char *target, const char *stamp, gpointer gpointer_type) { void *item; char *text, *freemsg = NULL; int level, type; g_return_if_fail(server != NULL); g_return_if_fail(msg != NULL); g_return_if_fail(nick != NULL); g_return_if_fail(target != NULL); type = GPOINTER_TO_INT(gpointer_type); level = MSGLEVEL_NO_ACT | MSGLEVEL_NOHILIGHT | (type == SEND_TARGET_CHANNEL ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); item = type == SEND_TARGET_CHANNEL ? (void *)channel_find(server, target) : query_find(server, nick); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis(item, msg); /* MUC */ if (type == SEND_TARGET_CHANNEL) { CHANNEL_REC *chanrec = item; int print_channel; char *nickmode; print_channel = chanrec == NULL || !window_item_is_active((WI_ITEM_REC *)chanrec); if (!print_channel && settings_get_bool("print_active_channel") && window_item_window((WI_ITEM_REC *)chanrec)->items->next != NULL) print_channel = TRUE; nickmode = channel_get_nickmode(chanrec, nick); text = !print_channel ? format_get_text(CORE_MODULE_NAME, NULL, server, target, TXT_PUBMSG, nick, msg, nickmode) : format_get_text(CORE_MODULE_NAME, NULL, server, target, TXT_PUBMSG_CHANNEL, nick, target, msg, nickmode); g_free(nickmode); /* General */ } else text = format_get_text(CORE_MODULE_NAME, NULL, server, target, item == NULL ? TXT_MSG_PRIVATE : TXT_MSG_PRIVATE_QUERY, nick, nick, msg); printformat_module(MODULE_NAME, server, target, level, XMPPTXT_MESSAGE_TIMESTAMP, stamp, text); g_free_not_null(freemsg); g_free(text); }
static void event_nick(SERVER_REC *server, const char *data, const char *orignick) { QUERY_REC *query; char *params, *nick; query = query_find(server, orignick); if (query != NULL) { params = event_get_params(data, 1, &nick); if (strcmp(query->name, nick) != 0) query_change_nick(query, nick); g_free(params); } }
static void dcc_chat_action(CHAT_DCC_REC *dcc, const char *msg) { char *sender; g_return_if_fail(IS_DCC_CHAT(dcc)); g_return_if_fail(msg != NULL); sender = g_strconcat("=", dcc->id, NULL); if (query_find(NULL, sender) == NULL) completion_last_message_add(sender); signal_emit("message dcc action", 2, dcc, msg); g_free(sender); }
static void sig_message_delay_action(SERVER_REC *server, const char *msg, const char *nick, const char *target, time_t *t, gpointer gpointer_type) { void *item; char *text, *freemsg = NULL; char stamp[BUFSIZ]; int level, type; g_return_if_fail(server != NULL); g_return_if_fail(msg != NULL); g_return_if_fail(nick != NULL); g_return_if_fail(target != NULL); type = GPOINTER_TO_INT(gpointer_type); level = MSGLEVEL_ACTIONS | MSGLEVEL_NO_ACT | MSGLEVEL_NOHILIGHT | (type == SEND_TARGET_CHANNEL ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); item = type == SEND_TARGET_CHANNEL ? (void *)get_muc((XMPP_SERVER_REC *)server, target) : query_find(server, nick); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis(item, msg); /* MUC */ if (type == SEND_TARGET_CHANNEL) { if (item && window_item_is_active(item)) text = format_get_text(IRC_MODULE_NAME, NULL, server, target, IRCTXT_ACTION_PUBLIC, nick, msg); else text = format_get_text(IRC_MODULE_NAME, NULL, server, target, IRCTXT_ACTION_PUBLIC_CHANNEL, nick, target, msg); /* General */ } else text = format_get_text(IRC_MODULE_NAME, NULL, server, nick, (item == NULL) ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY, nick, nick, msg); if (strftime(stamp, sizeof(stamp)-1, settings_get_str("xmpp_timestamp_format"), localtime(t)) == 0) stamp[sizeof(stamp)-1] = '\0'; printformat_module(MODULE_NAME, server, target, level, XMPPTXT_MESSAGE_TIMESTAMP, stamp, text); g_free(freemsg); }
static void sig_message_private(SERVER_REC *server, const char *msg, const char *nick, const char *address) { QUERY_REC *query; char *freemsg = NULL; query = query_find(server, nick); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis((WI_ITEM_REC *) query, msg); printformat(server, nick, MSGLEVEL_MSGS, query == NULL ? TXT_MSG_PRIVATE : TXT_MSG_PRIVATE_QUERY, nick, address, msg); g_free_not_null(freemsg); }
static void sig_dcc_destroyed(DCC_REC *dcc) { QUERY_REC *query; char *nick; if (dcc->type != DCC_TYPE_CHAT) return; nick = g_strconcat("=", dcc->nick, NULL); query = query_find(NULL, nick); g_free(nick); if (query != NULL) { /* DCC chat closed, close the query with it. */ query_destroy(query); } }
/* Return query where to put the private message. */ QUERY_REC *privmsg_get_query(SERVER_REC *server, const char *nick, int own, int level) { QUERY_REC *query; g_return_val_if_fail(IS_SERVER(server), NULL); g_return_val_if_fail(nick != NULL, NULL); query = query_find(server, nick); if (query == NULL && (querycreate_level & level) != 0 && (!own || settings_get_bool("autocreate_own_query"))) { query = CHAT_PROTOCOL(server)-> query_create(server->tag, nick, TRUE); } return query; }
static void cmd_unquery(const char *data, IRC_SERVER_REC *server, WI_IRC_REC *item) { QUERY_REC *query; g_return_if_fail(data != NULL); if (*data == '\0') { /* remove current query */ query = irc_item_query(item); if (query == NULL) return; } else { query = query_find(server, data); if (query == NULL) { printformat(server, NULL, MSGLEVEL_CLIENTERROR, IRCTXT_NO_QUERY, data); return; } } query_destroy(query); }
static void sig_dcc_destroyed(CHAT_DCC_REC *dcc) { QUERY_REC *query; char *nick; if (!IS_DCC_CHAT(dcc)) return; nick = g_strconcat("=", dcc->id, NULL); query = query_find(NULL, nick); if (query != NULL) { /* DCC chat closed, close the query with it. */ if (dcc->connection_lost) query->unwanted = TRUE; query_destroy(query); } else { /* remove nick from msg completion since it won't work anymore */ completion_last_message_remove(nick); } g_free(nick); }
static void event_privmsg(const char *data, IRC_SERVER_REC *server, const char *nick, const char *addr) { char *params, *target, *msg; QUERY_REC *query; g_return_if_fail(data != NULL); params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg); if (addr != NULL && !ischannel(*target)) { /* save nick's address to query */ query = query_find(server, nick); if (query != NULL && (query->address == NULL || strcmp(query->address, addr) != 0)) { g_free_not_null(query->address); query->address = g_strdup(addr); signal_emit("query address changed", 1, query); } } g_free(params); }
static void dcc_connected(CHAT_DCC_REC *dcc) { char *sender; if (!IS_DCC_CHAT(dcc)) return; sender = g_strconcat("=", dcc->id, NULL); printformat(dcc->server, NULL, MSGLEVEL_DCC, IRCTXT_DCC_CHAT_CONNECTED, dcc->id, dcc->addrstr, dcc->port); if (query_find(NULL, sender) == NULL) { int level = settings_get_level("autocreate_query_level"); int autocreate_dccquery = (level & MSGLEVEL_DCCMSGS) != 0; if (!autocreate_dccquery) completion_last_message_add(sender); else irc_query_create(dcc->servertag, sender, TRUE); } g_free(sender); }
static void dcc_chat_msg(CHAT_DCC_REC *dcc, const char *msg) { QUERY_REC *query; char *sender, *freemsg; g_return_if_fail(IS_DCC_CHAT(dcc)); g_return_if_fail(msg != NULL); sender = g_strconcat("=", dcc->id, NULL); query = query_find(NULL, sender); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis((WI_ITEM_REC *) query, msg); else freemsg = NULL; if (query == NULL) completion_last_message_add(sender); signal_emit("message dcc", 2, dcc, msg); g_free_not_null(freemsg); g_free(sender); }
static void sig_history_action(SERVER_REC *server, const char *msg, const char *nick, const char *target, const char *stamp, gpointer gpointer_type) { void *item; char *text, *freemsg = NULL; int level, type; g_return_if_fail(server != NULL); g_return_if_fail(msg != NULL); g_return_if_fail(nick != NULL); g_return_if_fail(target != NULL); type = GPOINTER_TO_INT(gpointer_type); level = MSGLEVEL_ACTIONS | MSGLEVEL_NO_ACT | MSGLEVEL_NOHILIGHT | (type == SEND_TARGET_CHANNEL ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); item = type == SEND_TARGET_CHANNEL ? (void *)channel_find(server, target) : query_find(server, nick); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis(item, msg); /* MUC */ if (type == SEND_TARGET_CHANNEL) { if (item && window_item_is_active(item)) text = format_get_text(IRC_MODULE_NAME, NULL, server, target, IRCTXT_ACTION_PUBLIC, nick, msg); else text = format_get_text(IRC_MODULE_NAME, NULL, server, target, IRCTXT_ACTION_PUBLIC_CHANNEL, nick, target, msg); /* General */ } else text = format_get_text(IRC_MODULE_NAME, NULL, server, nick, (item == NULL) ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY, nick, nick, msg); printformat_module(MODULE_NAME, server, target, level, XMPPTXT_MESSAGE_TIMESTAMP, stamp, text); g_free(freemsg); }
static void sig_own_action(SERVER_REC *server, const char *msg, const char *target, gpointer gpointer_type) { void *item; char *freemsg = NULL; int type; g_return_if_fail(server != NULL); g_return_if_fail(msg != NULL); g_return_if_fail(target != NULL); type = GPOINTER_TO_INT(gpointer_type); item = type == SEND_TARGET_CHANNEL ? (void *)channel_find(server, target) : query_find(server, target); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis(item, msg); printformat_module(IRC_MODULE_NAME, server, target, MSGLEVEL_ACTIONS | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT | ((type == SEND_TARGET_CHANNEL) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS), (item != NULL) ? IRCTXT_OWN_ACTION : IRCTXT_OWN_ACTION_TARGET, server->nick, msg, target); g_free(freemsg); }
static void sig_message_quit(SERVER_REC *server, const char *nick, const char *address, const char *reason) { WINDOW_REC *window; GString *chans; GSList *tmp, *windows; char *print_channel; int once, count, level = MSGLEVEL_QUITS; if (ignore_check_plus(server, nick, address, NULL, reason, &level, TRUE)) return; print_channel = NULL; once = settings_get_bool("show_quit_once"); count = 0; windows = NULL; chans = g_string_new(NULL); for (tmp = server->channels; tmp != NULL; tmp = tmp->next) { CHANNEL_REC *rec; level = MSGLEVEL_QUITS; rec = tmp->data; if (!nicklist_find(rec, nick)) continue; if (ignore_check_plus(server, nick, address, rec->visible_name, reason, &level, TRUE)) { count++; continue; } if (print_channel == NULL || active_win->active == (WI_ITEM_REC *) rec) print_channel = rec->visible_name; if (once) g_string_append_printf(chans, "%s,", rec->visible_name); else { window = window_item_window((WI_ITEM_REC *) rec); if (g_slist_find(windows, window) == NULL) { windows = g_slist_append(windows, window); printformat(server, rec->visible_name, level, TXT_QUIT, nick, address, reason, rec->visible_name); } } count++; } g_slist_free(windows); if (!once) { /* check if you had query with the nick and display the quit there too */ QUERY_REC *query = query_find(server, nick); if (query != NULL) { printformat(server, nick, level, TXT_QUIT, nick, address, reason, ""); } } if (once || count == 0) { if (chans->len > 0) g_string_truncate(chans, chans->len-1); printformat(server, print_channel, MSGLEVEL_QUITS, count <= 1 ? TXT_QUIT : TXT_QUIT_ONCE, nick, address, reason, chans->str); } g_string_free(chans, TRUE); }
/* SYNTAX: QUERY [-window] [-<server tag>] <nick> [<message>] */ static void cmd_query(const char *data, SERVER_REC *server, WI_ITEM_REC *item) { GHashTable *optlist; QUERY_REC *query; char *nick, *msg; void *free_arg; g_return_if_fail(data != NULL); if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST | PARAM_FLAG_OPTIONS | PARAM_FLAG_UNKNOWN_OPTIONS, "query", &optlist, &nick, &msg)) return; if (*nick == '\0') { /* remove current query */ cmd_unquery("", server, item); cmd_params_free(free_arg); return; } server = cmd_options_get_server("query", optlist, server); if (server == NULL) { cmd_params_free(free_arg); return; } if (*nick != '=' && (server == NULL || !server->connected)) cmd_param_error(CMDERR_NOT_CONNECTED); if (g_hash_table_lookup(optlist, "window") != NULL) { signal_add("query created", (SIGNAL_FUNC) signal_query_created_curwin); } query = query_find(server, nick); if (query == NULL) query = CHAT_PROTOCOL(server)-> query_create(server->tag, nick, FALSE); else { /* query already exists, set it active */ WINDOW_REC *window = window_item_window(query); if (window != active_win) window_set_active(window); window_item_set_active(active_win, (WI_ITEM_REC *) query); } if (g_hash_table_lookup(optlist, "window") != NULL) { signal_remove("query created", (SIGNAL_FUNC) signal_query_created_curwin); } if (*msg != '\0') { msg = g_strdup_printf("-nick %s %s", nick, msg); signal_emit("command msg", 3, msg, server, query); g_free(msg); } cmd_params_free(free_arg); }