[srvx-commits] CVS: services/src chanserv.h,1.40,1.41 chanserv.c,1.241,1.242
Brought to you by:
entrope
|
From: Entrope <en...@us...> - 2002-07-06 05:10:35
|
Update of /cvsroot/srvx/services/src
In directory usw-pr-cvs1:/tmp/cvs-serv22950/src
Modified Files:
chanserv.h chanserv.c
Log Message:
add history of channel suspensions (kept until the channel is unregged)
Index: chanserv.h
===================================================================
RCS file: /cvsroot/srvx/services/src/chanserv.h,v
retrieving revision 1.40
retrieving revision 1.41
diff -C2 -r1.40 -r1.41
*** chanserv.h 6 Jul 2002 00:32:09 -0000 1.40
--- chanserv.h 6 Jul 2002 05:10:31 -0000 1.41
***************
*** 122,125 ****
--- 122,128 ----
#define USER_FLAGS_SIZE 7
+ #define IsUserAutoOp(USER) (!((USER)->flags & USER_AUTO_OP))
+ #define IsUserSuspended(USER) ((USER)->flags & USER_SUSPENDED)
+
struct userData
{
***************
*** 164,172 ****
{
struct chanData *cData;
-
char *name;
char *suspender;
char *reason;
! time_t expires;
};
--- 167,175 ----
{
struct chanData *cData;
char *name;
char *suspender;
char *reason;
! time_t issued, expires, revoked;
! struct suspended *previous;
};
Index: chanserv.c
===================================================================
RCS file: /cvsroot/srvx/services/src/chanserv.c,v
retrieving revision 1.241
retrieving revision 1.242
diff -C2 -r1.241 -r1.242
*** chanserv.c 6 Jul 2002 00:32:09 -0000 1.241
--- chanserv.c 6 Jul 2002 05:10:31 -0000 1.242
***************
*** 113,117 ****
--- 113,121 ----
#define KEY_REGISTERED "registered"
#define KEY_REGISTRAR "registrar"
+ #define KEY_SUSPENDED "suspended"
+ #define KEY_PREVIOUS "previous"
#define KEY_SUSPENDER "suspender"
+ #define KEY_ISSUED "issued"
+ #define KEY_REVOKED "revoked"
#define KEY_SUSPEND_EXPIRES "suspend_expires"
#define KEY_SUSPEND_REASON "suspend_reason"
***************
*** 338,343 ****
#define CSMSG_CHANNEL_USERS "$b%s Count:%*s$b%i"
#define CSMSG_CHANNEL_REGISTRAR "$bRegistrar: $b%s"
! #define CSMSG_CHANNEL_SUSPENDED "$bSuspended: $bBy %s (%s)"
! #define CSMSG_CHANNEL_SUSPENDED2 "$bSuspended: $bBy %s (%s; %s remaining)"
#define CSMSG_CHANNEL_REGISTERED "$bRegistered: $b%s ago."
#define CSMSG_CHANNEL_VISITED "$bVisited: $b%s ago."
--- 342,355 ----
#define CSMSG_CHANNEL_USERS "$b%s Count:%*s$b%i"
#define CSMSG_CHANNEL_REGISTRAR "$bRegistrar: $b%s"
! #define CSMSG_CHANNEL_SUSPENDED "$b%s$b is suspended:"
! #define CSMSG_CHANNEL_HISTORY "Suspension history for $b%s$b:"
! #define CSMSG_CHANNEL_SUSPENDED_0 " by %s: %s"
! #define CSMSG_CHANNEL_SUSPENDED_1 " by %s; expires in %s: %s"
! #define CSMSG_CHANNEL_SUSPENDED_2 " by %s; expired %s ago: %s"
! #define CSMSG_CHANNEL_SUSPENDED_3 " by %s; revoked %s ago: %s"
! #define CSMSG_CHANNEL_SUSPENDED_4 " %s ago by %s: %s"
! #define CSMSG_CHANNEL_SUSPENDED_5 " %s ago by %s; expires in %s: %s"
! #define CSMSG_CHANNEL_SUSPENDED_6 " %s ago by %s; expired %s ago: %s"
! #define CSMSG_CHANNEL_SUSPENDED_7 " %s ago by %s; revoked %s ago: %s"
#define CSMSG_CHANNEL_REGISTERED "$bRegistered: $b%s ago."
#define CSMSG_CHANNEL_VISITED "$bVisited: $b%s ago."
***************
*** 666,670 ****
for(uData = channel->users; uData; uData = uData->next)
{
! if((uData->handle == handle) && (allow_suspended || !(uData->flags & USER_SUSPENDED))) break;
}
--- 678,682 ----
for(uData = channel->users; uData; uData = uData->next)
{
! if((uData->handle == handle) && (allow_suspended || !IsUserSuspended(uData))) break;
}
***************
*** 1734,1744 ****
{
struct chanNode *cNode = dict_find(channels, channel->suspended->name, NULL);
! struct suspended *suspended = channel->suspended;
! free(suspended->name);
! free(suspended->suspender);
! if(suspended->reason) free(suspended->reason);
! if(suspended->expires) timeq_del(suspended->expires, chanserv_expire_suspension, suspended, 0);
! free(suspended);
if(cNode)
--- 1746,1760 ----
{
struct chanNode *cNode = dict_find(channels, channel->suspended->name, NULL);
! struct suspended *suspended, *next_suspended;
! for(suspended = channel->suspended; suspended; suspended = next_suspended)
! {
! next_suspended = suspended->previous;
! free(suspended->name);
! free(suspended->suspender);
! free(suspended->reason);
! if(suspended->expires) timeq_del(suspended->expires, chanserv_expire_suspension, suspended, 0);
! free(suspended);
! }
if(cNode)
***************
*** 1855,1859 ****
if(!check_user_level(user, channel, channel->channel_info->options[optAutoOp], 0, 0)) return 0;
uData = GetChannelAccess(channel->channel_info, user->handle_info);
! return !uData || !(uData->flags & USER_AUTO_OP);
}
--- 1871,1876 ----
if(!check_user_level(user, channel, channel->channel_info->options[optAutoOp], 0, 0)) return 0;
uData = GetChannelAccess(channel->channel_info, user->handle_info);
! /* uData may be NULL if optAutoOp is "all" */
! return !uData || IsUserAutoOp(uData);
}
***************
*** 2096,2101 ****
if((suspended = dict_find(sChannels, argv[1], NULL)))
{
! char *reason = suspended->reason ? suspended->reason : "no reason";
! chanserv_notice(user, CSMSG_SUSPENDED_REASON, argv[1], reason);
return 0;
}
--- 2113,2117 ----
if((suspended = dict_find(sChannels, argv[1], NULL)))
{
! chanserv_notice(user, CSMSG_SUSPENDED_REASON, argv[1], suspended->reason);
return 0;
}
***************
*** 2144,2148 ****
if(new_channel)
{
! channel = AddChannel(argv[1], now, "", "", 0, NULL);
AddChannelUser(chanserv, channel);
}
--- 2160,2164 ----
if(new_channel)
{
! channel = AddChannel(argv[1], now, NULL, NULL, 0, NULL);
AddChannelUser(chanserv, channel);
}
***************
*** 2269,2273 ****
}
! target = AddChannel(argv[1], now, "", "", 0, NULL);
AddChannelUser(chanserv, target);
new_channel = 1;
--- 2285,2289 ----
}
! target = AddChannel(argv[1], now, NULL, NULL, 0, NULL);
AddChannelUser(chanserv, target);
new_channel = 1;
***************
*** 3074,3078 ****
|| IsSuspended(cList->channel)
|| !GetUserMode(cList->channel->channel, user)
! || (cList->user->flags & USER_SUSPENDED))
{
continue;
--- 3090,3094 ----
|| IsSuspended(cList->channel)
|| !GetUserMode(cList->channel->channel, user)
! || IsUserSuspended(cList->user))
{
continue;
***************
*** 3695,3702 ****
}
! if (uData->flags & USER_AUTO_OP) {
! chanserv_notice(user, ((uData->access > ulPeon) ? CSMSG_AUTOOP_OFF : CSMSG_AUTOVOICE_OFF), channel->name);
! } else {
chanserv_notice(user, ((uData->access > ulPeon) ? CSMSG_AUTOOP_ON : CSMSG_AUTOVOICE_ON), channel->name);
}
return 1;
--- 3711,3718 ----
}
! if (IsUserAutoOp(uData)) {
chanserv_notice(user, ((uData->access > ulPeon) ? CSMSG_AUTOOP_ON : CSMSG_AUTOVOICE_ON), channel->name);
+ } else {
+ chanserv_notice(user, ((uData->access > ulPeon) ? CSMSG_AUTOOP_OFF : CSMSG_AUTOVOICE_OFF), channel->name);
}
return 1;
***************
*** 3833,3837 ****
/* Likewise, only say it's suspended if the user has active
* access in that channel or it's their own entry. */
! if((uData->flags & USER_SUSPENDED)
&& (GetChannelUser(channel->channel_info, user->handle_info)
|| (user->handle_info == uData->handle)))
--- 3849,3853 ----
/* Likewise, only say it's suspended if the user has active
* access in that channel or it's their own entry. */
! if(IsUserSuspended(uData)
&& (GetChannelUser(channel->channel_info, user->handle_info)
|| (user->handle_info == uData->handle)))
***************
*** 4352,4355 ****
--- 4368,4425 ----
}
+ static void
+ show_suspension_info(struct userNode *user, struct suspended *suspended)
+ {
+ unsigned int combo;
+ char buf1[INTERVALLEN], buf2[INTERVALLEN];
+
+ /* We display things based on two dimensions:
+ * - Issue time: present or absent
+ * - Expiration: revoked, expired, expires in future, or indefinite expiration
+ * (in order of precedence, so something both expired and revoked
+ * only counts as revoked)
+ */
+ combo = (suspended->issued ? 4 : 0)
+ + (suspended->revoked ? 3 : suspended->expires ? ((suspended->expires < now) ? 2 : 1) : 0);
+ switch(combo) {
+ case 0: /* no issue time, indefinite expiration */
+ chanserv_notice(user, CSMSG_CHANNEL_SUSPENDED_0, suspended->suspender, suspended->reason);
+ break;
+ case 1: /* no issue time, expires in future */
+ intervalString(buf1, suspended->expires-now);
+ chanserv_notice(user, CSMSG_CHANNEL_SUSPENDED_1, suspended->suspender, buf1, suspended->reason);
+ break;
+ case 2: /* no issue time, expired */
+ intervalString(buf1, now-suspended->expires);
+ chanserv_notice(user, CSMSG_CHANNEL_SUSPENDED_2, suspended->suspender, buf1, suspended->reason);
+ break;
+ case 3: /* no issue time, revoked */
+ intervalString(buf1, now-suspended->revoked);
+ chanserv_notice(user, CSMSG_CHANNEL_SUSPENDED_3, suspended->suspender, buf1, suspended->reason);
+ break;
+ case 4: /* issue time set, indefinite expiration */
+ intervalString(buf1, now-suspended->issued);
+ chanserv_notice(user, CSMSG_CHANNEL_SUSPENDED_4, buf1, suspended->suspender, suspended->reason);
+ break;
+ case 5: /* issue time set, expires in future */
+ intervalString(buf1, now-suspended->issued);
+ intervalString(buf1, suspended->expires-now);
+ chanserv_notice(user, CSMSG_CHANNEL_SUSPENDED_5, buf1, suspended->suspender, buf2, suspended->reason);
+ break;
+ case 6: /* issue time set, expired */
+ intervalString(buf1, now-suspended->issued);
+ intervalString(buf2, now-suspended->expires);
+ chanserv_notice(user, CSMSG_CHANNEL_SUSPENDED_6, buf1, suspended->suspender, buf2, suspended->reason);
+ break;
+ case 7: /* issue time set, revoked */
+ intervalString(buf1, now-suspended->issued);
+ intervalString(buf2, now-suspended->revoked);
+ chanserv_notice(user, CSMSG_CHANNEL_SUSPENDED_7, buf1, suspended->suspender, buf2, suspended->reason);
+ default:
+ log(CS_LOG, LOG_ERROR, "Invalid combo value %d in show_suspension_info()\n", combo);
+ return;
+ }
+ }
+
static CHANSERV_FUNC(cmd_info)
{
***************
*** 4357,4369 ****
struct userData *uData;
struct chanData *cData;
! struct suspended *sChan = NULL;
struct do_not_register *dnr;
enum userLevel access;
- int i;
- (void)argc;(void)argv;
if(channel)
{
cData = channel->channel_info;
}
else if(argc > 1)
--- 4427,4439 ----
struct userData *uData;
struct chanData *cData;
! struct suspended *sChan;
struct do_not_register *dnr;
+ const char *chan_name;
enum userLevel access;
if(channel)
{
cData = channel->channel_info;
+ sChan = NULL;
}
else if(argc > 1)
***************
*** 4389,4393 ****
}
! chanserv_notice(user, CSMSG_CHANNEL_INFO, channel ? channel->name : sChan->name);
uData = GetChannelUser(cData, user->handle_info);
--- 4459,4464 ----
}
! chan_name = channel ? channel->name : sChan->name;
! chanserv_notice(user, CSMSG_CHANNEL_INFO, chan_name);
uData = GetChannelUser(cData, user->handle_info);
***************
*** 4402,4427 ****
for(access = USER_LEVEL_HIGHEST; access >= USER_LEVEL_LOWEST; access--)
{
! i = PADLEN - strlen(accessTitles[access]);
! chanserv_notice(user, CSMSG_CHANNEL_USERS, accessTitles[access], i, "", cData->userCount[access]);
}
chanserv_notice(user, CSMSG_CHANNEL_USERS, "Total User", PADLEN - 10, "", cData->userCount[0]);
chanserv_notice(user, CSMSG_CHANNEL_BANS, cData->banCount);
- if(IsSuspended(cData))
- {
- struct suspended *suspended = cData->suspended;
- char *reason = suspended->reason ? suspended->reason : "No reason";
- if(suspended->expires)
- {
- intervalString(buffer, suspended->expires - now);
- chanserv_notice(user, CSMSG_CHANNEL_SUSPENDED2, cData->suspended->suspender, reason, buffer);
- }
- else
- {
- chanserv_notice(user, CSMSG_CHANNEL_SUSPENDED, cData->suspended->suspender, reason);
- }
- }
-
intervalString(buffer, now - cData->visited);
chanserv_notice(user, CSMSG_CHANNEL_VISITED, buffer);
--- 4473,4483 ----
for(access = USER_LEVEL_HIGHEST; access >= USER_LEVEL_LOWEST; access--)
{
! int ii = PADLEN - strlen(accessTitles[access]);
! chanserv_notice(user, CSMSG_CHANNEL_USERS, accessTitles[access], ii, "", cData->userCount[access]);
}
chanserv_notice(user, CSMSG_CHANNEL_USERS, "Total User", PADLEN - 10, "", cData->userCount[0]);
chanserv_notice(user, CSMSG_CHANNEL_BANS, cData->banCount);
intervalString(buffer, now - cData->visited);
chanserv_notice(user, CSMSG_CHANNEL_VISITED, buffer);
***************
*** 4437,4441 ****
}
! if((dnr = chanserv_is_dnr(channel ? channel->name : sChan->name, NULL)))
{
chanserv_notice(user, CSMSG_DNR_INFO, dnr->chan_name, dnr->setter, dnr->reason);
--- 4493,4497 ----
}
! if((dnr = chanserv_is_dnr(chan_name, NULL)))
{
chanserv_notice(user, CSMSG_DNR_INFO, dnr->chan_name, dnr->setter, dnr->reason);
***************
*** 4443,4446 ****
--- 4499,4516 ----
}
+ if(IsSuspended(cData)) chanserv_notice(user, CSMSG_CHANNEL_SUSPENDED, chan_name);
+ if((cData->suspended) && (uData || IsPrivileged(user)))
+ {
+ struct suspended *suspended;
+ if(!IsSuspended(cData)) chanserv_notice(user, CSMSG_CHANNEL_HISTORY, chan_name);
+ for(suspended = cData->suspended; suspended; suspended = suspended->previous)
+ {
+ show_suspension_info(user, suspended);
+ }
+ }
+ else if(IsSuspended(cData))
+ {
+ show_suspension_info(user, sChan);
+ }
return 1;
}
***************
*** 4980,4983 ****
--- 5050,5054 ----
struct chanNode *channel;
+ if(!suspended->expires || (now < suspended->expires)) suspended->revoked = now;
dict_remove(sChannels, suspended->name);
channel = AddChannel(suspended->name, now, NULL, NULL, 0, NULL);
***************
*** 4987,4995 ****
suspended->cData->channel = channel;
suspended->cData->flags &= ~CHANNEL_SUSPENDED;
- suspended->cData->suspended = NULL;
- free(suspended->name);
- free(suspended->suspender);
- free(suspended->reason);
- free(suspended);
}
--- 5058,5061 ----
***************
*** 5031,5036 ****
unsplit_string(argv + 2, argc - 2);
! suspended = malloc(sizeof(struct suspended));
!
suspended->name = strdup(channel->name);
suspended->suspender = strdup(user->handle_info->handle);
--- 5097,5103 ----
unsplit_string(argv + 2, argc - 2);
! suspended = calloc(1, sizeof(*suspended));
! suspended->revoked = 0;
! suspended->issued = now;
suspended->name = strdup(channel->name);
suspended->suspender = strdup(user->handle_info->handle);
***************
*** 5042,5045 ****
--- 5109,5113 ----
suspended->reason = strdup(argv[2]);
suspended->cData = channel->channel_info;
+ suspended->previous = suspended->cData->suspended;
suspended->cData->suspended = suspended;
suspended->cData->channel = NULL;
***************
*** 5069,5073 ****
if(channel)
{
! if(!channel->channel_info || !IsSuspended(channel->channel_info) || !channel->channel_info->suspended)
{
chanserv_notice(user, CSMSG_NOT_SUSPENDED, channel->name);
--- 5137,5141 ----
if(channel)
{
! if(!channel->channel_info || !IsSuspended(channel->channel_info))
{
chanserv_notice(user, CSMSG_NOT_SUSPENDED, channel->name);
***************
*** 5084,5092 ****
timeq_del(suspended->expires, chanserv_expire_suspension, suspended, 0);
chanserv_expire_suspension(suspended);
! if(!channel)
! {
! channel = GetChannel(argv[1]);
! }
!
chanserv_notice(user, CSMSG_UNSUSPENDED, channel->name);
sprintf(message, "%s unsuspended by %s.", channel->name, user->handle_info->handle);
--- 5152,5156 ----
timeq_del(suspended->expires, chanserv_expire_suspension, suspended, 0);
chanserv_expire_suspension(suspended);
! if(!channel) channel = GetChannel(argv[1]);
chanserv_notice(user, CSMSG_UNSUSPENDED, channel->name);
sprintf(message, "%s unsuspended by %s.", channel->name, user->handle_info->handle);
***************
*** 6172,6179 ****
char change[10];
! if(IsSuspended(cData))
! {
! return;
! }
channel = cData->channel;
--- 6236,6240 ----
char change[10];
! if(IsSuspended(cData)) return;
channel = cData->channel;
***************
*** 6231,6253 ****
unsigned int ii;
! if(!channel->channel_info)
{
! if(channel->members.used < 3)
! {
! struct suspended *suspended = dict_find(sChannels, channel->name, NULL);
!
! if(!suspended)
! {
! return;
! }
!
! channel->channel_info = suspended->cData;
! suspended->cData->channel = channel;
! }
!
! return;
}
! if(IsLocal(user) || IsSuspended(channel->channel_info)) return;
cData = channel->channel_info;
--- 6292,6304 ----
unsigned int ii;
! if(!channel->channel_info && (channel->members.used < 3))
{
! struct suspended *suspended = dict_find(sChannels, channel->name, NULL);
! if(!suspended) return;
! channel->channel_info = suspended->cData;
! suspended->cData->channel = channel;
}
! if(IsLocal(user) || !channel->channel_info || IsSuspended(channel->channel_info)) return;
cData = channel->channel_info;
***************
*** 6352,6384 ****
handle = user->handle_info;
! if(handle && (uData = GetTrueChannelAccess(cData, handle)))
{
! /* Ops and above were handled by the above case. */
! if((uData->access == ulPeon)
! && !(uData->flags & USER_SUSPENDED)
! && !(cData->flags & CHANNEL_VOICE_ALL)
! && !(uData->flags & USER_AUTO_OP))
! {
! AddChannelVoice(1, &user, channel, chanserv, 1);
! }
! if((uData->access >= ulMaster) && !(uData->flags & USER_SUSPENDED))
! {
! cData->visited = now;
! }
! if(uData->info
! && !(uData->flags & USER_SUSPENDED)
&& (cData->flags & CHANNEL_INFO_LINES)
&& ((now - uData->seen) >= chanserv_conf.info_delay)
&& !uData->present)
! {
! char info[MAXLEN];
! sprintf(info, "[%s] %s", user->nick, uData->info);
! irc_privmsg(chanserv, channel->name, info);
! }
!
! uData->seen = now;
! uData->present = 1;
if(cData->user_greeting)
--- 6403,6431 ----
handle = user->handle_info;
! uData = handle ? GetTrueChannelAccess(cData, handle) : NULL;
! if(uData && !IsUserSuspended(uData))
{
! /* Ops and above were handled by the above case. */
! if((uData->access == ulPeon)
! && IsUserAutoOp(uData)
! && !(cData->flags & CHANNEL_VOICE_ALL))
! {
! AddChannelVoice(1, &user, channel, chanserv, 1);
! }
! if(uData->access >= ulMaster)
! {
! cData->visited = now;
! }
! if(uData->info
&& (cData->flags & CHANNEL_INFO_LINES)
&& ((now - uData->seen) >= chanserv_conf.info_delay)
&& !uData->present)
! {
! char info[MAXLEN];
! sprintf(info, "[%s] %s", user->nick, uData->info);
! irc_privmsg(chanserv, channel->name, info);
! }
if(cData->user_greeting)
***************
*** 6387,6393 ****
}
}
! else if(cData->greeting)
{
! chanserv_notice(user, "(%s) %s", channel->name, cData->greeting);
}
}
--- 6434,6449 ----
}
}
! else
! {
! /* Not a user, or a suspended user. */
! if(cData->greeting)
! {
! chanserv_notice(user, "(%s) %s", channel->name, cData->greeting);
! }
! }
! if(uData)
{
! uData->seen = now;
! uData->present = 1;
}
}
***************
*** 6419,6423 ****
}
else if((channel->user->access == ulPeon)
! && !(channel->user->flags & USER_AUTO_OP))
{
AddChannelVoice(1, &user, cn, chanserv, 1);
--- 6475,6479 ----
}
else if((channel->user->access == ulPeon)
! && IsUserAutoOp(channel->user))
{
AddChannelVoice(1, &user, cn, chanserv, 1);
***************
*** 6606,6613 ****
for(cData = channelList; cData; cData = cData->next)
{
! if(!IsSuspended(cData))
! {
! cData->may_opchan = 1;
! }
}
}
--- 6662,6666 ----
for(cData = channelList; cData; cData = cData->next)
{
! if(!IsSuspended(cData)) cData->may_opchan = 1;
}
}
***************
*** 6958,7006 ****
}
static int
chanserv_channel_read(const char *key, struct record_data *hir)
{
! struct chanNode *cNode = NULL;
! struct chanData *cData = NULL;
! dict_t channel, users, bans, notes;
dict_iterator_t it;
! char *flags, *topic, *topic_mask, *modes, *data;
! char *greeting, *user_greeting, *registrar, *suspender;
! char *options;
unsigned long num_flags;
! unsigned int max;
! time_t registered, visited, expires = 0;
! channel = hir->d.object;
! users = database_get_data(channel, KEY_USERS, RECDB_OBJECT);
!
! if(!users)
! {
! log(CS_LOG, LOG_ERROR, "%s has no users.\n", key);
! return 0;
! }
!
! bans = database_get_data(channel, KEY_BANS, RECDB_OBJECT);
! notes = database_get_data(channel, KEY_NOTES, RECDB_OBJECT);
! flags = database_get_data(channel, KEY_FLAGS, RECDB_QSTRING);
! topic = database_get_data(channel, KEY_TOPIC, RECDB_QSTRING);
! topic_mask = database_get_data(channel, KEY_TOPIC_MASK, RECDB_QSTRING);
! registrar = database_get_data(channel, KEY_REGISTRAR, RECDB_QSTRING);
! greeting = database_get_data(channel, KEY_GREETING, RECDB_QSTRING);
! user_greeting = database_get_data(channel, KEY_USER_GREETING, RECDB_QSTRING);
! modes = database_get_data(channel, KEY_MODES, RECDB_QSTRING);
!
! data = database_get_data(channel, KEY_REGISTERED, RECDB_QSTRING);
! registered = data ? (signed)strtoul(data, NULL, 0) : now;
!
! data = database_get_data(channel, KEY_VISITED, RECDB_QSTRING);
! visited = data ? (signed)strtoul(data, NULL, 0) : now;
! data = database_get_data(channel, KEY_MAX, RECDB_QSTRING);
! max = data ? strtoul(data, NULL, 0) : 0;
! if(flags)
{
! num_flags = base64toint(flags, FLAGS_STRING_LENGTH);
! options = flags + FLAGS_STRING_LENGTH;
}
else
--- 7011,7051 ----
}
+ static struct suspended *
+ chanserv_read_suspended(dict_t obj)
+ {
+ struct suspended *suspended = calloc(1, sizeof(*suspended));
+ char *str;
+ dict_t previous;
+
+ str = database_get_data(obj, KEY_EXPIRES, RECDB_QSTRING);
+ suspended->expires = str ? strtoul(str, NULL, 0) : 0;
+ str = database_get_data(obj, KEY_REVOKED, RECDB_QSTRING);
+ suspended->revoked = str ? strtoul(str, NULL, 0) : 0;
+ str = database_get_data(obj, KEY_ISSUED, RECDB_QSTRING);
+ suspended->issued = str ? strtoul(str, NULL, 0) : 0;
+ suspended->suspender = strdup(database_get_data(obj, KEY_SUSPENDER, RECDB_QSTRING));
+ suspended->reason = strdup(database_get_data(obj, KEY_REASON, RECDB_QSTRING));
+ previous = database_get_data(obj, KEY_PREVIOUS, RECDB_OBJECT);
+ suspended->previous = previous ? chanserv_read_suspended(previous) : NULL;
+ return suspended;
+ }
+
static int
chanserv_channel_read(const char *key, struct record_data *hir)
{
! struct chanNode *cNode;
! struct chanData *cData;
! dict_t channel, obj;
dict_iterator_t it;
! char *str, *registrar, *options;
unsigned long num_flags;
! struct suspended *suspended;
! channel = hir->d.object;
! if((str = database_get_data(channel, KEY_FLAGS, RECDB_QSTRING)))
{
! num_flags = base64toint(str, FLAGS_STRING_LENGTH);
! options = str + FLAGS_STRING_LENGTH;
}
else
***************
*** 7009,7028 ****
options = CHANNEL_DEFAULT_OPTIONS;
}
if(num_flags & CHANNEL_SUSPENDED)
{
! char *exp_text;
! exp_text = database_get_data(channel, KEY_SUSPEND_EXPIRES, RECDB_QSTRING);
! if(exp_text)
! {
! expires = strtoul(exp_text, NULL, 0);
! if(expires <= now)
! {
! num_flags &= ~CHANNEL_SUSPENDED;
! }
! }
}
!
! if(!(num_flags & CHANNEL_SUSPENDED))
{
cNode = AddChannel(key, now, NULL, NULL, 0, NULL);
--- 7054,7099 ----
options = CHANNEL_DEFAULT_OPTIONS;
}
+
+ if((obj = database_get_data(hir->d.object, KEY_SUSPENDED, RECDB_OBJECT)))
+ {
+ suspended = chanserv_read_suspended(obj);
+ /* We could use suspended->expires and suspended->revoked to
+ * set the CHANNEL_SUSPENDED flag, but we don't. */
+ }
+ else if(num_flags & CHANNEL_SUSPENDED)
+ {
+ suspended = calloc(1, sizeof(*suspended));
+ suspended->issued = 0;
+ suspended->revoked = 0;
+ str = database_get_data(hir->d.object, KEY_SUSPEND_EXPIRES, RECDB_QSTRING);
+ suspended->expires = str ? strtoul(str, NULL, 0) : 0;
+ suspended->suspender = strdup(database_get_data(hir->d.object, KEY_SUSPENDER, RECDB_QSTRING));
+ str = database_get_data(hir->d.object, KEY_SUSPEND_REASON, RECDB_QSTRING);
+ suspended->reason = strdup(str ? str : "No reason");
+ suspended->previous = NULL;
+ }
+ else
+ {
+ suspended = NULL;
+ }
+
+ if((num_flags & CHANNEL_SUSPENDED)
+ && suspended->expires
+ && (suspended->expires < now))
+ {
+ num_flags &= ~CHANNEL_SUSPENDED;
+ }
if(num_flags & CHANNEL_SUSPENDED)
{
! suspended->name = strdup(key);
! dict_insert(sChannels, suspended->name, suspended);
! if(suspended->expires > now)
! {
! timeq_add(suspended->expires, chanserv_expire_suspension, suspended);
! }
! cNode = NULL;
}
! else
{
cNode = AddChannel(key, now, NULL, NULL, 0, NULL);
***************
*** 7031,7034 ****
--- 7102,7106 ----
}
+ registrar = database_get_data(channel, KEY_REGISTRAR, RECDB_QSTRING);
cData = register_channel(cNode, registrar, options, num_flags);
if(!cData)
***************
*** 7038,7082 ****
}
! if(num_flags & CHANNEL_SUSPENDED)
! {
! struct suspended *suspended;
! char *reason;
! suspended = malloc(sizeof(struct suspended));
! if((suspended->expires = expires))
! {
! timeq_add(suspended->expires, chanserv_expire_suspension, suspended);
! }
! suspended->name = strdup(key);
! suspender = database_get_data(channel, KEY_SUSPENDER, RECDB_QSTRING);
! suspended->suspender = strdup(suspender);
! reason = database_get_data(channel, KEY_SUSPEND_REASON, RECDB_QSTRING);
! suspended->reason = reason ? strdup(reason) : NULL;
!
! suspended->cData = cData;
! cData->suspended = suspended;
!
! dict_insert(sChannels, suspended->name, suspended);
! }
!
! cData->registered = registered;
! cData->visited = visited;
! cData->max = max;
!
! if(greeting) cData->greeting = strdup(greeting);
! if(user_greeting) cData->user_greeting = strdup(user_greeting);
! if(topic_mask) cData->topic_mask = strdup(topic_mask);
! if(topic) safestrncpy(cData->topic, topic, sizeof(cData->topic));
!
! if(modes)
{
unsigned char *split_modes[3];
int count;
! count = split_line(modes, 0, 3, split_modes);
parse_mode_lock(split_modes, count, cData);
}
! for(it = dict_first(users); it; it = iter_next(it))
{
user_read_helper(iter_key(it), iter_data(it), cData);
--- 7110,7140 ----
}
! if ((cData->suspended = suspended)) suspended->cData = cData;
! str = database_get_data(channel, KEY_REGISTERED, RECDB_QSTRING);
! cData->registered = str ? strtoul(str, NULL, 0) : now;
! str = database_get_data(channel, KEY_VISITED, RECDB_QSTRING);
! cData->visited = str ? strtoul(str, NULL, 0) : now;
! str = database_get_data(channel, KEY_MAX, RECDB_QSTRING);
! cData->max = str ? strtoul(str, NULL, 0) : 0;
! str = database_get_data(channel, KEY_GREETING, RECDB_QSTRING);
! cData->greeting = str ? strdup(str) : NULL;
! str = database_get_data(channel, KEY_USER_GREETING, RECDB_QSTRING);
! cData->user_greeting = str ? strdup(str) : NULL;
! str = database_get_data(channel, KEY_TOPIC_MASK, RECDB_QSTRING);
! cData->topic_mask = str ? strdup(str) : NULL;
! str = database_get_data(channel, KEY_TOPIC, RECDB_QSTRING);
! if (str) safestrncpy(cData->topic, str, sizeof(cData->topic));
! if((str = database_get_data(channel, KEY_MODES, RECDB_QSTRING)))
{
unsigned char *split_modes[3];
int count;
! count = split_line(str, 0, ArrayLength(split_modes), split_modes);
parse_mode_lock(split_modes, count, cData);
}
! obj = database_get_data(channel, KEY_USERS, RECDB_OBJECT);
! for(it = dict_first(obj); it; it = iter_next(it))
{
user_read_helper(iter_key(it), iter_data(it), cData);
***************
*** 7094,7103 ****
}
! for(it = dict_first(bans); it; it = iter_next(it))
{
ban_read_helper(iter_key(it), iter_data(it), cData);
}
! for(it = dict_first(notes); it; it = iter_next(it))
{
struct note_type *ntype = dict_find(note_types, iter_key(it), NULL);
--- 7152,7163 ----
}
! obj = database_get_data(channel, KEY_BANS, RECDB_OBJECT);
! for(it = dict_first(obj); it; it = iter_next(it))
{
ban_read_helper(iter_key(it), iter_data(it), cData);
}
! obj = database_get_data(channel, KEY_NOTES, RECDB_OBJECT);
! for(it = dict_first(obj); it; it = iter_next(it))
{
struct note_type *ntype = dict_find(note_types, iter_key(it), NULL);
***************
*** 7291,7294 ****
--- 7351,7384 ----
}
+ static dict_t
+ chanserv_write_suspended(struct suspended *susp)
+ {
+ dict_t obj = alloc_object();
+ char buf[16];
+
+ dict_insert(obj, KEY_SUSPENDER, alloc_record_data_qstring(susp->suspender));
+ dict_insert(obj, KEY_REASON, alloc_record_data_qstring(susp->reason));
+ if(susp->issued)
+ {
+ sprintf(buf, FMT_TIME_T, susp->issued);
+ dict_insert(obj, KEY_ISSUED, alloc_record_data_qstring(buf));
+ }
+ if(susp->expires)
+ {
+ sprintf(buf, FMT_TIME_T, susp->expires);
+ dict_insert(obj, KEY_EXPIRES, alloc_record_data_qstring(buf));
+ }
+ if(susp->revoked)
+ {
+ sprintf(buf, FMT_TIME_T, susp->revoked);
+ dict_insert(obj, KEY_REVOKED, alloc_record_data_qstring(buf));
+ }
+ if (susp->previous)
+ {
+ dict_insert(obj, KEY_PREVIOUS, alloc_record_data_object(chanserv_write_suspended(susp->previous)));
+ }
+ return obj;
+ }
+
static void
chanserv_write_channel(dict_t db, struct chanData *channel)
***************
*** 7331,7346 ****
}
! if(IsSuspended(channel))
{
! dict_insert(obj, KEY_SUSPENDER, alloc_record_data_qstring(channel->suspended->suspender));
! if(channel->suspended->expires)
! {
! snprintf(str, sizeof(str), FMT_TIME_T, channel->suspended->expires);
! dict_insert(obj, KEY_SUSPEND_EXPIRES, alloc_record_data_qstring(str));
! }
! if(channel->suspended->reason)
! {
! dict_insert(obj, KEY_SUSPEND_REASON, alloc_record_data_qstring(channel->suspended->reason));
! }
}
--- 7421,7427 ----
}
! if(channel->suspended)
{
! dict_insert(obj, KEY_SUSPENDED, alloc_record_data_object(chanserv_write_suspended(channel->suspended)));
}
|