/* ARISA - Nick Hashing Structure and Function Definitions */
/* Copyright (C) 2003 Carl Ritson */

#define _ARISA_NICKHASH_H

enum mode_t { 
	MODE_UNKNOWN	= 0x0,
	MODE_REG	= 0x0,
	MODE_VOICE	= 0x2,
	MODE_HOP	= 0x4,
	MODE_OP		= 0x8,
	MODE_ANTIKICK	= 0x10,
	MODE_OWNER	= 0x20,
	MODE_ADD, MODE_DEL, MODE_SET
};

/* Structures */
typedef struct chanmode_t {
	channel_t	*channel;
	int		mode;
} chanmode_t;

typedef struct nickmode_t {
	char		*nick;
	int		mode;
} nickmode_t;

typedef struct nh_bucket_t {
	unsigned long 	hash;
	char 		*nick;
	chanmode_t	*cms;
	int		no_cms;
	struct nh_bucket_t *next;
} nh_bucket_t;

typedef struct nickhash_t {
	lock_t		lock;
	nh_bucket_t 	**table;
	unsigned int 	size;
	unsigned int	no_buckets;
} nickhash_t;

/* Functions */
int		mode_from_char(char c);
int 		mode_from_str(const char *str);
char		*str_from_mode(char *buffer, size_t bufsize, int mode);
nickhash_t 	*nickhash_init(void);
void		nickhash_flush(nickhash_t *ht);
void 		nickhash_free(nickhash_t *ht);
int 		nickhash_present_mode(nickhash_t *ht, channel_t *chan,
							const char *nick, 
							int *mode);
int 		nickhash_present(nickhash_t *ht, channel_t *chan, 
							const char *nick);
void		nickhash_add_mode(nickhash_t *ht, channel_t *chan, 
							const char *nick,
							int mode);
void		nickhash_add(nickhash_t *ht, channel_t *chan, const char *nick);
void		nickhash_del(nickhash_t *ht, channel_t *chan, const char *nick);
void 		nickhash_flush_channel(nickhash_t *ht, channel_t *chan);
void		nickhash_rename(nickhash_t *ht, const char *onick, 
							const char *nnick);
void		nickhash_change_mode(nickhash_t *ht, channel_t *chan,
							const char *nick, 
							int op, int mask);
int		nickhash_highest_mode(nickhash_t *ht, const char *nick);
int		nickhash_query_nick(nickhash_t *ht, const char *nick, 
							chanmode_t **cms);
int		nickhash_query_channel(nickhash_t *ht, channel_t *chan, 
							nickmode_t **nms);
