forked from pmer/yak
/
usr.c
91 lines (78 loc) · 1.84 KB
/
usr.c
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
#include <stdlib.h>
#include <string.h>
#include "diagnostic.h"
#include "hashtab.h"
#include "ircproto.h"
#include "presence.h"
#include "usr.h"
#include "yak.h"
static struct hashtab *users;
bool isme(char *prefix)
{
/* To verify identity, we only have to test nickname, that is enough.
* No need to look at username or host. */
char *bang;
int len;
bang = strchr(prefix, '!');
if (bang) {
len = bang - prefix;
return !strncasecmp(prefix, bot_nick, len) &&
strlen(bot_nick) == len;
}
else {
return !strcasecmp(prefix, bot_nick);
}
}
/**
* user_new - creates a new struct user object
*
* The nickname, username, and host are parsed from the specified prefix, if
* possible.
*
* @prefix - IRC message prefix, in the format of:
* "nickname[!username[@host]]"
*/
static struct user *user_new(char *prefix)
{
struct user *user;
user = malloc(sizeof(struct user));
ircproto_parse_prefix(prefix,
user->nick, sizeof(user->nick),
user->uname, sizeof(user->uname),
user->host, sizeof(user->host));
user->rname[0] = '\0';
INIT_LIST_HEAD(&user->presences);
if (hashtab_insert(users, user->nick, user) == -1)
err("user_new: %s: user already exists", user->nick);
return user;
}
void user_del(struct user *user)
{
hashtab_remove(users, user->nick);
free(user);
}
struct user *user_find(char *prefix)
{
struct user *user;
char nick[512];
ircproto_parse_prefix(prefix, nick, sizeof(nick), NULL, 0, NULL, 0);
user = hashtab_search(users, nick);
return user;
}
struct user *user_get(char *prefix)
{
struct user *user;
user = user_find(prefix);
return user ? user : user_new(prefix);
}
struct user *user_get2(char *prefix, bool *existed)
{
struct user *user;
user = user_find(prefix);
*existed = user != NULL;
return user ? user : user_new(prefix);
}
void usr_init()
{
users = hashtab_create(str_hash, strcmp_hash, 101);
}