/* 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
}
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
return;
#endif
- irc_account(user, stamp);
+ irc_account(user, stamp, timestamp);
user->modes |= FLAGS_STAMPED;
}
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; n<jf_used; n++) {
}
void
-SetChannelTopic(struct chanNode *channel, struct userNode *user, const char *topic, int announce)
+SetChannelTopic(struct chanNode *channel, struct userNode *service, struct userNode *user, const char *topic, int announce)
{
unsigned int n;
struct modeNode *mn;
if (announce) {
/* We don't really care if a local user messes with the topic,
* so don't call the tf_list functions. */
- irc_topic(user, channel, topic);
+ irc_topic(service, user, channel, topic);
} else {
for (n=0; n<tf_used; n++)
if (tf_list[n](user, channel, old_topic))
{
unsigned int n;
struct modeNode *mn = NULL;
+
+ verify(channel);
+ verify(channel->members.list);
+ verify(user);
+ verify(user->channels.list);
if (channel->members.used < user->channels.used) {
for (n=0; n<channel->members.used; n++) {
+ verify(channel->members.list[n]);
if (user == channel->members.list[n]->user) {
mn = channel->members.list[n];
break;
}
} else {
for (n=0; n<user->channels.used; n++) {
+ verify(user->channels.list[n]);
if (channel == user->channels.list[n]->channel) {
mn = user->channels.list[n];
break;
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; n<channel->members.used; n++) {
+ verify(channel->members.list[n]);
+ if (user == channel->members.list[n]->user) {
+ return(user);
+ }
+ }
+ } else {
+ for (n=0; n<user->channels.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*)