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);
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
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 */
21 const char *chanfield;
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},
63 static CMD_BIND(neonserv_cmd_set) {
65 if(argc && strcmp(argv[0], "help")) {
69 char query[1024], *value, *org_value, *tmp, nameBuf[64];
71 MYSQL_RES *res, *defaults_res;
72 MYSQL_ROW row, defaults;
76 while(channel_settings[i].setting) {
77 if(channel_settings[i].chanfield)
78 querypos += sprintf(query + querypos, ", `%s`", channel_settings[i].chanfield);
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);
88 row = mysql_fetch_row(res);
91 reply(getTextBot(), user, "NS_SET_HEADER", chan->name);
92 while(channel_settings[i].setting) {
93 if(channel_settings[i].chanfield) {
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);
102 if(channel_settings[i].valid & NS_VALID_BOOLEAN) {
103 if(!strcmp(value, "0"))
104 value = get_language_string(user, "NS_SET_OFF");
106 value = get_language_string(user, "NS_SET_ON");
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);
114 querypos += sprintf(query+querypos, " - %s", tmp);
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);
121 querypos += sprintf(query+querypos, " - %s", tmp);
124 content[0] = (char*)channel_settings[i].setting;
126 table_add(table, content);
129 char **table_lines = table_end(table);
130 for(i = 0; i < table->entrys; i++) {
131 reply(getTextBot(), user, table_lines[i]);
137 static char* neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int set, char *argument) {
141 static char* neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int set, char *argument) {
145 static char* neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int set, char *argument) {
149 static char* neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, int set, char *argument) {