fixed last commits
[NeonServV5.git] / cmd_neonserv_adduser.c
1
2 /*
3 * argv[0] - nick / *auth
4 * argv[1] - chan access
5 */
6 static AUTHLOOKUP_CALLBACK(neonserv_cmd_adduser_auth_lookup);
7 static USERAUTH_CALLBACK(neonserv_cmd_adduser_nick_lookup);
8 static void neonserv_cmd_adduser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, int access);
9
10 struct neonserv_cmd_adduser_cache {
11     struct ClientSocket *client, *textclient;
12     struct UserNode *user;
13     struct ChanNode *chan;
14     int access;
15     char *nick;
16 };
17
18 static CMD_BIND(neonserv_cmd_adduser) {
19     int caccess;
20     MYSQL_RES *res;
21     MYSQL_ROW row;
22     check_mysql();
23     //check acccess
24     caccess = atoi(argv[1]);
25     if(argv[0][0] == '*') {
26         //we've got an auth
27         argv[0]++;
28         printf_mysql_query("SELECT `user_user` FROM `users` WHERE `user_user` = '%s'", escape_string(argv[0]));
29         res = mysql_use();
30         if ((row = mysql_fetch_row(res)) != NULL) {
31             neonserv_cmd_adduser_async1(client, getTextBot(), user, chan, argv[0], row[0], caccess);
32         } else {
33             //we need to create a new user...
34             //but first lookup the auth to check if it really exists
35             struct neonserv_cmd_adduser_cache *cache = malloc(sizeof(*cache));
36             if (!cache) {
37                 perror("malloc() failed");
38                 return;
39             }
40             cache->client = client;
41             cache->textclient = getTextBot();
42             cache->user = user;
43             cache->chan = chan;
44             cache->access = caccess;
45             cache->nick = strdup(argv[0]);
46             lookup_authname(argv[0], neonserv_cmd_adduser_auth_lookup, cache);
47         }
48     } else {
49         struct UserNode *cuser = getUserByNick(argv[0]);
50         if(!cuser) {
51             cuser = createTempUser(argv[0]);
52             cuser->flags |= USERFLAG_ISTMPUSER;
53         }
54         if(cuser->flags & USERFLAG_ISAUTHED) {
55             neonserv_cmd_adduser_async1(client, getTextBot(), user, chan, argv[0], cuser->auth, caccess);
56         } else {
57             struct neonserv_cmd_adduser_cache *cache = malloc(sizeof(*cache));
58             if (!cache) {
59                 perror("malloc() failed");
60                 return;
61             }
62             cache->client = client;
63             cache->textclient = getTextBot();
64             cache->user = user;
65             cache->chan = chan;
66             cache->access = caccess;
67             cache->nick = strdup(argv[0]);
68             get_userauth(cuser, neonserv_cmd_adduser_nick_lookup, cache);
69         }
70     }
71 }
72
73 static AUTHLOOKUP_CALLBACK(neonserv_cmd_adduser_auth_lookup) {
74     struct neonserv_cmd_adduser_cache *cache = data;
75     if(!exists) {
76         //AUTH_DOES_NOT_EXIST
77     } else
78         neonserv_cmd_adduser_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->nick, auth, cache->access);
79     free(cache->nick);
80     free(cache);
81 }
82
83 static USERAUTH_CALLBACK(neonserv_cmd_adduser_nick_lookup) {
84     struct neonserv_cmd_adduser_cache *cache = data;
85     if(!user) {
86         //USER_DOES_NOT_EXIST
87     }
88     else if(!(user->flags & USERFLAG_ISAUTHED)) {
89         //USER_NOT_AUTHED
90     }
91     else
92         neonserv_cmd_adduser_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth, cache->access);
93     free(cache->nick);
94     free(cache);
95 }
96
97 static void neonserv_cmd_adduser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, int caccess) {
98     //we've got a valid auth now...
99     putsock(client, "PRIVMSG %s :%s: %s   %d", chan->name, nick, auth, caccess);
100 }