X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/a32da4c70ca85b879f8162469ae37ffeca500b99..db4e7826812cf256f6382cafcf93c3986040d842:/src/hash.c diff --git a/src/hash.c b/src/hash.c index e5ecd47..6e1005f 100644 --- a/src/hash.c +++ b/src/hash.c @@ -1,7 +1,7 @@ /* hash.c - IRC network state database * Copyright 2000-2004 srvx Development Team * - * This file is part of srvx. + * This file is part of x3. * * srvx is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -225,7 +225,7 @@ call_account_func(struct userNode *user, const char *stamp) } void -StampUser(struct userNode *user, const char *stamp) +StampUser(struct userNode *user, const char *stamp, time_t timestamp) { #ifdef WITH_PROTOCOL_P10 /* The P10 protocol says we can't stamp users who already @@ -234,7 +234,7 @@ StampUser(struct userNode *user, const char *stamp) return; #endif - irc_account(user, stamp); + irc_account(user, stamp, timestamp); user->modes |= FLAGS_STAMPED; } @@ -503,7 +503,8 @@ AddChannelUser(struct userNode *user, struct chanNode* channel) modeList_append(&channel->members, mNode); modeList_append(&user->channels, mNode); - if (channel->members.used == 1) + if (channel->members.used == 1 + && !(channel->modes & MODE_REGISTERED)) mNode->modes |= MODE_CHANOP; for (n=0; nmembers.list); + verify(user); + verify(user->channels.list); if (channel->members.used < user->channels.used) { for (n=0; nmembers.used; n++) { + verify(channel->members.list[n]); if (user == channel->members.list[n]->user) { mn = channel->members.list[n]; break; @@ -740,6 +747,7 @@ GetUserMode(struct chanNode *channel, struct userNode *user) } } else { for (n=0; nchannels.used; n++) { + verify(user->channels.list[n]); if (channel == user->channels.list[n]->channel) { mn = user->channels.list[n]; break; @@ -749,6 +757,32 @@ GetUserMode(struct chanNode *channel, struct userNode *user) return mn; } +struct userNode *IsInChannel(struct chanNode *channel, struct userNode *user) +{ + unsigned int n; + + verify(channel); + verify(channel->members.list); + verify(user); + verify(user->channels.list); + if (channel->members.used < user->channels.used) { + for (n=0; nmembers.used; n++) { + verify(channel->members.list[n]); + if (user == channel->members.list[n]->user) { + return(user); + } + } + } else { + for (n=0; nchannels.used; n++) { + verify(user->channels.list[n]); + if (channel == user->channels.list[n]->channel) { + return(user); + } + } + } + return NULL; +} + DEFINE_LIST(userList, struct userNode*) DEFINE_LIST(modeList, struct modeNode*) DEFINE_LIST(banList, struct banNode*)