static FILE_DCC_REC *dcc_resume_find(int type, const char *nick, int port) { GSList *tmp; for (tmp = dcc_conns; tmp != NULL; tmp = tmp->next) { FILE_DCC_REC *dcc = tmp->data; if (dcc->type == type && !dcc_is_connected(dcc) && dcc->port == port && g_strcasecmp(dcc->nick, nick) == 0) return dcc; } return NULL; }
/* Reject a DCC request */ void dcc_reject(DCC_REC *dcc, IRC_SERVER_REC *server) { g_return_if_fail(dcc != NULL); signal_emit("dcc rejected", 1, dcc); if (dcc->server != NULL) server = dcc->server; if (server != NULL && !dcc_is_connected(dcc)) { irc_send_cmdv(server, "NOTICE %s :\001DCC REJECT %s %s\001", dcc->nick, dcc_type2str(dcc->orig_type), dcc->arg); } dcc_close(dcc); }
DCC_REC *dcc_find_request(int type, const char *nick, const char *arg) { GSList *tmp; g_return_val_if_fail(nick != NULL, NULL); for (tmp = dcc_conns; tmp != NULL; tmp = tmp->next) { DCC_REC *dcc = tmp->data; if (dcc->type == type && !dcc_is_connected(dcc) && g_ascii_strcasecmp(dcc->nick, nick) == 0 && (arg == NULL || g_strcmp0(dcc->arg, arg) == 0)) return dcc; } return NULL; }
static void event_no_such_nick(IRC_SERVER_REC *server, char *data) { char *params, *nick; GSList *tmp, *next; g_return_if_fail(data != NULL); params = event_get_params(data, 2, NULL, &nick); /* check if we've send any dcc requests to this nick.. */ for (tmp = dcc_conns; tmp != NULL; tmp = next) { DCC_REC *dcc = tmp->data; next = tmp->next; if (!dcc_is_connected(dcc) && dcc->server == server && dcc->nick != NULL && g_ascii_strcasecmp(dcc->nick, nick) == 0) dcc_close(dcc); } g_free(params); }
/* DCC CLOSE CHAT <nick> - check only from chat_ids in open DCC chats, the default handler will check from DCC chat requests */ static void cmd_dcc_close(char *data, SERVER_REC *server) { GSList *tmp, *next; char *nick; void *free_arg; int found; g_return_if_fail(data != NULL); if (g_ascii_strncasecmp(data, "CHAT ", 5) != 0 || !cmd_get_params(data, &free_arg, 2, NULL, &nick)) return; if (*nick == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); found = FALSE; for (tmp = dcc_conns; tmp != NULL; tmp = next) { CHAT_DCC_REC *dcc = tmp->data; next = tmp->next; if (IS_DCC_CHAT(dcc) && dcc->id != NULL && g_ascii_strcasecmp(dcc->id, nick) == 0) { found = TRUE; if (!dcc_is_connected(dcc) && IS_IRC_SERVER(server)) dcc_reject(DCC(dcc), IRC_SERVER(server)); else { /* don't send DCC REJECT after DCC chat is already open */ dcc_close(DCC(dcc)); } } } if (found) signal_stop(); cmd_params_free(free_arg); }