cmd_neonserv_deluser added
[NeonServV5.git] / cmd_neonserv_deluser.c
1
2 /*
3 * argv[0] - nick / *auth
4 */
5 static AUTHLOOKUP_CALLBACK(neonserv_cmd_deluser_auth_lookup);
6 static USERAUTH_CALLBACK(neonserv_cmd_deluser_nick_lookup);
7 static void neonserv_cmd_deluser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth);
8
9 struct neonserv_cmd_deluser_cache {
10     struct ClientSocket *client, *textclient;
11     struct UserNode *user;
12     struct ChanNode *chan;
13     char *nick;
14 };
15
16 static CMD_BIND(neonserv_cmd_deluser) {
17     int caccess;
18     MYSQL_RES *res;
19     MYSQL_ROW row;
20     check_mysql();
21     if(argv[0][0] == '*') {
22         //we've got an auth
23         argv[0]++;
24         printf_mysql_query("SELECT `user_user` FROM `users` WHERE `user_user` = '%s'", escape_string(argv[0]));
25         res = mysql_use();
26         if ((row = mysql_fetch_row(res)) != NULL) {
27             neonserv_cmd_deluser_async1(client, getTextBot(), user, chan, argv[0], row[0]);
28         } else {
29             //we need to create a new user...
30             //but first lookup the auth to check if it really exists
31             struct neonserv_cmd_deluser_cache *cache = malloc(sizeof(*cache));
32             if (!cache) {
33                 perror("malloc() failed");
34                 return;
35             }
36             cache->client = client;
37             cache->textclient = getTextBot();
38             cache->user = user;
39             cache->chan = chan;
40             cache->nick = strdup(argv[0]);
41             lookup_authname(argv[0], neonserv_cmd_deluser_auth_lookup, cache);
42         }
43     } else {
44         struct UserNode *cuser = getUserByNick(argv[0]);
45         if(!cuser) {
46             cuser = createTempUser(argv[0]);
47             cuser->flags |= USERFLAG_ISTMPUSER;
48         }
49         if(cuser->flags & USERFLAG_ISAUTHED) {
50             neonserv_cmd_deluser_async1(client, getTextBot(), user, chan, argv[0], cuser->auth);
51         } else {
52             struct neonserv_cmd_deluser_cache *cache = malloc(sizeof(*cache));
53             if (!cache) {
54                 perror("malloc() failed");
55                 return;
56             }
57             cache->client = client;
58             cache->textclient = getTextBot();
59             cache->user = user;
60             cache->chan = chan;
61             cache->nick = strdup(argv[0]);
62             get_userauth(cuser, neonserv_cmd_deluser_nick_lookup, cache);
63         }
64     }
65 }
66
67 static AUTHLOOKUP_CALLBACK(neonserv_cmd_deluser_auth_lookup) {
68     struct neonserv_cmd_deluser_cache *cache = data;
69     if(!exists) {
70         //AUTH_DOES_NOT_EXIST
71         reply(cache->textclient, cache->user, "NS_AUTH_UNKNOWN", cache->nick);
72     } else
73         neonserv_cmd_deluser_async1(cache->client, cache->textclient, cache->user, cache->chan, cache->nick, auth);
74     free(cache->nick);
75     free(cache);
76 }
77
78 static USERAUTH_CALLBACK(neonserv_cmd_deluser_nick_lookup) {
79     struct neonserv_cmd_deluser_cache *cache = data;
80     if(!user) {
81         //USER_DOES_NOT_EXIST
82         reply(cache->textclient, cache->user, "NS_USER_UNKNOWN", cache->nick);
83     }
84     else if(!(user->flags & USERFLAG_ISAUTHED)) {
85         //USER_NOT_AUTHED
86         reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick);
87     }
88     else
89         neonserv_cmd_deluser_async1(cache->client, cache->textclient, cache->user, cache->chan, user->nick, user->auth);
90     free(cache->nick);
91     free(cache);
92 }
93
94 static void neonserv_cmd_deluser_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct ChanNode *chan, char *nick, char *auth) {
95     //we've got a valid auth now...
96     MYSQL_RES *res;
97     MYSQL_ROW row;
98     int userid;
99     printf_mysql_query("SELECT `user_id` FROM `users` WHERE `user_user` = '%s'", escape_string(auth));
100     res = mysql_use();
101     if ((row = mysql_fetch_row(res)) != NULL) {
102         userid = atoi(row[0]);
103         //check if the user is already added
104         printf_mysql_query("SELECT `chanuser_access`, `chanuser_id` FROM `chanusers` WHERE `chanuser_cid` = '%d' AND `chanuser_uid` = '%d'", chan->channel_id, userid);
105         res = mysql_use();
106         if ((row = mysql_fetch_row(res)) != NULL) {
107             //delete
108             printf_mysql_query("DELETE FROM `chanusers` WHERE `chanuser_id` = '%s'", row[1]);
109             reply(textclient, user, "NS_DELUSER_DONE", nick, atoi(row[0]), chan->name);
110             return;
111         }
112     }
113     reply(textclient, user, "NS_NOT_ON_USERLIST", nick, chan->name);
114 }