mirror of
https://github.com/osmarks/ngircd.git
synced 2025-02-02 02:29:08 +00:00
Channel autojoin functionality
This commit is contained in:
parent
3b70f4ba0c
commit
cfd7d4288e
@ -395,6 +395,9 @@
|
|||||||
# Default: none.
|
# Default: none.
|
||||||
;KeyFile = :ETCDIR:/#chan.key
|
;KeyFile = :ETCDIR:/#chan.key
|
||||||
|
|
||||||
|
# Autojoin - set to yes to force all users to join this channel on connect
|
||||||
|
;Autojoin = yes
|
||||||
|
|
||||||
[Channel]
|
[Channel]
|
||||||
# More [Channel] sections, if you like ...
|
# More [Channel] sections, if you like ...
|
||||||
|
|
||||||
|
@ -517,6 +517,9 @@ invite list, exception list) is supported.
|
|||||||
This option can be specified multiple times, evaluated top to bottom.
|
This option can be specified multiple times, evaluated top to bottom.
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
|
\fBAutojoin\fR (boolean)
|
||||||
|
Forces users to join this channel on connect. Users must have access to the channel to make it work.
|
||||||
|
.TP
|
||||||
\fBKeyFile\fR (string)
|
\fBKeyFile\fR (string)
|
||||||
Path and file name of a "key file" containing individual channel keys for
|
Path and file name of a "key file" containing individual channel keys for
|
||||||
different users. The file consists of plain text lines with the following
|
different users. The file consists of plain text lines with the following
|
||||||
|
@ -186,8 +186,6 @@ Channel_InitPredefined( void )
|
|||||||
new_chan->name, new_chan->modes, new_chan->key,
|
new_chan->name, new_chan->modes, new_chan->key,
|
||||||
new_chan->maxusers);
|
new_chan->maxusers);
|
||||||
}
|
}
|
||||||
if (channel_count)
|
|
||||||
array_free(&Conf_Channels);
|
|
||||||
|
|
||||||
/* Make sure the local &SERVER channel exists */
|
/* Make sure the local &SERVER channel exists */
|
||||||
if (!Channel_Search("&SERVER")) {
|
if (!Channel_Search("&SERVER")) {
|
||||||
|
@ -2000,6 +2000,9 @@ Handle_CHANNEL(const char *File, int Line, char *Var, char *Arg)
|
|||||||
Config_Error_TooLong(File, Line, Var);
|
Config_Error_TooLong(File, Line, Var);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if( strcasecmp( Var, "Autojoin" ) == 0 )
|
||||||
|
/* Check autojoin */
|
||||||
|
chan->autojoin = Check_ArgIsTrue(Arg);
|
||||||
if( strcasecmp( Var, "Key" ) == 0 ) {
|
if( strcasecmp( Var, "Key" ) == 0 ) {
|
||||||
/* Initial Channel Key (mode k) */
|
/* Initial Channel Key (mode k) */
|
||||||
len = strlcpy(chan->key, Arg, sizeof(chan->key));
|
len = strlcpy(chan->key, Arg, sizeof(chan->key));
|
||||||
|
@ -87,6 +87,7 @@ struct Conf_Channel {
|
|||||||
char key[CLIENT_PASS_LEN]; /**< Channel key ("password", mode "k" ) */
|
char key[CLIENT_PASS_LEN]; /**< Channel key ("password", mode "k" ) */
|
||||||
char topic[COMMAND_LEN]; /**< Initial topic */
|
char topic[COMMAND_LEN]; /**< Initial topic */
|
||||||
char keyfile[512]; /**< Path and name of channel key file */
|
char keyfile[512]; /**< Path and name of channel key file */
|
||||||
|
bool autojoin; /**< 1 to make all users autojoin this channel */
|
||||||
unsigned long maxusers; /**< User limit for this channel, mode "l" */
|
unsigned long maxusers; /**< User limit for this channel, mode "l" */
|
||||||
unsigned int modes_num; /**< Number of channel modes to evaluate */
|
unsigned int modes_num; /**< Number of channel modes to evaluate */
|
||||||
};
|
};
|
||||||
|
@ -201,9 +201,40 @@ Login_User_PostAuth(CLIENT *Client)
|
|||||||
} else
|
} else
|
||||||
IRC_SetPenalty(Client, 1);
|
IRC_SetPenalty(Client, 1);
|
||||||
|
|
||||||
|
/* Autojoin clients to the channels */
|
||||||
|
Login_Autojoin(Client);
|
||||||
|
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Autojoin clients to the channels set by administrator
|
||||||
|
* If autojoin is not set in Config or the channel is not available for search - do nothing
|
||||||
|
*
|
||||||
|
**/
|
||||||
|
GLOBAL void
|
||||||
|
Login_Autojoin(CLIENT *Client)
|
||||||
|
{
|
||||||
|
/** make an autojoin to each channel that is good for it **/
|
||||||
|
REQUEST Req;
|
||||||
|
const struct Conf_Channel *conf_chan;
|
||||||
|
size_t i, n, channel_count = array_length(&Conf_Channels, sizeof(*conf_chan));
|
||||||
|
conf_chan = array_start(&Conf_Channels);
|
||||||
|
assert(channel_count == 0 || conf_chan != NULL);
|
||||||
|
|
||||||
|
for (i = 0; i < channel_count; i++, conf_chan++) {
|
||||||
|
if(!conf_chan->autojoin)
|
||||||
|
continue;
|
||||||
|
if (!Channel_Search(conf_chan->name))
|
||||||
|
continue;
|
||||||
|
Req.prefix = Client_ID(Client_ThisServer());
|
||||||
|
Req.command = "JOIN";
|
||||||
|
Req.argc = 1;
|
||||||
|
Req.argv[0] = conf_chan->name;
|
||||||
|
IRC_JOIN(Client, &Req);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef PAM
|
#ifdef PAM
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
GLOBAL bool Login_User PARAMS((CLIENT * Client));
|
GLOBAL bool Login_User PARAMS((CLIENT * Client));
|
||||||
GLOBAL bool Login_User_PostAuth PARAMS((CLIENT *Client));
|
GLOBAL bool Login_User_PostAuth PARAMS((CLIENT *Client));
|
||||||
|
GLOBAL void Login_Autojoin PARAMS((CLIENT *Client));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user