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);