static void event_end_of_names(IRC_SERVER_REC *server, const char *data) { char *params, *channel; IRC_CHANNEL_REC *chanrec; NICK_REC *ownnick; int nicks; g_return_if_fail(server != NULL); params = event_get_params(data, 2, NULL, &channel); chanrec = irc_channel_find(server, channel); if (chanrec != NULL && !chanrec->names_got) { ownnick = nicklist_find(CHANNEL(chanrec), server->nick); if (ownnick == NULL) { /* stupid server - assume we have ops if channel is empty */ nicks = g_hash_table_size(chanrec->nicks); ownnick = irc_nicklist_insert(chanrec, server->nick, nicks == 0, FALSE, FALSE, FALSE, NULL); } nicklist_set_own(CHANNEL(chanrec), ownnick); chanrec->chanop = chanrec->ownnick->op; chanrec->names_got = TRUE; signal_emit("channel joined", 1, chanrec); } g_free(params); }
static void event_part(IRC_SERVER_REC *server, const char *data, const char *nick, const char *addr) { char *params, *channel, *reason; IRC_CHANNEL_REC *chanrec; NICK_REC *nickrec; g_return_if_fail(data != NULL); if (g_strcasecmp(nick, server->nick) == 0) { /* you left channel, no need to do anything here */ return; } params = event_get_params(data, 2, &channel, &reason); /* find channel */ chanrec = irc_channel_find(server, channel); if (chanrec == NULL) { g_free(params); return; } /* remove user from nicklist */ nickrec = nicklist_find(CHANNEL(chanrec), nick); if (nickrec != NULL) { if (nickrec->send_massjoin) { /* quick join/part after which it's useless to send nick in massjoin */ chanrec->massjoins--; } nicklist_remove(CHANNEL(chanrec), nickrec); } g_free(params); }
static void event_target_unavailable(IRC_SERVER_REC *server, const char *data, const char *nick, const char *addr) { IRC_CHANNEL_REC *chanrec; char *params, *target; g_return_if_fail(data != NULL); params = event_get_params(data, 2, NULL, &target); if (!ischannel(*target)) { /* nick unavailable */ printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_NICK_UNAVAILABLE, target); } else { chanrec = irc_channel_find(server, target); if (chanrec != NULL && chanrec->joined) { /* dalnet - can't change nick while being banned */ print_event_received(server, data, nick, FALSE); } else { /* channel is unavailable. */ printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_JOINERROR_UNAVAIL, target); } } g_free(params); }
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 event_kick(IRC_SERVER_REC *server, const char *data) { char *params, *channel, *nick, *reason; IRC_CHANNEL_REC *chanrec; NICK_REC *nickrec; g_return_if_fail(data != NULL); params = event_get_params(data, 3, &channel, &nick, &reason); if (g_strcasecmp(nick, server->nick) == 0) { /* you were kicked, no need to do anything */ g_free(params); return; } /* Remove user from nicklist */ chanrec = irc_channel_find(server, channel); nickrec = chanrec == NULL ? NULL : nicklist_find(CHANNEL(chanrec), nick); if (chanrec != NULL && nickrec != NULL) { if (nickrec->send_massjoin) { /* quick join/kick after which it's useless to send nick in massjoin */ chanrec->massjoins--; } nicklist_remove(CHANNEL(chanrec), nickrec); } g_free(params); }
static void channel_rejoin(IRC_SERVER_REC *server, const char *channel) { IRC_CHANNEL_REC *chanrec; REJOIN_REC *rec; g_return_if_fail(IS_IRC_SERVER(server)); g_return_if_fail(channel != NULL); chanrec = irc_channel_find(server, channel); if (chanrec == NULL || chanrec->joined) return; rec = rejoin_find(server, channel); if (rec != NULL) { /* already exists */ rec->joining = FALSE; /* update channel key */ g_free_and_null(rec->key); if (channel_have_key(chanrec)) rec->key = g_strdup(chanrec->key); } else { /* new rejoin */ rec = g_new0(REJOIN_REC, 1); rec->channel = g_strdup(channel); if (channel_have_key(chanrec)) rec->key = g_strdup(chanrec->key); server->rejoin_channels = g_slist_append(server->rejoin_channels, rec); signal_emit("channel rejoin new", 2, server, rec); } chanrec->left = TRUE; channel_destroy(CHANNEL(chanrec)); }
static void sig_event_forward(SERVER_REC *server, const char *data, const char *nick) { IRC_CHANNEL_REC *channel; char *params, *from, *to; params = event_get_params(data, 3, NULL, &from, &to); if (from != NULL && to != NULL && server_ischannel(server, from) && server_ischannel(server, to)) { channel = irc_channel_find(server, from); if (channel != NULL && irc_channel_find(server, to) == NULL) { window_bind_add(window_item_window(channel), server->tag, to); } } g_free(params); }
static void event_ban_list(IRC_SERVER_REC *server, const char *data) { IRC_CHANNEL_REC *chanrec; BAN_REC *banrec; const char *channel; char *params, *ban, *setby, *tims; long secs; g_return_if_fail(data != NULL); params = event_get_params(data, 5, NULL, &channel, &ban, &setby, &tims); secs = *tims == '\0' ? 0 : (long) (time(NULL) - atol(tims)); chanrec = irc_channel_find(server, channel); banrec = chanrec == NULL ? NULL : banlist_find(chanrec->banlist, ban); channel = get_visible_target(server, channel); printformat(server, channel, MSGLEVEL_CRAP, *setby == '\0' ? IRCTXT_BANLIST : IRCTXT_BANLIST_LONG, banrec == NULL ? 0 : g_slist_index(chanrec->banlist, banrec)+1, channel, ban, setby, secs); g_free(params); }
static void event_invite(IRC_SERVER_REC *server, const char *data) { char *params, *channel, *shortchan; g_return_if_fail(data != NULL); params = event_get_params(data, 2, NULL, &channel); if (irc_channel_find(server, channel) == NULL) { /* check if we're supposed to autojoin this channel */ CHANNEL_SETUP_REC *setup; setup = channel_setup_find(channel, server->connrec->chatnet); if (setup == NULL && channel[0] == '!' && strlen(channel) > 6) { shortchan = g_strdup_printf("!%s", channel+6); setup = channel_setup_find(shortchan, server->connrec->chatnet); g_free(shortchan); } if (setup != NULL && setup->autojoin && settings_get_bool("join_auto_chans_on_invite")) server->channels_join(SERVER(server), channel, TRUE); } g_free_not_null(server->last_invite); server->last_invite = g_strdup(channel); g_free(params); }
/* FIXME: should be moved to fe-common/core/fe-messages.c.. */ static void sig_message_mode(IRC_SERVER_REC *server, const char *channel, const char *nick, const char *addr, const char *mode) { if (nick == NULL) nick = server->real_address; if (ignore_check(SERVER(server), nick, addr, channel, mode, MSGLEVEL_MODES)) return; if (!ischannel(*channel)) { /* user mode change */ printformat(server, NULL, MSGLEVEL_MODES, IRCTXT_USERMODE_CHANGE, mode, channel); } else if (addr == NULL) { /* channel mode changed by server */ printformat(server, channel, MSGLEVEL_MODES, IRCTXT_SERVER_CHANMODE_CHANGE, channel, mode, nick); } else { /* channel mode changed by normal user */ IRC_CHANNEL_REC *chanrec; chanrec = !group_multi_mode ? NULL : irc_channel_find(server, channel); if (chanrec != NULL) msg_multi_mode(chanrec, nick, addr, mode); else { printformat(server, channel, MSGLEVEL_MODES, IRCTXT_CHANMODE_CHANGE, channel, mode, nick); } } }
static char *get_nicks(IRC_SERVER_REC *server, WI_ITEM_REC *item, const char *data, int op, int voice, IRC_CHANNEL_REC **ret_channel) { IRC_CHANNEL_REC *channel; GString *str; GHashTable *optlist; char **matches, **match, *ret, *channame, *nicks; void *free_arg; int count, max_modes; if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST | PARAM_FLAG_OPTIONS | PARAM_FLAG_OPTCHAN_NAME, item, "op", &optlist, &channame, &nicks)) return NULL; if (*nicks == '\0') return NULL; channel = irc_channel_find(server, channame); if (channel == NULL) { cmd_params_free(free_arg); return NULL; } str = g_string_new(NULL); matches = g_strsplit(nicks, " ", -1); for (match = matches; *match != NULL; match++) { if (strchr(*match, '*') == NULL && strchr(*match, '?') == NULL) { /* no wildcards */ g_string_sprintfa(str, "%s ", *match); } else { count = get_wildcard_nicks(str, *match, channel, op, voice); max_modes = settings_get_int("max_wildcard_modes"); if (max_modes > 0 && count > max_modes && g_hash_table_lookup(optlist, "yes") == NULL) { /* too many matches */ g_string_free(str, TRUE); cmd_params_free(free_arg); signal_emit("error command", 1, GINT_TO_POINTER(CMDERR_NOT_GOOD_IDEA)); signal_stop(); return NULL; } } } if (str->len > 0) g_string_truncate(str, str->len-1); ret = str->str; g_string_free(str, FALSE); cmd_params_free(free_arg); *ret_channel = channel; return ret; }
static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg, const char *nick, const char *address, const char *target) { void *item; const char *oldtarget; char *freemsg = NULL; int level; int own = FALSE; oldtarget = target; target = fe_channel_skip_prefix(IRC_SERVER(server), target); level = MSGLEVEL_ACTIONS | (server_ischannel(SERVER(server), target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); if (ignore_check_plus(SERVER(server), nick, address, target, msg, &level, TRUE)) return; if (server_ischannel(SERVER(server), target)) { item = irc_channel_find(server, target); } else { own = (!g_strcmp0(nick, server->nick)); item = privmsg_get_query(SERVER(server), own ? target : nick, FALSE, level); } if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis(item, msg); if (server_ischannel(SERVER(server), target)) { /* channel action */ if (window_item_is_active(item) && target == oldtarget) { /* message to active channel in window */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC, nick, msg); } else { /* message to not existing/active channel, or to @/+ */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC_CHANNEL, nick, oldtarget, msg); } } else { if (own) { /* own action bounced */ printformat(server, target, MSGLEVEL_ACTIONS | MSGLEVEL_MSGS, item != NULL && oldtarget == target ? IRCTXT_OWN_ACTION : IRCTXT_OWN_ACTION_TARGET, server->nick, msg, oldtarget); } else { /* private action */ printformat(server, nick, MSGLEVEL_ACTIONS | MSGLEVEL_MSGS, item == NULL ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY, nick, address == NULL ? "" : address, msg); } } g_free_not_null(freemsg); }
static void sig_message_irc_action(IRC_SERVER_REC *server, const char *msg, const char *nick, const char *address, const char *target) { void *item; const char *oldtarget; char *freemsg = NULL; int level; oldtarget = target; target = skip_target(IRC_SERVER(server), target); level = MSGLEVEL_ACTIONS | (ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); if (ignore_check(SERVER(server), nick, address, target, msg, level)) return; if (ignore_check(SERVER(server), nick, address, target, msg, level | MSGLEVEL_NO_ACT)) level |= MSGLEVEL_NO_ACT; if (ischannel(*target)) item = irc_channel_find(server, target); else item = privmsg_get_query(SERVER(server), nick, FALSE, level); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis(item, msg); if (ischannel(*target)) { /* channel action */ if (window_item_is_active(item) && target == oldtarget) { /* message to active channel in window */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC, nick, msg); } else { /* message to not existing/active channel, or to @/+ */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC_CHANNEL, nick, oldtarget, msg); } } else { /* private action */ printformat(server, nick, MSGLEVEL_ACTIONS | MSGLEVEL_MSGS, item == NULL ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY, nick, address == NULL ? "" : address, msg); } g_free_not_null(freemsg); }
const char *get_visible_target(IRC_SERVER_REC *server, const char *target) { IRC_CHANNEL_REC *channel; if (*target == '!') { /* visible_name of !channels is different - don't bother checking other types for now, they'll just slow up */ channel = irc_channel_find(server, target); if (channel != NULL) return channel->visible_name; } return target; }
/* SYNTAX: WALL [<channel>] <message> */ static void cmd_wall(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item) { char *channame, *msg, *args, *recoded; void *free_arg; IRC_CHANNEL_REC *chanrec; GSList *tmp, *nicks; CMD_IRC_SERVER(server); if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTCHAN | PARAM_FLAG_GETREST, item, &channame, &msg)) return; if (*msg == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); chanrec = irc_channel_find(server, channame); if (chanrec == NULL) cmd_param_error(CMDERR_CHAN_NOT_FOUND); /* See if the server has advertised support of wallchops */ if (g_hash_table_lookup(chanrec->server->isupport, "statusmsg") || g_hash_table_lookup(chanrec->server->isupport, "wallchops")) irc_send_cmdv(server, "NOTICE @%s :%s", chanrec->name, msg); else { /* Fall back to manually noticing each op */ nicks = NULL; g_hash_table_foreach(chanrec->nicks, (GHFunc) cmd_wall_hash, &nicks); args = g_strconcat(chanrec->name, " ", msg, NULL); msg = parse_special_string(settings_get_str("wall_format"), SERVER(server), item, args, NULL, 0); g_free(args); recoded = recode_out(SERVER(server), msg, channame); for (tmp = nicks; tmp != NULL; tmp = tmp->next) { NICK_REC *rec = tmp->data; if (rec != chanrec->ownnick) { irc_send_cmdv(server, "NOTICE %s :%s", rec->nick, recoded); } } g_free(recoded); g_free(msg); g_slist_free(nicks); } cmd_params_free(free_arg); }
static void event_end_of_banlist(IRC_SERVER_REC *server, const char *data) { IRC_CHANNEL_REC *chanrec; char *params, *channel; g_return_if_fail(data != NULL); params = event_get_params(data, 2, NULL, &channel); chanrec = irc_channel_find(server, channel); if (chanrec != NULL) channel_got_query(chanrec, CHANNEL_QUERY_BMODE); g_free(params); }
static void event_end_of_names(IRC_SERVER_REC *server, const char *data, const char *nick) { IRC_CHANNEL_REC *chanrec; char *params, *channel; g_return_if_fail(data != NULL); params = event_get_params(data, 2, NULL, &channel); chanrec = irc_channel_find(server, channel); if (chanrec == NULL || chanrec->names_got) print_event_received(server, data, nick, FALSE); g_free(params); }
static void event_end_of_names(IRC_SERVER_REC *server, const char *data) { char *params, *channel; IRC_CHANNEL_REC *chanrec; g_return_if_fail(data != NULL); params = event_get_params(data, 2, NULL, &channel); chanrec = irc_channel_find(server, channel); if (chanrec != NULL) fe_channels_nicklist(CHANNEL(chanrec), CHANNEL_NICKLIST_FLAG_ALL); g_free(params); }
static void sig_message_own_action(IRC_SERVER_REC *server, const char *msg, const char *target) { void *item; if (ischannel(*target)) item = irc_channel_find(server, target); else item = irc_query_find(server, target); printformat(server, target, MSGLEVEL_ACTIONS | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT | (ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS), item != NULL ? IRCTXT_OWN_ACTION : IRCTXT_OWN_ACTION_TARGET, server->nick, msg, target); }
static void event_banlist(IRC_SERVER_REC *server, const char *data) { IRC_CHANNEL_REC *chanrec; char *params, *channel, *ban, *setby, *tims; time_t tim; g_return_if_fail(data != NULL); params = event_get_params(data, 5, NULL, &channel, &ban, &setby, &tims); chanrec = irc_channel_find(server, channel); if (chanrec != NULL) { tim = (time_t) atol(tims); banlist_add(chanrec, ban, setby, tim); } g_free(params); }
static void event_names_list(IRC_SERVER_REC *server, const char *data) { char *params, *channel, *names; g_return_if_fail(data != NULL); params = event_get_params(data, 4, NULL, NULL, &channel, &names); if (irc_channel_find(server, channel) == NULL) { printformat_module("fe-common/core", server, channel, MSGLEVEL_CRAP, TXT_NAMES, channel, 0, 0, 0, 0, 0); printtext(server, channel, MSGLEVEL_CRAP, "%s", names); } g_free(params); }
static void event_end_of_names(const char *data, SERVER_REC *server) { char *params, *channel; IRC_CHANNEL_REC *chanrec; g_return_if_fail(server != NULL); params = event_get_params(data, 2, NULL, &channel); chanrec = irc_channel_find(server, channel); if (chanrec != NULL && !chanrec->names_got) { chanrec->names_got = TRUE; signal_emit("channel joined", 1, chanrec); } g_free(params); }
/* SYNTAX: KICKBAN [<channel>] <nicks> <reason> */ static void cmd_kickban(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item) { IRC_CHANNEL_REC *chanrec; char *channel, *nicks, *reason, *kickcmd, *bancmd, *recoded; char **nicklist, *spacenicks; void *free_arg; CMD_IRC_SERVER(server); if (!cmd_get_params(data, &free_arg, 3 | PARAM_FLAG_OPTCHAN | PARAM_FLAG_GETREST, item, &channel, &nicks, &reason)) return; if (*channel == '\0' || *nicks == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); chanrec = irc_channel_find(server, channel); if (chanrec == NULL) cmd_param_error(CMDERR_CHAN_NOT_FOUND); if (!chanrec->wholist) cmd_param_error(CMDERR_CHAN_NOT_SYNCED); nicklist = g_strsplit(nicks, ",", -1); spacenicks = g_strjoinv(" ", nicklist); g_strfreev(nicklist); recoded = recode_out(SERVER(server), reason, channel); kickcmd = g_strdup_printf("%s %s %s", chanrec->name, nicks, recoded); g_free(recoded); bancmd = g_strdup_printf("%s %s", chanrec->name, spacenicks); g_free(spacenicks); if (settings_get_bool("kick_first_on_kickban")) { signal_emit("command kick", 3, kickcmd, server, chanrec); signal_emit("command ban", 3, bancmd, server, chanrec); } else { signal_emit("command ban", 3, bancmd, server, chanrec); signal_emit("command kick", 3, kickcmd, server, chanrec); } g_free(kickcmd); g_free(bancmd); cmd_params_free(free_arg); }
/* SYNTAX: MODE <your nick>|<channel> [<mode> [<mode parameters>]] */ static void cmd_mode(const char *data, IRC_SERVER_REC *server, IRC_CHANNEL_REC *channel) { IRC_CHANNEL_REC *chanrec; char *target, *mode; void *free_arg; CMD_IRC_SERVER(server); if (*data == '+' || *data == '-') { target = "*"; if (!cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_GETREST, &mode)) return; } else { if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST, &target, &mode)) return; } if (strcmp(target, "*") == 0) { if (!IS_IRC_CHANNEL(channel)) cmd_param_error(CMDERR_NOT_JOINED); target = channel->name; } if (*target == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); if (*mode == '\0') { chanrec = irc_channel_find(server, target); if (chanrec != NULL) target = chanrec->name; irc_send_cmdv(server, "MODE %s", target); } else if (ischannel(*target)) channel_set_mode(server, target, mode); else { if (g_strcasecmp(target, server->nick) == 0) { server_redirect_event(server, "mode user", 1, target, -1, NULL, "event mode", "requested usermode change", NULL); } irc_send_cmdv(server, "MODE %s %s", target, mode); } cmd_params_free(free_arg); }
static void event_477(IRC_SERVER_REC *server, const char *data, const char *nick) { /* Numeric 477 can mean many things: * modeless channel, cannot join/send to channel (+r/+R/+M). * If we tried to join this channel, display the error in the * status window. Otherwise display it in the channel window. */ IRC_CHANNEL_REC *chanrec; char *params, *channel; g_return_if_fail(data != NULL); params = event_get_params(data, 2, NULL, &channel); chanrec = irc_channel_find(server, channel); print_event_received(server, data, nick, chanrec == NULL || chanrec->joined); g_free(params); }
static void command_set_ban(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item, int set) { 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, item, &channel, &nicks)) return; if (!ischannel(*channel)) cmd_param_error(CMDERR_NOT_JOINED); if (*nicks == '\0') { if (strcmp(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 (!chanrec->wholist) cmd_param_error(CMDERR_CHAN_NOT_SYNCED); if (set) ban_set(chanrec, nicks); else { if (is_numeric(nicks, '\0')) { /* unban with ban number */ BAN_REC *ban = g_slist_nth_data(chanrec->banlist, atoi(nicks)-1); if (ban != NULL) nicks = ban->ban; } ban_remove(chanrec, nicks); } cmd_params_free(free_arg); }
static void sig_message_own_action(IRC_SERVER_REC *server, const char *msg, const char *target) { void *item; char *freemsg = NULL; if (ischannel(*target)) item = irc_channel_find(server, target); else item = irc_query_find(server, target); if (settings_get_bool("emphasis")) msg = freemsg = expand_emphasis(item, msg); printformat(server, target, MSGLEVEL_ACTIONS | MSGLEVEL_NOHILIGHT | MSGLEVEL_NO_ACT | (ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS), item != NULL ? IRCTXT_OWN_ACTION : IRCTXT_OWN_ACTION_TARGET, server->nick, msg, target); g_free_not_null(freemsg); }
/* SYNTAX: BAN [<channel>] [<nicks>] */ static void cmd_ban(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item) { IRC_CHANNEL_REC *chanrec; char *channel, *nicks; void *free_arg; CMD_IRC_SERVER(server); if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTCHAN | PARAM_FLAG_GETREST | PARAM_FLAG_STRIP_TRAILING_WS, item, &channel, &nicks)) return; if (*nicks != '\0') { /* setting ban - don't handle here */ cmd_params_free(free_arg); return; } /* display bans */ chanrec = IRC_CHANNEL(item); if (chanrec == NULL && *channel == '\0') cmd_param_error(CMDERR_NOT_JOINED); if (*channel != '\0' && g_strcmp0(channel, "*") != 0) chanrec = irc_channel_find(server, channel); if (chanrec == NULL || !chanrec->synced) { /* not joined to such channel or not yet synced, ask ban lists from server */ bans_ask_channel(channel, server, item); } else { bans_show_channel(chanrec, server); } signal_stop(); cmd_params_free(free_arg); }
static void cmd_wall(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item) { IRC_CHANNEL_REC *chanrec; const char *channame, *msg; void *free_arg; CMD_IRC_SERVER(server); if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_OPTCHAN | PARAM_FLAG_GETREST, item, &channame, &msg)) return; if (*msg == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS); chanrec = irc_channel_find(server, channame); if (chanrec == NULL) cmd_param_error(CMDERR_CHAN_NOT_FOUND); signal_emit("message irc own_wall", 3, server, msg, chanrec->visible_name); cmd_params_free(free_arg); }
/* we use "ctcp msg" here because "ctcp msg action" can be ignored with /IGNORE * CTCPS, and we don't want that.. */ static void ctcp_msg_check_action(const char *data, IRC_SERVER_REC *server, const char *nick, const char *addr, const char *target) { void *item; int level; g_return_if_fail(data != NULL); if (g_strncasecmp(data, "ACTION ", 7) != 0) return; data += 7; level = MSGLEVEL_ACTIONS | (ischannel(*target) ? MSGLEVEL_PUBLIC : MSGLEVEL_MSGS); if (ignore_check(SERVER(server), nick, addr, target, data, level)) return; if (ischannel(*target)) { /* channel action */ item = irc_channel_find(server, target); if (window_item_is_active(item)) { /* message to active channel in window */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC, nick, data); } else { /* message to not existing/active channel */ printformat(server, target, level, IRCTXT_ACTION_PUBLIC_CHANNEL, nick, target, data); } } else { /* private action */ item = privmsg_get_query(SERVER(server), nick, FALSE, MSGLEVEL_MSGS); printformat(server, nick, level, item == NULL ? IRCTXT_ACTION_PRIVATE : IRCTXT_ACTION_PRIVATE_QUERY, nick, addr == NULL ? "" : addr, data); } }