#include "IRCEvents.h"
#include "ClientSocket.h"
#include "WHOHandler.h"
+#include "lang.h"
struct irc_cmd *irc_commands = NULL;
}
void reply(struct ClientSocket *client, struct UserNode *user, const char *text, ...) {
- //following
+ char *reply_format = get_language_string(user, text);
+ if(reply_format == NULL)
+ reply_format = text;
+ if((user->flags & USERFLAG_ISAUTHED) && !(user->flags & USERFLAG_LOADED_SETTINGS))
+ load_user_settings(user);
+ char formatBuf[MAXLEN];
+ sprintf(formatBuf, "%s %s :%s", ((user->flags & USERFLAG_REPLY_PRIVMSG) ? "PRIVMSG" : "NOTICE"), user->nick, reply_format);
+ va_list arg_list;
+ char sendBuf[MAXLEN];
+ int pos;
+ if (!(client->flags & SOCKET_FLAG_CONNECTED)) return;
+ sendBuf[0] = '\0';
+ va_start(arg_list, formatBuf);
+ pos = vsnprintf(sendBuf, MAXLEN - 2, formatBuf, arg_list);
+ va_end(arg_list);
+ if (pos < 0 || pos > (MAXLEN - 2)) pos = MAXLEN - 2;
+ sendBuf[pos] = '\n';
+ sendBuf[pos+1] = '\0';
+ write_socket(client, sendBuf, pos+1);
}
gcc -g -O2 ${LIBS} -c WHOHandler.c -o WHOHandler.o ${CFLAGS}
gcc -g -O2 ${LIBS} -c modcmd.c -o modcmd.o ${CFLAGS}
gcc -g -O2 ${LIBS} -c mysqlConn.c -o mysqlConn.o ${CFLAGS}
+ gcc -g -O2 ${LIBS} -c lang.c -o lang.o ${CFLAGS}
gcc -g -O2 ${LIBS} -c bots.c -o bots.o ${CFLAGS}
gcc -g -O2 ${LIBS} -c bot_NeonServ.c -o bot_NeonServ.o ${CFLAGS}
#include "UserNode.h"
#include "ChanUser.h"
+#include "mysqlConn.h"
+#include "lang.h"
static struct UserNode **userList;
last_user = cuser;
}
}
+
+
+void load_user_settings(struct UserNode *user) {
+ if(!(user->flags & USERFLAG_ISAUTHED) || (user->flags & USERFLAG_LOADED_SETTINGS))
+ return;
+ check_mysql();
+ MYSQL_RES *res;
+ MYSQL_ROW row;
+ printf_mysql_query("SELECT `user_lang`, `user_reply_privmsg` FROM `users` WHERE `user_user` = '%s'", escape_string(user->auth));
+ res = mysql_use();
+ if ((row = mysql_fetch_row(res)) != NULL) {
+ user->language = get_language_by_tag(row[0]);
+ if(user->language == NULL) user->language = get_default_language();
+ if(strcmp(row[1], "0"))
+ user->flags |= USERFLAG_REPLY_PRIVMSG;
+ } else
+ user->language = lang_c;
+ user->flags |= USERFLAG_LOADED_SETTINGS
+}
#define _UserNode_h
#include "main.h"
-#define USERFLAG_ISBOT 0x0001
-#define USERFLAG_ISAUTHED 0x0002
-#define USERFLAG_ISIRCOP 0x0004
-#define USERFLAG_ISTMPUSER 0x0008
-#define USERFLAG_ISSERVER 0x0010
-#define USERFLAG_FREETMPUSER 0x0020
+#define USERFLAG_ISBOT 0x0001
+#define USERFLAG_ISAUTHED 0x0002
+#define USERFLAG_ISIRCOP 0x0004
+#define USERFLAG_ISTMPUSER 0x0008
+#define USERFLAG_ISSERVER 0x0010
+#define USERFLAG_FREETMPUSER 0x0020
+#define USERFLAG_LOADED_SETTINGS 0x0040
+#define USERFLAG_REPLY_PRIVMSG 0x0080
struct ChanUser;
+struct language;
struct UserNode {
char nick[NICKLEN+1];
unsigned int flags;
time_t created;
struct ChanUser *channel;
+ struct language *language;
struct UserNode *next;
};
void delUser(struct UserNode* user, int freeUser);
void clearTempUsers();
+void load_user_settings(struct UserNode* user);
+
#endif
#define BOTID 1
#define CLASSNAME "NeonServ"
+static const struct default_language_entry msgtab[] = {
+
+};
+
static CMD_BIND(neonserv_cmd_users) {
struct ChanUser *chanuser;
putsock(client, "PRIVMSG %s :[BOT JOIN] Users on this Channel:", chan->name);
--- /dev/null
+#include "lang.h"
+#include "UserNode.h"
+
+#define DEFAULT_LANG_TAG "EN"
+#define DEFAULT_LANG_NAME "English"
+
+static struct language **langdict;
+static struct language *lang_c;
+
+void init_lang() {
+ langdict = calloc(MAXLANGUAGES, sizeof(*langdict));
+}
+
+void free_lang() {
+
+}
+
+static struct language* add_language(char *langtag, char *langname) {
+ int index;
+ for(index = 0; index < MAXLANGUAGES; index++) {
+ if(langdict[index] == NULL) break;
+ if(!strcmp(langdict[index]->langname, langname) || !strcmp(langdict[index]->langtag, langtag))
+ return langdict[index];
+ }
+ if(index == MAXLANGUAGES) return NULL;
+ struct language *lang = malloc(sizeof(*lang));
+ if (!lang) {
+ perror("malloc() failed");
+ return NULL;
+ }
+ lang->langtag = strdup(langtag);
+ lang->langname = strdup(langname);
+ struct language_table **entrys = calloc(27, sizeof(*entrys));
+ lang->entrys = entrys;
+ return lang;
+}
+
+static int get_entry_index(const char *ident) {
+ const char *underscore = strstr(ident, "_");
+ if(!underscore || !(underscore[1] >= 65 && underscore[1] <= 90)) return 26;
+ return (underscore[1] - 'A');
+}
+
+struct language* get_language_by_tag(char *tag) {
+ int index;
+ for(index = 0; index < MAXLANGUAGES; index++) {
+ if(langdict[index] == NULL) break;
+ if(!strcmp(langdict[index]->langtag, tag))
+ return langdict[index];
+ }
+ return NULL;
+}
+
+struct language* get_language_by_name(char *name) {
+ int index;
+ for(index = 0; index < MAXLANGUAGES; index++) {
+ if(langdict[index] == NULL) break;
+ if(!strcmp(langdict[index]->langname, name))
+ return langdict[index];
+ }
+ return NULL;
+}
+
+struct language* get_default_language() {
+ if(lang_c == NULL)
+ lang_c = add_language(DEFAULT_LANG_TAG, DEFAULT_LANG_NAME);
+ return lang_c;
+}
+
+void register_default_language_table(const struct default_language_entry *msgtab) {
+ if(lang_c == NULL)
+ lang_c = add_language(DEFAULT_LANG_TAG, DEFAULT_LANG_NAME);
+ struct language_table *lang_entry;
+ int index;
+ while(msgtab->ident) {
+ index = get_entry_index(msgtab->ident);
+ lang_entry = malloc(sizeof(*lang_entry));
+ if (!lang_entry) {
+ perror("malloc() failed");
+ return;
+ }
+ lang_entry->ident = strdup(msgtab->ident);
+ lang_entry->text = strdup(msgtab->text);
+ lang_entry->next = lang_c->entrys[index];
+ lang_c->entrys[index] = lang_entry;
+ msgtab++;
+ }
+}
+
+char *get_language_string(struct UserNode *user, char* msg_ident) {
+ struct language* lang;
+ if((user->flags & USERFLAG_ISAUTHED)) {
+ if(!(user->flags & USERFLAG_LOADED_SETTINGS))
+ load_user_settings(user);
+ lang = user->language;
+ } else
+ lang = lang_c;
+ int index = get_entry_index(msg_ident);
+ struct language_table* entry;
+ for(entry = lang->entrys[index]; entry; entry = entry->next) {
+ if(!strcmp(entry->ident, msg_ident))
+ return entry->text;
+ }
+}
--- /dev/null
+#ifndef _lang_h
+#define _lang_h
+
+struct UserNode;
+
+struct default_language_entry {
+ char *ident;
+ char *text;
+};
+
+struct language_table {
+ char *ident;
+ char *text;
+
+ struct language_table *next;
+};
+
+struct language {
+ char *langtag;
+ char *langname;
+ struct language_table **entrys;
+};
+
+struct language* get_language_by_tag(char *tag);
+struct language* get_language_by_name(char *name);
+struct language* get_default_language();
+void register_default_language_table(const struct default_language_entry **msgtab);
+char *get_language_string(struct UserNode *user, char* msg_ident);
+
+#endif
\ No newline at end of file
#include "WHOHandler.h"
#include "bots.h"
#include "mysqlConn.h"
+#include "lang.h"
void cleanup() {
free_sockets();
free_modcmd();
free_whoqueue();
free_bots();
+ free_lang();
free_mysql();
}
init_ChanNode();
init_bind();
init_modcmd();
+ init_lang();
init_bots();
time_t socket_wait;
#define MAXLEN 512
#define TRIGGERLEN 50
#define MAXNUMPARAMS 200 /* maximum number of parameters in one line */
+#define MAXLANGUAGES 5
//valid nick chars
#define VALID_NICK_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890{|}~[\\]^_`"
}
MYSQL_RES *mysql_use() {
- MYSQL_RES *res = mysql_use_result(mysql_conn);
+ MYSQL_RES *res = mysql_store_result(mysql_conn);
struct used_result *result = malloc(sizeof(*result));
if (!result) {
mysql_free_result(res);