diff --git a/src/execute.c b/src/execute.c index d865b0b..7d63b97 100644 --- a/src/execute.c +++ b/src/execute.c @@ -52,6 +52,7 @@ static struct cmd_func global_commands[] = { { "/note", cmd_note }, { "/q", cmd_quit }, { "/quit", cmd_quit }, + { "/requests", cmd_requests }, { "/status", cmd_status }, #ifdef _AUDIO diff --git a/src/execute.h b/src/execute.h index 89d99d6..add3819 100644 --- a/src/execute.h +++ b/src/execute.h @@ -29,10 +29,10 @@ #define MAX_NUM_ARGS 4 /* Includes command */ #ifdef _AUDIO -#define GLOBAL_NUM_COMMANDS 16 +#define GLOBAL_NUM_COMMANDS 17 #define CHAT_NUM_COMMANDS 12 #else -#define GLOBAL_NUM_COMMANDS 14 +#define GLOBAL_NUM_COMMANDS 15 #define CHAT_NUM_COMMANDS 5 #endif /* _AUDIO */ diff --git a/src/friendlist.c b/src/friendlist.c index a3ca327..a000025 100644 --- a/src/friendlist.c +++ b/src/friendlist.c @@ -791,7 +791,7 @@ static void blocklist_onDraw(ToxWindow *self, Tox *m, int y2, int x2) wmove(self->window, y2 - 1, 1); wattron(self->window, A_BOLD); - wprintw(self->window, "ID: "); + wprintw(self->window, "Key: "); wattroff(self->window, A_BOLD); int i; diff --git a/src/global_commands.c b/src/global_commands.c index 73f5471..ebcf688 100644 --- a/src/global_commands.c +++ b/src/global_commands.c @@ -50,18 +50,18 @@ void cmd_accept(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[ int req = atoi(argv[1]); - if ((req == 0 && strcmp(argv[1], "0")) || req < 0 || req >= MAX_FRIEND_REQUESTS) { + if ((req == 0 && strcmp(argv[1], "0")) || req < 0 || req > MAX_FRIEND_REQUESTS) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "No pending friend request with that ID."); return; } - if (FriendRequests.list[req][0] == '\0') { + if (!FriendRequests.request[req].active) { line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "No pending friend request with that ID."); return; } const char *msg; - int32_t friendnum = tox_add_friend_norequest(m, FriendRequests.list[req]); + int32_t friendnum = tox_add_friend_norequest(m, FriendRequests.request[req].key); if (friendnum == -1) msg = "Failed to add friend."; @@ -70,17 +70,17 @@ void cmd_accept(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[ on_friendadded(m, friendnum, true); } - memset(&FriendRequests.list[req], 0, TOX_CLIENT_ID_SIZE); + memset(&FriendRequests.request[req], 0, sizeof(struct _friend_request)); int i; - for (i = FriendRequests.index; i > 0; --i) { - if (FriendRequests.list[i - 1][0] == '\0') + for (i = FriendRequests.max_idx; i > 0; --i) { + if (FriendRequests.request[i - 1].active) break; } - FriendRequests.index = i; - + FriendRequests.max_idx = i; + --FriendRequests.num_requests; line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%s", msg); } @@ -365,6 +365,38 @@ void cmd_quit(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MA exit_toxic_success(m); } +void cmd_requests(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) +{ + if (FriendRequests.num_requests == 0) { + line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "No pending friend requests."); + return; + } + + int i; + int count = 0; + + for (i = 0; i < FriendRequests.max_idx; ++i) { + if (!FriendRequests.request[i].active) + continue; + + char id[TOX_CLIENT_ID_SIZE * 2 + 1] = {0}; + size_t j; + + for (j = 0; j < TOX_CLIENT_ID_SIZE; ++j) { + char d[3]; + snprintf(d, sizeof(d), "%02X", FriendRequests.request[i].key[j] & 0xff); + strcat(id, d); + } + + line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "id: %d, Key: %s", i, id); + line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Message: %s", FriendRequests.request[i].msg); + + if (++count < FriendRequests.num_requests) + line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, ""); + + } +} + void cmd_status(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) { bool have_note = false; diff --git a/src/global_commands.h b/src/global_commands.h index 89f10bc..0f05965 100644 --- a/src/global_commands.h +++ b/src/global_commands.h @@ -37,6 +37,7 @@ void cmd_nick(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE] void cmd_note(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]); void cmd_prompt_help(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]); void cmd_quit(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]); +void cmd_requests(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]); void cmd_status(WINDOW *, ToxWindow *, Tox *, int argc, char (*argv)[MAX_STR_SIZE]); void cmd_add_helper(ToxWindow *self, Tox *m, char *id_bin, char *msg); diff --git a/src/help.c b/src/help.c index 1490415..8016268 100644 --- a/src/help.c +++ b/src/help.c @@ -138,6 +138,7 @@ static void help_draw_global(ToxWindow *self) wprintw(win, " /add : Add contact with optional message\n"); wprintw(win, " /accept : Accept friend request\n"); + wprintw(win, " /requests : List pending friend requests\n"); wprintw(win, " /connect : Manually connect to a DHT node\n"); wprintw(win, " /status : Set status with optional note\n"); wprintw(win, " /note : Set a personal note\n"); @@ -264,9 +265,9 @@ void help_onKey(ToxWindow *self, wint_t key) case 'g': #ifdef _AUDIO - help_init_window(self, 21, 80); + help_init_window(self, 22, 80); #else - help_init_window(self, 17, 80); + help_init_window(self, 18, 80); #endif self->help->type = HELP_GLOBAL; break; diff --git a/src/prompt.c b/src/prompt.c index ed94a4a..e8677ec 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -63,6 +63,7 @@ const char glob_cmd_list[AC_NUM_GLOB_COMMANDS][MAX_CMDNAME_SIZE] = { { "/nick" }, { "/note" }, { "/quit" }, + { "/requests" }, { "/status" }, #ifdef _AUDIO @@ -128,19 +129,23 @@ void prompt_update_connectionstatus(ToxWindow *prompt, bool is_connected) /* Adds friend request to pending friend requests. Returns request number on success, -1 if queue is full. */ -static int add_friend_request(const char *public_key) +static int add_friend_request(const char *public_key, const char *data) { - if (FriendRequests.index >= MAX_FRIEND_REQUESTS) + if (FriendRequests.max_idx >= MAX_FRIEND_REQUESTS) return -1; int i; - for (i = 0; i <= FriendRequests.index; ++i) { - if (FriendRequests.list[i][0] == '\0') { - memcpy(FriendRequests.list[i], public_key, TOX_CLIENT_ID_SIZE); + for (i = 0; i <= FriendRequests.max_idx; ++i) { + if (!FriendRequests.request[i].active) { + FriendRequests.request[i].active = true; + memcpy(FriendRequests.request[i].key, public_key, TOX_CLIENT_ID_SIZE); + snprintf(FriendRequests.request[i].msg, sizeof(FriendRequests.request[i].msg), "%s", data); - if (i == FriendRequests.index) - ++FriendRequests.index; + if (i == FriendRequests.max_idx) + ++FriendRequests.max_idx; + + ++FriendRequests.num_requests; return i; } @@ -364,7 +369,7 @@ static void prompt_onFriendRequest(ToxWindow *self, Tox *m, const char *key, con line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 0, 0, "Friend request with the message '%s'", data); write_to_log("Friend request with the message '%s'", "", ctx->log, true); - int n = add_friend_request(key); + int n = add_friend_request(key, data); if (n == -1) { const char *errmsg = "Friend request queue is full. Discarding request."; diff --git a/src/prompt.h b/src/prompt.h index 6b48de7..e9d37d6 100644 --- a/src/prompt.h +++ b/src/prompt.h @@ -27,16 +27,23 @@ #include "windows.h" #ifdef _AUDIO -#define AC_NUM_GLOB_COMMANDS 16 +#define AC_NUM_GLOB_COMMANDS 17 #else -#define AC_NUM_GLOB_COMMANDS 14 +#define AC_NUM_GLOB_COMMANDS 15 #endif /* _AUDIO */ #define MAX_FRIEND_REQUESTS 32 +struct _friend_request { + bool active; + char msg[MAX_STR_SIZE]; + uint8_t key[TOX_CLIENT_ID_SIZE]; +}; + typedef struct { - int index; - uint8_t list[MAX_FRIEND_REQUESTS][TOX_CLIENT_ID_SIZE]; + int max_idx; + int num_requests; + struct _friend_request request[MAX_FRIEND_REQUESTS]; } _FriendRequests; ToxWindow new_prompt(void);