From 91e5543757dad266f041f46d11bf973966368a30 Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Sat, 5 Jun 2010 23:59:38 +0200 Subject: Mostly-working implementation of time tracking for users. Needs some more testing. --- user.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'user.c') diff --git a/user.c b/user.c index b64ca7c..d6554b9 100644 --- a/user.c +++ b/user.c @@ -7,6 +7,8 @@ struct user_t *users; +struct user_time_t *users_time; + void user_init() { users = malloc(sizeof(struct user_t) * USERS_MAX); memset(users, 0, sizeof(struct user_t) * USERS_MAX); @@ -33,6 +35,7 @@ struct user_t *user_get(char *nick) { user->nick = strdup(nick); memset(user->lines, 0, 24*4 * sizeof(unsigned long)); user->words = user->characters = user->kicks = user->kicked = user->monolog_lines = user->monologs = 0; + user->seen_first = user->seen_last = user->last_join = user->time_total = 0; user->next = NULL; char *_nick = nick_get(nick); user->real_user = strcmp(nick, _nick) ? user_get(_nick) : NULL; @@ -56,3 +59,50 @@ void user_free() { } free(users); } + +void user_time_init() { + users_time = malloc(sizeof(struct user_time_t) * USERS_MAX); + memset(users_time, 0, sizeof(struct user_time_t) * USERS_MAX); +} + +struct user_time_t *user_time_get(char *nick, int ignore_real) { + unsigned long hash = sdbm(nick); + int index = hash % USERS_MAX; + + struct user_time_t *user = &users_time[index]; + /* If hash doesn't match and there exists another user, fetch it. */ + while(user->hash != hash && user->next) user = user->next; + /* If hash still doesn't match and the user exists, add a new user. */ + if(user->hash != hash && user->nick) { + struct user_time_t *temp_user = malloc(sizeof(struct user_time_t)); + user->next = temp_user; + user = temp_user; + /* Initialize nick to NULL so the user can be correctly added. */ + user->nick = NULL; + } + /* Add the new user data to the current pointer if none was found. */ + if(!user->nick) { + user->hash = hash; + user->nick = strdup(nick); + user->seen_first = user->seen_last = user->last_join = user->time_total = 0; + user->real_user = user->next = NULL; + } + + return (!ignore_real && user->real_user ? user->real_user : user); +} + +void user_time_free() { + struct user_time_t *user; + for(int i = 0; i < USERS_MAX; i++) { + if(users_time[i].nick) + free(users_time[i].nick); + user = users_time[i].next; + while(user) { + struct user_time_t *temp = user->next; + free(user->nick); + free(user); + user = temp; + } + } + free(users_time); +} -- cgit v1.2.3