static void cmd_ctcp(const char *data, SERVER_REC *server) { CHAT_DCC_REC *dcc; char *target, *ctcpcmd, *ctcpdata; void *free_arg; g_return_if_fail(data != NULL); if (server == NULL || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); if (!cmd_get_params(data, &free_arg, 3 | PARAM_FLAG_GETREST, &target, &ctcpcmd, &ctcpdata)) return; if (*target == '\0' || *ctcpcmd == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); if (*target != '=') { /* handle only DCC CTCPs */ cmd_params_free(free_arg); return; } 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 { ascii_strup(ctcpcmd); signal_emit("message dcc own_ctcp", 3, dcc, ctcpcmd, ctcpdata); } cmd_params_free(free_arg); }
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 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); }
static void cmd_ctcp(const char *data, IRC_SERVER_REC *server) { CHAT_DCC_REC *dcc; char *target, *ctcpcmd, *ctcpdata, *str; void *free_arg; g_return_if_fail(data != NULL); if (!cmd_get_params(data, &free_arg, 3 | PARAM_FLAG_GETREST, &target, &ctcpcmd, &ctcpdata)) return; if (*target == '\0' || *ctcpcmd == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); if (*target != '=') { /* handle only DCC CTCPs */ cmd_params_free(free_arg); return; } dcc = dcc_chat_find_id(target+1); if (dcc != NULL) { ascii_strup(ctcpcmd); str = g_strconcat(ctcpcmd, " ", ctcpdata, NULL); dcc_ctcp_message(server, dcc->nick, dcc, FALSE, str); g_free(str); } cmd_params_free(free_arg); signal_stop(); }
static void cmd_action(const char *data, IRC_SERVER_REC *server) { CHAT_DCC_REC *dcc; char *target, *text, *str; 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) { str = g_strconcat("ACTION ", text, NULL); dcc_ctcp_message(server, dcc->nick, dcc, FALSE, str); g_free(str); } cmd_params_free(free_arg); signal_stop(); }
/* Send text to DCC chat */ 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 (g_strcmp0(target, "*") == 0) dcc = item_get_dcc(item); else if (*target == '=') dcc = dcc_chat_find_id(target+1); else dcc = NULL; if (dcc != NULL && dcc->sendbuf != NULL) { char *recoded; recoded = recode_out(server, text, dcc->nick); dcc_chat_send(dcc, recoded); g_free(recoded); } if (dcc != NULL || *target == '=') signal_stop(); cmd_params_free(free_arg); }
/* If `item' is a query of a =nick, return DCC chat record of nick */ CHAT_DCC_REC *item_get_dcc(WI_ITEM_REC *item) { QUERY_REC *query; query = IRC_QUERY(item); if (query == NULL || *query->name != '=') return NULL; return dcc_chat_find_id(query->name+1); }
static char *dcc_chat_get_new_id(const char *nick) { char *id; int num; g_return_val_if_fail(nick != NULL, NULL); if (dcc_chat_find_id(nick) == NULL) { /* same as nick, good */ return g_strdup(nick); } /* keep adding numbers after nick until some of them isn't found */ for (num = 2;; num++) { id = g_strdup_printf("%s%d", nick, num); if (dcc_chat_find_id(id) == NULL) return id; g_free(id); } }
static void sig_query_destroyed(QUERY_REC *query) { CHAT_DCC_REC *dcc; if (*query->name != '=') return; dcc = dcc_chat_find_id(query->name+1); if (dcc != NULL && !dcc->destroyed) { /* DCC query window closed, close the dcc chat too. */ dcc_close(DCC(dcc)); } }
/* SYNTAX: DCC CHAT [-passive] [<nick>] */ static void cmd_dcc_chat(const char *data, IRC_SERVER_REC *server) { void *free_arg; CHAT_DCC_REC *dcc; IPADDR own_ip; GIOChannel *handle; GHashTable *optlist; int p_id; char *nick, host[MAX_IP_LEN]; int port; g_return_if_fail(data != NULL); if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS, "dcc chat", &optlist, &nick)) return; if (*nick == '\0') { dcc = DCC_CHAT(dcc_find_request_latest(DCC_CHAT_TYPE)); if (dcc != NULL) { if (!dcc_is_passive(dcc)) dcc_chat_connect(dcc); else dcc_chat_passive(dcc); } cmd_params_free(free_arg); return; } dcc = dcc_chat_find_id(nick); if (dcc != NULL && dcc_is_waiting_user(dcc)) { if (!dcc_is_passive(dcc)) { /* found from dcc chat requests, we're the connecting side */ dcc_chat_connect(dcc); } else { /* We are accepting a passive DCC CHAT. */ dcc_chat_passive(dcc); } cmd_params_free(free_arg); return; } if (dcc != NULL && dcc_is_listening(dcc) && dcc->server == server) { /* sending request again even while old request is still waiting, remove it. */ dcc_destroy(DCC(dcc)); } if (!IS_IRC_SERVER(server) || !server->connected) cmd_param_error(CMDERR_NOT_CONNECTED); dcc = dcc_chat_create(server, NULL, nick, "chat"); if (dcc == NULL) { cmd_params_free(free_arg); g_warn_if_reached(); return; } if (g_hash_table_lookup(optlist, "passive") == NULL) { /* Standard DCC CHAT... let's listen for incoming connections */ handle = dcc_listen(net_sendbuffer_handle(server->handle), &own_ip, &port); if (handle == NULL) cmd_param_error(CMDERR_ERRNO); dcc->handle = handle; dcc->tagconn = g_input_add(dcc->handle, G_INPUT_READ, (GInputFunction) dcc_chat_listen, dcc); /* send the chat request */ signal_emit("dcc request send", 1, dcc); dcc_ip2str(&own_ip, host); irc_send_cmdv(server, "PRIVMSG %s :\001DCC CHAT CHAT %s %d\001", nick, host, port); } else { /* Passive protocol... we want the other side to listen */ /* send the chat request */ dcc->port = 0; signal_emit("dcc request send", 1, dcc); /* generate a random id */ p_id = rand() % 64; dcc->pasv_id = p_id; /* 16843009 is the long format of 1.1.1.1, we use a fake IP since the other side shouldn't care of it: they will send the address for us to connect to in the reply */ irc_send_cmdv(server, "PRIVMSG %s :\001DCC CHAT CHAT 16843009 0 %d\001", nick, p_id); } cmd_params_free(free_arg); }