Add channel_metadata_time_add, a local only form of metadata that stores time values. And use it to make +J work.

This commit is contained in:
B.Greenham 2010-03-05 00:18:56 -05:00
parent 402f23b9e0
commit 104becbf7f
7 changed files with 68 additions and 6 deletions

View File

@ -96,6 +96,7 @@ struct c_Metadata
{ {
const char *name; const char *name;
const char *value; const char *value;
time_t timevalue;
}; };
#define BANLEN 195 #define BANLEN 195
@ -308,4 +309,10 @@ extern struct Metadata *channel_metadata_add(struct Channel *target, const char
extern void channel_metadata_delete(struct Channel *target, const char *name, int propegate); extern void channel_metadata_delete(struct Channel *target, const char *name, int propegate);
extern struct Metadata *channel_metadata_find(struct Channel *target, const char *name); extern struct Metadata *channel_metadata_find(struct Channel *target, const char *name);
extern struct Metadata *channel_metadata_add(struct Channel *target, const char *name, const char *value, int propegate);
extern struct Metadata *channel_metadata_time_add(struct Channel *target, const char *name, time_t value);
extern void channel_metadata_delete(struct Channel *target, const char *name, int propegate);
extern struct Metadata *channel_metadata_find(struct Channel *target, const char *name);
#endif /* INCLUDED_channel_h */ #endif /* INCLUDED_channel_h */

View File

@ -307,6 +307,8 @@ extern const char *form_str(int);
#define ERR_NOCTCP 492 #define ERR_NOCTCP 492
#define ERR_KICKNOREJOIN 495
#define ERR_UMODEUNKNOWNFLAG 501 #define ERR_UMODEUNKNOWNFLAG 501
#define ERR_USERSDONTMATCH 502 #define ERR_USERSDONTMATCH 502

View File

@ -68,6 +68,7 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p
char *comment; char *comment;
const char *name; const char *name;
char *p = NULL; char *p = NULL;
char *text = rb_strdup("");
const char *user; const char *user;
static char buf[BUFSIZE]; static char buf[BUFSIZE];
int is_override = 0; int is_override = 0;
@ -228,6 +229,12 @@ m_kick(struct Client *client_p, struct Client *source_p, int parc, const char *p
":%s KICK %s %s :%s", ":%s KICK %s %s :%s",
use_id(source_p), chptr->chname, use_id(who), comment); use_id(source_p), chptr->chname, use_id(who), comment);
remove_user_from_channel(msptr); remove_user_from_channel(msptr);
rb_sprintf(text, "K%s",who->name);
/* we don't need to track NOKICK stuff unless it's our client being kicked */
if(MyClient(source_p) && chptr->mode.mode & MODE_NOREJOIN)
channel_metadata_time_add(chptr, text, rb_current_time());
} }
else if (MyClient(source_p)) else if (MyClient(source_p))
sendto_one_numeric(source_p, ERR_USERNOTINCHANNEL, sendto_one_numeric(source_p, ERR_USERNOTINCHANNEL,

View File

@ -829,6 +829,9 @@ can_join(struct Client *source_p, struct Channel *chptr, char *key)
int use_althost = 0; int use_althost = 0;
int i = 0; int i = 0;
hook_data_channel moduledata; hook_data_channel moduledata;
struct c_Metadata *md;
struct DictionaryIter iter;
char *text = rb_strdup("");
s_assert(source_p->localClient != NULL); s_assert(source_p->localClient != NULL);
@ -857,6 +860,24 @@ can_join(struct Client *source_p, struct Channel *chptr, char *key)
if((is_banned(chptr, source_p, NULL, src_host, src_iphost)) == CHFL_BAN) if((is_banned(chptr, source_p, NULL, src_host, src_iphost)) == CHFL_BAN)
return (ERR_BANNEDFROMCHAN); return (ERR_BANNEDFROMCHAN);
rb_sprintf(text, "K%s",source_p->name);
if(md = channel_metadata_find(chptr, text))
{
if(md->timevalue + ConfigChannel.kick_no_rejoin_time > rb_current_time())
{
return ERR_KICKNOREJOIN;
}
/* cleanup the channel's kicknorejoin metadata. */
DICTIONARY_FOREACH(md, &iter, chptr->c_metadata)
{
text = rb_strdup(md->name);
if((text[0] == 'K') && (md->timevalue + ConfigChannel.kick_no_rejoin_time > rb_current_time()))
channel_metadata_delete(chptr, md->name, 1);
}
}
if(chptr->mode.mode & MODE_INVITEONLY) if(chptr->mode.mode & MODE_INVITEONLY)
{ {
RB_DLINK_FOREACH(invite, source_p->user->invited.head) RB_DLINK_FOREACH(invite, source_p->user->invited.head)
@ -1912,7 +1933,7 @@ void user_join(struct Client * client_p, struct Client * source_p, const char *
struct Metadata * struct Metadata *
channel_metadata_add(struct Channel *target, const char *name, const char *value, int propegate) channel_metadata_add(struct Channel *target, const char *name, const char *value, int propegate)
{ {
struct Metadata *md; struct c_Metadata *md;
md = rb_malloc(sizeof(struct Metadata)); md = rb_malloc(sizeof(struct Metadata));
md->name = rb_strdup(name); md->name = rb_strdup(name);
@ -1927,6 +1948,29 @@ channel_metadata_add(struct Channel *target, const char *name, const char *value
return md; return md;
} }
/*
* channel_metadata_time_add
*
* inputs - pointer to channel struct
* - name of metadata item you wish to add
* - time_t you wish to add
* output - none
* side effects - metadata is added to the channel in question
*/
struct Metadata *
channel_metadata_time_add(struct Channel *target, const char *name, time_t value)
{
struct c_Metadata *md;
md = rb_malloc(sizeof(struct c_Metadata));
md->name = rb_strdup(name);
md->timevalue = value;
irc_dictionary_add(target->c_metadata, md->name, md);
return md;
}
/* /*
* channel_metadata_delete * channel_metadata_delete
* *
@ -1939,7 +1983,7 @@ channel_metadata_add(struct Channel *target, const char *name, const char *value
void void
channel_metadata_delete(struct Channel *target, const char *name, int propegate) channel_metadata_delete(struct Channel *target, const char *name, int propegate)
{ {
struct Metadata *md = channel_metadata_find(target, name); struct c_Metadata *md = channel_metadata_find(target, name);
if(!md) if(!md)
return; return;

View File

@ -516,7 +516,7 @@ static const char * replies[] = {
/* 492 ERR_NOCTCP */ ":Can't send CTCP to %s (+C set)", /* 492 ERR_NOCTCP */ ":Can't send CTCP to %s (+C set)",
/* 493 */ NULL, /* 493 */ NULL,
/* 494 */ NULL, /* 494 */ NULL,
/* 495 */ NULL, /* 495 ERR_KICKNOREJOIN */ ":%s 495 %s %s :Cannot rejoin channel so soon after being kicked (+J set)",
/* 496 */ NULL, /* 496 */ NULL,
/* 497 */ NULL, /* 497 */ NULL,
/* 498 */ NULL, /* 498 */ NULL,

View File

@ -2269,7 +2269,7 @@ static struct ConfEntry conf_channel_table[] =
{ "use_forward", CF_YESNO, NULL, 0, &ConfigChannel.use_forward }, { "use_forward", CF_YESNO, NULL, 0, &ConfigChannel.use_forward },
{ "use_local_channels", CF_YESNO, NULL, 0, &ConfigChannel.use_local_channels }, { "use_local_channels", CF_YESNO, NULL, 0, &ConfigChannel.use_local_channels },
{ "resv_forcepart", CF_YESNO, NULL, 0, &ConfigChannel.resv_forcepart }, { "resv_forcepart", CF_YESNO, NULL, 0, &ConfigChannel.resv_forcepart },
{ "kick_no_rejoin_time", CF_INT, NULL, 0, &ConfigChannel.kick_no_rejoin_time }, { "kick_no_rejoin_time", CF_TIME, NULL, 0, &ConfigChannel.kick_no_rejoin_time },
{ "exempt_cmode_c", CF_YESNO, NULL, 0, &ConfigChannel.exempt_cmode_c }, { "exempt_cmode_c", CF_YESNO, NULL, 0, &ConfigChannel.exempt_cmode_c },
{ "exempt_cmode_C", CF_YESNO, NULL, 0, &ConfigChannel.exempt_cmode_C }, { "exempt_cmode_C", CF_YESNO, NULL, 0, &ConfigChannel.exempt_cmode_C },
{ "exempt_cmode_D", CF_YESNO, NULL, 0, &ConfigChannel.exempt_cmode_D }, { "exempt_cmode_D", CF_YESNO, NULL, 0, &ConfigChannel.exempt_cmode_D },

View File

@ -589,6 +589,8 @@ burst_TS6(struct Client *client_p)
DICTIONARY_FOREACH(md, &iter, chptr->c_metadata) DICTIONARY_FOREACH(md, &iter, chptr->c_metadata)
{ {
/* don't bother bursting +J metadata */
if(!(md->name[0] == 'K'))
sendto_one(client_p, ":%s ENCAP * METADATA ADD %s %s :%s", sendto_one(client_p, ":%s ENCAP * METADATA ADD %s %s :%s",
use_id(target_p), use_id(target_p), md->name, md->value); use_id(target_p), use_id(target_p), md->name, md->value);
} }