/*
 * FISG - Fast IRC Stats Generator
 * Programmed and designed by Matti 'ccr' Hamalainen
 * (C) Copyright 2003-2004 Tecnic Software productions (TNSP)
 *
 * Please read file 'COPYING' for information on license and distribution.
 */
#ifndef _FISG_H
#define _FISG_H

#include "th_util.h"
#include "th_string.h"
#include <assert.h>

/*
 * Program name, version
 */
#define FISG_NAME	"FISG"
#define FISG_VERSION	"0.3.12"
#define FISG_COPYRIGHT	"by ccr/TNSP (C) Copyright 2004 TNSP"
#define FISG_FULLNAME	"Fast IRC Stats Generator"


/*
 * Settings and constants
 */
#define SET_MAX_INFILES		(4096)
#define SET_MAX_NICKLEN		(32)
#define SET_MIN_COMMENT_LEN	(10)

#define SET_HASH_MAXINDEX	(256)

#define	SET_HOURS_DAY		(24)
#define	SET_DAY_DIVISOR		(6)

 
/*
 * Typedefs, structures
 */
typedef struct {
	BOOL	autoFollowNicks,
		autoHeuristics,
		stripCtrlChars,
		usePisgScoring,
		statOnlyListed,
		showHappy,
		showComment,
		showPicture,
		showURL,
		statActiveTimes,
		statTopUsers,
		statAlmostTop,
		statURLs,
		statBigNumbers,
		statTopics;

	
	t_uint	commentMaxLength,
		commentMinLength,
		showTopUserMax,
		showAlmostMax,
		showURLsMax,
		showTopicsMax;


	char	*ircChannel,
		*ircNetwork,
		*message,
		*dateFormat,
		*userFilename;
		
} t_fisgconfig;


typedef struct tusernode {
	/* Read from config */
	char	*userHandle;		/* Handle (real nick) */
	char	*picPath;		/* Path/filename of user's picture */
	char	*linkURL;		/* Link to homepages, etc. */
	BOOL	isManaged;		/* Managed user? */
	BOOL	isIgnored;		/* TRUE if user is ignored in stats */

	/* Calculated during parsing */
	t_ulint	nWords, nChars, nPublics, nCaps,
		nQuestions, nYelling,
		nKicks, nModeChanges, nTopicSets,
		nActions, nNotices, nGotKicked,
		nURLs, nJoins, nNickChanges,
		nTopics, nLove;

	t_ulint	nWordsPerHour[SET_HOURS_DAY],
		nPublicsPerHour[SET_HOURS_DAY];

	char	*sComment;

	/* Computed after parsing */
	t_float	fWordsPerPublic,
		fCharsPerWord,
		fHappiness,
		fLove,
		fTotalScore,
		fCapsPercent,
		fActivityPerHour[SET_HOURS_DAY];

	struct tusernode *pPrev, *pNext;
} t_user_entry;


typedef struct tuserdata {
	t_user_entry	*pList,		/* Linked list of users */
			**ppIndex;	/* Index of users */
	t_ulint		n;		/* Number of nodes in index */

	BOOL		dirtyN,		/* TRUE if nIndex not updated after pList change */
			dirtyIndex;	/* TRUE if ppIndex not updated after pList change */
} t_user_data;


typedef struct {
	/* Computed during parsing */
	t_ulint nLines, nChars, nLogFiles, nDays;

	t_user_data	*usersList,
			*usersIgnored,
			*usersRemoved;
	
	t_str_hash	nickList,
			urlList;
	t_str_node	*topicList;


	/* Computed after parsing */
	t_str_index	*urlIndex,
			*topicIndex;

	t_user_entry
		*mostStupid,
		*mostLoud,
		*mostActions,
		*mostNotices,
		*mostModes,
		*mostKicks,
		*mostKicked,
		*mostCaps,
		*mostHappy,
		*mostSad,
		*mostURLs,
		*mostJoins,
		*mostTopics;

	t_ulint	nTimeElapsed;
	t_float	fActivityPerHour[SET_HOURS_DAY];
	int	activityPeak;
} t_stats;


typedef struct {
	int		iMode;
	BOOL		isSet;
	t_user_entry	*pUser;
} t_mode;


typedef struct {
	int	iYear, iMonth, iDay,
		iHours, iMinutes, iSeconds;
} t_datetime;


typedef struct {
	t_datetime	ts;
	t_user_entry	*pUser, *pUser2;
	t_mode	setModes[16];
	char	pText[SET_MAX_BUF + 1];
} t_lineinfo;


/*
 * Internationalization
 */
#define	_(MSTR)	(MSTR)

/*
 * Functions
 */
t_user_entry	*user_new(char *);
void		user_free(t_user_entry *);
void		user_insert(t_user_data *, t_user_entry *);
void		user_delete(t_user_data *, t_user_entry *);
int		parse_userfile(char *, t_stats *, t_fisgconfig *);


t_user_data *	user_data_new(void);
void		user_data_free(t_user_data *);
int		user_data_makeindex(t_user_data *);

int		nickhash_insert(t_str_hash, t_str_node *);
t_str_node	*nickhash_search(t_str_hash, char *);

void		NDMSG(const char *, ...);
void		NDPRINT(const char *, ...);

#endif /* _FISG_H */


syntax highlighted by Code2HTML, v. 0.9.1