git-svn-id: file:///raid/svn-personal/irc-archiver/trunk@8 f310dea9-ad02-7e44-859a-30a050007fc7
This commit is contained in:
Nishi 2024-08-30 03:46:36 +00:00
parent d0af1bc41f
commit ee3ab054db
5 changed files with 133 additions and 1 deletions

View File

@ -5,7 +5,7 @@ include $(PWD)/Platform/$(PLATFORM).mk
.PHONY: all clean
.SUFFIXES: .c .o
OBJS = main.o util.o bot.o ircfw.o
OBJS = main.o util.o db.o bot.o ircfw.o
all: ircarc$(EXEC)

View File

@ -3,6 +3,7 @@
#include "ia_bot.h"
#include "ia_util.h"
#include "ia_db.h"
#include "ircfw.h"
@ -35,6 +36,7 @@ extern char* realname;
extern char* nickname;
extern char* username;
extern char* password;
extern char* nickserv;
extern char* channels[];
extern int port;
@ -132,6 +134,10 @@ void ia_bot_loop(void) {
}
sprintf(construct, "NOTICE %s :IRC-Archiver %s is ready to accept requests", admin, IRCARC_VERSION);
ircfw_socket_send_cmd(ia_sock, NULL, construct);
if(nickserv != NULL) {
sprintf(construct, "PRIVMSG NickServ :%s", nickserv);
ircfw_socket_send_cmd(ia_sock, NULL, construct);
}
}
} else {
if(strcasecmp(ircfw_message.command, "PING") == 0) {
@ -167,6 +173,7 @@ void ia_bot_loop(void) {
}
} else if(sentin[0] == '#') {
/* This was sent in channel ; log it */
ia_db_put(nick, sentin, msg);
} else {
/* Command, I guess */
int i;

94
Bot/db.c Normal file
View File

@ -0,0 +1,94 @@
/* $Id$ */
#include "ia_db.h"
#include "ia_util.h"
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <sqlite3.h>
sqlite3* sql;
extern char* database;
int ia_db_init(void) {
int ret;
ret = sqlite3_open(database, &sql);
if(ret != SQLITE_OK) {
return 1;
}
ret = sqlite3_exec(sql, "create table if not exists log(user text, channel text, message text, date number)", NULL, NULL, NULL);
if(ret != SQLITE_OK) {
return 1;
}
return 0;
}
char* escape_sql(const char* stuff) {
char* str = malloc(strlen(stuff) * 2 + 1);
int incr = 0;
int i;
for(i = 0; stuff[i] != 0; i++) {
if(stuff[i] == '\'') {
str[incr++] = '\'';
str[incr++] = '\'';
} else {
str[incr++] = stuff[i];
}
}
str[incr] = 0;
return str;
}
int ia_db_put(const char* user, const char* channel, const char* message) {
char* eusr = escape_sql(user);
char* echn = escape_sql(channel);
char* emsg = escape_sql(message);
char* date = malloc(512);
sprintf(date, "%llu", (unsigned long long)time(NULL));
char* tmp;
char* str;
tmp = ia_strcat("insert into log values('", eusr);
str = ia_strcat(tmp, "', '");
free(tmp);
tmp = str;
str = ia_strcat(tmp, echn);
free(tmp);
tmp = str;
str = ia_strcat(tmp, "', '");
free(tmp);
tmp = str;
str = ia_strcat(tmp, emsg);
free(tmp);
tmp = str;
str = ia_strcat(tmp, "', ");
free(tmp);
tmp = str;
str = ia_strcat(tmp, date);
free(tmp);
tmp = str;
str = ia_strcat(tmp, ")");
free(tmp);
free(date);
free(eusr);
free(echn);
free(emsg);
int ret = sqlite3_exec(sql, str, NULL, NULL, NULL);
return ret == SQLITE_OK ? 0 : 1;
}

9
Bot/ia_db.h Normal file
View File

@ -0,0 +1,9 @@
/* $Id$ */
#ifndef __IA_DB_H__
#define __IA_DB_H__
int ia_db_init(void);
int ia_db_put(const char* user, const char* channel, const char* message);
#endif

View File

@ -9,15 +9,18 @@
#include "ia_util.h"
#include "ia_bot.h"
#include "ia_db.h"
extern bool ia_do_log;
char* host = NULL;
int port = 0;
char* nickname = NULL;
char* webroot = NULL;
char* database = NULL;
char* username = NULL;
char* realname = NULL;
char* nickserv = NULL;
char* password = NULL;
char* admin = NULL;
char* channels[128];
@ -94,6 +97,12 @@ int main(int argc, char** argv) {
} else if(strcmp(key, "realname") == 0) {
if(realname != NULL) free(realname);
realname = ia_strdup(value);
} else if(strcmp(key, "webroot") == 0) {
if(webroot != NULL) free(webroot);
webroot = ia_strdup(value);
} else if(strcmp(key, "nickserv") == 0) {
if(nickserv != NULL) free(nickserv);
nickserv = ia_strdup(value);
} else if(strcmp(key, "channel") == 0) {
channels[chanincr++] = ia_strdup(value);
channels[chanincr] = NULL;
@ -136,6 +145,10 @@ int main(int argc, char** argv) {
fprintf(stderr, "Specify admin\n");
st = 1;
}
if(webroot == NULL) {
fprintf(stderr, "Specify webroot\n");
st = 1;
}
if(realname == NULL) {
fprintf(stderr, "Specify realname\n");
st = 1;
@ -144,6 +157,11 @@ int main(int argc, char** argv) {
printf("Initializing the database\n");
if(ia_db_init() != 0) {
fprintf(stderr, "Failed to open database\n");
goto cleanup;
}
pid_t pid = 0;
if(daemon) {
printf("Bot spawning a daemon\n");
@ -156,7 +174,10 @@ int main(int argc, char** argv) {
printf("Spawned daemon, I am exiting\n");
}
cleanup:
if(host != NULL) free(host);
if(nickserv != NULL) free(nickserv);
if(webroot != NULL) free(webroot);
if(realname != NULL) free(realname);
if(database != NULL) free(database);
if(username != NULL) free(username);
@ -166,4 +187,5 @@ int main(int argc, char** argv) {
for(i = 0; channels[i] != NULL; i++) {
free(channels[i]);
}
return st;
}