/* SYNTAX: RAWLOG OPEN <file> */ static void cmd_rawlog_open(const char *data, SERVER_REC *server) { g_return_if_fail(data != NULL); if (server == NULL || server->rawlog == NULL) cmd_return_error(CMDERR_NOT_CONNECTED); if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); rawlog_open(server->rawlog, data); }
static void command_1self(const char *data, IRC_SERVER_REC *server) { g_return_if_fail(data != NULL); if (!IS_IRC_SERVER(server) || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); irc_send_cmdv(server, "%s :%s", current_command, data); }
/* SYNTAX: UNSILENCE <nick!user@host> */ static void cmd_unsilence(const char *data, IRC_SERVER_REC *server) { g_return_if_fail(data != NULL); if (!IS_IRC_SERVER(server) || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); irc_send_cmdv(server, "SILENCE -%s", data); }
static void cmd_ver(gchar *data, IRC_SERVER_REC *server, WI_IRC_REC *item) { char *str; g_return_if_fail(data != NULL); if (!irc_server_check(server)) cmd_return_error(CMDERR_NOT_CONNECTED); if (*data == '\0' && !irc_item_check(item)) cmd_return_error(CMDERR_NOT_JOINED); str = g_strdup_printf("%s VERSION", *data == '\0' ? item->name : data); signal_emit("command ctcp", 3, str, server, item); g_free(str); }
/* SYNTAX: WHOWAS [<nicks> [<count>]] */ static void cmd_whowas(const char *data, IRC_SERVER_REC *server) { char *nicks, *count; void *free_arg; int free_nick; g_return_if_fail(data != NULL); if (!IS_IRC_SERVER(server) || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); if (!cmd_get_params(data, &free_arg, 2, &nicks, &count)) return; if (*nicks == '\0') nicks = server->nick; server->whowas_found = FALSE; irc_send_cmdv(server, *count == '\0' ? "WHOWAS %s" : "WHOWAS %s %s", nicks, count); nicks = get_redirect_nicklist(nicks, &free_nick); server_redirect_event(SERVER(server), nicks, 1, "event 369", "event 369", 1, "event 314", "whowas event", 1, NULL); if (free_nick) g_free(nicks); cmd_params_free(free_arg); }
/* SYNTAX: NICK <new nick> */ static void cmd_nick(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item) { char *nick; void *free_arg; g_return_if_fail(data != NULL); if (!IS_IRC_SERVER(server) || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); if (!cmd_get_params(data, &free_arg, 1, &nick)) return; server->nick_changing = TRUE; irc_send_cmdv(server, "NICK %s", nick); nick = g_strdup_printf("%s :%s", nick, nick); server_redirect_event(SERVER(server), nick, 5, "event nick", "nickchange over", 0, "event 433", "nickchange over", 1, /* 437: ircnet = target unavailable, dalnet = banned in channel, can't change nick */ "event 437", "nickchange over", -1, "event 432", "nickchange over", 1, "event 438", "nickchange over", 1, NULL); g_free(nick); cmd_params_free(free_arg); }
/* SYNTAX: WHO <nicks>|<channels>|** */ static void cmd_who(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item) { char *channel, *rest; void *free_arg; g_return_if_fail(data != NULL); if (!IS_IRC_SERVER(server) || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST, &channel, &rest)) return; if (strcmp(channel, "*") == 0 || *channel == '\0') { if (!IS_IRC_CHANNEL(item)) cmd_param_error(CMDERR_NOT_JOINED); channel = item->name; } if (strcmp(channel, "**") == 0) { /* ** displays all nicks.. */ *channel = '\0'; } irc_send_cmdv(server, *rest == '\0' ? "WHO %s" : "WHO %s %s", channel, rest); cmd_params_free(free_arg); /* add default redirection */ server_redirect_default((SERVER_REC *) server, "bogus command who"); }
static void command_set_ban(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item, int set, int ban_type) { IRC_CHANNEL_REC *chanrec; char *channel, *nicks; void *free_arg; g_return_if_fail(data != NULL); if (server == NULL || !server->connected || !IS_IRC_SERVER(server)) cmd_return_error(CMDERR_NOT_CONNECTED); if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTCHAN | PARAM_FLAG_GETREST | PARAM_FLAG_STRIP_TRAILING_WS, item, &channel, &nicks)) return; if (!server_ischannel(SERVER(server), channel)) cmd_param_error(CMDERR_NOT_JOINED); if (*nicks == '\0') { if (g_strcmp0(data, "*") != 0) cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); /* /BAN * or /UNBAN * - ban/unban everyone */ nicks = (char *) data; } chanrec = irc_channel_find(server, channel); if (chanrec == NULL) cmd_param_error(CMDERR_CHAN_NOT_FOUND); if (set) ban_set(chanrec, nicks, ban_type); else ban_remove(chanrec, nicks); cmd_params_free(free_arg); }
static void cmd_ctcp(const char *data, SERVER_REC *server) { char *params, *target, *ctcpcmd, *ctcpdata; DCC_REC *dcc; g_return_if_fail(data != NULL); if (server == NULL || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); params = cmd_get_params(data, 3 | PARAM_FLAG_GETREST, &target, &ctcpcmd, &ctcpdata); if (*target == '\0' || *ctcpcmd == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); if (*target != '=') { /* handle only DCC CTCPs */ g_free(params); return; } 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 { g_strup(ctcpcmd); printformat(server, target, MSGLEVEL_DCC, IRCTXT_OWN_DCC_CTCP, target, ctcpcmd, ctcpdata); } g_free(params); }
static void cmd_exec(const char *data) { PyObject *co; PyObject *ret; PyObject *d; PyObject *m; char *cmd; if (!*data) cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); cmd = g_strconcat(data, "\n", NULL); m = PyImport_AddModule("__main__"); if (!m) goto error; d = PyModule_GetDict(m); if (!d) goto error; co = Py_CompileString(cmd, "<stdin>", Py_single_input); if (!co) goto error; ret = PyEval_EvalCode((PyCodeObject *)co, d, d); Py_DECREF(co); Py_XDECREF(ret); error: g_free(cmd); if (PyErr_Occurred()) PyErr_Print(); }
static void cmd_ctcp(const char *data, IRC_SERVER_REC *server) { char *params, *target, *ctcpcmd, *ctcpdata; DCC_REC *dcc; char *str; g_return_if_fail(data != NULL); if (server == NULL || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); params = cmd_get_params(data, 3 | PARAM_FLAG_GETREST, &target, &ctcpcmd, &ctcpdata); if (*target == '\0' || *ctcpcmd == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); if (*target != '=') { /* handle only DCC CTCPs */ g_free(params); return; } dcc = dcc_find_item(DCC_TYPE_CHAT, target+1, NULL); if (dcc != NULL) { g_strup(ctcpcmd); str = g_strdup_printf("%s %s", ctcpcmd, ctcpdata); dcc_ctcp_message(dcc->nick, NULL, dcc, FALSE, str); g_free(str); } g_free(params); signal_stop(); }
static void dcc_chat_passive(CHAT_DCC_REC *dcc) { IPADDR own_ip; int port; GIOChannel *handle; char host[MAX_IP_LEN]; g_return_if_fail(IS_DCC_CHAT(dcc)); if (dcc->addrstr[0] == '\0' || dcc->starttime != 0 || dcc->handle != NULL) { /* already sent a chat request / already chatting */ return; } handle = dcc_listen(net_sendbuffer_handle(dcc->server->handle), &own_ip, &port); if (handle == NULL) cmd_return_error(CMDERR_ERRNO); dcc->handle = handle; dcc->tagconn = g_input_add(dcc->handle, G_INPUT_READ, (GInputFunction) dcc_chat_listen, dcc); /* Let's send the reply to the other client! */ dcc_ip2str(&own_ip, host); irc_send_cmdv(dcc->server, "PRIVMSG %s :\001DCC CHAT CHAT %s %d %d\001", dcc->nick, host, port, dcc->pasv_id); }
/* SYNTAX: WAIT [-<server tag>] <milliseconds> */ static void cmd_wait(const char *data, IRC_SERVER_REC *server) { GHashTable *optlist; char *msecs; void *free_arg; int n; g_return_if_fail(data != NULL); if (!IS_SERVER(server) || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS | PARAM_FLAG_UNKNOWN_OPTIONS | PARAM_FLAG_GETREST, NULL, &optlist, &msecs)) return; if (*msecs == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); /* -<server tag> */ server = IRC_SERVER(cmd_options_get_server(NULL, optlist, SERVER(server))); n = atoi(msecs); if (server != NULL && n > 0) { g_get_current_time(&server->wait_cmd); server->wait_cmd.tv_sec += n/1000; server->wait_cmd.tv_usec += n%1000; if (server->wait_cmd.tv_usec >= 1000) { server->wait_cmd.tv_sec++; server->wait_cmd.tv_usec -= 1000; } } cmd_params_free(free_arg); }
static void cmd_oper(const char *data, IRC_SERVER_REC *server) { char *nick, *password, *format; void *free_arg; g_return_if_fail(data != NULL); if (!IS_IRC_SERVER(server) || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); if (!cmd_get_params(data, &free_arg, 2, &nick, &password)) return; if (*password == '\0') { /* password not given, ask it. irc/core handles the /OPER when password is given */ OPER_PASS_REC *rec; rec = g_new(OPER_PASS_REC, 1); rec->server = server; rec->nick = g_strdup(*nick != '\0' ? nick : server->nick); format = format_get_text(MODULE_NAME, NULL, server, NULL, IRCTXT_ASK_OPER_PASS); keyboard_entry_redirect((SIGNAL_FUNC) cmd_oper_got_pass, format, ENTRY_REDIRECT_FLAG_HIDDEN, rec); g_free(format); signal_stop(); } cmd_params_free(free_arg); }
/* SYNTAX: QUOTE <raw_command> */ static void cmd_quote(const char *data, XMPP_SERVER_REC *server) { char *recoded; CMD_XMPP_SERVER(server); if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); g_strstrip((char *)data); if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); signal_emit("xmpp xml out", 2, server, data); recoded = xmpp_recode_out(data); lm_connection_send_raw(server->lmconn, recoded, NULL); g_free(recoded); }
/* SYNTAX: SCONNECT <new server> [[<port>] <existing server>] */ static void cmd_sconnect(const char *data, IRC_SERVER_REC *server) { CMD_IRC_SERVER(server); if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); irc_send_cmdv(server, "CONNECT %s", data); }
static void bans_show_channel(IRC_CHANNEL_REC *channel, IRC_SERVER_REC *server) { GSList *tmp; int counter; if (!channel->synced) cmd_return_error(CMDERR_CHAN_NOT_SYNCED); if (channel->banlist == NULL) { printformat(server, channel->visible_name, MSGLEVEL_CLIENTNOTICE, IRCTXT_NO_BANS, channel->visible_name); return; } /* show bans.. */ counter = 1; for (tmp = channel->banlist; tmp != NULL; tmp = tmp->next) { BAN_REC *rec = tmp->data; printformat(server, channel->visible_name, MSGLEVEL_CRAP, (rec->setby == NULL || *rec->setby == '\0') ? IRCTXT_BANLIST : IRCTXT_BANLIST_LONG, counter, channel->visible_name, rec->ban, rec->setby, (int) (time(NULL)-rec->time)); counter++; } }
/* SYNTAX: UPGRADE [<irssi binary path>] */ static void cmd_upgrade(const char *data) { CONFIG_REC *session; char *session_file, *str; char *binary; if (*data == '\0') data = irssi_binary; if ((binary = g_find_program_in_path(data)) == NULL) cmd_return_error(CMDERR_PROGRAM_NOT_FOUND); /* save the session */ session_file = g_strdup_printf("%s/session", get_irssi_dir()); session = config_open(session_file, 0600); unlink(session_file); signal_emit("session save", 1, session); config_write(session, NULL, -1); config_close(session); /* data may contain some other program as well, like /UPGRADE /usr/bin/screen irssi */ str = g_strdup_printf("%s --noconnect --session=%s --home=%s --config=%s", binary, session_file, get_irssi_dir(), get_irssi_config()); g_free(binary); g_free(session_file); session_args = g_strsplit(str, " ", -1); g_free(str); signal_emit("gui exit", 0); }
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); }
/* SYNTAX: CYCLE [<channel>] [<message>] */ static void cmd_cycle(const char *data, SERVER_REC *server, WI_ITEM_REC *item) { CHANNEL_REC *chanrec; char *channame, *msg, *joindata; void *free_arg; g_return_if_fail(data != NULL); if (!IS_SERVER(server) || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTCHAN, item, &channame, &msg)) return; if (*channame == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); chanrec = channel_find(server, channame); if (chanrec == NULL) cmd_param_error(CMDERR_CHAN_NOT_FOUND); joindata = chanrec->get_join_data(chanrec); window_bind_add(window_item_window(chanrec), chanrec->server->tag, chanrec->name); /* FIXME: kludgy kludgy... */ signal_emit("command part", 3, data, server, item); if (g_slist_find(channels, chanrec) != NULL) { chanrec->left = TRUE; channel_destroy(chanrec); } server->channels_join(server, joindata, FALSE); g_free(joindata); cmd_params_free(free_arg); }
/* SYNTAX: UNALIAS <alias> */ static void cmd_unalias(const char *data) { g_return_if_fail(data != NULL); if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); alias_remove(data); }
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); }
/* Try to reconnect immediately */ static void cmd_reconnect(const char *data, IRC_SERVER_REC *server) { IRC_SERVER_CONNECT_REC *conn; RECONNECT_REC *rec; char *str; int tag; if (*data == '\0') { /* reconnect back to same server */ if (server == NULL) cmd_return_error(CMDERR_NOT_CONNECTED); str = g_strdup_printf("%s %d %s %s", server->connrec->address, server->connrec->port, server->connrec->password, server->connrec->nick); signal_emit("command server", 2, str, server); g_free(str); return; } if (g_strncasecmp(data, "RECON-", 6) == 0) data += 6; tag = atoi(data); rec = tag <= 0 ? NULL : reconnect_find_tag(tag); if (rec == NULL) signal_emit("server reconnect not found", 1, data); else { conn = rec->conn; server_reconnect_destroy(rec, FALSE); irc_server_connect(conn); } }
static void cmd_rmrejoins(const char *data, IRC_SERVER_REC *server) { if (!IS_IRC_SERVER(server) || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); while (server->rejoin_channels != NULL) rejoin_destroy(server, server->rejoin_channels->data); }
/* SYNTAX: RAWLOG CLOSE */ static void cmd_rawlog_close(const char *data, SERVER_REC *server) { g_return_if_fail(data != NULL); if (server == NULL || server->rawlog == NULL) cmd_return_error(CMDERR_NOT_CONNECTED); rawlog_close(server->rawlog); }
/* SYNTAX: QUOTE <data> */ static void cmd_quote(const char *data, IRC_SERVER_REC *server) { g_return_if_fail(data != NULL); if (server == NULL || !IS_IRC_SERVER(server)) cmd_return_error(CMDERR_NOT_CONNECTED); irc_send_cmd(server, data); }
/* SYNTAX: UNSILENCE <nick!user@host> */ static void cmd_unsilence(const char *data, IRC_SERVER_REC *server) { CMD_IRC_SERVER(server); if (*data == '\0') cmd_return_error(CMDERR_NOT_ENOUGH_PARAMS); irc_send_cmdv(server, "SILENCE -%s", data); }
/* SYNTAX: RAWQUOTE <data> */ static void cmd_rawquote(const char *data, IRC_SERVER_REC *server) { if (server != NULL && !IS_IRC_SERVER(server)) return; if (server == NULL || server->connect_time == 0) cmd_return_error(CMDERR_NOT_CONNECTED); irc_send_cmd_full(server, data, FALSE, FALSE, TRUE); }
/* SYNTAX: DEOP <nicks> */ static void cmd_deop(const char *data, IRC_SERVER_REC *server) { g_return_if_fail(data != NULL); if (!IS_IRC_SERVER(server) || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); if (*data == '\0') irc_send_cmdv(server, "MODE %s -o", server->nick); }
/* SYNTAX: KNOCKOUT [<seconds>] <nick> <reason> */ static void cmd_knockout(const char *data, IRC_SERVER_REC *server, IRC_CHANNEL_REC *channel) { KNOCKOUT_REC *rec; char *nick, *reason, *timeoutstr, *str; void *free_arg; int timeleft; g_return_if_fail(data != NULL); if (!IS_IRC_SERVER(server) || !server->connected) cmd_return_error(CMDERR_NOT_CONNECTED); if (!IS_IRC_CHANNEL(channel)) cmd_return_error(CMDERR_NOT_JOINED); if (is_numeric(data, ' ')) { /* first argument is the timeout */ if (!cmd_get_params(data, &free_arg, 3 | PARAM_FLAG_GETREST, &timeoutstr, &nick, &reason)) return; timeleft = atoi(timeoutstr); } else { timeleft = 0; if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST, &nick, &reason)) return; } if (timeleft == 0) timeleft = settings_get_int("knockout_time"); if (*nick == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); signal_emit("command ban", 3, nick, server, channel); str = g_strdup_printf("%s %s", nick, reason); signal_emit("command kick", 3, str, server, channel); g_free(str); /* create knockout record */ rec = g_new(KNOCKOUT_REC, 1); rec->timeleft = timeleft; rec->channel = channel; rec->ban = ban_get_mask(channel, nick); server->knockoutlist = g_slist_append(server->knockoutlist, rec); cmd_params_free(free_arg); }