void sync_nicklist(UserList *added, int type) { ChannelList *chan; NickList *nick; int i; char *check; check = clear_server_flags(added->host); for (i = 0; i < server_list_size(); i ++) { for (chan = get_server_channels(i); chan; chan = chan->next) { for (nick = next_nicklist(chan, NULL); nick; nick = next_nicklist(chan, nick)) { if (wild_match(check, nick->host)) { if (type) { nick->userlist = added; check_auto(chan->channel, nick, chan); } else nick->userlist = NULL; } } } } }
void remove_all(int type) { UserList *tmp; ShitList *tmp_s, *next_s; ChannelList *chan; NickList *nick; void *location = NULL; int i = 0; if (type == -1 || type == USERLIST_REMOVE) { int size = -1; while ((tmp = next_userlist(NULL, &size, &location))) { if ((tmp = find_userlist(tmp->host, tmp->channels, 1))) { new_free(&tmp->nick); new_free(&tmp->host); new_free(&tmp->channels); new_free(&tmp->password); new_free(&tmp->comment); new_free((char **)&tmp); } } user_count = 0; user_list = NULL; for (i = 0; i < server_list_size(); i ++) { for (chan = get_server_channels(i); chan; chan = chan->next) { for(nick = next_nicklist(chan,NULL); nick; nick = next_nicklist(chan, nick)) nick->userlist = NULL; } } } if (type == -1 || type == SHITLIST_REMOVE) { for (tmp_s = shitlist_list; tmp_s; tmp_s = next_s) { next_s = tmp_s->next; sync_shitlist(tmp_s, 0); new_free(&tmp_s->filter); new_free(&tmp_s->channels); new_free(&tmp_s->reason); new_free((char **)&tmp_s); } for (i = 0; i < server_list_size(); i ++) { for (chan = get_server_channels(i); chan; chan = chan->next) { for(nick = next_nicklist(chan,NULL); nick; nick = next_nicklist(chan, nick)) nick->shitlist = NULL; } } shit_count = 0; shitlist_list = NULL; } }
void check_channel_limit(ChannelList *chan) { if (chan && chan->csets && chan->csets->set_auto_limit && chan->chop) { int count = 0; NickList *nick; for (nick = next_nicklist(chan, NULL); nick; nick = next_nicklist(chan, nick)) count++; set_channel_limit(chan, chan->limit, chan->csets->set_auto_limit, count); } }
void limit_channel(CSetArray *var, CSetList *cs) { ChannelList *chan; if ((chan = lookup_channel(cs->channel, from_server, 0))) { if (cs->set_auto_limit) { int count = 0; NickList *nick; for (nick = next_nicklist(chan, NULL); nick; nick = next_nicklist(chan, nick)) count++; set_channel_limit(chan, chan->limit, cs->set_auto_limit, count); } else set_channel_limit(chan, chan->limit, 0, 0); } }
int delay_opz (void *arg, char *sub) { char * args = (char *)arg; char * from = NULL; char * host = NULL; char * channel = NULL; char * mode = NULL; char * serv_num = NULL; ChannelList *chan = NULL; int this_server = from_server; char *p = (char *) arg; /* original args unmodified so we can free them */ channel = next_arg(args, &args); from = next_arg(args, &args); host = next_arg(args, &args); mode = next_arg(args, &args); if ((serv_num = next_arg(args, &args))) this_server = my_atol(serv_num); chan = lookup_channel(channel, this_server, 0); if (chan && is_on_channel(channel, this_server, from) && chan->chop) { NickList *nick; for (nick = next_nicklist(chan, NULL); nick; nick = next_nicklist(chan, nick)) { if (!my_stricmp(nick->nick, from)) { if (!my_stricmp(host, nick->host)) break; else { new_free(&p); new_free(&sub); return 0; } } } if (nick && ((!nick_isop(nick) && *mode == 'o') || (!nick_isvoice(nick) && *mode == 'v'))) { my_send_to_server(this_server, "MODE %s +%s %s", channel, mode, from); if (get_int_var(SEND_OP_MSG_VAR)) my_send_to_server(this_server, "NOTICE %s :You have been delay Auto-%s'd", from, *mode == 'o'? "op":"voice"); } } new_free(&p); new_free(&sub); return 0; }
NickList *BX_sorted_nicklist(ChannelList *chan, int sort) { NickList *tmp, *l = NULL, *list = NULL, *last = NULL; for (tmp = next_nicklist(chan, NULL); tmp; tmp = next_nicklist(chan, tmp)) { l = (NickList *)new_malloc(sizeof(NickList)); memcpy(l, tmp, sizeof(NickList)); l->next = NULL; switch(sort) { case NICKSORT_HOST: add_to_list_ext((List **)&list, (List *)l, cmp_host); break; case NICKSORT_STAT: add_to_list_ext((List **)&list, (List *)l, cmp_stat); break; case NICKSORT_TIME: add_to_list_ext((List **)&list, (List *)l, cmp_time); break; case NICKSORT_IP: add_to_list_ext((List **)&list, (List *)l, cmp_ip); break; case NICKSORT_NONE: if (last) last->next = l; else list = l; break; default: case NICKSORT_NICK: case NICKSORT_NORMAL: add_to_list((List **)&list, (List *)l); break; } last = l; } return list; }
int delay_check_auto (char *channel) { ChannelList *chan = NULL; char *buffer = NULL; NickList *possible; if (!channel || !*channel) return -1; if ((chan = lookup_channel(channel, from_server, CHAN_NOUNLINK)) == NULL) return -1; for (possible = next_nicklist(chan, NULL); possible; possible = next_nicklist(chan, possible)) { if ((possible->shitlist || possible->userlist) && (!(possible->sent_reop < 4) || !(possible->sent_deop < 4))) { malloc_sprintf(&buffer, "%s %s %s %d", channel, possible->nick, possible->host, from_server); add_timer(0, empty_string, 3 * 1000, 1, real_check_auto, buffer, NULL, -1, "check-auto"); } } add_timer(0, empty_string, 5 * 1000, 1, delay_flush_all, m_sprintf("%s %d", channel, from_server), NULL, -1, "check-auto"); return 0; }
void sync_shitlist(ShitList *added, int type) { ChannelList *chan; NickList *nick; int i; char tmp[BIG_BUFFER_SIZE+1]; char *check; for (i = 0; i < server_list_size(); i ++) { for (chan = get_server_channels(i); chan; chan = chan->next) { for (nick = next_nicklist(chan, NULL); nick; nick = next_nicklist(chan, nick)) { check = clear_server_flags(nick->host); sprintf(tmp, "%s!%s", nick->nick, check); if (wild_match(added->filter, tmp)) { if (type) { nick->shitlist = added; check_auto(chan->channel, nick, chan); } else { BanList *b = NULL; nick->shitlist = NULL; if ((b = ban_is_on_channel(tmp, chan)) && !eban_is_on_channel(tmp, chan)) add_mode(chan, "b", 0, b->ban, NULL, get_int_var(NUM_BANMODES_VAR)); } } } flush_mode_all(chan); } } }
void send_line(char dumb, char *dumber) { int server; WaitPrompt *OldPrompt; server = from_server; from_server = get_window_server(0); unhold_a_window(curr_scr_win); if (current_screen->promptlist && current_screen->promptlist->type == WAIT_PROMPT_LINE) { OldPrompt = current_screen->promptlist; (*OldPrompt->func) (OldPrompt->data, get_input()); set_input(empty_str); current_screen->promptlist = OldPrompt->next; new_free(&OldPrompt->data); new_free(&OldPrompt->prompt); new_free(&OldPrompt); change_input_prompt(-1); } else { char *line, *tmp = NULL; line = get_input(); if (line && (*line != get_int_var(CMDCHARS_VAR)) && get_int_var(NICK_COMPLETION_VAR)) { char auto_comp_char = ':'; if (!(auto_comp_char = (char) get_int_var(NICK_COMPLETION_CHAR_VAR))) auto_comp_char = ':'; /* possible nick completion */ if (strchr(line, auto_comp_char)) { char *p; struct channel *chan; struct nick_list *nick; char *channel; malloc_strcpy(&tmp, line); p = strchr(tmp, auto_comp_char); *p++ = 0; if (*tmp && *p && (channel = get_current_channel_by_refnum(0))) { chan = lookup_channel(channel, from_server, 0); for (nick = next_nicklist(chan, NULL); nick; nick = next_nicklist(chan, nick)) if (!my_strnicmp(tmp, nick->nick, strlen(tmp))) break; if (nick) { if (get_fset_var(FORMAT_NICK_COMP_FSET)) malloc_strcpy(&tmp, stripansicodes(convert_output_format (get_fset_var(FORMAT_NICK_COMP_FSET), "%s %s", nick->nick, p))); else malloc_sprintf(&tmp, "%s%c %s", nick->nick, auto_comp_char, p); } else malloc_strcpy(&tmp, line); } else malloc_strcpy(&tmp, line); } else malloc_strcpy(&tmp, line); } else malloc_strcpy(&tmp, line); if (do_hook(INPUT_LIST, "%s", tmp)) { if (get_int_var(INPUT_ALIASES_VAR)) parse_line(NULL, tmp, empty_str, 1, 0); else parse_line(NULL, tmp, NULL, 1, 0); } update_input(UPDATE_ALL); new_free(&tmp); } new_free(&input_lastmsg); *new_nick = 0; in_completion = STATE_NORMAL; from_server = server; }
static NickTab *getnextnick(char *input_nick, char *oldnick, char *nick) { struct channel *chan; struct nick_list *cnick = NULL; NickTab *tmp = tabkey_array; int server = from_server; static NickTab sucks = { NULL }; if (tmp && (in_completion == STATE_NORMAL || in_completion == STATE_TABKEY)) { if (!oldnick && !nick && tmp) { in_completion = STATE_TABKEY; return tmp; } if (oldnick) { for (; tmp; tmp = tmp->next) { if (!my_strnicmp(oldnick, tmp->nick, strlen(oldnick))) break; } /* nick was not in the list. oops didn't come from here */ if (!tmp && in_completion == STATE_TABKEY) tmp = tabkey_array; else if (tmp) tmp = tmp->next; } if (nick && in_completion != STATE_TABKEY) { if (tmp && tmp->next) { for (; tmp; tmp = tmp->next) if (!my_strnicmp(nick, tmp->nick, strlen(nick))) break; } } if (tmp) { in_completion = STATE_TABKEY; return tmp; } } if ((chan = prepare_command(&server, NULL, 3))) { cnick = next_nicklist(chan, NULL); /* * we've never been here before so return first nick * user hasn't entered anything on the line. */ if (!oldnick && !nick && cnick) { in_completion = STATE_CNICK; sucks.nick = cnick->nick; return &sucks; } /* * user has been here before so we attempt to find the correct * first nick to start from. */ if (oldnick) { /* find the old nick so we have a frame of reference */ for (; cnick; cnick = next_nicklist(chan, cnick)) { if (!my_strnicmp(cnick->nick, oldnick, strlen(oldnick))) { cnick = next_nicklist(chan, cnick); break; } } } /* * if the user has put something on the line * we attempt to pattern match here. */ if (input_nick) { /* * if oldnick was the last one in the channel * cnick will be NULL; */ if (!cnick && oldnick) cnick = next_nicklist(chan, NULL); /* we have a new nick */ else if (cnick) { /* * if there's more than one nick, start * scanning. */ for (; cnick; cnick = next_nicklist(chan, cnick)) { if (!my_strnicmp(cnick->nick, input_nick, strlen(input_nick)) || !strcasecmp(cnick->nick, input_nick)) break; } } } } if (!cnick) in_completion = STATE_NORMAL; else in_completion = STATE_CNICK; if (cnick) sucks.nick = cnick->nick; return sucks.nick ? &sucks : NULL; }
static char *getchannick(char *oldnick, char *nick) { struct channel *chan; char *channel, *tnick = NULL; struct nick_list *cnick; channel = get_current_channel_by_refnum(0); if (channel) { if (!(chan = lookup_channel(channel, from_server, 0)) || !(cnick = next_nicklist(chan, NULL))) { in_completion = STATE_NORMAL; return NULL; } /* * we've never been here before so return first nick * user hasn't entered anything on the line. */ if (!oldnick && !nick && cnick) { in_completion = STATE_CNICK; return cnick->nick; } /* * user has been here before so we attempt to find the correct * first nick to start from. */ if (oldnick) { /* find the old nick so we have a frame of reference */ for (cnick = next_nicklist(chan, NULL); cnick; cnick = next_nicklist(chan, cnick)) { if (!my_strnicmp(cnick->nick, oldnick, strlen(oldnick))) { tnick = cnick->nick; if ((cnick = next_nicklist(chan, cnick))) tnick = cnick->nick; break; } } } /* * if the user has put something on the line * we attempt to pattern match here. */ if (nick && in_completion == STATE_NORMAL) { /* * if oldnick was the last one in the channel * cnick will be NULL; */ if (!cnick) { cnick = next_nicklist(chan, NULL); tnick = cnick->nick; } /* we have a new nick */ else if (next_nicklist(chan, cnick)) { /* * if there's more than one nick, start * scanning. */ for (; cnick; cnick = next_nicklist(chan, cnick)) { if (!my_strnicmp(cnick->nick, nick, strlen(nick))) { tnick = cnick->nick; break; } } } else tnick = cnick->nick; } else if (in_completion == STATE_CNICK) { /* * else we've been here before so * attempt to continue through the nicks */ if (!cnick) cnick = next_nicklist(chan, NULL); tnick = cnick->nick; } } if (tnick) in_completion = STATE_CNICK; return tnick; }
void sort_scan (IrcCommandDll *this_not_used, char *called, char *args, char *subargs) { int numberofpeople = 0, server = -1; char *channel = NULL, *qbert = NULL; ChannelList *chanlist; NickList *anick, *ops = NULL, *nops = NULL, *voice = NULL, *tmp = NULL; if (!(chanlist = prepare_command (&server, channel, NO_OP)) ) return; for (anick = next_nicklist (chanlist, NULL); anick; anick = next_nicklist (chanlist, anick)) { if (!nick_isop(anick) && !nick_isvoice(anick)) { tmp = (NickList *)new_malloc (sizeof (NickList)); memcpy (tmp, anick, sizeof (NickList)); tmp -> next = NULL; add_to_list ((List **)&nops, (List *)tmp); } else if (nick_isvoice(anick) && !nick_isop(anick)) { tmp = (NickList *)new_malloc (sizeof (NickList)); memcpy (tmp, anick, sizeof (NickList)); tmp -> next = NULL; add_to_list ((List **)&voice, (List *)tmp); } else if (nick_isop(anick)) { tmp = (NickList *)new_malloc (sizeof (NickList)); memcpy (tmp, anick, sizeof (NickList)); tmp -> next = NULL; add_to_list ((List **)&ops, (List *)tmp); } numberofpeople++; } put_it ("%s", convert_output_format (fget_string_var (FORMAT_NAMES_FSET), "%s %s %d %s", update_clock (GET_TIME), chanlist -> channel, numberofpeople, space)); numberofpeople = 0; for (anick = ops; anick; anick = anick -> next) { malloc_strcat (&qbert, convert_output_format (fget_string_var (FORMAT_NAMES_OPCOLOR_FSET), "@ %s", anick -> nick)); malloc_strcat (&qbert, space); if (numberofpeople++ == 4) { if (fget_string_var (FORMAT_NAMES_BANNER_FSET)) put_it ("%s%s", convert_output_format (fget_string_var(FORMAT_NAMES_BANNER_FSET), NULL, NULL), qbert); else put_it ("%s", qbert); new_free (&qbert); numberofpeople = 0; } } for (anick = voice; anick; anick = anick -> next) { malloc_strcat (&qbert, convert_output_format (fget_string_var(FORMAT_NAMES_VOICECOLOR_FSET), "+ %s", anick -> nick)); malloc_strcat (&qbert, space); if (numberofpeople++ == 4) { if (fget_string_var (FORMAT_NAMES_BANNER_FSET)) put_it ("%s%s", convert_output_format (fget_string_var(FORMAT_NAMES_BANNER_FSET), NULL, NULL), qbert); else put_it ("%s", qbert); new_free (&qbert); numberofpeople = 0; } } for (anick = nops; anick; anick = anick -> next) { malloc_strcat (&qbert, convert_output_format (fget_string_var(FORMAT_NAMES_NICKCOLOR_FSET), "$ %s", anick -> nick)); malloc_strcat (&qbert, space); if (numberofpeople++ == 4) { if (fget_string_var (FORMAT_NAMES_BANNER_FSET)) put_it ("%s%s", convert_output_format (fget_string_var(FORMAT_NAMES_BANNER_FSET), NULL, NULL), qbert); else put_it ("%s", qbert); new_free (&qbert); numberofpeople = 0; } } if (numberofpeople && qbert) { if (fget_string_var (FORMAT_NAMES_BANNER_FSET)) put_it ("%s%s", convert_output_format (fget_string_var (FORMAT_NAMES_BANNER_FSET), NULL, NULL), qbert); else put_it ("%s", qbert); } new_free (&qbert); if (fget_string_var (FORMAT_NAMES_FOOTER_FSET)) put_it ("%s", convert_output_format (fget_string_var (FORMAT_NAMES_FOOTER_FSET), NULL, NULL)); clear_sorted_nicklist (&ops); clear_sorted_nicklist (&nops); clear_sorted_nicklist (&voice); }
/* * Protection levels * 1 Reop if de-oped * 2 De-op offender * 3 Kick offender * 4 KickBan offender */ int check_prot(char *from, char *person, ChannelList *chan, BanList *thisban, NickList *n) { NickList *tmp = NULL; NickList *kicker; char *tmp_ban = NULL; char *nick = NULL, *userhost = NULL, *p; if (!from || !*from || !person || !*person || !chan) return 0; if (!my_stricmp(person, from)) return 0; tmp_ban = LOCAL_COPY(person); if ((p = strchr(tmp_ban, '!'))) { nick = tmp_ban; *p++ = 0; userhost = p; } else nick = person; if (!n) { if (!(tmp = find_nicklist_in_channellist(person, chan, 0))) { for (tmp = next_nicklist(chan, NULL); tmp; tmp = next_nicklist(chan, tmp)) { if (wild_match(nick, tmp->nick) && wild_match(userhost, tmp->host) && tmp->userlist) { n = tmp; break; } } } } if (get_cset_int_var(chan->csets, USERLIST_CSET) && chan->chop && ((n && n->userlist) || (tmp && tmp->userlist))) { UserList *user = NULL; time_t current = now; if (n) user = n->userlist; else user = tmp->userlist; if (!user || (user && !check_channel_match(user->channels, chan->channel))) return 0; if (!(kicker = find_nicklist_in_channellist(from, chan, 0))) return 0; if ((user->flags & (PROT_DEOP | PROT_INVITE | PROT_BAN | PROT_KICK | PROT_REOP))) { int do_reop = 0; if (user->flags & PROT_DEOP) { if (!kicker->sent_deop) { if (!kicker->userlist || (kicker->userlist && !(kicker->userlist->flags & PROT_DEOP))) send_to_server("MODE %s -o %s", chan->channel, from); kicker->sent_deop++; } do_reop = 1; } if (user->flags & PROT_INVITE) { if (thisban && !thisban->sent_unban) { thisban->sent_unban++; thisban->sent_unban_time = current; send_to_server("MODE %s -b %s", chan->channel, thisban->ban); send_to_server("INVITE %s %s", n?n->nick:tmp->nick, chan->channel); } } if (user->flags & PROT_BAN) { /* do_reop = 1; */ if (kicker->userlist) send_to_server("MODE %s -o %s", chan->channel, from); else { char *h, *u; u = LOCAL_COPY(kicker->host); h = strchr(u, '@'); *h++ = 0; send_to_server("MODE %s -o+b %s %s", chan->channel, kicker->nick, ban_it(kicker->nick, u, h, kicker->ip)); if (get_int_var(AUTO_UNBAN_VAR)) add_timer(0, empty_string, get_int_var(AUTO_UNBAN_VAR) * 1000, 1, timer_unban, m_sprintf("%d %s %s", from_server, chan->channel, ban_it(kicker->nick, u, h, kicker->ip)), NULL, -1, "auto-unban"); } } if (user->flags & PROT_KICK) { if (kicker && (!kicker->userlist || (kicker->userlist && !(kicker->userlist->flags & PROT_KICK)))) send_to_server("KICK %s %s :\002BitchX\002 Protected User", chan->channel, kicker->nick); } if ((user->flags & PROT_REOP) || do_reop) { /* added by Sergs [email protected] */ if (thisban) { if (thisban->sent_unban_time - current > 30) { thisban->sent_unban++; thisban->sent_unban_time = current; send_to_server("MODE %s -b %s", chan->channel, thisban->ban); } else if (thisban->sent_unban < 3) { thisban->sent_unban++; thisban->sent_unban_time = current; send_to_server("MODE %s -b %s", chan->channel, thisban->ban); } } if (n && (!n->sent_reop || (n->sent_reop_time && (current - n->sent_reop_time > 60)))) { char *u = NULL; malloc_sprintf(&u, "%s %s %s %s %d", chan->channel, n->nick, n->host, "o", from_server); add_timer(0, empty_string, 10 * 1000, 1, delay_opz, u, NULL, -1, "delay-ops"); n->sent_reop++; n->sent_reop_time = current; } } } if ((user->flags & USER_FLAG_PROT) && (p = get_string_var(USER_FLAG_PROT_VAR))) run_user_flag("USER_FLAG_PROT", p, n, kicker); return 1; } return 0; }