X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/b5c80c61b96547b6aa1c7d7db80a5b0286a788e8..3f5b88017d6667911c6a82a82ffd3f967690347e:/src/proto-p10.c diff --git a/src/proto-p10.c b/src/proto-p10.c index 333ec57..9e92dbe 100644 --- a/src/proto-p10.c +++ b/src/proto-p10.c @@ -864,7 +864,7 @@ irc_invite(struct userNode *from, struct userNode *who, struct chanNode *to) void irc_silence(struct userNode *who, const char *mask, int add) { - putsock("%s " P10_SILENCE " %s %s%s", self->numeric, who->numeric, add ? "" : "-", mask); + putsock("%s " P10_SILENCE " %s %s%s", self->numeric, who->numeric, add ? "+" : "-", mask); } void @@ -1632,6 +1632,49 @@ static CMD_FUNC(cmd_part) return 1; } +static CMD_FUNC(cmd_silence) +{ + struct userNode *user; + char *mask; + char *new_mask; + unsigned int i; + + if (argc < 2) + return 0; + + user = GetUserN(argv[1]); + + /* Sanity, go nuts if this happens */ + if (!user) + return 0; + + /* We can safely ignore this if a user adding a silence is not + * ignored. However this brings up a TODO. If a user logs in and + * they have silences on the IRCd then we need to set them here + * somehow + */ + if (!user->handle_info) + return 1; + + mask = argv[2]; + + if (*mask == '-') { + for (i=0; ihandle_info->ignores->used; i++) { + if (!irccasecmp(mask+1, user->handle_info->ignores->list[i])) + user->handle_info->ignores->list[i] = user->handle_info->ignores->list[--user->handle_info->ignores->used]; + } + } else { + for (i=0; ihandle_info->ignores->used; i++) { + if (!strcmp(mask+1, user->handle_info->ignores->list[i])) + return 1; /* Already on the users NickServ ignore list, safely ignore */ + } + + new_mask = strdup(mask+1); + string_list_append(user->handle_info->ignores, new_mask); + } + return 1; +} + static CMD_FUNC(cmd_kick) { if (argc < 3) @@ -1866,8 +1909,8 @@ init_parse(void) dict_insert(irc_func_dict, TOK_TOPIC, cmd_topic); dict_insert(irc_func_dict, CMD_AWAY, cmd_away); dict_insert(irc_func_dict, TOK_AWAY, cmd_away); - dict_insert(irc_func_dict, CMD_SILENCE, cmd_dummy); - dict_insert(irc_func_dict, TOK_SILENCE, cmd_dummy); + dict_insert(irc_func_dict, CMD_SILENCE, cmd_silence); + dict_insert(irc_func_dict, TOK_SILENCE, cmd_silence); dict_insert(irc_func_dict, CMD_KICK, cmd_kick); dict_insert(irc_func_dict, TOK_KICK, cmd_kick); dict_insert(irc_func_dict, CMD_SQUIT, cmd_squit);