X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=src%2Fchanserv.c;h=3ddfaf6874822d50451a596628451b53c73dcef1;hb=18a22dac8302182719e030976fa1c045bde8a461;hp=887b95aaa3c4e8ffb8b40ed44f42d253894bf04a;hpb=76a803c329f3dd218758bd03609065d3beeb190f;p=srvx.git diff --git a/src/chanserv.c b/src/chanserv.c index 887b95a..3ddfaf6 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -43,6 +43,7 @@ #define KEY_DNR_EXPIRE_FREQ "dnr_expire_freq" #define KEY_MAX_CHAN_USERS "max_chan_users" #define KEY_MAX_CHAN_BANS "max_chan_bans" +#define KEY_MIN_TIME_BANS "min_time_bans" #define KEY_NICK "nick" #define KEY_OLD_CHANSERV_NAME "old_chanserv_name" #define KEY_8BALL_RESPONSES "8ball" @@ -581,6 +582,7 @@ static struct unsigned int max_owned; unsigned int max_chan_users; unsigned int max_chan_bans; + unsigned int min_time_bans; unsigned int max_userinfo_length; unsigned int revoke_mode_a; @@ -3476,7 +3478,7 @@ eject_user(struct userNode *user, struct chanNode *channel, unsigned int argc, c { duration = ParseInterval(argv[2]); - if(duration < 15) + if(duration < chanserv_conf.min_time_bans) { reply("CSMSG_DURATION_TOO_LOW"); free(ban); @@ -4167,6 +4169,8 @@ cmd_list_users(struct userNode *user, struct chanNode *channel, unsigned int arg ary[1] = uData->handle->handle; if(uData->present) ary[2] = "Here"; + else if(HANDLE_FLAGGED(uData->handle, NETWORK)) + ary[2] = "Here"; else if(!uData->seen) ary[2] = "Never"; else @@ -4174,6 +4178,12 @@ cmd_list_users(struct userNode *user, struct chanNode *channel, unsigned int arg ary[2] = strdup(ary[2]); if(IsUserSuspended(uData)) ary[3] = "Suspended"; + else if(HANDLE_FLAGGED(uData->handle, OPER)) + ary[3] = "Operator"; + else if(HANDLE_FLAGGED(uData->handle, HELPING)) + ary[3] = "Staff"; + else if(HANDLE_FLAGGED(uData->handle, NETWORK)) + ary[3] = "Network"; else if(HANDLE_FLAGGED(uData->handle, FROZEN)) ary[3] = "Vacation"; else if(HANDLE_FLAGGED(uData->handle, BOT)) @@ -6573,13 +6583,23 @@ static CHANSERV_FUNC(cmd_giveownership) return 1; } +static void +chanserv_expire_user_suspension(void *data) +{ + struct userData *target = data; + + target->expires = 0; + target->flags &= ~USER_SUSPENDED; +} + static CHANSERV_FUNC(cmd_suspend) { struct handle_info *hi; struct userData *actor, *real_actor, *target; unsigned int override = 0; + time_t expiry; - REQUIRE_PARAMS(2); + REQUIRE_PARAMS(3); if(!(hi = modcmd_get_handle_info(user, argv[1]))) return 0; actor = GetChannelUser(channel->channel_info, user->handle_info); real_actor = GetChannelAccess(channel->channel_info, user->handle_info); @@ -6605,6 +6625,24 @@ static CHANSERV_FUNC(cmd_suspend) } if(!real_actor || target->access >= real_actor->access) override = CMD_LOG_OVERRIDE; + if(!strcmp(argv[2], "0")) + expiry = 0; + else + { + unsigned int duration; + if(!(duration = ParseInterval(argv[2]))) + { + reply("MSG_INVALID_DURATION", argv[2]); + return 0; + } + expiry = now + duration; + } + + target->expires = expiry; + + if(target->expires) + timeq_add(target->expires, chanserv_expire_user_suspension, target); + target->flags |= USER_SUSPENDED; reply("CSMSG_USER_SUSPENDED", hi->handle, channel->name); return 1 | override; @@ -6637,6 +6675,7 @@ static CHANSERV_FUNC(cmd_unsuspend) } if(!real_actor || target->access >= real_actor->access) override = CMD_LOG_OVERRIDE; + timeq_del(target->expires, chanserv_expire_user_suspension, target, 0); target->flags &= ~USER_SUSPENDED; scan_user_presence(target, NULL); reply("CSMSG_USER_UNSUSPENDED", hi->handle, channel->name); @@ -7849,6 +7888,8 @@ chanserv_conf_read(void) chanserv_conf.max_chan_users = str ? atoi(str) : 512; str = database_get_data(conf_node, KEY_MAX_CHAN_BANS, RECDB_QSTRING); chanserv_conf.max_chan_bans = str ? atoi(str) : 512; + str = database_get_data(conf_node, KEY_MIN_TIME_BANS, RECDB_QSTRING); + chanserv_conf.min_time_bans = str ? atoi(str) : 5; str = database_get_data(conf_node, KEY_MAX_USERINFO_LENGTH, RECDB_QSTRING); chanserv_conf.max_userinfo_length = str ? atoi(str) : 400; str = database_get_data(conf_node, KEY_NICK, RECDB_QSTRING); @@ -8023,7 +8064,7 @@ user_read_helper(const char *key, struct record_data *rd, struct chanData *chan) { struct handle_info *handle; struct userData *uData; - char *seen, *inf, *flags, *voted, *votefor; + char *seen, *inf, *flags, *voted, *votefor, *expires; unsigned long last_seen; unsigned short access_level; @@ -8044,6 +8085,7 @@ user_read_helper(const char *key, struct record_data *rd, struct chanData *chan) seen = database_get_data(rd->d.object, KEY_SEEN, RECDB_QSTRING); last_seen = seen ? strtoul(seen, NULL, 0) : now; flags = database_get_data(rd->d.object, KEY_FLAGS, RECDB_QSTRING); + expires = database_get_data(rd->d.object, KEY_EXPIRES, RECDB_QSTRING); voted = database_get_data(rd->d.object, KEY_VOTE_VOTED, RECDB_QSTRING); votefor = database_get_data(rd->d.object, KEY_VOTE_VOTEDFOR, RECDB_QSTRING); handle = get_handle_info(key); @@ -8055,6 +8097,15 @@ user_read_helper(const char *key, struct record_data *rd, struct chanData *chan) uData = add_channel_user(chan, handle, access_level, last_seen, inf); uData->flags = flags ? strtoul(flags, NULL, 0) : 0; + uData->expires = expires ? (signed)strtoul(expires, NULL, 0) : 0; + + if((uData->flags & USER_SUSPENDED) && uData->expires) + { + if(uData->expires > now) + timeq_add(uData->expires, chanserv_expire_user_suspension, uData); + else + uData->flags &= ~USER_SUSPENDED; + } if(chan->vote) { uData->voted = voted ? strtoul(voted, NULL, 0) : 0; uData->votefor = votefor ? strtoul(votefor, NULL, 0) : 0; @@ -8472,6 +8523,8 @@ chanserv_write_users(struct saxdb_context *ctx, struct userData *uData) saxdb_write_int(ctx, KEY_SEEN, uData->seen); if(uData->flags) saxdb_write_int(ctx, KEY_FLAGS, uData->flags); + if(uData->expires) + saxdb_write_int(ctx, KEY_EXPIRES, uData->expires); if(uData->channel->vote && uData->voted) saxdb_write_int(ctx, KEY_VOTE_VOTED, uData->voted); if(uData->channel->vote && uData->votefor)