1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
USERS *adduser(char *nick, char *chan, unsigned int fdclient, acetables *ace_tables)
{
USERS *nuser, *ghost;
CHANNEL *channel;
RAW *newraw;
char fdstr[32];
unsigned int owned = 0;
nuser = (USERS *)malloc(sizeof(*nuser));
memset(fdstr, '\0', 32);
memset(nuser->ip, '\0', 32);
nuser->fdclient = fdclient;
nuser->state = ADIED;
nuser->idle = time(NULL);
nuser->next = ace_tables->uHead;
nuser->prev = NULL;
nuser->nraw = 0;
nuser->rawhead = NULL;
nuser->rawfoot = NULL;
if (nuser->next != NULL) {
nuser->next->prev = nuser;
}
memcpy(nuser->nick, nick, strlen(nick)+1);
memcpy(nuser->chan, chan, strlen(chan)+1);
gen_sessid_new(nuser->sessid, ace_tables);
ace_tables->uHead = nuser;
sprintf(fdstr, "%i", fdclient);
if (!hashtbl_seek(ace_tables->hLusers, chan)) {
channel = mkchan(chan, ace_tables);
owned = 1;
} else {
channel = (CHANNEL *)hashtbl_seek(ace_tables->hLusers, chan);
}
if ((ghost = hashtbl_seek(ace_tables->hFdclient, fdstr)) != NULL) {
ghost->state = ADIED;
hashtbl_erase(ace_tables->hFdclient, fdstr);
}
//printf("users : %s\n", getlist(chan, ace_tables)->userinfo->nick);
hashtbl_append(ace_tables->hLogin, nick, (void *)nuser);
hashtbl_append(ace_tables->hSessid, nuser->sessid, (void *)nuser);
hashtbl_append(ace_tables->hFdclient, fdstr, (void *)nuser);
newraw = forge_raw(RAW_LOGIN, 0, nuser->sessid);
post_raw(newraw, nuser);
join(nuser, channel, ace_tables);
if (owned == 1) {
setlevel(NULL, nuser, channel, 3);
}
return nuser;
}
void deluser(USERS *user, acetables *ace_tables)
{
char fdstr[32];
if (user == NULL) {
return;
}
memset(fdstr, '\0', 32);
sprintf(fdstr, "%i", user->fdclient);
do_died(user);
left(user, ace_tables);
clear_raws(user);
hashtbl_erase_special(ace_tables->hLogin, user->nick, user->chan); // a faire le special !!!
hashtbl_erase(ace_tables->hSessid, user->sessid);
if (((USERS *)hashtbl_seek(ace_tables->hFdclient, fdstr)) == user) {
hashtbl_erase(ace_tables->hFdclient, fdstr);
}
if (user->prev == NULL) { // faire pareil pour les channels
ace_tables->uHead = user->next;
} else {
user->prev->next = user->next;
}
if (user->next != NULL) {
user->next->prev = user->prev;
}
free(user);
user = NULL;
} |