/* $Id: channels.h 295 2005-12-16 19:44:24Z tsaviran $
 * -------------------------------------------------------
 * Copyright 2002-2005 Tommi Saviranta <wnd@iki.fi>
 *	(C) 2002 Lee Hardy <lee@leeh.co.uk>
 *	(C) 1998-2002 Sebastian Kienzl <zap@riot.org>
 * -------------------------------------------------------
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#ifndef CHANNELS_H_
#define CHANNELS_H_

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif /* ifdef HAVE_CONFIG_H */

#include "llist.h"
#include "conntype.h"

#include <stdio.h>



enum {
	LIST_PASSIVE = 0,
	LIST_ACTIVE,
	LIST_OLD
};

#define JOINTRIES_UNSET	-1

struct channel_log {
	int	type;
	FILE	*file;
};

typedef struct {
	/*
	 * name is the real name of a channel. This field should differ from
	 * simplename only in case of a safe channel or such. If the channel is
	 * a safe channel, name can be something like "!ONZGEfoobar" while
	 * simplename is "!foobar". simplename is used e.g. for logging and
	 * joining the channel. name and simplename will point to the same
	 * address if they're the same; simple_set will be set once it have
	 * been checked if they should differ.
	 */
	char		*name;
	char		*simple_name;
	int		name_set;	/* real name have been set */
	int		simple_set;	/* simple name have been set */
	char		*topic;		/* Channel topic. */
	char		*topicwho;	/* Topic set by ... */
	char		*topicwhen;	/* Topic set in ... */
	char		*key;		/* Channel key. */
	int		jointries;	/* Remaining # of jointries */
#ifdef AUTOMODE
	/*
	 * oper:
	 *   0: not operator and we know it
	 *   1: operator and we know it
	 *  -1: don't know if we're operator
	 */
	int		oper;
	llist_list	mode_queue;	/* Queue for channel modes. */
#endif /* AUTOMODE */
#ifdef QUICKLOG
	int		hasqlog;	/* Channel has qlog. */
#endif /* QUICKLOG */
	struct channel_log	*log;
} channel_type;

struct			llist_list;
extern llist_list	active_channels;
extern llist_list	passive_channels;
extern llist_list	old_channels;

void channel_free(channel_type *chan);
channel_type *channel_add(const char *channel, const char *key, const int list);
void channel_rem(channel_type *chptr, const int list);
void channel_drop_all(const int keeplog);
channel_type *channel_find(const char *name, int list);
void channel_join_list(const int list, const int rejoin,
		connection_type *client);

int channel_is_name(const char *name);

void channel_topic(channel_type *chan, const char *topic);
void channel_when(channel_type *chan, const char *who, const char *when);

char *channel_simplify_name(const char *chan);

#ifdef OBSOLETE
extern unsigned int channel_hash(char *);
#endif /* OBSOLETE */



#endif /* ifndef CHANNELS_H_ */


syntax highlighted by Code2HTML, v. 0.9.1