From 7a81db868b1bdc8351134cd31464f2f6692c1eee Mon Sep 17 00:00:00 2001
From: 8nlight <8nlight@disroot.org>
Date: Tue, 1 Aug 2023 22:42:36 +0300
Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?=
=?UTF-8?q?=D1=82=D1=8C=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20=C2=AB?=
=?UTF-8?q?=C2=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Makefile | 6 +++++
cfg.h | 13 ++++++++++
main.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 98 insertions(+)
create mode 100644 Makefile
create mode 100644 cfg.h
create mode 100644 main.c
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..ead83ee
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,6 @@
+CFLAGS?= -s -Os -flto -pedantic
+all:
+ cc *.c $(CFLAGS) -obot
+
+clean:
+ rm irc.* bot
diff --git a/cfg.h b/cfg.h
new file mode 100644
index 0000000..425a097
--- /dev/null
+++ b/cfg.h
@@ -0,0 +1,13 @@
+#define NICK "history"
+#define HOST "irc.server.net"
+#define PORT 6667
+#define DIR "tmp/"
+
+char *channels[] = {"#channel"};
+
+//Output
+#define FORMAT_TXT "<%s> %s\n"
+#define FORMAT_HTML "[%s] %s
\n"
+#define FORMAT FORMAT_TXT
+
+#define OUTPUT ".txt"
diff --git a/main.c b/main.c
new file mode 100644
index 0000000..15c13fc
--- /dev/null
+++ b/main.c
@@ -0,0 +1,79 @@
+#include "irc.h"
+#include "cfg.h"
+#include
+IRCC_client client;
+
+void die(char *msg) {
+ puts(msg);
+ IRCC_close(&client);
+ exit(1);
+}
+
+struct tm GetTime(void) {
+ time_t t = time(NULL);
+ return *localtime(&t);
+}
+
+char *GetFilename(void) {
+ //Get filename + date
+ struct tm tm = GetTime();
+
+ size_t filename_size = strlen(client.channel + 1) + (sizeof(tm.tm_year) * 3) + strlen(OUTPUT) + 3;
+ char *filename = malloc(filename_size + 1);
+ if (filename == NULL)
+ die("malloc returned NULL");
+
+ snprintf(filename, filename_size, "%s-%d-%d-%d%s", client.channel + 1, tm.tm_year + 1900, tm.tm_mon, tm.tm_mday, OUTPUT);
+ return filename;
+}
+
+void WriteToFile(void) {
+ if (client.msg[1] == '.')
+ return;
+
+ char *filename = GetFilename();
+ FILE *fp = fopen(filename, "a");
+ free(filename);
+
+ if (fp == NULL) {
+ printf("Cant open file %s\n", client.channel);
+ return;
+ }
+
+ fprintf(fp, FORMAT, client.nick, client.msg + 1);
+ fclose(fp);
+}
+
+int main(void) {
+ if (chdir(DIR))
+ die("Cant chdir");
+
+ //512 - size of raw buffer (max)
+ IRCC_init(&client, 512);
+ int status = IRCC_connect(&client, HOST, PORT);
+ if (status == IRCC_ERROR)
+ die("Conn refused");
+
+ //Register and join in channel
+ IRCC_register(&client, NICK);
+ for (size_t i = 0; i < sizeof(channels) / sizeof(char *); i++) {
+ sleep(1);
+ size_t join_size = strlen("JOIN \r\n") + strlen(channels[i]) + 1;
+ char *tmp = malloc(join_size);
+ if (tmp == NULL)
+ die("malloc retured NULL");
+
+ snprintf(tmp, join_size, "JOIN %s\r\n", channels[i]);
+ send(client.socket, tmp, join_size, 0);
+ free(tmp);
+ }
+
+ while (1) {
+ unsigned int irc_status = IRCC_recv(&client);
+ if (irc_status == IRCC_DISCONNECTED)
+ die("Disconnected");
+
+ else if (client.nick != NULL && client.channel != NULL && client.msg != NULL && irc_status == IRCC_PRIVMSG)
+ WriteToFile();
+ }
+}