2 typedef int neonserv_cmd_set_function(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *argument);
3 static int neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *argument);
4 static int neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *argument);
5 static int neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *argument);
6 static int neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, 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_HALP 0x200 /* help (SET_HELP_{NAME}) - only shown if help is requested */
21 const char *chanfield;
24 } channel_settings[] = {
25 {"TRIGGER", "channel_trigger", 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, NULL2},
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[512], *value, *tmp, nameBuf[64];
72 MYSQL_ROW row, defaults;
76 while(channel_settings[i]->setting) {
77 querypos += sprintf(query + querypos, ", `%s`", channel_settings[i]->chanfield);
80 table = table_init(2, i, 0);
81 table_set_bold(table, 0, 1);
82 printf_mysql_query("SELECT `channel_id` %s FROM `channels` WHERE `channel_id` = 'defaults'", query);
83 defaults = mysql_fetch_row(mysql_use());
84 printf_mysql_query("SELECT `channel_name` %s FROM `channels` WHERE `channel_id` = '%s'", query, chan->channel_id);
86 row = mysql_fetch_row(res);
88 reply(textclient, user, "NS_SET_HEADER", chan->name);
89 while(channel_settings[i]->setting) {
90 value = (row[1+i] ? row[1+i] : defaults[1+i]);
91 if(channel_settings[i]->valid & NS_VALID_BOOLEAN) {
92 if(!strcmp(value, "0"))
93 value = get_language_string(user, "NS_SET_OFF");
95 value = get_language_string(user, "NS_SET_ON");
98 querypos = strlen(query);
99 if(channel_settings[i]->valid & NS_HAS_OPT) {
100 sprintf(nameBuf, "NS_SET_OPTION_%s_%s", channel_settings[i]->setting, (row[1+i] ? row[1+i] : defaults[1+i]));
101 tmp = get_language_string(user, nameBuf);
103 querypos += sprintf(query+querypos, " - %s", tmp);
106 if(argc && channel_settings[i]->valid & NS_HAS_HELP) {
107 sprintf(nameBuf, "NS_SET_HELP_%s", channel_settings[i]->setting);
108 tmp = get_language_string(user, nameBuf);
110 querypos += sprintf(query+querypos, " - %s", tmp);
113 content[0] = channel_settings[i]->setting;
115 table_add(table, content);
117 char **table_lines = table_end(table);
118 for(i = 0; i < table->entrys; i++) {
119 reply(getTextBot(), user, table_lines[i]);
125 static int neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *argument) {
129 static int neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *argument) {
133 static int neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *argument) {
137 static int neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *argument) {