summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTimo Sirainen <cras@irssi.org>2002-12-28 17:54:13 +0000
committercras <cras@dbcabf3a-b0e7-0310-adc4-f8d773084564>2002-12-28 17:54:13 +0000
commitbd6fe052bce57849a7a850c0c5bee0ad896b9460 (patch)
tree95f3cb743874913a6dc1ff1314264b88989a4b60 /src
parent9c18cb00e7d096e46f5853f802724da4c59c2857 (diff)
downloadirssi-bd6fe052bce57849a7a850c0c5bee0ad896b9460.zip
Added time, size and level setting types. Breaks some settings - I'll add
automatic converter to these settings later. Meanwhile you CVS users can fix your config files yourself :) Time settings allow using "days", "hours", "minutes", "seconds" and "milliseconds" or several of their abbreviations. For example "5d 4h 5msecs". Size settings allow using "gbytes", "mbytes", "kbytes" and "bytes" or their abbrevations. For example "5MB". Level settings are currently handled pretty much the way they were before. git-svn-id: http://svn.irssi.org/repos/irssi/trunk@3080 dbcabf3a-b0e7-0310-adc4-f8d773084564
Diffstat (limited to 'src')
-rw-r--r--src/core/commands.h3
-rw-r--r--src/core/log-away.c11
-rw-r--r--src/core/misc.c114
-rw-r--r--src/core/misc.h4
-rw-r--r--src/core/servers-reconnect.c8
-rw-r--r--src/core/settings.c264
-rw-r--r--src/core/settings.h44
-rw-r--r--src/core/write-buffer.c15
-rw-r--r--src/fe-common/core/fe-common-core.c6
-rw-r--r--src/fe-common/core/fe-core-commands.c3
-rw-r--r--src/fe-common/core/fe-ignore.c14
-rw-r--r--src/fe-common/core/fe-log.c4
-rw-r--r--src/fe-common/core/fe-queries.c8
-rw-r--r--src/fe-common/core/fe-settings.c27
-rw-r--r--src/fe-common/core/fe-windows.c4
-rw-r--r--src/fe-common/core/formats.c8
-rw-r--r--src/fe-common/core/hilight-text.c4
-rw-r--r--src/fe-common/core/module-formats.c3
-rw-r--r--src/fe-common/core/module-formats.h3
-rw-r--r--src/fe-common/core/printtext.c2
-rw-r--r--src/fe-common/core/window-activity.c12
-rw-r--r--src/fe-common/irc/dcc/fe-dcc-chat.c2
-rw-r--r--src/fe-text/gui-printtext.c10
-rw-r--r--src/fe-text/statusbar-items.c13
-rw-r--r--src/fe-text/textbuffer.c2
-rw-r--r--src/irc/core/irc-commands.c15
-rw-r--r--src/irc/core/irc-servers-reconnect.c2
-rw-r--r--src/irc/core/irc-servers.c6
-rw-r--r--src/irc/core/lag.c8
-rw-r--r--src/irc/dcc/dcc-autoget.c6
-rw-r--r--src/irc/dcc/dcc.c4
-rw-r--r--src/irc/flood/autoignore.c12
-rw-r--r--src/irc/notifylist/notify-commands.c16
-rw-r--r--src/irc/notifylist/notify-ison.c13
-rw-r--r--src/perl/common/Settings.xs42
35 files changed, 526 insertions, 186 deletions
diff --git a/src/core/commands.h b/src/core/commands.h
index 0b599f54..bdc8755d 100644
--- a/src/core/commands.h
+++ b/src/core/commands.h
@@ -37,7 +37,8 @@ enum {
CMDERR_CHAN_NOT_FOUND, /* channel not found */
CMDERR_CHAN_NOT_SYNCED, /* channel not fully synchronized yet */
CMDERR_ILLEGAL_PROTO, /* requires different chat protocol than the active server */
- CMDERR_NOT_GOOD_IDEA /* not good idea to do, -yes overrides this */
+ CMDERR_NOT_GOOD_IDEA, /* not good idea to do, -yes overrides this */
+ CMDERR_INVALID_TIME /* invalid time specification */
};
/* Return the full command for `alias' */
diff --git a/src/core/log-away.c b/src/core/log-away.c
index 724e4b4a..586d17d4 100644
--- a/src/core/log-away.c
+++ b/src/core/log-away.c
@@ -38,16 +38,13 @@ static void sig_log_written(LOG_REC *log)
static void awaylog_open(void)
{
- const char *fname, *levelstr;
+ const char *fname;
LOG_REC *log;
int level;
fname = settings_get_str("awaylog_file");
- levelstr = settings_get_str("awaylog_level");
- if (*fname == '\0' || *levelstr == '\0') return;
-
- level = level2bits(levelstr);
- if (level == 0) return;
+ level = settings_get_level("awaylog_level");
+ if (*fname == '\0' || level == 0) return;
log = log_find(fname);
if (log != NULL && log->handle != -1)
@@ -106,7 +103,7 @@ void log_away_init(void)
away_msgs = 0;
settings_add_str("log", "awaylog_file", IRSSI_DIR_SHORT"/away.log");
- settings_add_str("log", "awaylog_level", "msgs hilight");
+ settings_add_level("log", "awaylog_level", "msgs hilight");
signal_add("log written", (SIGNAL_FUNC) sig_log_written);
signal_add("away mode changed", (SIGNAL_FUNC) sig_away_changed);
diff --git a/src/core/misc.c b/src/core/misc.c
index 89f564d3..46720d62 100644
--- a/src/core/misc.c
+++ b/src/core/misc.c
@@ -816,3 +816,117 @@ int nearest_power(int num)
while (n < num) n <<= 1;
return n;
}
+
+int parse_time_interval(const char *time, int *msecs)
+{
+ const char *desc;
+ int number, len;
+
+ *msecs = 0;
+
+ /* max. return value is about 1.6 years */
+ number = 0;
+ for (;;) {
+ if (i_isdigit(*time)) {
+ number = number*10 + (*time - '0');
+ time++;
+ continue;
+ }
+
+ /* skip punctuation */
+ while (*time != '\0' && i_ispunct(*time))
+ time++;
+
+ /* get description */
+ for (len = 0, desc = time; i_isalpha(*time); time++)
+ len++;
+
+ if (len == 0) {
+ if (number == 0) {
+ /* "0" - allow it */
+ return TRUE;
+ }
+
+ *msecs += number; /* assume seconds */
+ return FALSE;
+ }
+
+ if (g_strncasecmp(desc, "weeks", len) == 0)
+ *msecs += number * 1000*3600*7;
+ if (g_strncasecmp(desc, "days", len) == 0)
+ *msecs += number * 1000*3600;
+ else if (g_strncasecmp(desc, "minutes", len) == 0 ||
+ g_strncasecmp(desc, "mins", len) == 0)
+ *msecs += number * 1000*60;
+ else if (g_strncasecmp(desc, "seconds", len) == 0 ||
+ g_strncasecmp(desc, "secs", len) == 0)
+ *msecs += number * 1000;
+ else if (g_strncasecmp(desc, "milliseconds", len) == 0 ||
+ g_strncasecmp(desc, "millisecs", len) == 0 ||
+ g_strncasecmp(desc, "mseconds", len) == 0 ||
+ g_strncasecmp(desc, "msecs", len) == 0)
+ *msecs += number;
+
+ /* skip punctuation */
+ while (*time != '\0' && i_ispunct(*time))
+ time++;
+
+ if (*time == '\0')
+ break;
+
+ number = 0;
+ }
+
+ return TRUE;
+}
+
+int parse_size(const char *size, int *bytes)
+{
+ const char *desc;
+ int number, len;
+
+ *bytes = 0;
+
+ /* max. return value is about 1.6 years */
+ number = 0;
+ while (*size != '\0') {
+ if (i_isdigit(*size)) {
+ number = number*10 + (*size - '0');
+ size++;
+ continue;
+ }
+
+ /* skip punctuation */
+ while (*size != '\0' && i_ispunct(*size))
+ size++;
+
+ /* get description */
+ for (len = 0, desc = size; i_isalpha(*size); size++)
+ len++;
+
+ if (len == 0) {
+ if (number == 0) {
+ /* "0" - allow it */
+ return TRUE;
+ }
+
+ *bytes += number*1024; /* assume kilobytes */
+ return FALSE;
+ }
+
+ if (g_strncasecmp(desc, "gbytes", len) == 0)
+ *bytes += number * 1024*1024*1024;
+ if (g_strncasecmp(desc, "mbytes", len) == 0)
+ *bytes += number * 1024*1024;
+ if (g_strncasecmp(desc, "kbytes", len) == 0)
+ *bytes += number * 1024;
+ if (g_strncasecmp(desc, "bytes", len) == 0)
+ *bytes += number;
+
+ /* skip punctuation */
+ while (*size != '\0' && i_ispunct(*size))
+ size++;
+ }
+
+ return TRUE;
+}
diff --git a/src/core/misc.h b/src/core/misc.h
index 46f91bb8..7eee01a2 100644
--- a/src/core/misc.h
+++ b/src/core/misc.h
@@ -105,4 +105,8 @@ char *escape_string(const char *str);
int nearest_power(int num);
+/* Returns TRUE / FALSE */
+int parse_time_interval(const char *time, int *msecs);
+int parse_size(const char *size, int *bytes);
+
#endif
diff --git a/src/core/servers-reconnect.c b/src/core/servers-reconnect.c
index c7b5dd45..beeddc94 100644
--- a/src/core/servers-reconnect.c
+++ b/src/core/servers-reconnect.c
@@ -461,14 +461,14 @@ static void sig_chat_protocol_deinit(CHAT_PROTOCOL_REC *proto)
static void read_settings(void)
{
- reconnect_time = settings_get_int("server_reconnect_time");
- connect_timeout = settings_get_int("server_connect_timeout");
+ reconnect_time = settings_get_time("server_reconnect_time")/1000;
+ connect_timeout = settings_get_time("server_connect_timeout")/1000;
}
void servers_reconnect_init(void)
{
- settings_add_int("server", "server_reconnect_time", 300);
- settings_add_int("server", "server_connect_timeout", 300);
+ settings_add_time("server", "server_reconnect_time", "5min");
+ settings_add_time("server", "server_connect_timeout", "5min");
reconnects = NULL;
last_reconnect_tag = 0;
diff --git a/src/core/settings.c b/src/core/settings.c
index d99757e0..c93a11d6 100644
--- a/src/core/settings.c
+++ b/src/core/settings.c
@@ -21,6 +21,7 @@
#include "module.h"
#include "signals.h"
#include "commands.h"
+#include "levels.h"
#include "misc.h"
#include "lib-config/iconfig.h"
@@ -29,6 +30,8 @@
#include <signal.h>
+#define SETTINGS_AUTOSAVE_TIMEOUT (1000*60*60) /* 1 hour */
+
CONFIG_REC *mainconfig;
static GString *last_errors;
@@ -60,83 +63,107 @@ static SETTINGS_REC *settings_find(const char *key)
return rec;
}
-const char *settings_get_str(const char *key)
+static SETTINGS_REC *settings_get(const char *key, SettingType type)
{
SETTINGS_REC *rec;
- CONFIG_NODE *setnode, *node;
rec = settings_find(key);
- g_return_val_if_fail(rec != NULL, NULL);
+ if (rec == NULL) {
+ g_warning("settings_get(%s) : not found", key);
+ return 0;
+ }
+ if (type != -1 && rec->type != type) {
+ g_warning("settings_get(%s) : invalid type", key);
+ return 0;
+ }
+
+ return rec;
+}
+
+static const char *
+settings_get_str_type(const char *key, SettingType type)
+{
+ SETTINGS_REC *rec;
+ CONFIG_NODE *node;
- setnode = iconfig_node_traverse("settings", FALSE);
- if (setnode == NULL)
- return rec->def;
+ rec = settings_get(key, type);
+ if (rec == NULL) return NULL;
- node = config_node_section(setnode, rec->module, -1);
- return node == NULL ? rec->def :
- config_node_get_str(node, key, rec->def);
+ node = iconfig_node_traverse("settings", FALSE);
+ node = node == NULL ? NULL : config_node_section(node, rec->module, -1);
+
+ return node == NULL ? rec->default_value.v_string :
+ config_node_get_str(node, key, rec->default_value.v_string);
+}
+
+const char *settings_get_str(const char *key)
+{
+ return settings_get_str_type(key, -1);
}
int settings_get_int(const char *key)
{
SETTINGS_REC *rec;
- CONFIG_NODE *setnode, *node;
- int def;
+ CONFIG_NODE *node;
- rec = settings_find(key);
- g_return_val_if_fail(rec != NULL, 0);
- def = GPOINTER_TO_INT(rec->def);
+ rec = settings_get(key, SETTING_TYPE_INT);
+ if (rec == NULL) return 0;
- setnode = iconfig_node_traverse("settings", FALSE);
- if (setnode == NULL)
- return def;
+ node = iconfig_node_traverse("settings", FALSE);
+ node = node == NULL ? NULL : config_node_section(node, rec->module, -1);
- node = config_node_section(setnode, rec->module, -1);
- return node == NULL ? def :
- config_node_get_int(node, key, def);
+ return node == NULL ? rec->default_value.v_int :
+ config_node_get_int(node, key, rec->default_value.v_int);
}
int settings_get_bool(const char *key)
{
SETTINGS_REC *rec;
- CONFIG_NODE *setnode, *node;
- int def;
+ CONFIG_NODE *node;
- rec = settings_find(key);
- g_return_val_if_fail(rec != NULL, 0);
- def = GPOINTER_TO_INT(rec->def);
+ rec = settings_get(key, SETTING_TYPE_BOOLEAN);
+ if (rec == NULL) return FALSE;
- setnode = iconfig_node_traverse("settings", FALSE);
- if (setnode == NULL)
- return def;
+ node = iconfig_node_traverse("settings", FALSE);
+ node = node == NULL ? NULL : config_node_section(node, rec->module, -1);
- node = config_node_section(setnode, rec->module, -1);
- return node == NULL ? def :
- config_node_get_bool(node, key, def);
+ return node == NULL ? rec->default_value.v_bool :
+ config_node_get_bool(node, key, rec->default_value.v_bool);
}
-void settings_add_str_module(const char *module, const char *section,
- const char *key, const char *def)
+int settings_get_time(const char *key)
{
- SETTINGS_REC *rec;
+ const char *str;
+ int msecs;
- g_return_if_fail(key != NULL);
- g_return_if_fail(section != NULL);
+ str = settings_get_str_type(key, SETTING_TYPE_TIME);
+ if (str != NULL && !parse_time_interval(str, &msecs))
+ g_warning("settings_get_size(%s) : Invalid time '%s'", key, str);
+ return str == NULL ? 0 : msecs;
+}
- rec = g_hash_table_lookup(settings, key);
- g_return_if_fail(rec == NULL);
+int settings_get_level(const char *key)
+{
+ const char *str;
+
+ str = settings_get_str_type(key, SETTING_TYPE_LEVEL);
+ return str == NULL ? 0 : level2bits(str);
+}
- rec = g_new0(SETTINGS_REC, 1);
- rec->module = g_strdup(module);
- rec->key = g_strdup(key);
- rec->section = g_strdup(section);
- rec->def = def == NULL ? NULL : g_strdup(def);
+int settings_get_size(const char *key)
+{
+ const char *str;
+ int bytes;
- g_hash_table_insert(settings, rec->key, rec);
+ str = settings_get_str_type(key, SETTING_TYPE_SIZE);
+ if (str != NULL && !parse_size(str, &bytes))
+ g_warning("settings_get_size(%s) : Invalid size '%s'", key, str);
+ return str == NULL ? 0 : bytes;
}
-void settings_add_int_module(const char *module, const char *section,
- const char *key, int def)
+static void settings_add(const char *module, const char *section,
+ const char *key, SettingType type,
+ SettingValue *default_value)
{
SETTINGS_REC *rec;
@@ -144,49 +171,106 @@ void settings_add_int_module(const char *module, const char *section,
g_return_if_fail(section != NULL);
rec = g_hash_table_lookup(settings, key);
- g_return_if_fail(rec == NULL);
+ if (rec != NULL) {
+ /* Already exists, make sure it's correct type */
+ if (rec->type != type) {
+ g_warning("Trying to add already existing "
+ "setting '%s' with different type.", key);
+ return;
+ }
+ } else {
+ rec = g_new(SETTINGS_REC, 1);
+ rec->module = g_strdup(module);
+ rec->key = g_strdup(key);
+ rec->section = g_strdup(section);
+ rec->type = type;
+
+ rec->default_value = *default_value;
+ if (type != SETTING_TYPE_INT &&
+ type != SETTING_TYPE_BOOLEAN) {
+ rec->default_value.v_string =
+ g_strdup(default_value->v_string);
+ }
- rec = g_new0(SETTINGS_REC, 1);
- rec->module = g_strdup(module);
- rec->type = SETTING_TYPE_INT;
- rec->key = g_strdup(key);
- rec->section = g_strdup(section);
- rec->def = GINT_TO_POINTER(def);
+ g_hash_table_insert(settings, rec->key, rec);
+ }
- g_hash_table_insert(settings, rec->key, rec);
+ rec->refcount++;
+}
+
+void settings_add_str_module(const char *module, const char *section,
+ const char *key, const char *def)
+{
+ SettingValue default_value;
+
+ default_value.v_string = (char *) def;
+ settings_add(module, section, key, SETTING_TYPE_STRING, &default_value);
+}
+
+void settings_add_int_module(const char *module, const char *section,
+ const char *key, int def)
+{
+ SettingValue default_value;
+
+ default_value.v_int = def;
+ settings_add(module, section, key, SETTING_TYPE_INT, &default_value);
}
void settings_add_bool_module(const char *module, const char *section,
const char *key, int def)
{
- SETTINGS_REC *rec;
+ SettingValue default_value;
- g_return_if_fail(key != NULL);
- g_return_if_fail(section != NULL);
+ default_value.v_bool = def;
+ settings_add(module, section, key, SETTING_TYPE_BOOLEAN,
+ &default_value);
+}
- rec = g_hash_table_lookup(settings, key);
- g_return_if_fail(rec == NULL);
+void settings_add_time_module(const char *module, const char *section,
+ const char *key, const char *def)
+{
+ SettingValue default_value;
- rec = g_new0(SETTINGS_REC, 1);
- rec->module = g_strdup(module);
- rec->type = SETTING_TYPE_BOOLEAN;
- rec->key = g_strdup(key);
- rec->section = g_strdup(section);
- rec->def = GINT_TO_POINTER(def);
+ default_value.v_string = (char *) def;
+ settings_add(module, section, key, SETTING_TYPE_TIME, &default_value);
+}
- g_hash_table_insert(settings, rec->key, rec);
+void settings_add_level_module(const char *module, const char *section,
+ const char *key, const char *def)
+{
+ SettingValue default_value;
+
+ default_value.v_string = (char *) def;
+ settings_add(module, section, key, SETTING_TYPE_LEVEL, &default_value);
+}
+
+void settings_add_size_module(const char *module, const char *section,
+ const char *key, const char *def)
+{
+ SettingValue default_value;
+
+ default_value.v_string = (char *) def;
+ settings_add(module, section, key, SETTING_TYPE_SIZE, &default_value);
}
static void settings_destroy(SETTINGS_REC *rec)
{
if (rec->type == SETTING_TYPE_STRING)
- g_free_not_null(rec->def);
+ g_free(rec->default_value.v_string);
g_free(rec->module);
g_free(rec->section);
g_free(rec->key);
g_free(rec);
}
+static void settings_unref(SETTINGS_REC *rec)
+{
+ if (--rec->refcount == 0) {
+ g_hash_table_remove(settings, rec->key);
+ settings_destroy(rec);
+ }
+}
+
void settings_remove(const char *key)
{
SETTINGS_REC *rec;
@@ -194,17 +278,15 @@ void settings_remove(const char *key)
g_return_if_fail(key != NULL);
rec = g_hash_table_lookup(settings, key);
- if (rec == NULL) return;
-
- g_hash_table_remove(settings, key);
- settings_destroy(rec);
+ if (rec != NULL)
+ settings_unref(rec);
}
static int settings_remove_hash(const char *key, SETTINGS_REC *rec,
const char *module)
{
if (strcmp(rec->module, module) == 0) {
- settings_destroy(rec);
+ settings_unref(rec);
return TRUE;
}
@@ -226,7 +308,10 @@ static CONFIG_NODE *settings_get_node(const char *key)
g_return_val_if_fail(key != NULL, NULL);
rec = g_hash_table_lookup(settings, key);
- g_return_val_if_fail(rec != NULL, NULL);
+ if (rec == NULL) {
+ g_warning("Changing unknown setting '%s'", key);
+ return NULL;
+ }
node = iconfig_node_traverse("settings", TRUE);
return config_node_section(node, rec->module, NODE_TYPE_BLOCK);
@@ -247,7 +332,35 @@ void settings_set_bool(const char *key, int value)
iconfig_node_set_bool(settings_get_node(key), key, value);
}
-int settings_get_type(const char *key)
+int settings_set_time(const char *key, const char *value)
+{
+ int msecs;
+
+ if (!parse_time_interval(value, &msecs))
+ return FALSE;
+
+ iconfig_node_set_str(settings_get_node(key), key, value);
+ return TRUE;
+}
+
+int settings_set_level(const char *key, const char *value)
+{
+ iconfig_node_set_str(settings_get_node(key), key, value);
+ return TRUE;
+}
+
+int settings_set_size(const char *key, const char *value)
+{
+ int size;
+
+ if (!parse_size(value, &size))
+ return FALSE;
+
+ iconfig_node_set_str(settings_get_node(key), key, value);
+ return TRUE;
+}
+
+SettingType settings_get_type(const char *key)
{
SETTINGS_REC *rec;
@@ -621,7 +734,8 @@ void settings_init(void)
init_configfile();
settings_add_bool("misc", "settings_autosave", TRUE);
- timeout_tag = g_timeout_add(1000*60*60, (GSourceFunc) sig_autosave, NULL);
+ timeout_tag = g_timeout_add(SETTINGS_AUTOSAVE_TIMEOUT,
+ (GSourceFunc) sig_autosave, NULL);
signal_add("irssi init finished", (SIGNAL_FUNC) sig_init_finished);
signal_add("gui exit", (SIGNAL_FUNC) sig_autosave);
}
diff --git a/src/core/settings.h b/src/core/settings.h
index fdff3801..df4a95ab 100644
--- a/src/core/settings.h
+++ b/src/core/settings.h
@@ -1,18 +1,30 @@
#ifndef __SETTINGS_H
#define __SETTINGS_H
-enum {
+typedef enum {
SETTING_TYPE_STRING,
SETTING_TYPE_INT,
- SETTING_TYPE_BOOLEAN
-};
+ SETTING_TYPE_BOOLEAN,
+ SETTING_TYPE_TIME,
+ SETTING_TYPE_LEVEL,
+ SETTING_TYPE_SIZE
+} SettingType;
+
+typedef union {
+ char *v_string;
+ int v_int;
+ unsigned int v_bool:1;
+} SettingValue;
typedef struct {
- char *module;
- int type;
+ int refcount;
+
+ char *module;
char *key;
char *section;
- void *def;
+
+ SettingType type;
+ SettingValue default_value;
} SETTINGS_REC;
/* macros for handling the default Irssi configuration */
@@ -40,6 +52,9 @@ extern const char *default_config;
const char *settings_get_str(const char *key);
int settings_get_int(const char *key);
int settings_get_bool(const char *key);
+int settings_get_time(const char *key); /* as milliseconds */
+int settings_get_level(const char *key);
+int settings_get_size(const char *key); /* as bytes */
/* Functions to add/remove settings */
void settings_add_str_module(const char *module, const char *section,
@@ -48,6 +63,12 @@ void settings_add_int_module(const char *module, const char *section,
const char *key, int def);
void settings_add_bool_module(const char *module, const char *section,
const char *key, int def);
+void settings_add_time_module(const char *module, const char *section,
+ const char *key, const char *def);
+void settings_add_level_module(const char *module, const char *section,
+ const char *key, const char *def);
+void settings_add_size_module(const char *module, const char *section,
+ const char *key, const char *def);
void settings_remove(const char *key);
void settings_remove_module(const char *module);
@@ -57,13 +78,22 @@ void settings_remove_module(const char *module);
settings_add_int_module(MODULE_NAME, section, key, def)
#define settings_add_bool(section, key, def) \
settings_add_bool_module(MODULE_NAME, section, key, def)
+#define settings_add_time(section, key, def) \
+ settings_add_time_module(MODULE_NAME, section, key, def)
+#define settings_add_level(section, key, def) \
+ settings_add_level_module(MODULE_NAME, section, key, def)
+#define settings_add_size(section, key, def) \
+ settings_add_size_module(MODULE_NAME, section, key, def)
void settings_set_str(const char *key, const char *value);
void settings_set_int(const char *key, int value);
void settings_set_bool(const char *key, int value);
+int settings_set_time(const char *key, const char *value);
+int settings_set_level(const char *key, const char *value);
+int settings_set_size(const char *key, const char *value);
/* Get the type (SETTING_TYPE_xxx) of `key' */
-int settings_get_type(const char *key);
+SettingType settings_get_type(const char *key);
/* Get all settings sorted by section. Free the result with g_slist_free() */
GSList *settings_get_sorted(void);
/* Get the record of the setting */
diff --git a/src/core/write-buffer.c b/src/core/write-buffer.c
index 1c3eef82..eec306ae 100644
--- a/src/core/write-buffer.c
+++ b/src/core/write-buffer.c
@@ -134,17 +134,14 @@ static int flush_timeout(void)
static void read_settings(void)
{
- int msecs;
-
write_buffer_flush();
- write_buffer_max_blocks = settings_get_int("write_buffer_kb") *
- 1024/BUFFER_BLOCK_SIZE;
+ write_buffer_max_blocks =
+ settings_get_size("write_buffer_size") / BUFFER_BLOCK_SIZE;
- if (settings_get_int("write_buffer_mins") > 0) {
- msecs = settings_get_int("write_buffer_mins")*60*1000;
+ if (settings_get_time("write_buffer_timeout") > 0) {
if (timeout_tag == -1) {
- timeout_tag = g_timeout_add(msecs,
+ timeout_tag = g_timeout_add(settings_get_time("write_buffer_timeout"),
(GSourceFunc) flush_timeout,
NULL);
}
@@ -161,8 +158,8 @@ static void cmd_flushbuffer(void)
void write_buffer_init(void)
{
- settings_add_int("misc", "write_buffer_mins", 0);
- settings_add_int("misc", "write_buffer_kb", 0);
+ settings_add_time("misc", "write_buffer_timeout", "0");
+ settings_add_size("misc", "write_buffer_size", "0");
buffers = g_hash_table_new((GHashFunc) g_direct_hash,
(GCompareFunc) g_direct_equal);
diff --git a/src/fe-common/core/fe-common-core.c b/src/fe-common/core/fe-common-core.c
index 49c8db87..e6fdb6fe 100644
--- a/src/fe-common/core/fe-common-core.c
+++ b/src/fe-common/core/fe-common-core.c
@@ -153,11 +153,11 @@ void fe_common_core_init(void)
args_register(options);
settings_add_bool("lookandfeel", "timestamps", TRUE);
- settings_add_str("lookandfeel", "timestamp_level", "ALL");
- settings_add_int("lookandfeel", "timestamp_timeout", 0);
+ settings_add_level("lookandfeel", "timestamp_level", "ALL");
+ settings_add_time("lookandfeel", "timestamp_timeout", 0);
settings_add_bool("lookandfeel", "bell_beeps", FALSE);
- settings_add_str("lookandfeel", "beep_msg_level", "");
+ settings_add_level("lookandfeel", "beep_msg_level", "");
settings_add_bool("lookandfeel", "beep_when_window_active", TRUE);
settings_add_bool("lookandfeel", "beep_when_away", TRUE);
diff --git a/src/fe-common/core/fe-core-commands.c b/src/fe-common/core/fe-core-commands.c
index b599c810..56c2dac3 100644
--- a/src/fe-common/core/fe-core-commands.c
+++ b/src/fe-common/core/fe-core-commands.c
@@ -47,7 +47,8 @@ static int ret_texts[] = {
TXT_CHAN_NOT_FOUND,
TXT_CHAN_NOT_SYNCED,
TXT_ILLEGAL_PROTO,
- TXT_NOT_GOOD_IDEA
+ TXT_NOT_GOOD_IDEA,
+ CMDERR_INVALID_TIME
};
int command_hide_output;
diff --git a/src/fe-common/core/fe-ignore.c b/src/fe-common/core/fe-ignore.c
index 4621ab26..83bc1584 100644
--- a/src/fe-common/core/fe-ignore.c
+++ b/src/fe-common/core/fe-ignore.c
@@ -115,7 +115,7 @@ static void cmd_ignore(const char *data)
char *patternarg, *chanarg, *mask, *levels, *timestr;
char **channels;
void *free_arg;
- int new_ignore;
+ int new_ignore, msecs;
if (*data == '\0') {
cmd_ignore_show();
@@ -132,6 +132,13 @@ static void cmd_ignore(const char *data)
if (*mask == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
if (*levels == '\0') levels = "ALL";
+ msecs = 0;
+ timestr = g_hash_table_lookup(optlist, "time");
+ if (timestr != NULL) {
+ if (!parse_time_interval(timestr, &msecs))
+ cmd_return_error(CMDERR_INVALID_TIME);
+ }
+
if (active_win->active_server != NULL &&
server_ischannel(active_win->active_server, mask)) {
chanarg = mask;
@@ -173,9 +180,8 @@ static void cmd_ignore(const char *data)
rec->regexp = g_hash_table_lookup(optlist, "regexp") != NULL;
rec->fullword = g_hash_table_lookup(optlist, "full") != NULL;
rec->replies = g_hash_table_lookup(optlist, "replies") != NULL;
- timestr = g_hash_table_lookup(optlist, "time");
- if (timestr != NULL)
- rec->unignore_time = time(NULL)+atoi(timestr);
+ if (msecs != 0)
+ rec->unignore_time = time(NULL)+msecs/1000;
if (new_ignore)
ignore_add_rec(rec);
diff --git a/src/fe-common/core/fe-log.c b/src/fe-common/core/fe-log.c
index 1db74fe1..1b88364e 100644
--- a/src/fe-common/core/fe-log.c
+++ b/src/fe-common/core/fe-log.c
@@ -671,7 +671,7 @@ static void read_settings(void)
autolog_path = settings_get_str("autolog_path");
autolog_level = !settings_get_bool("autolog") ? 0 :
- level2bits(settings_get_str("autolog_level"));
+ settings_get_level("autolog_level");
if (old_autolog && !autolog_level)
autologs_close_all();
@@ -704,7 +704,7 @@ void fe_log_init(void)
settings_add_bool("log", "autolog", FALSE);
settings_add_bool("log", "autolog_colors", FALSE);
settings_add_str("log", "autolog_path", "~/irclogs/$tag/$0.log");
- settings_add_str("log", "autolog_level", "all -crap -clientcrap -ctcps");
+ settings_add_level("log", "autolog_level", "all -crap -clientcrap -ctcps");
settings_add_str("log", "log_theme", "");
autolog_level = 0;
diff --git a/src/fe-common/core/fe-queries.c b/src/fe-common/core/fe-queries.c
index 8345d52f..f48e37e9 100644
--- a/src/fe-common/core/fe-queries.c
+++ b/src/fe-common/core/fe-queries.c
@@ -340,8 +340,8 @@ static void sig_message_private(SERVER_REC *server, const char *msg,
static void read_settings(void)
{
- querycreate_level = level2bits(settings_get_str("autocreate_query_level"));
- query_auto_close = settings_get_int("autoclose_query");
+ querycreate_level = settings_get_level("autocreate_query_level");
+ query_auto_close = settings_get_time("autoclose_query")/1000;
if (query_auto_close > 0 && queryclose_tag == -1)
queryclose_tag = g_timeout_add(5000, (GSourceFunc) sig_query_autoclose, NULL);
else if (query_auto_close <= 0 && queryclose_tag != -1) {
@@ -352,9 +352,9 @@ static void read_settings(void)
void fe_queries_init(void)
{
- settings_add_str("lookandfeel", "autocreate_query_level", "MSGS DCCMSGS");
+ settings_add_level("lookandfeel", "autocreate_query_level", "MSGS DCCMSGS");
settings_add_bool("lookandfeel", "autocreate_own_query", TRUE);
- settings_add_int("lookandfeel", "autoclose_query", 0);
+ settings_add_time("lookandfeel", "autoclose_query", "0");
queryclose_tag = -1;
read_settings();
diff --git a/src/fe-common/core/fe-settings.c b/src/fe-common/core/fe-settings.c
index 7fb512e8..8dba8f73 100644
--- a/src/fe-common/core/fe-settings.c
+++ b/src/fe-common/core/fe-settings.c
@@ -45,6 +45,9 @@ static void set_print(SETTINGS_REC *rec)
value = value_int;
break;
case SETTING_TYPE_STRING:
+ case SETTING_TYPE_TIME:
+ case SETTING_TYPE_LEVEL:
+ case SETTING_TYPE_SIZE:
value = settings_get_str(rec->key);
break;
default:
@@ -106,20 +109,38 @@ static void cmd_set(char *data)
if (clear)
settings_set_bool(key, FALSE);
else if (set_default)
- settings_set_bool(key, GPOINTER_TO_INT(rec->def));
+ settings_set_bool(key, rec->default_value.v_bool);
else
set_boolean(key, value);
break;
case SETTING_TYPE_INT:
settings_set_int(key, clear ? 0 :
- set_default ? GPOINTER_TO_INT(rec->def) :
+ set_default ? rec->default_value.v_int :
atoi(value));
break;
case SETTING_TYPE_STRING:
settings_set_str(key, clear ? "" :
- set_default ? rec->def :
+ set_default ? rec->default_value.v_string :
value);
break;
+ case SETTING_TYPE_TIME:
+ if (!settings_set_time(key, clear ? "0" :
+ set_default ? rec->default_value.v_string : value))
+ printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
+ TXT_INVALID_TIME);
+ break;
+ case SETTING_TYPE_LEVEL:
+ if (!settings_set_level(key, clear ? "" :
+ set_default ? rec->default_value.v_string : value))
+ printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
+ TXT_INVALID_LEVEL);
+ break;
+ case SETTING_TYPE_SIZE:
+ if (!settings_set_size(key, clear ? "0" :
+ set_default ? rec->default_value.v_string : value))
+ printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
+ TXT_INVALID_SIZE);
+ break;
}
signal_emit("setup changed", 0);
}
diff --git a/src/fe-common/core/fe-windows.c b/src/fe-common/core/fe-windows.c
index dc264d65..6eb4707a 100644
--- a/src/fe-common/core/fe-windows.c
+++ b/src/fe-common/core/fe-windows.c
@@ -70,7 +70,7 @@ WINDOW_REC *window_create(WI_ITEM_REC *item, int automatic)
rec = g_new0(WINDOW_REC, 1);
rec->refnum = window_get_new_refnum();
- rec->level = level2bits(settings_get_str("window_default_level"));
+ rec->level = settings_get_level("window_default_level");
windows = g_slist_prepend(windows, rec);
signal_emit("window created", 2, rec, GINT_TO_POINTER(automatic));
@@ -646,7 +646,7 @@ void windows_init(void)
settings_add_bool("lookandfeel", "window_auto_change", FALSE);
settings_add_bool("lookandfeel", "windows_auto_renumber", TRUE);
settings_add_bool("lookandfeel", "window_check_level_first", FALSE);
- settings_add_str("lookandfeel", "window_default_level", "NONE");
+ settings_add_level("lookandfeel", "window_default_level", "NONE");
read_settings();
signal_add("server looking", (SIGNAL_FUNC) sig_server_connected);
diff --git a/src/fe-common/core/formats.c b/src/fe-common/core/formats.c
index 06464894..c6bc72a3 100644
--- a/src/fe-common/core/formats.c
+++ b/src/fe-common/core/formats.c
@@ -1091,11 +1091,9 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text)
static void read_settings(void)
{
timestamp_level = settings_get_bool("timestamps") ? MSGLEVEL_ALL : 0;
- if (timestamp_level > 0) {
- timestamp_level =
- level2bits(settings_get_str("timestamp_level"));
- }
- timestamp_timeout = settings_get_int("timestamp_timeout");
+ if (timestamp_level > 0)
+ timestamp_level = settings_get_level("timestamp_level");
+ timestamp_timeout = settings_get_time("timestamp_timeout")/1000;
hide_server_tags = settings_get_bool("hide_server_tags");
hide_text_style = settings_get_bool("hide_text_style");
diff --git a/src/fe-common/core/hilight-text.c b/src/fe-common/core/hilight-text.c
index 9749504b..54cb12a1 100644
--- a/src/fe-common/core/hilight-text.c
+++ b/src/fe-common/core/hilight-text.c
@@ -676,14 +676,14 @@ static void hilight_nick_cache(GHashTable *list, CHANNEL_REC *channel,
static void read_settings(void)
{
- default_hilight_level = level2bits(settings_get_str("hilight_level"));
+ default_hilight_level = settings_get_level("hilight_level");
}
void hilight_text_init(void)
{
settings_add_str("lookandfeel", "hilight_color", "%Y");
settings_add_str("lookandfeel", "hilight_act_color", "%M");
- settings_add_str("lookandfeel", "hilight_level", "PUBLIC DCCMSGS");
+ settings_add_level("lookandfeel", "hilight_level", "PUBLIC DCCMSGS");
read_settings();
diff --git a/src/fe-common/core/module-formats.c b/src/fe-common/core/module-formats.c
index 2d4f02e1..c70f1e04 100644
--- a/src/fe-common/core/module-formats.c
+++ b/src/fe-common/core/module-formats.c
@@ -214,6 +214,9 @@ FORMAT_REC fecommon_core_formats[] = {
{ "chan_not_synced", "Channel not fully synchronized yet, try again after a while", 0 },
{ "illegal_proto", "Command isn't designed for the chat protocol of the active server", 0 },
{ "not_good_idea", "Doing this is not a good idea. Add -YES option to command if you really mean it", 0 },
+ { "invalid_time", "Invalid timestamp", 0 },
+ { "invalid_level", "Invalid message level", 0 },
+ { "invalid_size", "Invalid size", 0 },
/* ---- */
{ NULL, "Themes", 0 },
diff --git a/src/fe-common/core/module-formats.h b/src/fe-common/core/module-formats.h
index 7cd46bab..5f28f0e1 100644
--- a/src/fe-common/core/module-formats.h
+++ b/src/fe-common/core/module-formats.h
@@ -183,6 +183,9 @@ enum {
TXT_CHAN_NOT_SYNCED,
TXT_ILLEGAL_PROTO,
TXT_NOT_GOOD_IDEA,
+ TXT_INVALID_TIME,
+ TXT_INVALID_LEVEL,
+ TXT_INVALID_SIZE,
TXT_FILL_11,
diff --git a/src/fe-common/core/printtext.c b/src/fe-common/core/printtext.c
index e32b5943..6cc64081 100644
--- a/src/fe-common/core/printtext.c
+++ b/src/fe-common/core/printtext.c
@@ -474,7 +474,7 @@ static void sig_gui_dialog(const char *type, const char *text)
static void read_settings(void)
{
- beep_msg_level = level2bits(settings_get_str("beep_msg_level"));
+ beep_msg_level = settings_get_level("beep_msg_level");
beep_when_away = settings_get_bool("beep_when_away");
beep_when_window_active = settings_get_bool("beep_when_window_active");
}
diff --git a/src/fe-common/core/window-activity.c b/src/fe-common/core/window-activity.c
index 883821f0..64b0aad3 100644
--- a/src/fe-common/core/window-activity.c
+++ b/src/fe-common/core/window-activity.c
@@ -138,18 +138,18 @@ static void read_settings(void)
g_strsplit(targets, " ", -1);
hide_level = MSGLEVEL_NEVER | MSGLEVEL_NO_ACT |
- level2bits(settings_get_str("activity_hide_level"));
- msg_level = level2bits(settings_get_str("activity_msg_level"));
+ settings_get_level("activity_hide_level");
+ msg_level = settings_get_level("activity_msg_level");
hilight_level = MSGLEVEL_HILIGHT |
- level2bits(settings_get_str("activity_hilight_level"));
+ settings_get_level("activity_hilight_level");
}
void window_activity_init(void)
{
settings_add_str("lookandfeel", "activity_hide_targets", "");
- settings_add_str("lookandfeel", "activity_hide_level", "");
- settings_add_str("lookandfeel", "activity_msg_level", "PUBLIC");
- settings_add_str("lookandfeel", "activity_hilight_level", "MSGS DCCMSGS");
+ settings_add_level("lookandfeel", "activity_hide_level", "");
+ settings_add_level("lookandfeel", "activity_msg_level", "PUBLIC");
+ settings_add_level("lookandfeel", "activity_hilight_level", "MSGS DCCMSGS");
read_settings();
signal_add("print text", (SIGNAL_FUNC) sig_hilight_text);
diff --git a/src/fe-common/irc/dcc/fe-dcc-chat.c b/src/fe-common/irc/dcc/fe-dcc-chat.c
index 3095fcfd..d2723c96 100644
--- a/src/fe-common/irc/dcc/fe-dcc-chat.c
+++ b/src/fe-common/irc/dcc/fe-dcc-chat.c
@@ -340,7 +340,7 @@ static void read_settings(void)
{
int level;
- level = level2bits(settings_get_str("autocreate_query_level"));
+ level = settings_get_level("autocreate_query_level");
autocreate_dccquery = (level & MSGLEVEL_DCCMSGS) != 0;
}
diff --git a/src/fe-text/gui-printtext.c b/src/fe-text/gui-printtext.c
index 2d8a8cde..b4d223e9 100644
--- a/src/fe-text/gui-printtext.c
+++ b/src/fe-text/gui-printtext.c
@@ -30,7 +30,7 @@
#include "gui-windows.h"
int mirc_colors[] = { 15, 0, 1, 2, 12, 4, 5, 6, 14, 10, 3, 11, 9, 13, 8, 7 };
-static int scrollback_lines, scrollback_hours, scrollback_burst_remove;
+static int scrollback_lines, scrollback_time, scrollback_burst_remove;
static int last_fg, last_bg, last_flags;
static int next_xpos, next_ypos;
@@ -120,7 +120,7 @@ static void remove_old_lines(TEXT_BUFFER_VIEW_REC *view)
LINE_REC *line;
time_t old_time;
- old_time = time(NULL)-(scrollback_hours*3600)+1;
+ old_time = time(NULL)-scrollback_time+1;
if (view->buffer->lines_count >=
scrollback_lines+scrollback_burst_remove) {
/* remove lines by line count */
@@ -130,7 +130,7 @@ static void remove_old_lines(TEXT_BUFFER_VIEW_REC *view)
scrollback_lines == 0) {
/* too new line, don't remove yet - also
if scrollback_lines is 0, we want to check
- only scrollback_hours setting. */
+ only scrollback_time setting. */
break;
}
textbuffer_view_remove_line(view, line);
@@ -302,7 +302,7 @@ static void sig_gui_printtext_finished(WINDOW_REC *window)
static void read_settings(void)
{
scrollback_lines = settings_get_int("scrollback_lines");
- scrollback_hours = settings_get_int("scrollback_hours");
+ scrollback_time = settings_get_time("scrollback_time")/1000;
scrollback_burst_remove = settings_get_int("scrollback_burst_remove");
}
@@ -314,7 +314,7 @@ void gui_printtext_init(void)
(GCompareFunc) g_str_equal);
settings_add_int("history", "scrollback_lines", 500);
- settings_add_int("history", "scrollback_hours", 24);
+ settings_add_time("history", "scrollback_time", "day");
settings_add_int("history", "scrollback_burst_remove", 10);
signal_add("gui print text", (SIGNAL_FUNC) sig_gui_print_text);
diff --git a/src/fe-text/statusbar-items.c b/src/fe-text/statusbar-items.c
index fe74a748..fe9ca0e2 100644
--- a/src/fe-text/statusbar-items.c
+++ b/src/fe-text/statusbar-items.c
@@ -290,15 +290,16 @@ static void item_lag(SBAR_ITEM_REC *item, int get_size_only)
int lag, lag_unknown;
server = active_win == NULL ? NULL : active_win->active_server;
- lag = get_lag(server, &lag_unknown)/10;
+ lag = get_lag(server, &lag_unknown);
- if (lag <= 0 || lag < settings_get_int("lag_min_show")) {
+ if (lag <= 0 || lag < settings_get_time("lag_min_show")) {
/* don't print the lag item */
if (get_size_only)
item->min_size = item->max_size = 0;
return;
}
+ lag /= 10;
last_lag = lag;
last_lag_unknown = lag_unknown;
@@ -321,8 +322,10 @@ static void lag_check_update(void)
server = active_win == NULL ? NULL : active_win->active_server;
lag = get_lag(server, &lag_unknown)/10;
- if (lag < settings_get_int("lag_min_show"))
- lag = 0;
+ if (lag < settings_get_time("lag_min_show"))
+ lag = 0;
+ else
+ lag /= 10;
if (lag != last_lag || (lag > 0 && lag_unknown != last_lag_unknown))
statusbar_items_redraw("lag");
@@ -372,7 +375,7 @@ static void read_settings(void)
void statusbar_items_init(void)
{
- settings_add_int("misc", "lag_min_show", 100);
+ settings_add_time("misc", "lag_min_show", "100msec");
settings_add_bool("lookandfeel", "actlist_moves", FALSE);
statusbar_item_register("window", NULL, item_window_active);
diff --git a/src/fe-text/textbuffer.c b/src/fe-text/textbuffer.c
index e989b8fd..5a8d256d 100644
--- a/src/fe-text/textbuffer.c
+++ b/src/fe-text/textbuffer.c
@@ -137,6 +137,8 @@ static void text_chunk_line_free(TEXT_BUFFER_REC *buffer, LINE_REC *line)
break;
text = tmp-1;
+ } else if (*text == LINE_CMD_INDENT_FUNC) {
+ text += sizeof(int (*) ());
}
}
}
diff --git a/src/irc/core/irc-commands.c b/src/irc/core/irc-commands.c
index d7512de2..8c888ffe 100644
--- a/src/irc/core/irc-commands.c
+++ b/src/irc/core/irc-commands.c
@@ -736,7 +736,7 @@ static int knockout_timeout(void)
return 1;
}
-/* SYNTAX: KNOCKOUT [<seconds>] <nicks> <reason> */
+/* SYNTAX: KNOCKOUT [<time>] <nicks> <reason> */
static void cmd_knockout(const char *data, IRC_SERVER_REC *server,
IRC_CHANNEL_REC *channel)
{
@@ -753,20 +753,21 @@ static void cmd_knockout(const char *data, IRC_SERVER_REC *server,
if (!channel->wholist)
cmd_return_error(CMDERR_CHAN_NOT_SYNCED);
- if (is_numeric(data, ' ')) {
+ if (i_isdigit(*data)) {
/* first argument is the timeout */
if (!cmd_get_params(data, &free_arg, 3 | PARAM_FLAG_GETREST,
&timeoutstr, &nicks, &reason))
return;
- timeleft = atoi(timeoutstr);
+
+ if (!parse_time_interval(timeoutstr, &timeleft))
+ cmd_param_error(CMDERR_INVALID_TIME);
} else {
if (!cmd_get_params(data, &free_arg, 2 | PARAM_FLAG_GETREST,
&nicks, &reason))
return;
- timeleft = 0;
+ timeleft = settings_get_time("knockout_time");
}
- if (timeleft == 0) timeleft = settings_get_int("knockout_time");
if (*nicks == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
nicklist = g_strsplit(nicks, ",", -1);
@@ -797,7 +798,7 @@ static void cmd_knockout(const char *data, IRC_SERVER_REC *server,
else {
/* create knockout record */
rec = g_new(KNOCKOUT_REC, 1);
- rec->unban_time = time(NULL)+timeleft;
+ rec->unban_time = time(NULL)+timeleft/1000;
rec->channel = channel;
rec->ban = banmasks;
@@ -916,7 +917,7 @@ void irc_commands_init(void)
tmpstr = g_string_new(NULL);
settings_add_str("misc", "part_message", "");
- settings_add_int("misc", "knockout_time", 300);
+ settings_add_time("misc", "knockout_time", "5min");
settings_add_str("misc", "wall_format", "[Wall/$0] $1-");
settings_add_bool("misc", "kick_first_on_kickban", FALSE);
diff --git a/src/irc/core/irc-servers-reconnect.c b/src/irc/core/irc-servers-reconnect.c
index c2649f5e..7e66b255 100644
--- a/src/irc/core/irc-servers-reconnect.c
+++ b/src/irc/core/irc-servers-reconnect.c
@@ -88,7 +88,7 @@ static void event_nick_collision(IRC_SERVER_REC *server, const char *data)
don't connect to the server more than once in every 10 seconds. */
new_connect = server->connect_time+10 -
- settings_get_int("server_reconnect_time");
+ settings_get_time("server_reconnect_time")/1000;
if (server->connect_time > new_connect)
server->connect_time = new_connect;
diff --git a/src/irc/core/irc-servers.c b/src/irc/core/irc-servers.c
index b1a7b007..fa3ded76 100644
--- a/src/irc/core/irc-servers.c
+++ b/src/irc/core/irc-servers.c
@@ -46,7 +46,7 @@
#define DEFAULT_MAX_MSGS 1
#define DEFAULT_USER_MODE "+i"
-#define DEFAULT_CMD_QUEUE_SPEED 2200
+#define DEFAULT_CMD_QUEUE_SPEED "2200msec"
#define DEFAULT_CMDS_MAX_AT_ONCE 5
#define DEFAULT_MAX_QUERY_CHANS 1 /* more and more IRC networks are using stupid ircds.. */
@@ -180,7 +180,7 @@ SERVER_REC *irc_server_init_connect(SERVER_CONNECT_REC *conn)
}
server->cmd_queue_speed = ircconn->cmd_queue_speed > 0 ?
- ircconn->cmd_queue_speed : settings_get_int("cmd_queue_speed");
+ ircconn->cmd_queue_speed : settings_get_time("cmd_queue_speed");
server->max_cmds_at_once = ircconn->max_cmds_at_once > 0 ?
ircconn->max_cmds_at_once : settings_get_int("cmds_max_at_once");
server->max_query_chans = ircconn->max_query_chans > 0 ?
@@ -587,7 +587,7 @@ static void event_empty(void)
void irc_servers_init(void)
{
settings_add_str("misc", "usermode", DEFAULT_USER_MODE);
- settings_add_int("flood", "cmd_queue_speed", DEFAULT_CMD_QUEUE_SPEED);
+ settings_add_time("flood", "cmd_queue_speed", DEFAULT_CMD_QUEUE_SPEED);
settings_add_int("flood", "cmds_max_at_once", DEFAULT_CMDS_MAX_AT_ONCE);
cmd_tag = g_timeout_add(500, (GSourceFunc) servers_cmd_timeout, NULL);
diff --git a/src/irc/core/lag.c b/src/irc/core/lag.c
index e919b3fc..7d4f51ed 100644
--- a/src/irc/core/lag.c
+++ b/src/irc/core/lag.c
@@ -88,8 +88,8 @@ static int sig_check_lag(void)
time_t now;
int lag_check_time, max_lag;
- lag_check_time = settings_get_int("lag_check_time");
- max_lag = settings_get_int("lag_max_before_disconnect");
+ lag_check_time = settings_get_time("lag_check_time")/1000;
+ max_lag = settings_get_time("lag_max_before_disconnect")/1000;
if (lag_check_time <= 0)
return 1;
@@ -122,8 +122,8 @@ static int sig_check_lag(void)
void lag_init(void)
{
- settings_add_int("misc", "lag_check_time", 60);
- settings_add_int("misc", "lag_max_before_disconnect", 300);
+ settings_add_time("misc", "lag_check_time", "1min");
+ settings_add_time("misc", "lag_max_before_disconnect", "5min");
timeout_tag = g_timeout_add(1000, (GSourceFunc) sig_check_lag, NULL);
signal_add_first("lag pong", (SIGNAL_FUNC) lag_event_pong);
diff --git a/src/irc/dcc/dcc-autoget.c b/src/irc/dcc/dcc-autoget.c
index 87dd00d8..bf9a3b66 100644
--- a/src/irc/dcc/dcc-autoget.c
+++ b/src/irc/dcc/dcc-autoget.c
@@ -57,8 +57,8 @@ static void sig_dcc_request(GET_DCC_REC *dcc, const char *nickaddr)
/* check file size limit, NOTE: it's still possible to send a
bogus file size and then just send what ever sized file.. */
- max_size = settings_get_int("dcc_autoget_max_size");
- if (max_size > 0 && (uoff_t)max_size*1024 < dcc->size)
+ max_size = settings_get_size("dcc_autoget_max_size");
+ if (max_size > 0 && (uoff_t)max_size < dcc->size)
return;
/* ok. but do we want/need to resume? */
@@ -77,7 +77,7 @@ void dcc_autoget_init(void)
settings_add_bool("dcc", "dcc_autoget", FALSE);
settings_add_bool("dcc", "dcc_autoaccept_lowports", FALSE);
settings_add_bool("dcc", "dcc_autoresume", FALSE);
- settings_add_int("dcc", "dcc_autoget_max_size", 0);
+ settings_add_size("dcc", "dcc_autoget_max_size", 0);
settings_add_str("dcc", "dcc_autoget_masks", "");
signal_add_last("dcc request", (SIGNAL_FUNC) sig_dcc_request);
diff --git a/src/irc/dcc/dcc.c b/src/irc/dcc/dcc.c
index 44ef3f20..e3e04107 100644
--- a/src/irc/dcc/dcc.c
+++ b/src/irc/dcc/dcc.c
@@ -420,7 +420,7 @@ static int dcc_timeout_func(void)
GSList *tmp, *next;
time_t now;
- now = time(NULL)-settings_get_int("dcc_timeout");
+ now = time(NULL)-settings_get_time("dcc_timeout")/1000;
for (tmp = dcc_conns; tmp != NULL; tmp = next) {
DCC_REC *dcc = tmp->data;
@@ -514,7 +514,7 @@ void irc_dcc_init(void)
dcc_timeouttag = g_timeout_add(1000, (GSourceFunc) dcc_timeout_func, NULL);
settings_add_str("dcc", "dcc_port", "0");
- settings_add_int("dcc", "dcc_timeout", 300);
+ settings_add_time("dcc", "dcc_timeout", "5min");
settings_add_str("dcc", "dcc_own_ip", "");
signal_add("event connected", (SIGNAL_FUNC) sig_connected);
diff --git a/src/irc/flood/autoignore.c b/src/irc/flood/autoignore.c
index 7d409b6c..f029a39f 100644
--- a/src/irc/flood/autoignore.c
+++ b/src/irc/flood/autoignore.c
@@ -32,7 +32,8 @@
void autoignore_update(IGNORE_REC *rec, int level)
{
rec->level |= level;
- rec->unignore_time = time(NULL)+settings_get_int("autoignore_time");
+ rec->unignore_time = time(NULL) +
+ settings_get_time("autoignore_time")/1000;
ignore_update_rec(rec);
}
@@ -46,7 +47,8 @@ void autoignore_add(IRC_SERVER_REC *server, char *mask, int level)
rec->mask = g_strdup(mask);
rec->servertag = g_strdup(server->tag);
rec->level = level;
- rec->unignore_time = time(NULL)+settings_get_int("autoignore_time");
+ rec->unignore_time = time(NULL) +
+ settings_get_time("autoignore_time")/1000;
ignore_add_rec(rec);
}
@@ -60,7 +62,7 @@ static void sig_flood(IRC_SERVER_REC *server, const char *nick, const char *host
g_return_if_fail(IS_IRC_SERVER(server));
level = GPOINTER_TO_INT(levelp);
- check_level = level2bits(settings_get_str("autoignore_level"));
+ check_level = settings_get_level("autoignore_level");
mask = g_strdup_printf("%s!%s", nick, host);
if (level & check_level) {
@@ -75,8 +77,8 @@ static void sig_flood(IRC_SERVER_REC *server, const char *nick, const char *host
void autoignore_init(void)
{
- settings_add_int("flood", "autoignore_time", 300);
- settings_add_str("flood", "autoignore_level", "");
+ settings_add_time("flood", "autoignore_time", "5min");
+ settings_add_level("flood", "autoignore_level", "");
signal_add("flood", (SIGNAL_FUNC) sig_flood);
}
diff --git a/src/irc/notifylist/notify-commands.c b/src/irc/notifylist/notify-commands.c
index c51f33f3..1fb485e3 100644
--- a/src/irc/notifylist/notify-commands.c
+++ b/src/irc/notifylist/notify-commands.c
@@ -26,9 +26,7 @@
#include "notifylist.h"
-#define DEFAULT_NOTIFY_IDLE_TIME 60
-
-/* SYNTAX: NOTIFY [-away] [-idle [<minutes>]] <mask> [<ircnets>] */
+/* SYNTAX: NOTIFY [-away] [-idle [<time>]] <mask> [<ircnets>] */
static void cmd_notify(gchar *data)
{
GHashTable *optlist;
@@ -46,14 +44,16 @@ static void cmd_notify(gchar *data)
idletime = g_hash_table_lookup(optlist, "idle");
if (idletime == NULL)
idle_check_time = 0;
+ else if (*idletime == '\0')
+ idle_check_time = settings_get_time("notify_idle_time");
else {
- idle_check_time = is_numeric(idletime, 0) ? (atoi(idletime)*60) :
- (settings_get_int("notify_idle_time")*60);
+ if (!parse_time_interval(idletime, &idle_check_time))
+ cmd_return_error(CMDERR_INVALID_TIME);
}
away_check = g_hash_table_lookup(optlist, "away") != NULL;
notifylist_remove(mask);
- notifylist_add(mask, ircnets, away_check, idle_check_time);
+ notifylist_add(mask, ircnets, away_check, idle_check_time/1000);
cmd_params_free(free_arg);
}
@@ -77,11 +77,11 @@ static void cmd_unnotify(const char *data)
void notifylist_commands_init(void)
{
- settings_add_int("misc", "notify_idle_time", DEFAULT_NOTIFY_IDLE_TIME);
+ settings_add_time("misc", "notify_idle_time", "hour");
command_bind("notify", NULL, (SIGNAL_FUNC) cmd_notify);
command_bind("unnotify", NULL, (SIGNAL_FUNC) cmd_unnotify);
- command_set_options("notify", "@idle away");
+ command_set_options("notify", "-idle away");
}
void notifylist_commands_deinit(void)
diff --git a/src/irc/notifylist/notify-ison.c b/src/irc/notifylist/notify-ison.c
index 2de398a1..e27e3d60 100644
--- a/src/irc/notifylist/notify-ison.c
+++ b/src/irc/notifylist/notify-ison.c
@@ -29,8 +29,8 @@
#include "notifylist.h"
-#define DEFAULT_NOTIFY_CHECK_TIME 60
-#define DEFAULT_NOTIFY_WHOIS_TIME (60*5)
+#define DEFAULT_NOTIFY_CHECK_TIME "1min"
+#define DEFAULT_NOTIFY_WHOIS_TIME "5min"
typedef struct {
char *nick;
@@ -321,15 +321,16 @@ static void event_ison(IRC_SERVER_REC *server, const char *data)
static void read_settings(void)
{
if (notify_tag != -1) g_source_remove(notify_tag);
- notify_tag = g_timeout_add(1000*settings_get_int("notify_check_time"), (GSourceFunc) notifylist_timeout_func, NULL);
+ notify_tag = g_timeout_add(settings_get_time("notify_check_time"),
+ (GSourceFunc) notifylist_timeout_func, NULL);
- notify_whois_time = settings_get_int("notify_whois_time");
+ notify_whois_time = settings_get_time("notify_whois_time")/1000;
}
void notifylist_ison_init(void)
{
- settings_add_int("misc", "notify_check_time", DEFAULT_NOTIFY_CHECK_TIME);
- settings_add_int("misc", "notify_whois_time", DEFAULT_NOTIFY_WHOIS_TIME);
+ settings_add_time("misc", "notify_check_time", DEFAULT_NOTIFY_CHECK_TIME);
+ settings_add_time("misc", "notify_whois_time", DEFAULT_NOTIFY_WHOIS_TIME);
notify_tag = -1;
read_settings();
diff --git a/src/perl/common/Settings.xs b/src/perl/common/Settings.xs
index a7c5e6f6..f545befd 100644
--- a/src/perl/common/Settings.xs
+++ b/src/perl/common/Settings.xs
@@ -99,6 +99,21 @@ settings_set_bool(key, value)
char *key
int value
+int
+settings_set_time(key, value)
+ char *key
+ char *value
+
+int
+settings_set_level(key, value)
+ char *key
+ char *value
+
+int
+settings_set_size(key, value)
+ char *key
+ char *value
+
void
settings_add_str(section, key, def)
char *section
@@ -127,6 +142,33 @@ CODE:
settings_add_bool_module(MODULE_NAME"/scripts", section, key, def);
void
+settings_add_time(section, key, def)
+ char *section
+ char *key
+ char *def
+CODE:
+ perl_settings_add(key);
+ settings_add_time_module(MODULE_NAME"/scripts", section, key, def);
+
+void
+settings_add_level(section, key, def)
+ char *section
+ char *key
+ char *def
+CODE:
+ perl_settings_add(key);
+ settings_add_level_module(MODULE_NAME"/scripts", section, key, def);
+
+void
+settings_add_size(section, key, def)
+ char *section
+ char *key
+ char *def
+CODE:
+ perl_settings_add(key);
+ settings_add_size_module(MODULE_NAME"/scripts", section, key, def);
+
+void
settings_remove(key)
char *key
CODE: