git.strcat.st

/strcat/minitox.git/ - summarytreelogarchive

subject
add optional logging when -l flag passed
commit
7e81c3531034c6430da4bf97852fc5843cba477c
date
2026-04-20T00:44:27Z
message
diff
 minitox.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 49 insertions(+), 5 deletions(-)

diff --git a/minitox.c b/minitox.c
index 3139d86..c3ee877 100644
--- a/minitox.c
+++ b/minitox.c
@@ -17,6 +17,7 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/ioctl.h>
+#include <sys/stat.h>
 
 #include <tox/tox.h>
 
@@ -178,6 +179,7 @@ struct Group *groups = NULL;
 enum TALK_TYPE { TALK_TYPE_FRIEND, TALK_TYPE_GROUP, TALK_TYPE_COUNT, TALK_TYPE_NULL = UINT32_MAX };
 
 uint32_t TalkingTo = TALK_TYPE_NULL;
+bool logging_enabled = false;
 
 
 /*******************************************************************************
@@ -362,6 +364,47 @@ char *bin2hex(const uint8_t *bin, size_t length) {
     return saved;
 }
 
+static void append_chat_log(bool is_group, uint32_t num, const char *name, const char *message, size_t length) {
+    if (!logging_enabled) return;
+
+    const char *home = getenv("HOME");
+    if (!home || !home[0]) return;
+
+    char tox_dir[4096];
+    char logs_dir[4096];
+    if (snprintf(tox_dir, sizeof(tox_dir), "%s/.tox", home) <= 0) return;
+    if (snprintf(logs_dir, sizeof(logs_dir), "%s/logs", tox_dir) <= 0) return;
+
+    mkdir(tox_dir, 0700);
+    mkdir(logs_dir, 0700);
+
+    char *id_hex = NULL;
+    if (is_group) {
+        uint8_t group_id[TOX_CONFERENCE_ID_SIZE];
+        if (!tox_conference_get_id(tox, num, group_id)) return;
+        id_hex = bin2hex(group_id, sizeof(group_id));
+    } else {
+        struct Friend *f = getfriend(num);
+        if (!f) return;
+        id_hex = bin2hex(f->pubkey, sizeof(f->pubkey));
+    }
+
+    if (!id_hex) return;
+
+    char path[4096];
+    if (snprintf(path, sizeof(path), "%s/%s", logs_dir, id_hex) <= 0) {
+        free(id_hex);
+        return;
+    }
+    free(id_hex);
+
+    FILE *f = fopen(path, "ab");
+    if (!f) return;
+
+    fprintf(f, "[%s] <%s> %.*s\n", getftime(), name ? name : "unknown", (int)length, message ? message : "");
+    fclose(f);
+}
+
 struct ChatHist ** get_current_histp(void) {
     if (TalkingTo == TALK_TYPE_NULL) return NULL;
     uint32_t num = INDEX_TO_NUM(TalkingTo);
@@ -697,6 +740,7 @@ void friend_message_cb(Tox *tox, uint32_t friend_num, TOX_MESSAGE_TYPE type, con
     }
 
     char *msg = genmsg(&f->hist, GUEST_MSG_PREFIX "%.*s", getftime(), f->name, (int)length, (char*)message);
+    append_chat_log(false, friend_num, f->name, (char*)message, length);
     if (GEN_INDEX(friend_num, TALK_TYPE_FRIEND) == TalkingTo) {
         PRINT("%s", msg);
     } else {
@@ -808,6 +852,7 @@ void group_message_cb(Tox *tox, uint32_t group_num, uint32_t peer_number, TOX_ME
 
     struct GroupPeer *peer = &cf->peers[peer_number];
     char *msg = genmsg(&cf->hist, GUEST_MSG_PREFIX "%.*s", getftime(), peer->name, (int)length, (char*)message);
+    append_chat_log(true, group_num, peer->name, (char*)message, length);
 
     if (GEN_INDEX(group_num, TALK_TYPE_GROUP) == TalkingTo) {
         PRINT("%s", msg);
@@ -1538,9 +1583,11 @@ void repl_iterate(void){
                 PRINT("%s", msg);
                 switch (INDEX_TO_TYPE(TalkingTo)) {
                     case TALK_TYPE_FRIEND:
+                        append_chat_log(false, INDEX_TO_NUM(TalkingTo), self.name, line, strlen(line));
                         tox_friend_send_message(tox, INDEX_TO_NUM(TalkingTo), TOX_MESSAGE_TYPE_NORMAL, (uint8_t*)line, strlen(line), NULL);
                         continue; // continue to for_1
                     case TALK_TYPE_GROUP:
+                        append_chat_log(true, INDEX_TO_NUM(TalkingTo), self.name, line, strlen(line));
                         tox_conference_send_message(tox, INDEX_TO_NUM(TalkingTo), TOX_MESSAGE_TYPE_NORMAL, (uint8_t*)line, strlen(line), NULL);
                         continue;  // continue to for_1
                 }
@@ -1589,11 +1636,8 @@ void repl_iterate(void){
 int main(int argc, char **argv) {
     atexit(cleanup_on_exit);
 
-    if (argc == 2 && strcmp(argv[1], "--help") == 0) {
-        fputs("Usage: minitox\n", stdout);
-        fputs("\n", stdout);
-        fputs("Minitox does not take any arguments.\n", stdout);
-        return 0;
+    if (argc == 2 && strcmp(argv[1], "-l") == 0) {
+        logging_enabled = true;
     }
 
     fputs("Type `/guide` to print the guide.\n", stdout);