diff options
| author | michi <michi+ngircd@dataswamp.org> | 2020-02-19 09:26:21 +0000 |
|---|---|---|
| committer | Alexander Barton <alex@barton.de> | 2020-03-28 23:47:21 +0100 |
| commit | decf98d5efce97f1abfbd125a9aae92a2e94b89f (patch) | |
| tree | 861cb634573cb18a93481d73af6e363b38bb6fe0 /src | |
| parent | a77353361bc11a25f30bd1ea13d54cb92e1134a4 (diff) | |
| download | ngircd-decf98d5efce97f1abfbd125a9aae92a2e94b89f.tar.gz ngircd-decf98d5efce97f1abfbd125a9aae92a2e94b89f.zip | |
Evaluate initial channel modes
Allow setting arbitrary channel modes in the config file. Closes #55.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ngircd/channel.c | 25 | ||||
| -rw-r--r-- | src/ngircd/conf.h | 2 |
2 files changed, 22 insertions, 5 deletions
diff --git a/src/ngircd/channel.c b/src/ngircd/channel.c index 53c385c2..b317ada4 100644 --- a/src/ngircd/channel.c +++ b/src/ngircd/channel.c @@ -36,6 +36,8 @@ #include "log.h" #include "messages.h" #include "match.h" +#include "parse.h" +#include "irc-mode.h" #define REMOVE_PART 0 #define REMOVE_QUIT 1 @@ -93,8 +95,10 @@ GLOBAL void Channel_InitPredefined( void ) { CHANNEL *new_chan; + REQUEST Req; const struct Conf_Channel *conf_chan; - const char *c; + char *c; + char modes[COMMAND_LEN], name[CHANNEL_NAME_LEN]; size_t i, channel_count = array_length(&Conf_Channels, sizeof(*conf_chan)); conf_chan = array_start(&Conf_Channels); @@ -134,9 +138,22 @@ Channel_InitPredefined( void ) if (conf_chan->topic[0]) Channel_SetTopic(new_chan, NULL, conf_chan->topic); - c = conf_chan->modes; - while (*c) - Channel_ModeAdd(new_chan, *c++); + /* Evaluate modes string with a fake request */ + if(conf_chan->modes[0]) { + strlcpy(modes, conf_chan->modes, sizeof(modes)); + strlcpy(name, conf_chan->name, sizeof(name)); + Log(LOG_DEBUG, "Evaluate \"MODE %s %s\".", name, modes); + Req.argc = 0; + Req.argv[Req.argc++] = name; + Req.prefix = Client_ID(Client_ThisServer()); + Req.command = "MODE"; + c = strtok(modes, " "); + while (c && Req.argc<15) { + Req.argv[Req.argc++] = c; + c = strtok(0, " "); + } + IRC_MODE(Client_ThisServer(), &Req); + } Channel_SetKey(new_chan, conf_chan->key); Channel_SetMaxUsers(new_chan, conf_chan->maxusers); diff --git a/src/ngircd/conf.h b/src/ngircd/conf.h index 8029c0f7..900338dd 100644 --- a/src/ngircd/conf.h +++ b/src/ngircd/conf.h @@ -83,7 +83,7 @@ struct SSLOptions { /** Pre-defined channels */ struct Conf_Channel { char name[CHANNEL_NAME_LEN]; /**< Name of the channel */ - char modes[CHANNEL_MODE_LEN]; /**< Initial channel modes */ + char modes[COMMAND_LEN]; /**< Initial channel modes to evaluate */ char key[CLIENT_PASS_LEN]; /**< Channel key ("password", mode "k" ) */ char topic[COMMAND_LEN]; /**< Initial topic */ char keyfile[512]; /**< Path and name of channel key file */ |