#ifndef CHANNEL_H__
#define CHANNEL_H__


#include <silcincludes.h>
#include <silcclient.h>
#include <glade/glade.h>

#define CHANNEL_NAME(ch)	((ch)->channel_entry->channel_name)
#define CHANNEL_TOPIC(ch)	((ch)->channel_topic)
#define CHANNEL_CMODE(ch)	((ch)->channel_entry->mode)

#define CHMEMBER_NAME(chm)	((chm)->client->nickname)

#define IS_CHANNEL_FOUNDER(chm) ((chm)->chuser->mode & SILC_CHANNEL_UMODE_CHANFO)
#define IS_CHANNEL_MUTED(chm)	((chm)->chuser->mode & SILC_CHANNEL_UMODE_QUIET)
#define IS_CHANNEL_OP(chm)	((chm)->chuser->mode & SILC_CHANNEL_UMODE_CHANOP)

#define I_AM_OP(ch) \
    (((get_channel_user_by_entry(ch, silky->conn->local_entry))->mode & SILC_CHANNEL_UMODE_CHANOP) ? TRUE : FALSE)
#define I_AM_FOUNDER(ch) \
    (((get_channel_user_by_entry(ch, silky->conn->local_entry))->mode & SILC_CHANNEL_UMODE_CHANFO) ? TRUE : FALSE)
#define I_AM_QUIET(ch) \
    (((get_channel_user_by_entry(ch, silky->conn->local_entry))->mode & SILC_CHANNEL_UMODE_QUIET) ? TRUE : FALSE)

/* CHANNEL STRUCT */
/* FIXME: any other elements needed? */
struct channel_t {
  struct channel_t	*next;

  SilcChannelEntry	channel_entry;
  gchar			topic[257]; /* channel topic */

  struct chmember_t	*members; /* pointer to linked list of members */

  struct chmember_t	*tab_member; /* used with tab-completion */
  gchar			*tab_prefix; /* tab-completion prefix */
  gchar			*tab_text;   /* text (if any) before word being completed */

  GladeXML		*glade_xml;
  gint pagenr; /* which GtkNotebook page (of index) contains this channel */
  gpointer *label_text; /* label title */
  gpointer *label_image; /* label image */
};

typedef struct channel_t SilkyChannel;


/* CHANNEL MEMBER STRUCT */
/* used for tab-completion */
struct chmember_t {
    struct chmember_t	*next;
    SilcChannelUser	chuser;
    SilcClientEntry	client;		/* local persistent copy */
};

typedef struct chmember_t SilkyChannelMember;

SilkyChannel *channel_find_by_name( gchar *name );
SilkyChannel *channel_find_by_pagenr( gint pagenr );
SilkyChannel *channel_find_by_entry( SilcChannelEntry entry );

SilkyChannel *channel_add( SilcChannelEntry entry );

gboolean channel_remove_by_name( gchar *name );
gboolean channel_remove_by_entry( SilcChannelEntry entry );

void channel_topic_set_by_name( gchar *name, gchar *topic );
void channel_topic_set_by_entry( SilcChannelEntry entry, gchar *topic );

void channel_pagenr_set_by_name( gchar *name, gint pagenr );
void channel_pagenr_set_by_entry( SilcChannelEntry entry, gint pagenr );

void channel_mode_set_by_name( gchar *name, SilcUInt32 cmode );
void channel_mode_set_by_entry( SilcChannelEntry entry, SilcUInt32 cmode );



struct chmember_t *channel_member_find_by_nick( SilkyChannel *channel, gchar *name );
SilkyChannelMember *channel_member_find_by_entry( SilkyChannel *channel, SilcClientEntry client );
SilkyChannelMember *channel_member_add( SilkyChannel *channel, SilcChannelUser chuser );

gint channel_member_remove_by_entry( SilkyChannel *channel, SilcClientEntry client) ;

void channel_member_change_client_entry( SilkyChannel *channel, SilcClientEntry oldclient, SilcClientEntry newclient);

void channel_free_all( void );
void channel_member_free_all( SilkyChannel *channel );

void update_channel_nicklist (SilcClientEntry old_entry, SilcClientID *old_client_id, SilcClientEntry new_client_entry);
void refresh_nicklist (SilcChannelEntry channel_entry);
void refresh_nicklist_resolved(SilcClient client,
			       SilcClientConnection conn,
			       SilcClientEntry *clients,
			       SilcUInt32 clients_count,
			       void *context);
void channels_nick_change(SilcClientEntry old_entry, SilcClientID *old_client_id, SilcClientEntry new_client_entry);

#define I_AM_CHANOP(ch)	\
    (((get_channel_user_by_entry(ch, silky->client))->mode & SILC_CHANNEL_UMODE_CHANOP) ? TRUE : FALSE)

void silky_join_channel(const gchar *channel_name);
void silky_leave_channel(const gchar *channel_name);

#endif


syntax highlighted by Code2HTML, v. 0.9.1