996aed6d32a8d99b3af98cf0813eb951e1f4bdf8
[NeonServV5.git] / src / cmd_neonserv_assignrank.c
1
2 #include "cmd_neonserv.h"
3
4 /*
5 * argv[0] - nick / *auth
6 * argv[1-*] - rank name
7 */
8 static AUTHLOOKUP_CALLBACK(neonserv_cmd_assignrank_auth_lookup);
9 static USERAUTH_CALLBACK(neonserv_cmd_assignrank_nick_lookup);
10 static void neonserv_cmd_assignrank_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct Event *event, char *nick, char *auth, int rank_id);
11
12 struct neonserv_cmd_assignrank_cache {
13     struct ClientSocket *client, *textclient;
14     struct UserNode *user;
15     struct Event *event;
16     int rank_id;
17     char *nick;
18 };
19
20 CMD_BIND(neonserv_cmd_assignrank) {
21     MYSQL_RES *res;
22     MYSQL_ROW row;
23     char *name = merge_argv(argv, 1, argc);
24     int rank_id = 0;
25     if(stricmp(name, "*") && stricmp(name, "user") && stricmp(name, "none")) {
26         printf_mysql_query("SELECT `rank_id`, `rank_name` FROM `support_ranks` WHERE `rank_name` = '%s'", escape_string(name));
27         res = mysql_use();
28         if ((row = mysql_fetch_row(res)) == NULL) {
29             reply(getTextBot(), user, "NS_DELRANK_NOT_FOUND", name);
30             return;
31         }
32         rank_id = atoi(row[0]);
33     }
34     if(argv[0][0] == '*') {
35         //we've got an auth
36         argv[0]++;
37         printf_mysql_query("SELECT `user_user` FROM `users` WHERE `user_user` = '%s'", escape_string(argv[0]));
38         res = mysql_use();
39         if ((row = mysql_fetch_row(res)) != NULL) {
40             neonserv_cmd_assignrank_async1(client, getTextBot(), user, event, argv[0], row[0], rank_id);
41         } else {
42             //we need to create a new user...
43             //but first lookup the auth to check if it really exists
44             struct neonserv_cmd_assignrank_cache *cache = malloc(sizeof(*cache));
45             if (!cache) {
46                 perror("malloc() failed");
47                 return;
48             }
49             cache->client = client;
50             cache->textclient = getTextBot();
51             cache->user = user;
52             cache->event = event;
53             cache->rank_id = rank_id;
54             cache->nick = strdup(argv[0]);
55             lookup_authname(argv[0], neonserv_cmd_assignrank_auth_lookup, cache);
56         }
57     } else {
58         struct UserNode *cuser = getUserByNick(argv[0]);
59         if(!cuser) {
60             cuser = createTempUser(argv[0]);
61             cuser->flags |= USERFLAG_ISTMPUSER;
62         }
63         if(cuser->flags & USERFLAG_ISAUTHED) {
64             neonserv_cmd_assignrank_async1(client, getTextBot(), user, event, argv[0], cuser->auth, rank_id);
65         } else {
66             struct neonserv_cmd_assignrank_cache *cache = malloc(sizeof(*cache));
67             if (!cache) {
68                 perror("malloc() failed");
69                 return;
70             }
71             cache->client = client;
72             cache->textclient = getTextBot();
73             cache->user = user;
74             cache->event = event;
75             cache->rank_id = rank_id;
76             cache->nick = strdup(argv[0]);
77             get_userauth(cuser, neonserv_cmd_assignrank_nick_lookup, cache);
78         }
79     }
80 }
81
82 static AUTHLOOKUP_CALLBACK(neonserv_cmd_assignrank_auth_lookup) {
83     struct neonserv_cmd_assignrank_cache *cache = data;
84     if(!exists) {
85         //AUTH_DOES_NOT_EXIST
86         reply(cache->textclient, cache->user, "NS_AUTH_UNKNOWN", cache->nick);
87     } else
88         neonserv_cmd_assignrank_async1(cache->client, cache->textclient, cache->user, cache->event, cache->nick, auth, cache->rank_id);
89     free(cache->nick);
90     free(cache);
91 }
92
93 static USERAUTH_CALLBACK(neonserv_cmd_assignrank_nick_lookup) {
94     struct neonserv_cmd_assignrank_cache *cache = data;
95     if(!user) {
96         //USER_DOES_NOT_EXIST
97         reply(cache->textclient, cache->user, "NS_USER_UNKNOWN", cache->nick);
98     }
99     else if(!(user->flags & USERFLAG_ISAUTHED)) {
100         //USER_NOT_AUTHED
101         reply(cache->textclient, cache->user, "NS_USER_NEED_AUTH", cache->nick);
102     }
103     else
104         neonserv_cmd_assignrank_async1(cache->client, cache->textclient, cache->user, cache->event, user->nick, user->auth, cache->rank_id);
105     free(cache->nick);
106     free(cache);
107 }
108
109 static void neonserv_cmd_assignrank_async1(struct ClientSocket *client, struct ClientSocket *textclient, struct UserNode *user, struct Event *event, char *nick, char *auth, int rank_id) {
110     //we've got a valid auth now...
111     MYSQL_RES *res;
112     MYSQL_ROW row, rank = NULL;
113     int caccess = 0;
114     if(rank_id) {
115         printf_mysql_query("SELECT `rank_access`, `rank_name` FROM `support_ranks` WHERE `rank_id` = '%d'", rank_id);
116         res = mysql_use();
117         rank = mysql_fetch_row(res);
118         caccess = atoi(rank[0]);
119     }
120     printf_mysql_query("SELECT `user_id`, `user_rank` FROM `users` WHERE `user_user` = '%s'", escape_string(auth));
121     res = mysql_use();
122     if ((row = mysql_fetch_row(res)) != NULL) {
123         if(atoi(row[1]) != rank_id) {
124             printf_mysql_query("UPDATE `users` SET `user_access` = '%d', `user_rank` = '%d' WHERE `user_id` = '%s'", caccess, rank_id, row[0]);
125         }
126     } else if(rank_id) {
127         printf_mysql_query("INSERT INTO `users` (`user_user`, `user_access`, `user_rank`) VALUES ('%s', '%d', '%d')", escape_string(auth), caccess, rank_id);
128     }
129     reply(textclient, user, "NS_ASSIGNRANK_DONE", auth, (rank_id ? rank[1] : "*"));
130     logEvent(event);
131 }