added first command requesting asynchronous data (adduser)
[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 access;
20     MYSQL_RES *res;
21     MYSQL_ROW row;
22     check_mysql();
23     //check acccess
24     access = 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], access);
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 (!user) {
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 = access;
45             cache->nick = strdup(argv[0]);
46             lookup_authname(argv[0], neonserv_cmd_adduser_auth_lookup, cache);
47         }
48     } else {
49         struct UserNode *user = getUserByNick(argv[0]);
50         if(!user) {
51             user = createTempUser(from);
52             user->flags |= USERFLAG_ISTMPUSER;
53         }
54         if(user->flags & USERFLAG_ISAUTHED) {
55             neonserv_cmd_adduser_async1(client, getTextBot(), user, chan, argv[0], user->auth, access);
56         } else {
57             struct neonserv_cmd_adduser_cache *cache = malloc(sizeof(*cache));
58             if (!user) {
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 = access;
67             cache->nick = strdup(argv[0]);
68             lookup_authname(argv[0], neonserv_cmd_adduser_nick_lookup, cache);
69             get_userauth(user, command_checked_auth, data);
70         }
71     }
72 }
73
74 static AUTHLOOKUP_CALLBACK(neonserv_cmd_adduser_auth_lookup) {
75     struct neonserv_cmd_adduser_cache *cache = data;
76     if(!exists) {
77         //AUTH_DOES_NOT_EXIST
78     } else
79         neonserv_cmd_adduser_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->nick, auth, cache->access);
80     free(cache->nick);
81     free(cache);
82 }
83
84 static USERAUTH_CALLBACK(neonserv_cmd_adduser_nick_lookup) {
85     struct neonserv_cmd_adduser_cache *cache = data;
86     if(!user) {
87         //USER_DOES_NOT_EXIST
88     }
89     else if(!(user->flags & USERFLAG_ISAUTHED)) {
90         //USER_NOT_AUTHED
91     }
92     else
93         neonserv_cmd_adduser_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth, cache->access);
94     free(cache->nick);
95     free(cache);
96 }
97
98 static void neonserv_cmd_adduser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth, int access) {
99     //we've got a valid auth now...
100     putsock(client, "PRIVMSG %s :%s: %s", chan->name, nick, auth);
101 }