bitchx/source/cset.c

1309 lines
43 KiB
C

/************
* cset.c *
************
*
* My code for creating all the "Channel Sets" on a per channel
* basis. We manage them here, and then just insert/remove/return them
* when a channel calls for them.
* Code for creating and modifying "Window Sets" on a per window
* basis.
*
* Note: Notice the shameless use of typecasting to get these functions
* to work as painlessly as possible.
*
* Written by Scott H Kilau
* Modified by Colten D Edwards for /wset
*
* Copyright(c) 1997
*
* See the COPYRIGHT file, or do a HELP IRCII COPYRIGHT
*/
#if 0
[Sheik(~sheik@spartan.pei.edu)] notice in struct.h that the cset struct *does*
have a ->next pointer.. thats for the future when we may want to
daisy chain cset's that don't have channels yet.. ie a user can
/cset *warez* and know that all warez channels would get defaulted
#endif
#include "irc.h"
static char cvsrevision[] = "$Id$";
CVS_REVISION(cset_c)
#include "struct.h"
#include "vars.h" /* for do_boolean() and var_settings[] */
#include "window.h" /* for get_current_channel_by_refnum() */
#include "screen.h" /* for curr_scr_win */
#include "names.h" /* for lookup_channel() */
#include "log.h"
#include "ircaux.h"
#include "status.h"
#include "server.h"
#include "output.h"
#include "misc.h"
#include "list.h"
#include "cset.h"
#include "hash2.h"
#define MAIN_SOURCE
#include "modval.h"
void log_channel(CSetArray *, CSetList *);
void limit_channel(CSetArray *, CSetList *);
void set_msglog_channel_level(CSetArray *, CSetList *);
/*
* Array of structures for each of the cset vars... allows us to
* get an offset into the CSetList struct to that var
*/
static CSetArray cset_array[] = {
{ "AINV", INT_TYPE_VAR, offsetof(CSetList, set_ainv) ,NULL, 0 },
{ "ANNOY_KICK", BOOL_TYPE_VAR, offsetof(CSetList, set_annoy_kick) ,NULL, 0 },
{ "AOP", BOOL_TYPE_VAR, offsetof(CSetList, set_aop) ,NULL, 0 },
{ "AUTO_JOIN_ON_INVITE", BOOL_TYPE_VAR, offsetof(CSetList, set_auto_join_on_invite), NULL, 0 },
{ "AUTO_LIMIT", INT_TYPE_VAR, offsetof(CSetList, set_auto_limit), limit_channel, 0 },
{ "AUTO_REJOIN", INT_TYPE_VAR, offsetof(CSetList, set_auto_rejoin) ,NULL, 0 },
{ "BANTIME", INT_TYPE_VAR, offsetof(CSetList, set_bantime), NULL, 0 },
{ "BITCH", BOOL_TYPE_VAR, offsetof(CSetList, bitch_mode) ,NULL, 0 },
{ "CHANMODE", STR_TYPE_VAR, offsetof(CSetList, chanmode), NULL, 0 },
{ "CHANNEL_LOG", BOOL_TYPE_VAR, offsetof(CSetList, channel_log) ,log_channel, 0 },
{ "CHANNEL_LOG_FILE", STR_TYPE_VAR, offsetof(CSetList, channel_log_file), NULL, 0 },
{ "CHANNEL_LOG_LEVEL", STR_TYPE_VAR, offsetof(CSetList, log_level), set_msglog_channel_level, 0 },
{ "COMPRESS_MODES", BOOL_TYPE_VAR, offsetof(CSetList, compress_modes) ,NULL, 0 },
{ "CTCP_FLOOD_BAN", BOOL_TYPE_VAR, offsetof(CSetList, set_ctcp_flood_ban), NULL, 0 },
{ "DEOPFLOOD", BOOL_TYPE_VAR, offsetof(CSetList, set_deopflood) ,NULL, 0 },
{ "DEOPFLOOD_TIME", INT_TYPE_VAR, offsetof(CSetList, set_deopflood_time) ,NULL, 0 },
{ "DEOP_ON_DEOPFLOOD", INT_TYPE_VAR, offsetof(CSetList, set_deop_on_deopflood) ,NULL, 0 },
{ "DEOP_ON_KICKFLOOD", INT_TYPE_VAR, offsetof(CSetList, set_deop_on_kickflood) ,NULL, 0 },
{ "HACKING", INT_TYPE_VAR, offsetof(CSetList, set_hacking) ,NULL, 0 },
{ "JOINFLOOD", BOOL_TYPE_VAR, offsetof(CSetList, set_joinflood) ,NULL, 0 },
{ "JOINFLOOD_TIME", INT_TYPE_VAR, offsetof(CSetList, set_joinflood_time) ,NULL, 0 },
{ "KICKFLOOD", BOOL_TYPE_VAR, offsetof(CSetList, set_kickflood) ,NULL, 0 },
{ "KICKFLOOD_TIME", INT_TYPE_VAR, offsetof(CSetList, set_kickflood_time) ,NULL, 0 },
{ "KICK_IF_BANNED", BOOL_TYPE_VAR, offsetof(CSetList, set_kick_if_banned) ,NULL, 0 },
{ "KICK_ON_DEOPFLOOD", INT_TYPE_VAR, offsetof(CSetList, set_kick_on_deopflood) ,NULL, 0 },
{ "KICK_ON_JOINFLOOD", INT_TYPE_VAR, offsetof(CSetList, set_kick_on_joinflood) ,NULL, 0 },
{ "KICK_ON_KICKFLOOD", INT_TYPE_VAR, offsetof(CSetList, set_kick_on_kickflood) ,NULL, 0 },
{ "KICK_ON_NICKFLOOD", INT_TYPE_VAR, offsetof(CSetList, set_kick_on_nickflood) ,NULL, 0 },
{ "KICK_ON_PUBFLOOD", INT_TYPE_VAR, offsetof(CSetList, set_kick_on_pubflood) ,NULL, 0 },
{ "KICK_OPS", BOOL_TYPE_VAR, offsetof(CSetList, set_kick_ops), NULL, 0 },
{ "LAMEIDENT", BOOL_TYPE_VAR, offsetof(CSetList, set_lame_ident), NULL, 0},
{ "LAMELIST", BOOL_TYPE_VAR, offsetof(CSetList, set_lamelist) ,NULL, 0 },
{ "NICKFLOOD", BOOL_TYPE_VAR, offsetof(CSetList, set_nickflood) ,NULL, 0 },
{ "NICKFLOOD_TIME", INT_TYPE_VAR, offsetof(CSetList, set_nickflood_time) ,NULL, 0 },
{ "PUBFLOOD", BOOL_TYPE_VAR, offsetof(CSetList, set_pubflood) ,NULL, 0 },
{ "PUBFLOOD_IGNORE_TIME", INT_TYPE_VAR, offsetof(CSetList, set_pubflood_ignore) ,NULL, 0 },
{ "PUBFLOOD_TIME", INT_TYPE_VAR, offsetof(CSetList, set_pubflood_time) ,NULL, 0 },
{ "SHITLIST", BOOL_TYPE_VAR, offsetof(CSetList, set_shitlist) ,NULL, 0 },
{ "USERLIST", BOOL_TYPE_VAR, offsetof(CSetList, set_userlist) ,NULL, 0 },
{ NULL, 0, 0, NULL, 0 }
};
static WSetArray wset_array[] = {
{ "STATUS_AWAY", STR_TYPE_VAR, offsetof(WSet, status_away), offsetof(WSet, away_format), BX_build_status },
{ "STATUS_CDCCCOUNT", STR_TYPE_VAR, offsetof(WSet, status_cdcccount), offsetof(WSet, cdcc_format), BX_build_status },
{ "STATUS_CHANNEL", STR_TYPE_VAR, offsetof(WSet, status_channel), offsetof(WSet, channel_format), BX_build_status },
{ "STATUS_CHANOP", STR_TYPE_VAR, offsetof(WSet, status_chanop), -1, BX_build_status },
{ "STATUS_CLOCK", STR_TYPE_VAR, offsetof(WSet, status_clock), offsetof(WSet, clock_format), BX_build_status },
{ "STATUS_CPU_SAVER", STR_TYPE_VAR, offsetof(WSet, status_cpu_saver), offsetof(WSet, cpu_saver_format), BX_build_status },
{ "STATUS_DCCCOUNT", STR_TYPE_VAR, offsetof(WSet, status_dcccount), offsetof(WSet, dcccount_format), BX_build_status },
{ "STATUS_FLAG", STR_TYPE_VAR, offsetof(WSet, status_flag), offsetof(WSet, flag_format), BX_build_status },
{ "STATUS_FORMAT", STR_TYPE_VAR, offsetof(WSet, format_status), -1, BX_build_status },
{ "STATUS_FORMAT1", STR_TYPE_VAR, offsetof(WSet, format_status[1]), -1, BX_build_status },
{ "STATUS_FORMAT2", STR_TYPE_VAR, offsetof(WSet, format_status[2]), -1, BX_build_status },
{ "STATUS_FORMAT3", STR_TYPE_VAR, offsetof(WSet, format_status[3]), -1, BX_build_status },
{ "STATUS_HALFOP", STR_TYPE_VAR, offsetof(WSet, status_halfop), -1, BX_build_status },
{ "STATUS_HOLD", STR_TYPE_VAR, offsetof(WSet, status_hold), -1, BX_build_status },
{ "STATUS_HOLD_LINES", STR_TYPE_VAR, offsetof(WSet, status_hold_lines), offsetof(WSet, hold_lines_format), BX_build_status },
{ "STATUS_LAG", STR_TYPE_VAR, offsetof(WSet, status_lag), offsetof(WSet, lag_format), BX_build_status },
{ "STATUS_MAIL", STR_TYPE_VAR, offsetof(WSet, status_mail), offsetof(WSet, mail_format), BX_build_status },
{ "STATUS_MODE", STR_TYPE_VAR, offsetof(WSet, status_mode), offsetof(WSet, mode_format), BX_build_status },
{ "STATUS_MSGCOUNT", STR_TYPE_VAR, offsetof(WSet, status_msgcount), offsetof(WSet, msgcount_format), BX_build_status },
{ "STATUS_NICK", STR_TYPE_VAR, offsetof(WSet, status_nick), offsetof(WSet, nick_format), BX_build_status },
{ "STATUS_NOTIFY", STR_TYPE_VAR, offsetof(WSet, status_notify), offsetof(WSet, notify_format), BX_build_status },
{ "STATUS_OPER_KILLS", STR_TYPE_VAR, offsetof(WSet, status_oper_kills), offsetof(WSet, kills_format), BX_build_status },
{ "STATUS_QUERY", STR_TYPE_VAR, offsetof(WSet, status_query), offsetof(WSet, query_format), BX_build_status },
{ "STATUS_SCROLLBACK", STR_TYPE_VAR, offsetof(WSet, status_scrollback), -1, BX_build_status },
{ "STATUS_SERVER", STR_TYPE_VAR, offsetof(WSet, status_server), offsetof(WSet, server_format), BX_build_status },
{ "STATUS_TOPIC", STR_TYPE_VAR, offsetof(WSet, status_topic), offsetof(WSet, topic_format), BX_build_status },
{ "STATUS_UMODE", STR_TYPE_VAR, offsetof(WSet, status_umode), offsetof(WSet, umode_format), BX_build_status },
{ "STATUS_USER0", STR_TYPE_VAR, offsetof(WSet, status_user_formats0), -1, BX_build_status },
{ "STATUS_USER1", STR_TYPE_VAR, offsetof(WSet, status_user_formats1), -1, BX_build_status },
{ "STATUS_USER10", STR_TYPE_VAR, offsetof(WSet, status_user_formats10), -1, BX_build_status },
{ "STATUS_USER11", STR_TYPE_VAR, offsetof(WSet, status_user_formats11), -1, BX_build_status },
{ "STATUS_USER12", STR_TYPE_VAR, offsetof(WSet, status_user_formats12), -1, BX_build_status },
{ "STATUS_USER13", STR_TYPE_VAR, offsetof(WSet, status_user_formats13), -1, BX_build_status },
{ "STATUS_USER14", STR_TYPE_VAR, offsetof(WSet, status_user_formats14), -1, BX_build_status },
{ "STATUS_USER15", STR_TYPE_VAR, offsetof(WSet, status_user_formats15), -1, BX_build_status },
{ "STATUS_USER16", STR_TYPE_VAR, offsetof(WSet, status_user_formats16), -1, BX_build_status },
{ "STATUS_USER17", STR_TYPE_VAR, offsetof(WSet, status_user_formats17), -1, BX_build_status },
{ "STATUS_USER18", STR_TYPE_VAR, offsetof(WSet, status_user_formats18), -1, BX_build_status },
{ "STATUS_USER19", STR_TYPE_VAR, offsetof(WSet, status_user_formats19), -1, BX_build_status },
{ "STATUS_USER2", STR_TYPE_VAR, offsetof(WSet, status_user_formats2), -1, BX_build_status },
{ "STATUS_USER20", STR_TYPE_VAR, offsetof(WSet, status_user_formats20), -1, BX_build_status },
{ "STATUS_USER21", STR_TYPE_VAR, offsetof(WSet, status_user_formats21), -1, BX_build_status },
{ "STATUS_USER22", STR_TYPE_VAR, offsetof(WSet, status_user_formats22), -1, BX_build_status },
{ "STATUS_USER23", STR_TYPE_VAR, offsetof(WSet, status_user_formats23), -1, BX_build_status },
{ "STATUS_USER24", STR_TYPE_VAR, offsetof(WSet, status_user_formats24), -1, BX_build_status },
{ "STATUS_USER25", STR_TYPE_VAR, offsetof(WSet, status_user_formats25), -1, BX_build_status },
{ "STATUS_USER26", STR_TYPE_VAR, offsetof(WSet, status_user_formats26), -1, BX_build_status },
{ "STATUS_USER27", STR_TYPE_VAR, offsetof(WSet, status_user_formats27), -1, BX_build_status },
{ "STATUS_USER28", STR_TYPE_VAR, offsetof(WSet, status_user_formats28), -1, BX_build_status },
{ "STATUS_USER29", STR_TYPE_VAR, offsetof(WSet, status_user_formats29), -1, BX_build_status },
{ "STATUS_USER3", STR_TYPE_VAR, offsetof(WSet, status_user_formats3), -1, BX_build_status },
{ "STATUS_USER30", STR_TYPE_VAR, offsetof(WSet, status_user_formats30), -1, BX_build_status },
{ "STATUS_USER31", STR_TYPE_VAR, offsetof(WSet, status_user_formats31), -1, BX_build_status },
{ "STATUS_USER32", STR_TYPE_VAR, offsetof(WSet, status_user_formats32), -1, BX_build_status },
{ "STATUS_USER33", STR_TYPE_VAR, offsetof(WSet, status_user_formats33), -1, BX_build_status },
{ "STATUS_USER34", STR_TYPE_VAR, offsetof(WSet, status_user_formats34), -1, BX_build_status },
{ "STATUS_USER35", STR_TYPE_VAR, offsetof(WSet, status_user_formats35), -1, BX_build_status },
{ "STATUS_USER36", STR_TYPE_VAR, offsetof(WSet, status_user_formats36), -1, BX_build_status },
{ "STATUS_USER37", STR_TYPE_VAR, offsetof(WSet, status_user_formats37), -1, BX_build_status },
{ "STATUS_USER38", STR_TYPE_VAR, offsetof(WSet, status_user_formats38), -1, BX_build_status },
{ "STATUS_USER39", STR_TYPE_VAR, offsetof(WSet, status_user_formats39), -1, BX_build_status },
{ "STATUS_USER4", STR_TYPE_VAR, offsetof(WSet, status_user_formats4), -1, BX_build_status },
{ "STATUS_USER5", STR_TYPE_VAR, offsetof(WSet, status_user_formats5), -1, BX_build_status },
{ "STATUS_USER6", STR_TYPE_VAR, offsetof(WSet, status_user_formats6), -1, BX_build_status },
{ "STATUS_USER7", STR_TYPE_VAR, offsetof(WSet, status_user_formats7), -1, BX_build_status },
{ "STATUS_USER8", STR_TYPE_VAR, offsetof(WSet, status_user_formats8), -1, BX_build_status },
{ "STATUS_USER9", STR_TYPE_VAR, offsetof(WSet, status_user_formats9), -1, BX_build_status },
{ "STATUS_USERS", STR_TYPE_VAR, offsetof(WSet, status_users), offsetof(WSet, status_users_format), BX_build_status },
{ "STATUS_VOICE", STR_TYPE_VAR, offsetof(WSet, status_voice), -1, BX_build_status },
{ "STATUS_WINDOW", STR_TYPE_VAR, offsetof(WSet, status_window), -1, BX_build_status },
{ NULL, 0, 0, -1, NULL }
};
CSetList *cset_queue = NULL;
/*
* returns the requested int from the cset struct
* Will work fine with either BOOL or INT type of csets.
*/
int BX_get_cset_int_var(CSetList *tmp, int var)
{
int val = *(int *)((void *)tmp + cset_array[var].offset);
return val;
}
char *BX_get_cset_str_var(CSetList *tmp, int var)
{
char *s = *(char **) ((void *)tmp + cset_array[var].offset);
return s;
}
/*
* returns the requested int from the cset struct
* Will work fine with either BOOL or INT type of csets.
*/
int cset_getflag(CSetList *tmp, int var)
{
int val = *(int *)((void *)tmp + cset_array[var].flag);
return val;
}
/*
* sets the requested int from the cset struct
* Will work fine with either BOOL or INT type of csets.
*/
void cset_setflag(CSetList *tmp, int var, int value)
{
int *ptr = (int *) ((void *)tmp + cset_array[var].flag);
*ptr = value;
}
/*
* returns the requested int ADDRESS from the cset struct
* Will work fine with either BOOL or INT type of csets.
*/
static void * get_cset_int_var_address(CSetList *tmp, int var)
{
void *ptr = ((void *)tmp + cset_array[var].offset);
return ptr;
}
/*
* sets the requested int from the cset struct
* Will work fine with either BOOL or INT type of csets.
*/
void BX_set_cset_int_var(CSetList *tmp, int var, int value)
{
int *ptr = (int *) ((void *)tmp + cset_array[var].offset);
*ptr = value;
}
void BX_set_cset_str_var(CSetList *tmp, int var, char *value)
{
char **ptr = (char **) ((void *)tmp + cset_array[var].offset);
if (value)
malloc_strcpy(ptr, value);
else
new_free(ptr);
}
/*
* Next few functions ripped from vars.c, as we are really doing the same
* thing as those functions did, with a couple changes... The nice
* thing about this is that we will get the same "feel" now with
* SET's and CSET's
*/
static int find_cset_variable(CSetArray *array, char *org_name, int *cnt)
{
CSetArray *v, *first;
int len, var_index;
char *name = NULL;
len = strlen(org_name);
name = alloca(len + 1);
strcpy(name, org_name);
upper(name);
var_index = 0;
for (first = array; first->name; first++, var_index++)
{
if (strncmp(name, first->name, len) == 0)
{
*cnt = 1;
break;
}
}
if (first->name)
{
if (strlen(first->name) != len)
{
v = first;
for (v++; v->name; v++, (*cnt)++)
{
if (strncmp(name, v->name, len) != 0)
break;
}
}
return (var_index);
}
else
{
*cnt = 0;
return (-1);
}
}
static void set_cset_var_value(CSetList *tmp, int var_index, char *value)
{
char *rest;
CSetArray *var;
var = &(cset_array[var_index]);
switch (var->type)
{
case BOOL_TYPE_VAR:
if (value && *value && (value = next_arg(value, &rest))) {
if (do_boolean(value, (int *)get_cset_int_var_address(tmp, var_index)))
{
say("Value must be either ON, OFF, or TOGGLE");
break;
}
if (var->func)
var->func(var, tmp);
put_it("%s", convert_output_format(fget_string_var(FORMAT_CSET_FSET), "%s %s %s", var->name, tmp->channel, get_cset_int_var(tmp, var_index)?var_settings[ON] : var_settings[OFF]));
}
else
put_it("%s", convert_output_format(fget_string_var(FORMAT_CSET_FSET), "%s %s %s", var->name, tmp->channel, get_cset_int_var(tmp, var_index)?var_settings[ON] : var_settings[OFF]));
break;
case INT_TYPE_VAR:
if (value && *value && (value = next_arg(value, &rest)))
{
int val;
if (!is_number(value))
{
say("Value of %s must be numeric!", var->name);
break;
}
if ((val = atoi(value)) < 0)
{
say("Value of %s must be greater than 0", var->name);
break;
}
set_cset_int_var(tmp, var_index, val);
if (var->func)
var->func(var, tmp);
put_it("%s", convert_output_format(fget_string_var(FORMAT_CSET_FSET), "%s %s %d", var->name, tmp->channel, get_cset_int_var(tmp, var_index)));
}
else
put_it("%s", convert_output_format(fget_string_var(FORMAT_CSET_FSET), "%s %s %d", var->name, tmp->channel, get_cset_int_var(tmp, var_index)));
break;
case STR_TYPE_VAR:
if (value && *value)
{
set_cset_str_var(tmp, var_index, value);
if (var->func)
var->func(var, tmp);
put_it("%s", convert_output_format(fget_string_var(FORMAT_CSET_FSET), "%s %s %s", var->name, tmp->channel, get_cset_str_var(tmp, var_index) ));
}
else
put_it("%s", convert_output_format(fget_string_var(FORMAT_CSET_FSET), "%s %s %s", var->name, tmp->channel, (char *)get_cset_str_var(tmp, var_index)));
}
}
CSetList *check_cset_queue(char *channel, int add)
{
CSetList *c = NULL;
int found = 0;
if (!strchr(channel, '*') && !(c = (CSetList *)find_in_list((List **)&cset_queue, channel, 0)))
{
if (!add)
{
for (c = cset_queue; c; c = c->next)
if (!my_stricmp(c->channel, channel) || wild_match(c->channel, channel))
return c;
return NULL;
}
c = create_csets_for_channel(channel);
add_to_list((List **)&cset_queue, (List *)c);
found++;
}
if (c)
return c;
if (add && !found)
{
for (c = cset_queue; c; c = c->next)
if (!my_stricmp(c->channel, channel))
return c;
c = create_csets_for_channel(channel);
c->next = cset_queue;
cset_queue = c;
return c;
}
return NULL;
}
static inline void cset_variable_case1(char *channel, int var_index, char *args)
{
ChannelList *chan = NULL;
int tmp = 0;
int count = 0;
/*
* implement a queue for channels that don't exist... later...
* go home if user doesn't have any channels.
*/
if (current_window->server != -1)
{
for (chan = get_server_channels(current_window->server); chan; chan = chan->next)
{
tmp = var_index;
if (wild_match(channel, chan->channel))
{
set_cset_var_value(chan->csets, tmp, args);
count++;
}
}
}
/* no channel match. lets check the queue */
/* if (!count)*/
{
CSetList *c = NULL;
if (!count)
check_cset_queue(channel, 1);
for (c = cset_queue; c; c = c->next)
{
tmp = var_index;
if (!my_stricmp(channel, c->channel) || wild_match(channel, c->channel))
{
set_cset_var_value(c, tmp, args);
count++;
}
}
if (!count)
say("CSET_VARIABLE: No match in cset queue for %s", channel);
}
}
static inline void cset_variable_casedef(char *channel, int cnt, int var_index, char *args)
{
ChannelList *chan = NULL;
int tmp, tmp2;
int count = 0;
if (current_window->server != -1)
{
for (chan = get_server_channels(current_window->server); chan; chan = chan->next)
{
tmp = var_index;
tmp2 = cnt;
if (wild_match(channel, chan->channel))
{
for (tmp2 += tmp; tmp < tmp2; tmp++)
set_cset_var_value(chan->csets, tmp, empty_string);
count++;
}
}
}
/* if (!count) */
{
CSetList *c = NULL;
if (!count)
check_cset_queue(channel, 1);
for (c = cset_queue; c; c = c->next)
{
tmp = var_index;
tmp2 = cnt;
if (!my_stricmp(channel, c->channel) || wild_match(channel, c->channel))
{
for (tmp2 +=tmp; tmp < tmp2; tmp++)
set_cset_var_value(c, tmp, empty_string);
count++;
}
}
if (!count)
say("CSET_VARIABLE: No match in cset queue for %s", channel);
return;
}
}
static inline void cset_variable_noargs(char *channel)
{
int var_index = 0;
ChannelList *chan = NULL;
int count = 0;
if (current_window->server != -1)
{
for (chan = get_server_channels(current_window->server); chan; chan = chan->next)
{
if (wild_match(channel, chan->channel))
{
for (var_index = 0; var_index < NUMBER_OF_CSETS; var_index++)
set_cset_var_value(chan->csets, var_index, empty_string);
count++;
}
}
}
/* if (!count) */
{
CSetList *c = NULL;
if (!count)
check_cset_queue(channel, 1);
for (c = cset_queue; c; c = c->next)
{
if (!wild_match(channel, c->channel))
continue;
for (var_index = 0; var_index < NUMBER_OF_CSETS; var_index++)
set_cset_var_value(c, var_index, empty_string);
count++;
}
if (!count)
say("CSET_VARIABLE: No match in cset queue for %s", channel ? channel : empty_string);
return;
}
}
char *set_cset(char *var, ChannelList *chan, char *value)
{
int var_index, cnt = 0;
var_index = find_cset_variable(cset_array, var, &cnt);
if (cnt == 1)
{
CSetArray *var;
var = &(cset_array[var_index]);
switch(var->type)
{
case BOOL_TYPE_VAR:
{
int i = my_atol(value);
set_cset_int_var(chan->csets, var_index, i? 1 : 0);
break;
}
case INT_TYPE_VAR:
{
int i = my_atol(value);
set_cset_int_var(chan->csets, var_index, i);
break;
}
case STR_TYPE_VAR:
{
set_cset_str_var(chan->csets, var_index, value);
break;
}
default:
return NULL;
}
return value;
}
return NULL;
}
char *get_cset(char *var, ChannelList *chan, char *value)
{
int var_index, cnt = 0;
var_index = find_cset_variable(cset_array, var, &cnt);
if (cnt == 1)
{
char s[81];
CSetArray *var;
var = &(cset_array[var_index]);
*s = 0;
switch (var->type)
{
case BOOL_TYPE_VAR:
{
strcpy(s, get_cset_int_var(chan->csets, var_index)?var_settings[ON] : var_settings[OFF]);
if (value)
{
int val = -1;
if (!my_stricmp(value, on))
val = 1;
else if (!my_stricmp(value, off))
val = 0;
else
{
if (isdigit((unsigned char)*value))
val = (int)(*value - '0');
}
if (val != -1)
set_cset_int_var(chan->csets, var_index, val);
}
break;
}
case INT_TYPE_VAR:
{
strncpy(s, ltoa(get_cset_int_var(chan->csets, var_index)), 30);
if (value && isdigit((unsigned char)*value))
set_cset_int_var(chan->csets, var_index, my_atol(value));
break;
}
case STR_TYPE_VAR:
{
char *t;
t = m_strdup(get_cset_str_var(chan->csets, var_index));
if (value)
set_cset_str_var(chan->csets, var_index, value);
return t;
}
}
return m_strdup(s && *s ? s : empty_string);
}
return m_strdup(empty_string);
}
BUILT_IN_COMMAND(cset_variable)
{
char *var, *channel = NULL;
int no_args = 1, cnt, var_index, hook = 1;
if (from_server != -1 && current_window->server != -1)
{
if (args && *args && (is_channel(args) || *args == '*'))
channel = next_arg(args, &args);
else
channel = get_current_channel_by_refnum(0);
}
else if (args && *args && (is_channel(args) || *args == '*'))
channel = next_arg(args, &args);
if (!channel)
return;
if ((var = next_arg(args, &args)) != NULL)
{
if (*var == '-')
{
var++;
args = NULL;
}
var_index = find_cset_variable(cset_array, var, &cnt);
if (hook)
{
switch (cnt)
{
case 0:
say("No such variable \"%s\"", var);
return;
case 1:
cset_variable_case1(channel, var_index, args);
return;
default:
say("%s is ambiguous", var);
cset_variable_casedef(channel, cnt, var_index, args);
return;
}
}
}
if (no_args)
cset_variable_noargs(channel);
}
CSetList *create_csets_for_channel(char *channel)
{
CSetList *tmp;
#ifdef VAR_DEBUG
int i;
for (i = 1; i < NUMBER_OF_CSETS - 1; i++)
if (strcmp(cset_array[i-1].name, cset_array[i].name) >= 0)
ircpanic("Variable [%d] (%s) is out of order.", i, cset_array[i].name);
#endif
if (check_cset_queue(channel, 0))
{
if ((tmp = (CSetList *)find_in_list((List **)&cset_queue, channel, 0)))
return tmp;
for (tmp = cset_queue; tmp; tmp = tmp->next)
if (!my_stricmp(tmp->channel, channel) || wild_match(tmp->channel, channel))
return tmp;
}
tmp = (CSetList *) new_malloc(sizeof(CSetList));
/* use default settings. */
tmp->set_aop = get_int_var(AOP_VAR);
tmp->set_annoy_kick = get_int_var(ANNOY_KICK_VAR);
tmp->set_ainv = get_int_var(AINV_VAR);
tmp->set_auto_join_on_invite = get_int_var(AUTO_JOIN_ON_INVITE_VAR);
tmp->set_auto_rejoin = get_int_var(AUTO_REJOIN_VAR);
tmp->set_bantime = get_int_var(BANTIME_VAR);
tmp->compress_modes = get_int_var(COMPRESS_MODES_VAR);
tmp->bitch_mode = get_int_var(BITCH_VAR);
tmp->channel_log = 0;
tmp->log_level = m_strdup("ALL");
set_msglog_channel_level(cset_array, tmp);
#if defined(WINNT) || defined(__EMX__)
tmp->channel_log_file = m_sprintf("~/bx-conf/%s.log", channel+1);
#else
tmp->channel_log_file = m_sprintf("~/.BitchX/%s.log", channel+1);
#endif
tmp->set_joinflood = get_int_var(JOINFLOOD_VAR);
tmp->set_joinflood_time = get_int_var(JOINFLOOD_TIME_VAR);
tmp->set_ctcp_flood_ban = get_int_var(CTCP_FLOOD_BAN_VAR);
tmp->set_deop_on_deopflood = get_int_var(DEOP_ON_DEOPFLOOD_VAR);
tmp->set_deop_on_kickflood = get_int_var(DEOP_ON_KICKFLOOD_VAR);
tmp->set_deopflood = get_int_var(DEOPFLOOD_VAR);
tmp->set_deopflood_time = get_int_var(DEOPFLOOD_TIME_VAR);
tmp->set_hacking = get_int_var(HACKING_VAR);
tmp->set_kick_on_deopflood = get_int_var(KICK_ON_DEOPFLOOD_VAR);
tmp->set_kick_on_joinflood = get_int_var(KICK_ON_JOINFLOOD_VAR);
tmp->set_kick_on_kickflood = get_int_var(KICK_ON_KICKFLOOD_VAR);
tmp->set_kick_on_nickflood = get_int_var(KICK_ON_NICKFLOOD_VAR);
tmp->set_kick_on_pubflood = get_int_var(KICK_ON_PUBFLOOD_VAR);
tmp->set_kickflood = get_int_var(KICKFLOOD_VAR);
tmp->set_kickflood_time = get_int_var(KICKFLOOD_TIME_VAR);
tmp->set_kick_ops = get_int_var(KICK_OPS_VAR);
tmp->set_nickflood = get_int_var(NICKFLOOD_VAR);
tmp->set_nickflood_time = get_int_var(NICKFLOOD_TIME_VAR);
tmp->set_pubflood = get_int_var(PUBFLOOD_VAR);
tmp->set_pubflood_time = get_int_var(PUBFLOOD_TIME_VAR);
tmp->set_pubflood_ignore = 60;
tmp->set_userlist = get_int_var(USERLIST_VAR);
tmp->set_shitlist = get_int_var(SHITLIST_VAR);
tmp->set_lamelist = get_int_var(LAMELIST_VAR);
tmp->set_lame_ident = get_int_var(LAMEIDENT_VAR);
tmp->set_kick_if_banned = get_int_var(KICK_IF_BANNED_VAR);
tmp->set_auto_limit = get_int_var(AUTO_LIMIT_VAR);
malloc_strcpy(&tmp->chanmode, get_string_var(CHANMODE_VAR));
malloc_strcpy(&tmp->channel, channel);
return tmp;
}
void remove_csets_for_channel(CSetList *tmp)
{
new_free(&tmp->channel);
new_free(&tmp->channel_log_file);
new_free(&tmp->chanmode);
new_free(&tmp);
}
static int find_wset_variable(WSetArray *array, char *org_name, int *cnt)
{
WSetArray *v, *first;
int len, var_index;
char *name = NULL;
len = strlen(org_name);
name = alloca(len + 1);
strcpy(name, org_name);
upper(name);
var_index = 0;
for (first = array; first->name; first++, var_index++)
{
if (strncmp(name, first->name, len) == 0)
{
*cnt = 1;
break;
}
}
if (first->name)
{
if (strlen(first->name) != len)
{
v = first;
for (v++; v->name; v++, (*cnt)++)
{
if (strncmp(name, v->name, len) != 0)
break;
}
}
return (var_index);
}
else
{
*cnt = 0;
return (-1);
}
}
/*
* returns the requested int from the cset struct
* Will work fine with either BOOL or INT type of csets.
*/
char *BX_get_wset_string_var(WSet *tmp, int var)
{
char **ptr = (char **)((unsigned long)tmp + wset_array[var].offset);
return *ptr;
}
/*
* returns the requested int ADDRESS from the wset struct
* Will work fine with STR_TYPE_VAR type of csets.
*/
static char ** get_wset_str_var_address(WSet *tmp, int var)
{
char **ptr = (char **)((unsigned long)tmp + wset_array[var].offset);
return ptr;
}
/*
* returns the requested int ADDRESS from the wset struct
* Will work fine with STR_TYPE_VAR type of csets.
*/
char ** get_wset_format_var_address(WSet *tmp, int var)
{
char **ptr = NULL;
if (wset_array[var].format_offset != -1)
ptr = (char **)((unsigned long)tmp + wset_array[var].format_offset);
return ptr;
}
/*
* sets the requested string from the wset struct
*/
void BX_set_wset_string_var(WSet *tmp, int var, char *value)
{
char **ptr = (char **)((unsigned long)tmp + wset_array[var].offset);
if (value && *value)
malloc_strcpy(ptr, value);
else
new_free(ptr);
}
static void set_wset_var_value(Window *win, int var_index, char *value)
{
WSetArray *var;
var = &(wset_array[var_index]);
switch (var->type)
{
case STR_TYPE_VAR:
{
char **val = NULL;
if ((val = get_wset_str_var_address(win->wset, var_index)))
{
if (value)
{
if (*value)
malloc_strcpy(val, value);
else
{
put_it("%s", convert_output_format(fget_string_var(FORMAT_SET_FSET), "%s %s", var->name, *val?*val:empty_string));
return;
}
} else
new_free(val);
if (var->func)
(var->func) (win, *val, 0);
say("Value of %s set to %s", var->name, *val ?
*val : "<EMPTY>");
}
}
break;
default:
say("WSET_type not supported");
}
}
static inline void wset_variable_case1(Window *win, char *name, int var_index, char *args)
{
Window *tmp = NULL;
int count = 0;
int i;
if (!name)
{
set_wset_var_value(win, var_index, args);
return;
}
while ((traverse_all_windows(&tmp)))
{
i = var_index;
if (*name == '*')
{
set_wset_var_value(tmp, i, args);
count++;
}
else if ((tmp->name && wild_match(name, tmp->name)) || (tmp->refnum == my_atol(name)))
{
set_wset_var_value(tmp, i, args);
count++;
}
}
if (!count)
say("No such window name [%s]", name);
}
static inline void wset_variable_casedef(Window *win, char *name, int cnt, int var_index, char *args)
{
Window *tmp = NULL;
int count = 0;
int c, i;
if (!name)
{
for (cnt +=var_index; var_index < cnt; var_index++)
set_wset_var_value(win, var_index, args);
return;
}
while ((traverse_all_windows(&tmp)))
{
c = cnt;
i = var_index;
if (*name == '*')
{
for (c += i; i < c; i++)
set_wset_var_value(tmp, i, empty_string);
count++;
}
else if ((tmp->name && wild_match(name, tmp->name)) || (tmp->refnum == my_atol(name)) )
{
for (c += i; i < c; i++)
set_wset_var_value(tmp, i, empty_string);
count++;
}
}
if (!count)
say("No such window name [%s]", name);
}
static inline void wset_variable_noargs(Window *win, char *name)
{
Window *tmp = NULL;
int var_index = 0;
if (!name)
{
for (var_index = 0; var_index < NUMBER_OF_WSETS; var_index++)
set_wset_var_value(win, var_index, empty_string);
}
else
{
int count = 0;
while ((traverse_all_windows(&tmp)))
{
if (*name == '*')
{
for (var_index = 0; var_index < NUMBER_OF_WSETS; var_index++)
set_wset_var_value(tmp, var_index, empty_string);
count++;
}
else if ((tmp->name && wild_match(name, tmp->name)) || (tmp->refnum == my_atol(name)))
{
for (var_index = 0; var_index < NUMBER_OF_WSETS; var_index++)
set_wset_var_value(tmp, var_index, empty_string);
count++;
}
}
if (!count)
say("No such window name [%s]", name);
}
}
BUILT_IN_COMMAND(wset_variable)
{
char *var;
char *possible;
char *name = NULL;
int no_args = 1, cnt, var_index;
Window *win = screen_list->window_list;
if (args)
{
if (*args == '*')
name = next_arg(args, &args);
else if (args && *args)
{
possible = LOCAL_COPY(args);
name = next_arg(possible, &possible);
if (!(win = get_window_by_name(name)))
{
win = get_window_by_refnum(my_atol(name));
if (!win)
{
if (isdigit((unsigned char)*name))
{
say("No such window refnum %d", my_atol(name));
return;
}
}
else if (isdigit((unsigned char)*name))
var = next_arg(args, &args);
name = NULL;
}
else
var = next_arg(args, &args);
}
}
else
win = current_window;
if ((var = next_arg(args, &args)) != NULL)
{
if (*var == '-')
{
var++;
args = NULL;
}
var_index = find_wset_variable(wset_array, var, &cnt);
switch (cnt)
{
case 0:
say("No such variable \"%s\"", var);
return;
case 1:
wset_variable_case1(win, name, var_index, args);
update_all_status(win, NULL, 0);
update_all_windows();
return;
default:
say("%s is ambiguous", var);
wset_variable_casedef(win, name, cnt, var_index, args);
return;
}
}
if (no_args)
wset_variable_noargs(win, name);
}
WSet *create_wsets_for_window(Window *win)
{
WSet *tmp;
#ifdef VAR_DEBUG
int i;
for (i = 1; i < NUMBER_OF_CSETS - 1; i++)
if (strcmp(wset_array[i-1].name, wset_array[i].name) >= 0)
ircpanic("Variable [%d] (%s) is out of order.", i, wset_array[i].name);
#endif
tmp = (WSet *) new_malloc(sizeof(WSet));
malloc_strcpy(&tmp->status_channel, get_string_var(STATUS_CHANNEL_VAR));
malloc_strcpy(&tmp->status_chanop, get_string_var(STATUS_CHANOP_VAR));
malloc_strcpy(&tmp->status_halfop, get_string_var(STATUS_HALFOP_VAR));
malloc_strcpy(&tmp->status_clock, get_string_var(STATUS_CLOCK_VAR));
malloc_strcpy(&tmp->status_hold_lines, get_string_var(STATUS_HOLD_LINES_VAR));
malloc_strcpy(&tmp->status_hold, get_string_var(STATUS_HOLD_VAR));
malloc_strcpy(&tmp->status_voice, get_string_var(STATUS_VOICE_VAR));
malloc_strcpy(&tmp->status_dcccount, get_string_var(STATUS_DCCCOUNT_VAR));
malloc_strcpy(&tmp->status_cdcccount, get_string_var(STATUS_CDCCCOUNT_VAR));
malloc_strcpy(&tmp->status_cpu_saver, get_string_var(STATUS_CPU_SAVER_VAR));
malloc_strcpy(&tmp->status_lag, get_string_var(STATUS_LAG_VAR));
malloc_strcpy(&tmp->status_away, get_string_var(STATUS_AWAY_VAR));
malloc_strcpy(&tmp->status_mail, get_string_var(STATUS_MAIL_VAR));
malloc_strcpy(&tmp->status_mode, get_string_var(STATUS_MODE_VAR));
malloc_strcpy(&tmp->status_notify, get_string_var(STATUS_NOTIFY_VAR));
malloc_strcpy(&tmp->status_oper_kills, get_string_var(STATUS_OPER_KILLS_VAR));
malloc_strcpy(&tmp->status_query, get_string_var(STATUS_QUERY_VAR));
malloc_strcpy(&tmp->status_server, get_string_var(STATUS_SERVER_VAR));
malloc_strcpy(&tmp->status_topic, get_string_var(STATUS_TOPIC_VAR));
malloc_strcpy(&tmp->status_umode, get_string_var(STATUS_UMODE_VAR));
malloc_strcpy(&tmp->status_users, get_string_var(STATUS_USERS_VAR));
malloc_strcpy(&tmp->status_msgcount, get_string_var(STATUS_MSGCOUNT_VAR));
malloc_strcpy(&tmp->status_nick, get_string_var(STATUS_NICK_VAR));
malloc_strcpy(&tmp->status_flag, get_string_var(STATUS_FLAG_VAR));
malloc_strcpy(&tmp->status_scrollback, get_string_var(STATUS_SCROLLBACK_VAR));
malloc_strcpy(&tmp->format_status[0], get_string_var(STATUS_FORMAT_VAR));
malloc_strcpy(&tmp->format_status[1], get_string_var(STATUS_FORMAT1_VAR));
malloc_strcpy(&tmp->format_status[2], get_string_var(STATUS_FORMAT2_VAR));
malloc_strcpy(&tmp->format_status[3], get_string_var(STATUS_FORMAT3_VAR));
malloc_strcpy(&tmp->status_user_formats0, get_string_var(STATUS_USER0_VAR));
malloc_strcpy(&tmp->status_user_formats1, get_string_var(STATUS_USER1_VAR));
malloc_strcpy(&tmp->status_user_formats10, get_string_var(STATUS_USER10_VAR));
malloc_strcpy(&tmp->status_user_formats11, get_string_var(STATUS_USER11_VAR));
malloc_strcpy(&tmp->status_user_formats12, get_string_var(STATUS_USER12_VAR));
malloc_strcpy(&tmp->status_user_formats13, get_string_var(STATUS_USER13_VAR));
malloc_strcpy(&tmp->status_user_formats14, get_string_var(STATUS_USER14_VAR));
malloc_strcpy(&tmp->status_user_formats15, get_string_var(STATUS_USER15_VAR));
malloc_strcpy(&tmp->status_user_formats16, get_string_var(STATUS_USER16_VAR));
malloc_strcpy(&tmp->status_user_formats17, get_string_var(STATUS_USER17_VAR));
malloc_strcpy(&tmp->status_user_formats18, get_string_var(STATUS_USER18_VAR));
malloc_strcpy(&tmp->status_user_formats19, get_string_var(STATUS_USER19_VAR));
malloc_strcpy(&tmp->status_user_formats2, get_string_var(STATUS_USER2_VAR));
malloc_strcpy(&tmp->status_user_formats20, get_string_var(STATUS_USER20_VAR));
malloc_strcpy(&tmp->status_user_formats21, get_string_var(STATUS_USER21_VAR));
malloc_strcpy(&tmp->status_user_formats22, get_string_var(STATUS_USER22_VAR));
malloc_strcpy(&tmp->status_user_formats23, get_string_var(STATUS_USER23_VAR));
malloc_strcpy(&tmp->status_user_formats24, get_string_var(STATUS_USER24_VAR));
malloc_strcpy(&tmp->status_user_formats25, get_string_var(STATUS_USER25_VAR));
malloc_strcpy(&tmp->status_user_formats26, get_string_var(STATUS_USER26_VAR));
malloc_strcpy(&tmp->status_user_formats27, get_string_var(STATUS_USER27_VAR));
malloc_strcpy(&tmp->status_user_formats28, get_string_var(STATUS_USER28_VAR));
malloc_strcpy(&tmp->status_user_formats29, get_string_var(STATUS_USER29_VAR));
malloc_strcpy(&tmp->status_user_formats3, get_string_var(STATUS_USER3_VAR));
malloc_strcpy(&tmp->status_user_formats30, get_string_var(STATUS_USER30_VAR));
malloc_strcpy(&tmp->status_user_formats31, get_string_var(STATUS_USER31_VAR));
malloc_strcpy(&tmp->status_user_formats32, get_string_var(STATUS_USER32_VAR));
malloc_strcpy(&tmp->status_user_formats33, get_string_var(STATUS_USER33_VAR));
malloc_strcpy(&tmp->status_user_formats34, get_string_var(STATUS_USER34_VAR));
malloc_strcpy(&tmp->status_user_formats35, get_string_var(STATUS_USER35_VAR));
malloc_strcpy(&tmp->status_user_formats36, get_string_var(STATUS_USER36_VAR));
malloc_strcpy(&tmp->status_user_formats37, get_string_var(STATUS_USER37_VAR));
malloc_strcpy(&tmp->status_user_formats38, get_string_var(STATUS_USER38_VAR));
malloc_strcpy(&tmp->status_user_formats39, get_string_var(STATUS_USER39_VAR));
malloc_strcpy(&tmp->status_user_formats4, get_string_var(STATUS_USER4_VAR));
malloc_strcpy(&tmp->status_user_formats5, get_string_var(STATUS_USER5_VAR));
malloc_strcpy(&tmp->status_user_formats6, get_string_var(STATUS_USER6_VAR));
malloc_strcpy(&tmp->status_user_formats7, get_string_var(STATUS_USER7_VAR));
malloc_strcpy(&tmp->status_user_formats8, get_string_var(STATUS_USER8_VAR));
malloc_strcpy(&tmp->status_user_formats9, get_string_var(STATUS_USER9_VAR));
malloc_strcpy(&tmp->status_window, get_string_var(STATUS_WINDOW_VAR));
win->wset = tmp;
return tmp;
}
void remove_wsets_for_window(Window *tmp)
{
new_free(&tmp->wset->status_channel);
new_free(&tmp->wset->status_clock);
new_free(&tmp->wset->status_hold_lines);
new_free(&tmp->wset->status_hold);
new_free(&tmp->wset->status_voice);
new_free(&tmp->wset->status_dcccount);
new_free(&tmp->wset->status_cdcccount);
new_free(&tmp->wset->status_lag);
new_free(&tmp->wset->status_away);
new_free(&tmp->wset->status_nick);
new_free(&tmp->wset->status_flag);
new_free(&tmp->wset->status_mail);
new_free(&tmp->wset->status_msgcount);
new_free(&tmp->wset->status_cpu_saver);
new_free(&tmp->wset->status_chanop);
new_free(&tmp->wset->status_mode);
new_free(&tmp->wset->status_notify);
new_free(&tmp->wset->status_oper_kills);
new_free(&tmp->wset->status_query);
new_free(&tmp->wset->status_server);
new_free(&tmp->wset->status_topic);
new_free(&tmp->wset->status_umode);
new_free(&tmp->wset->status_users);
new_free(&tmp->wset->status_scrollback);
new_free(&tmp->wset->status_halfop);
new_free(&tmp->wset->status_user_formats1);
new_free(&tmp->wset->status_user_formats10);
new_free(&tmp->wset->status_user_formats11);
new_free(&tmp->wset->status_user_formats12);
new_free(&tmp->wset->status_user_formats13);
new_free(&tmp->wset->status_user_formats14);
new_free(&tmp->wset->status_user_formats15);
new_free(&tmp->wset->status_user_formats16);
new_free(&tmp->wset->status_user_formats17);
new_free(&tmp->wset->status_user_formats18);
new_free(&tmp->wset->status_user_formats19);
new_free(&tmp->wset->status_user_formats2);
new_free(&tmp->wset->status_user_formats20);
new_free(&tmp->wset->status_user_formats21);
new_free(&tmp->wset->status_user_formats22);
new_free(&tmp->wset->status_user_formats23);
new_free(&tmp->wset->status_user_formats24);
new_free(&tmp->wset->status_user_formats25);
new_free(&tmp->wset->status_user_formats26);
new_free(&tmp->wset->status_user_formats27);
new_free(&tmp->wset->status_user_formats28);
new_free(&tmp->wset->status_user_formats29);
new_free(&tmp->wset->status_user_formats3);
new_free(&tmp->wset->status_user_formats30);
new_free(&tmp->wset->status_user_formats31);
new_free(&tmp->wset->status_user_formats32);
new_free(&tmp->wset->status_user_formats33);
new_free(&tmp->wset->status_user_formats34);
new_free(&tmp->wset->status_user_formats35);
new_free(&tmp->wset->status_user_formats36);
new_free(&tmp->wset->status_user_formats37);
new_free(&tmp->wset->status_user_formats38);
new_free(&tmp->wset->status_user_formats39);
new_free(&tmp->wset->status_user_formats4);
new_free(&tmp->wset->status_user_formats5);
new_free(&tmp->wset->status_user_formats6);
new_free(&tmp->wset->status_user_formats7);
new_free(&tmp->wset->status_user_formats8);
new_free(&tmp->wset->status_user_formats9);
new_free(&tmp->wset->status_user_formats0);
new_free(&tmp->wset->format_status[0]);
new_free(&tmp->wset->format_status[1]);
new_free(&tmp->wset->format_status[2]);
new_free(&tmp->wset->format_status[3]);
new_free(&tmp->wset->status_format[0]);
new_free(&tmp->wset->status_format[1]);
new_free(&tmp->wset->status_format[2]);
new_free(&tmp->wset->status_format[3]);
new_free(&tmp->wset->status_line[0]);
new_free(&tmp->wset->status_line[1]);
new_free(&tmp->wset->status_line[2]);
new_free(&tmp->wset->mode_format);
new_free(&tmp->wset->umode_format);
new_free(&tmp->wset->topic_format);
new_free(&tmp->wset->query_format);
new_free(&tmp->wset->clock_format);
new_free(&tmp->wset->hold_lines_format);
new_free(&tmp->wset->channel_format);
new_free(&tmp->wset->mail_format);
new_free(&tmp->wset->server_format);
new_free(&tmp->wset->notify_format);
new_free(&tmp->wset->kills_format);
new_free(&tmp->wset->lag_format);
new_free(&tmp->wset->cpu_saver_format);
new_free(&tmp->wset->msgcount_format);
new_free(&tmp->wset->dcccount_format);
new_free(&tmp->wset->cdcc_format);
new_free(&tmp->wset->nick_format);
new_free(&tmp->wset->away_format);
new_free(&tmp->wset->flag_format);
new_free(&tmp->wset->status_users_format);
new_free(&tmp->wset->status_window);
new_free(&tmp->wset->window_special_format);
new_free(&tmp->wset);
}
void log_channel(CSetArray *var, CSetList *cs)
{
ChannelList *chan;
if (!cs->channel_log_file)
{
bitchsay("Try setting a channel log file first");
set_cset_int_var(cs, CHANNEL_LOG_CSET, 0);
return;
}
if ((chan = lookup_channel(cs->channel, from_server, 0)))
do_log(cs->channel_log, cs->channel_log_file, &chan->msglog_fp);
}
void set_msglog_channel_level(CSetArray *var, CSetList *cs)
{
ChannelList *chan;
if ((chan = lookup_channel(cs->channel, from_server, 0)))
{
chan->log_level = parse_lastlog_level(cs->log_level, 1);
set_cset_str_var(cs, CHANNEL_LOG_LEVEL_CSET, bits_to_lastlog_level(chan->log_level));
}
}
void do_logchannel(unsigned long level, ChannelList *chan, char *format, ...)
{
if (!chan || !get_cset_int_var(chan->csets, CHANNEL_LOG_CSET))
return;
if ((chan->log_level & level) && format)
{
char s[BIG_BUFFER_SIZE+1];
va_list args;
va_start(args, format);
vsnprintf(s, BIG_BUFFER_SIZE, format, args);
va_end(args);
add_to_log(chan->msglog_fp, now, s, logfile_line_mangler);
}
}
void set_channel_limit(ChannelList *channel, int currentlimit, int add, int numusers)
{
if ((now - channel->limit_time) < 30)
return;
if (add && numusers)
{
if ((currentlimit - numusers) < (add / 2) && ((numusers + add) != currentlimit))
my_send_to_server(channel->server, "MODE %s +l %d", channel->channel, numusers + add);
else if ((currentlimit - numusers) > (currentlimit + (add / 2)) && ((numusers + add) != currentlimit))
my_send_to_server(channel->server, "MODE %s +l %d", channel->channel, numusers + add);
}
else
my_send_to_server(channel->server, "MODE %s -l", channel->channel);
channel->limit_time = now;
}
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);
}
}
#ifdef GUI
CSetArray *return_cset_var(int nummer)
{
return &cset_array[nummer];
}
WSetArray *return_wset_var(int nummer)
{
return &wset_array[nummer];
}
#endif