fixed last commits
[NeonServV5.git] / cmd_neonserv_set.c
1
2 typedef char* neonserv_cmd_set_function(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int set, char *argument);
3 static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int set, char *argument);
4 static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int set, char *argument);
5 static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int set, char *argument);
6 static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int set, char *argument);
7
8 #define NS_VALID_FUNCTION 0x01
9 #define NS_VALID_STRING   0x02
10 #define NS_VALID_ACCESS   0x04
11 #define NS_VALID_NO501    0x08
12 #define NS_VALID_OPTIONS  0x10
13 #define NS_VALID_NUMERIC  0x20
14 #define NS_VALID_BOOLEAN  0x40
15
16 #define NS_HAS_OPT  0x100 /* options (SET_OPTION_{NAME}_{VALUE}) */
17 #define NS_HAS_HELP 0x200 /* help    (SET_HELP_{NAME}) - only shown if help is requested */
18
19 static const struct {
20     const char *setting;
21     const char *chanfield;
22     unsigned int valid;
23     void *parameter;
24 } channel_settings[] = {
25     {"TRIGGER",         NULL,                   NS_VALID_FUNCTION,                  neonserv_cmd_set_trigger},
26     {"DEFAULTTOPIC",    "channel_defaulttopic", NS_VALID_STRING,                    NULL},
27     {"TOPICMASK",       "channel_topicmask",    NS_VALID_STRING,                    NULL},
28     {"GREETING",        "channel_greeting",     NS_VALID_STRING,                    NULL},
29     {"USERGREETING",    "channel_usergreeting", NS_VALID_STRING,                    NULL},
30     {"USERINFO",        "channel_userinfo",     NS_VALID_ACCESS,                    NULL},
31     {"WIPEINFO",        "channel_wipeinfo",     NS_VALID_ACCESS,                    NULL},
32     {"MODES",           "channel_modes",        NS_VALID_FUNCTION,                  neonserv_cmd_set_modes},
33     {"INVITEME",        "channel_getinvite",    NS_VALID_ACCESS,                    NULL},
34     {"GIVEOPS",         "channel_getop",        NS_VALID_ACCESS,                    NULL},
35     {"GIVEVOICE",       "channel_getvoice",     NS_VALID_ACCESS,                    NULL},
36     {"ENFOPS",          "channel_canop",        NS_VALID_ACCESS,                    NULL},
37     {"ENFVOICE",        "channel_canvoice",     NS_VALID_ACCESS,                    NULL},
38     {"KICK",            "channel_cankick",      NS_VALID_ACCESS,                    NULL},
39     {"BAN",             "channel_canban",       NS_VALID_ACCESS,                    NULL},
40     {"STATICBAN",       "channel_staticban",    NS_VALID_ACCESS,                    NULL},
41     {"PUBCMD",          "channel_pubcmd",       NS_VALID_ACCESS,                    NULL},
42     {"ENFMODES",        "channel_enfmodes",     NS_VALID_ACCESS,                    NULL},
43     {"ENFTOPIC",        "channel_enftopic",     NS_VALID_ACCESS,                    NULL},
44     {"TOPICSNARF",      "channel_topicsnarf",   NS_VALID_ACCESS,                    NULL},
45     {"CHANGETOPIC",     "channel_changetopic",  NS_VALID_ACCESS,                    NULL},
46     {"SETTERS",         "channel_setters",      NS_VALID_ACCESS | NS_VALID_NO501,   NULL},
47     {"ADDUSER",         "channel_canadd",       NS_VALID_ACCESS,                    NULL},
48     {"DELUSER",         "channel_candel",       NS_VALID_ACCESS,                    NULL},
49     {"CLVL",            "channel_canclvl",      NS_VALID_ACCESS,                    NULL},
50     {"RESYNC",          "channel_canresync",    NS_VALID_ACCESS,                    NULL},
51     {"SUSPEND",         "channel_cansuspend",   NS_VALID_ACCESS,                    NULL},
52     {"NOTICEUSERS",     "channel_notice",       NS_VALID_ACCESS,                    NULL},
53     {"NOTICEREACTION",  "channel_noticereaction", NS_VALID_OPTIONS | NS_HAS_OPT,    "4"},
54     {"CTCPUSERS",       "channel_ctcp",         NS_VALID_ACCESS,                    NULL},
55     {"CTCPREACTION",    "channel_ctcpreaction", NS_VALID_OPTIONS | NS_HAS_OPT,      "4"},
56     {"PROTECT",         "channel_protect",      NS_VALID_OPTIONS | NS_HAS_OPT,      "4"},
57     {"TOYS",            "channel_toys",         NS_VALID_OPTIONS | NS_HAS_OPT,      "3"},
58     {"DYNLIMIT",        "channel_dynlimit",     NS_VALID_NUMERIC | NS_VALID_FUNCTION | NS_HAS_OPT, neonserv_cmd_set_dynlimit},
59     {"NODELETE",        "channel_nodelete",     NS_VALID_BOOLEAN | NS_VALID_FUNCTION, neonserv_cmd_set_nodelete},
60     {NULL, NULL, 0, NULL}
61 };
62
63 static CMD_BIND(neonserv_cmd_set) {
64     int i, j;
65     if(argc && strcmp(argv[0], "help")) {
66         
67     } else {
68         check_mysql();
69         char query[1024], *value, *org_value, *tmp, nameBuf[64];
70         int querypos = 0;
71         MYSQL_RES *res, *defaults_res;
72         MYSQL_ROW row, defaults;
73         struct Table *table;
74         char *content[2];
75         i = 0;
76         while(channel_settings[i].setting) {
77             if(channel_settings[i].chanfield)
78                 querypos += sprintf(query + querypos, ", `%s`", channel_settings[i].chanfield);
79             i++;
80         }
81         table = table_init(2, i, 0);
82         table_set_bold(table, 0, 1);
83         printf_mysql_query("SELECT `channel_id` %s FROM `channels` WHERE `channel_name` = 'defaults'", query);
84         defaults_res = mysql_use();
85         defaults = mysql_fetch_row(defaults_res);
86         printf_mysql_query("SELECT `channel_name` %s FROM `channels` WHERE `channel_id` = '%d'", query, chan->channel_id);
87         res = mysql_use();
88         row = mysql_fetch_row(res);
89         i = 0;
90         j = 0;
91         reply(getTextBot(), user, "NS_SET_HEADER", chan->name);
92         while(channel_settings[i].setting) {
93             if(channel_settings[i].chanfield) {
94                 j++;
95                 org_value = (row[j] ? row[j] : defaults[j]);
96             } else if(channel_settings[i].valid & NS_VALID_FUNCTION) {
97                 neonserv_cmd_set_function *func = channel_settings[i].parameter;
98                 org_value = func(client, user, chan, 0, NULL);
99             } else
100                 org_value = "0";
101             value = org_value;
102             if(channel_settings[i].valid & NS_VALID_BOOLEAN) {
103                 if(!strcmp(value, "0"))
104                     value = get_language_string(user, "NS_SET_OFF");
105                 else
106                     value = get_language_string(user, "NS_SET_ON");
107             }
108             strcpy(query, value);
109             querypos = strlen(query);
110             if(channel_settings[i].valid & NS_HAS_OPT) {
111                 sprintf(nameBuf, "NS_SET_OPTION_%s_%s", channel_settings[i].setting, org_value);
112                 tmp = get_language_string(user, nameBuf);
113                 if(tmp) {
114                     querypos += sprintf(query+querypos, " - %s", tmp);
115                 }
116             }
117             if(argc && channel_settings[i].valid & NS_HAS_HELP) {
118                 sprintf(nameBuf, "NS_SET_HELP_%s", channel_settings[i].setting);
119                 tmp = get_language_string(user, nameBuf);
120                 if(tmp) {
121                     querypos += sprintf(query+querypos, " - %s", tmp);
122                 }
123             }
124             content[0] = (char*)channel_settings[i].setting;
125             content[1] = query;
126             table_add(table, content);
127             i++;
128         }
129         char **table_lines = table_end(table);
130         for(i = 0; i < table->entrys; i++) {
131             reply(getTextBot(), user, table_lines[i]);
132         }
133         table_free(table);
134     }
135 }
136
137 static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int set, char *argument) {
138     return "+";
139 }
140
141 static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int set, char *argument) {
142     return NULL;
143 }
144
145 static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int set, char *argument) {
146     return NULL;
147 }
148
149 static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int set, char *argument) {
150     return NULL;
151 }
152