/* timeout function: knockout */ static void knockout_timeout_server(IRC_SERVER_REC *server) { GSList *tmp, *next; time_t t; g_return_if_fail(server != NULL); if (!IS_IRC_SERVER(server)) return; t = server->knockout_lastcheck == 0 ? 0 : time(NULL)-server->knockout_lastcheck; server->knockout_lastcheck = time(NULL); for (tmp = server->knockoutlist; tmp != NULL; tmp = next) { KNOCKOUT_REC *rec = tmp->data; next = tmp->next; if (rec->timeleft > t) rec->timeleft -= t; else { /* timeout, unban. */ ban_remove(rec->channel, rec->ban); knockout_destroy(server, rec); } } }
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); }
/** @copydoc command_func */ void command_ban(object *op, const char *command, char *params) { size_t pos = 0; char word[MAX_BUF]; if (!string_get_word(params, &pos, ' ', VS(word), '"')) { return; } params = player_sanitize_input(params + pos); if (strcmp(word, "add") == 0) { if (params == NULL) { return; } ban_error_t rc = ban_add(params); if (rc == BAN_OK) { draw_info(COLOR_GREEN, op, "Added new ban successfully."); } else { draw_info_format(COLOR_RED, op, "Failed to add new ban: %s", ban_strerror(rc)); } } else if (strcmp(word, "remove") == 0) { if (params == NULL) { return; } ban_error_t rc = ban_remove(params); if (rc == BAN_OK) { draw_info(COLOR_GREEN, op, "Removed ban successfully."); } else { draw_info_format(COLOR_RED, op, "Failed to remove ban: %s", ban_strerror(rc)); } } else if (strcmp(word, "list") == 0) { ban_list(op); } else if (strcmp(word, "kick") == 0) { for (player *pl = first_player; pl != NULL; pl = pl->next) { if (ban_check(pl->cs, pl->ob->name)) { LOG(SYSTEM, "Ban: Kicking player due to a ban. [%s, %s]", pl->ob->name, socket_get_addr(pl->cs->sc)); draw_info_type(CHAT_TYPE_GAME, NULL, COLOR_RED, pl->ob, "You have been banned."); pl->cs->state = ST_ZOMBIE; } } } }
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); }
/* timeout function: knockout */ static void knockout_timeout_server(IRC_SERVER_REC *server) { GSList *tmp, *next; time_t now; g_return_if_fail(server != NULL); if (!IS_IRC_SERVER(server)) return; now = time(NULL); for (tmp = server->knockoutlist; tmp != NULL; tmp = next) { KNOCKOUT_REC *rec = tmp->data; next = tmp->next; if (rec->unban_time <= now) { /* timeout, unban. */ ban_remove(rec->channel, rec->ban); knockout_destroy(server, rec); } } }