/*
 * Copyright (c) 2005 William Pitcock, et al.
 * Rights to this code are as documented in doc/LICENSE.
 *
 * Headers for service selection tree.
 *
 */

#ifndef SERVTREE_H
#define SERVTREE_H

struct service_ {
	char *internal_name;

	char *nick;
	char *user;
	char *host;
	char *real;
	char *disp;

	user_t *me;

	void (*handler)(sourceinfo_t *, int, char **);
	void (*notice_handler)(sourceinfo_t *, int, char **);

	mowgli_patricia_t *commands;
	mowgli_patricia_t *aliases;
	mowgli_patricia_t *access;

	bool chanmsg;

	mowgli_list_t conf_table;

	bool botonly;

	struct service_ *logtarget;
};

static inline const char *service_get_log_target(const service_t *svs)
{
	if (svs != NULL && svs->logtarget != NULL)
		return service_get_log_target(svs->logtarget);

	return svs != NULL ? svs->nick : me.name;
}

E mowgli_patricia_t *services_name;
E mowgli_patricia_t *services_nick;

E void servtree_init(void);
E service_t *service_add(const char *name, void (*handler)(sourceinfo_t *si, int parc, char *parv[]));
E service_t *service_add_static(const char *name, const char *user, const char *host, const char *real, void (*handler)(sourceinfo_t *si, int parc, char *parv[]), service_t *logtarget);
E void service_delete(service_t *sptr);
E service_t *service_find_any(void);
E service_t *service_find(const char *name);
E service_t *service_find_nick(const char *nick);
E char *service_name(char *name);
E void service_set_chanmsg(service_t *, bool);
E const char *service_resolve_alias(service_t *sptr, const char *context, const char *cmd);
E const char *service_set_access(service_t *sptr, const char *cmd, const char *access);

E void service_bind_command(service_t *, command_t *);
E void service_unbind_command(service_t *, command_t *);

E void service_named_bind_command(const char *, command_t *);
E void service_named_unbind_command(const char *, command_t *);
E void servtree_update(void *dummy);

#endif

/* vim:cinoptions=>s,e0,n0,f0,{0,}0,^0,=s,ps,t0,c3,+s,(2s,us,)20,*30,gs,hs
 * vim:ts=8
 * vim:sw=8
 * vim:noexpandtab
 */
