Oook, it took a bit, but now I've added toLower for Channelnames and mysql_real_escape_string for Channelnames and Nicknames.
Source:
#include "module.h"
#include <mysql.h>
#define AUTHOR "Tzann"
#define VERSION "1.3"
// SQL
#define GET_MYSQL_ERROR mysql_error(mysql_obj)
MYSQL *mysql_obj = NULL;
MYSQL_RES *res = NULL;
my_ulonglong q_mysql_affected_rows;
char *NICK_SQL_HOST = NULL;
unsigned int NICK_SQL_PORT = 0;
char *NICK_SQL_USER = NULL;
char *NICK_SQL_PASS = NULL;
char *NICK_SQL_DB = NULL;
// intern struct
struct c_userlist *cu, *next;
unsigned int i;
// Events
int reload_config(int ac, char **av);
int channels_update(int ac, char **av);
int user_quit(int ac, char **av);
// Methods
int load_config();
int channel_update(char *chan);
// SQL
int do_mysql_connect();
int do_mysql_query(char *q);
void do_mysql_close();
//Helper
char *lower(char *str);
char *esc_str(char *str);
int AnopeInit(void)
{
EvtHook *hook;
unsigned int ret;
moduleAddAuthor(AUTHOR);
moduleAddVersion(VERSION);
hook = createEventHook(EVENT_JOIN_CHANNEL, channels_update);
if (moduleAddEventHook(hook) != MOD_ERR_OK)
return MOD_STOP;
hook = createEventHook(EVENT_PART_CHANNEL, channels_update);
if (moduleAddEventHook(hook) != MOD_ERR_OK)
return MOD_STOP;
hook = createEventHook(EVENT_CHANGE_NICK, channels_update);
if (moduleAddEventHook(hook) != MOD_ERR_OK)
return MOD_STOP;
hook = createEventHook(EVENT_USER_LOGOFF, user_quit);
if (moduleAddEventHook(hook) != MOD_ERR_OK)
return MOD_STOP;
hook = createEventHook(EVENT_CHAN_DROP, channels_update);
if (moduleAddEventHook(hook) != MOD_ERR_OK)
return MOD_STOP;
hook = createEventHook(EVENT_CHAN_EXPIRE, channels_update);
if (moduleAddEventHook(hook) != MOD_ERR_OK)
return MOD_STOP;
hook = createEventHook(EVENT_NICK_LOGOUT, channels_update);
if (moduleAddEventHook(hook) != MOD_ERR_OK)
return MOD_STOP;
hook = createEventHook(EVENT_RELOAD, reload_config);
if (moduleAddEventHook(hook) != MOD_ERR_OK)
return MOD_STOP;
if (load_config() == MOD_STOP) return MOD_STOP;
if (do_mysql_connect() == MOD_STOP)
{
alog("[\002cs_nicklist\002] Can't connect to MySQL server");
return MOD_STOP;
}
ret = do_mysql_query("CREATE TABLE IF NOT EXISTS channels"
"(chan char(50),"
"user char(50))");
if(ret == MOD_STOP)
return MOD_STOP;
alog("[\002cs_nicklist\002]: loaded . . . [Author: \002%s\002] [Version: \002%s\002]", AUTHOR, VERSION);
return MOD_CONT;
}
int load_config(void)
{
Directive confvalues[][1] = {
{{ "NickMysqlHost", { { PARAM_STRING, PARAM_RELOAD, &NICK_SQL_HOST } } }},
{{ "NickMysqlPort", { { PARAM_PORT, PARAM_RELOAD, &NICK_SQL_PORT } } }},
{{ "NickMysqlUser", { { PARAM_STRING, PARAM_RELOAD, &NICK_SQL_USER } } }},
{{ "NickMysqlPass", { { PARAM_STRING, PARAM_RELOAD, &NICK_SQL_PASS } } }},
{{ "NickMysqlName", { { PARAM_STRING, PARAM_RELOAD, &NICK_SQL_DB } } }}
};
NICK_SQL_PORT = 3306;
if (NICK_SQL_HOST) { free(NICK_SQL_HOST); NICK_SQL_HOST = NULL; }
if (NICK_SQL_USER) { free(NICK_SQL_USER); NICK_SQL_USER = NULL; }
if (NICK_SQL_PASS) { free(NICK_SQL_PASS); NICK_SQL_PASS = NULL; }
if (NICK_SQL_DB) { free(NICK_SQL_DB); NICK_SQL_DB = NULL; }
i = 0;
for (i = 0; i < 5; i++)
{
moduleGetConfigDirective(confvalues[i]);
}
return MOD_CONT;
}
int reload_config(int ac, char **av)
{
if (ac >= 1)
{
if (!stricmp(av[0], EVENT_START))
{
alog("[\002cs_nicklist\002]: Reloading configuration directives...");
return load_config();
}
}
return MOD_CONT;
}
void AnopeFini(void)
{
if (NICK_SQL_HOST) { free(NICK_SQL_HOST); NICK_SQL_HOST = NULL; }
if (NICK_SQL_USER) { free(NICK_SQL_USER); NICK_SQL_USER = NULL; }
if (NICK_SQL_PASS) { free(NICK_SQL_PASS); NICK_SQL_PASS = NULL; }
if (NICK_SQL_DB) { free(NICK_SQL_DB); NICK_SQL_DB = NULL; }
do_mysql_close();
alog("[\002cs_nicklist\002]: Modul unloaded");
}
int channels_update(int ac, char **av)
{
FILE *file;
Channel *c;
ChannelInfo *ci;
int carryon = 0;
int i;
carryon = 0;
do_mysql_query("DELETE FROM channels;");
for(i = 0; i < 1024; i++)
{
for(c = chanlist[i]; c; c = c->next)
{
channel_update(c->name);
}
}
return MOD_CONT;
}
int user_quit(int ac, char **av)
{
char query[200];
snprintf(query, 200, "DELETE FROM channels WHERE (user=\"%s\");",esc_str(av[0]));
do_mysql_query(query);
return 1;
}
int channel_update(char *chan)
{
Channel *c;
char query[200];
c = findchan(chan);
cu = c->users;
while (cu)
{
next = cu->next;
snprintf(query, 200, "INSERT INTO channels(chan,user) VALUES (\"%s\",\"%s\");",esc_str(lower(c->name)),esc_str(cu->user->nick));
do_mysql_query(query);
cu = next;
}
return 1;
}
int do_mysql_connect()
{
mysql_obj = mysql_init(NULL);
if(mysql_real_connect(mysql_obj, NICK_SQL_HOST, NICK_SQL_USER, NICK_SQL_PASS, NICK_SQL_DB, 3306, NULL, 0) == NULL)
{
alog("[\002cs_nicklist\002]: mysql_real_connect FAILED!");
return MOD_STOP;
}
return MOD_CONT;
}
int do_mysql_query(char *q)
{
char log[300];
unsigned querysize = 0;
querysize = (unsigned) strlen(q);
//snprintf(log, 300, "Query: \"%s\" (%i)",q,querysize);
//alog(log);
if (mysql_real_query(mysql_obj, q, querysize)) {
alog("[\002cs_nicklist\002]: mysql_real_query FAILED!");
return MOD_STOP;
}
if(res != NULL)
{
mysql_free_result(res);
res = NULL;
}
res = mysql_store_result(mysql_obj);
return MOD_CONT;
}
void do_mysql_close()
{
if (res)
{
mysql_free_result(res);
res = NULL;
}
mysql_close(mysql_obj);
}
char *lower(char *str)
{
char *toRet = str;
for(i = 0; i < strlen(toRet); i++)
toRet[i] = tolower(toRet[i]);
return toRet;
}
char *esc_str(char *str)
{
char *toRet = (char *) malloc(strlen(str) * 2 + 1);
mysql_real_escape_string(mysql_obj, toRet, str, strlen(str));
return toRet;
}