diff options
author | Jon Bergli Heier <snakebite@jvnv.net> | 2010-06-05 23:59:38 +0200 |
---|---|---|
committer | Jon Bergli Heier <snakebite@jvnv.net> | 2010-06-05 23:59:38 +0200 |
commit | 91e5543757dad266f041f46d11bf973966368a30 (patch) | |
tree | c3f6b80463fd7c1bf6ec1a113a644e6934354a3d /user.c | |
parent | a1039148b6e06df5af790846087b7837c60a88b9 (diff) |
Mostly-working implementation of time tracking for users.time
Needs some more testing.
Diffstat (limited to 'user.c')
-rw-r--r-- | user.c | 50 |
1 files changed, 50 insertions, 0 deletions
@@ -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); +} |