continued cmd_set
[NeonServV5.git] / cmd_neonserv_set.c
1
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);
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_HALP 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",         "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},
60     {NULL, NULL, 0, NULL}
61 };
62
63 static CMD_BIND(neonserv_cmd_set) {
64     int i;
65     if(argc && strcmp(argv[0], "help")) {
66         
67     } else {
68         check_mysql();
69         char query[512], *value, *tmp, nameBuf[64];
70         int querypos = 0;
71         MYSQL_RES *res;
72         MYSQL_ROW row, defaults;
73         struct Table *table;
74         char *content[2];
75         i = 0;
76         while(channel_settings[i]->setting) {
77             querypos += sprintf(query + querypos, ", `%s`", channel_settings[i]->chanfield);
78             i++;
79         }
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);
85         res = mysql_use();
86         row = mysql_fetch_row(res);
87         i = 0;
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");
94                 else
95                     value = get_language_string(user, "NS_SET_ON");
96             }
97             strcpy(query, value);
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);
102                 if(tmp) {
103                     querypos += sprintf(query+querypos, " - %s", tmp);
104                 }
105             }
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);
109                 if(tmp) {
110                     querypos += sprintf(query+querypos, " - %s", tmp);
111                 }
112             }
113             content[0] = channel_settings[i]->setting;
114             content[1] = query;
115             table_add(table, content);
116         }
117         char **table_lines = table_end(table);
118         for(i = 0; i < table->entrys; i++) {
119             reply(getTextBot(), user, table_lines[i]);
120         }
121         free_table(table);
122     }
123 }
124
125 static int neonserv_cmd_set_trigger(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *argument) {
126     return 1;
127 }
128
129 static int neonserv_cmd_set_modes(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *argument) {
130     return 1;
131 }
132
133 static int neonserv_cmd_set_dynlimit(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *argument) {
134     return 1;
135 }
136
137 static int neonserv_cmd_set_nodelete(struct ClientSocket *client, struct UserNode *user, struct ChanNode *chan, char *argument) {
138     return 1;
139 }
140