mirror of
https://github.com/Tha14/toxic.git
synced 2024-11-23 00:53:03 +01:00
Add groupchat side panel & add new callback
This commit is contained in:
parent
d8da80914d
commit
f84ece13de
@ -20,9 +20,9 @@ void cmd_chat_help(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*arg
|
|||||||
wprintw(window, "Chat commands:\n");
|
wprintw(window, "Chat commands:\n");
|
||||||
wattroff(window, A_BOLD);
|
wattroff(window, A_BOLD);
|
||||||
|
|
||||||
wprintw(window, " /status <type> <message> : Set your status with optional note\n");
|
wprintw(window, " /status <type> <msg> : Set your status with optional note\n");
|
||||||
wprintw(window, " /note <message> : Set a personal note\n");
|
wprintw(window, " /note <msg> : Set a personal note\n");
|
||||||
wprintw(window, " /nick <nickname> : Set your nickname\n");
|
wprintw(window, " /nick <nick> : Set your nickname\n");
|
||||||
wprintw(window, " /invite <n> : Invite friend to a group chat\n");
|
wprintw(window, " /invite <n> : Invite friend to a group chat\n");
|
||||||
wprintw(window, " /me <action> : Do an action\n");
|
wprintw(window, " /me <action> : Do an action\n");
|
||||||
wprintw(window, " /myid : Print your ID\n");
|
wprintw(window, " /myid : Print your ID\n");
|
||||||
|
@ -271,12 +271,12 @@ void cmd_prompt_help(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*a
|
|||||||
wprintw(window, "\n\nGlobal commands:\n");
|
wprintw(window, "\n\nGlobal commands:\n");
|
||||||
wattroff(window, A_BOLD);
|
wattroff(window, A_BOLD);
|
||||||
|
|
||||||
wprintw(window, " /add <id> <message> : Add friend with optional message\n");
|
wprintw(window, " /add <id> <msg> : Add friend with optional message\n");
|
||||||
wprintw(window, " /accept <n> : Accept friend request\n");
|
wprintw(window, " /accept <n> : Accept friend request\n");
|
||||||
wprintw(window, " /connect <ip> <port> <key> : Manually connect to a DHT server\n");
|
wprintw(window, " /connect <ip> <port> <key> : Manually connect to a DHT server\n");
|
||||||
wprintw(window, " /status <type> <message> : Set your status with optional note\n");
|
wprintw(window, " /status <type> <msg> : Set your status with optional note\n");
|
||||||
wprintw(window, " /note <message> : Set a personal note\n");
|
wprintw(window, " /note <msg> : Set a personal note\n");
|
||||||
wprintw(window, " /nick <nickname> : Set your nickname\n");
|
wprintw(window, " /nick <nick> : Set your nickname\n");
|
||||||
wprintw(window, " /groupchat : Create a group chat\n");
|
wprintw(window, " /groupchat : Create a group chat\n");
|
||||||
wprintw(window, " /myid : Print your ID\n");
|
wprintw(window, " /myid : Print your ID\n");
|
||||||
wprintw(window, " /quit or /exit : Exit Toxic\n");
|
wprintw(window, " /quit or /exit : Exit Toxic\n");
|
||||||
@ -285,7 +285,7 @@ void cmd_prompt_help(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*a
|
|||||||
|
|
||||||
wattron(window, A_BOLD);
|
wattron(window, A_BOLD);
|
||||||
wprintw(window, " * Argument messages must be enclosed in quotation marks.\n");
|
wprintw(window, " * Argument messages must be enclosed in quotation marks.\n");
|
||||||
wprintw(window, " * Use the TAB key to navigate through the tabs.\n");
|
wprintw(window, " * Use TAB and Shift-TAB to navigate through the tabs.\n");
|
||||||
wattroff(window, A_BOLD);
|
wattroff(window, A_BOLD);
|
||||||
|
|
||||||
wattroff(window, COLOR_PAIR(CYAN));
|
wattroff(window, COLOR_PAIR(CYAN));
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include "toxic_windows.h"
|
#include "toxic_windows.h"
|
||||||
#include "execute.h"
|
#include "execute.h"
|
||||||
#include "misc_tools.h"
|
#include "misc_tools.h"
|
||||||
|
#include "groupchat.h"
|
||||||
|
|
||||||
static GroupChat groupchats[MAX_GROUPCHAT_NUM];
|
static GroupChat groupchats[MAX_GROUPCHAT_NUM];
|
||||||
static int max_groupchat_index = 0;
|
static int max_groupchat_index = 0;
|
||||||
@ -31,6 +32,7 @@ int init_groupchat_win(ToxWindow *prompt, Tox *m, int groupnum)
|
|||||||
if (!groupchats[i].active) {
|
if (!groupchats[i].active) {
|
||||||
groupchats[i].chatwin = add_window(m, new_group_chat(m, groupnum));
|
groupchats[i].chatwin = add_window(m, new_group_chat(m, groupnum));
|
||||||
groupchats[i].active = true;
|
groupchats[i].active = true;
|
||||||
|
groupchats[i].num_peers = 0;
|
||||||
set_active_window(groupchats[i].chatwin);
|
set_active_window(groupchats[i].chatwin);
|
||||||
|
|
||||||
if (i == max_groupchat_index)
|
if (i == max_groupchat_index)
|
||||||
@ -67,10 +69,10 @@ static void print_groupchat_help(ChatContext *ctx)
|
|||||||
wprintw(ctx->history, "Group chat commands:\n");
|
wprintw(ctx->history, "Group chat commands:\n");
|
||||||
wattroff(ctx->history, A_BOLD);
|
wattroff(ctx->history, A_BOLD);
|
||||||
|
|
||||||
wprintw(ctx->history, " /add <id> <message> : Add friend with optional message\n");
|
wprintw(ctx->history, " /add <id> <msg> : Add friend with optional message\n");
|
||||||
wprintw(ctx->history, " /status <type> <message> : Set your status with optional note\n");
|
wprintw(ctx->history, " /status <type> <msg>: Set your status with optional note\n");
|
||||||
wprintw(ctx->history, " /note <message> : Set a personal note\n");
|
wprintw(ctx->history, " /note <msg> : Set a personal note\n");
|
||||||
wprintw(ctx->history, " /nick <nickname> : Set your nickname\n");
|
wprintw(ctx->history, " /nick <nick> : Set your nickname\n");
|
||||||
wprintw(ctx->history, " /groupchat : Create a group chat\n");
|
wprintw(ctx->history, " /groupchat : Create a group chat\n");
|
||||||
wprintw(ctx->history, " /myid : Print your ID\n");
|
wprintw(ctx->history, " /myid : Print your ID\n");
|
||||||
wprintw(ctx->history, " /clear : Clear the screen\n");
|
wprintw(ctx->history, " /clear : Clear the screen\n");
|
||||||
@ -112,6 +114,17 @@ static void groupchat_onGroupMessage(ToxWindow *self, Tox *m, int groupnum, int
|
|||||||
self->blink = true;
|
self->blink = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void groupchat_onGroupNamelistChange(ToxWindow *self, Tox *m, int groupnum)
|
||||||
|
{
|
||||||
|
if (self->num != groupnum)
|
||||||
|
return;
|
||||||
|
|
||||||
|
memset(groupchats[groupnum].peer_names, 0, sizeof(groupchats[groupnum].peer_names);
|
||||||
|
int num_peers = tox_group_number_peers(m, groupnum);
|
||||||
|
groupchats[groupnum].num_peers = MIN(MAX_GROUP_PEERS, num_peers);
|
||||||
|
tox_group_copy_names(m, groupnum, groupchats[groupnum].peer_names, num_peers);
|
||||||
|
}
|
||||||
|
|
||||||
static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key)
|
static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key)
|
||||||
{
|
{
|
||||||
ChatContext *ctx = (ChatContext *) self->chatwin;
|
ChatContext *ctx = (ChatContext *) self->chatwin;
|
||||||
@ -199,21 +212,40 @@ static void groupchat_onDraw(ToxWindow *self, Tox *m)
|
|||||||
curs_set(1);
|
curs_set(1);
|
||||||
int x, y;
|
int x, y;
|
||||||
getmaxyx(self->window, y, x);
|
getmaxyx(self->window, y, x);
|
||||||
|
|
||||||
ChatContext *ctx = (ChatContext *) self->chatwin;
|
ChatContext *ctx = (ChatContext *) self->chatwin;
|
||||||
|
wclrtobot(ctx->sidebar);
|
||||||
mvwhline(ctx->linewin, 0, 0, '_', x);
|
mvwhline(ctx->linewin, 0, 0, '_', x);
|
||||||
|
mvwvline(ctx->sidebar, 0, 0,'|', x);
|
||||||
|
|
||||||
|
int num_peers = groupchats[self->num].num_peers;
|
||||||
|
if (num_peers) {
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < num_peers; ++i) {
|
||||||
|
wmove(ctx->sidebar, i, 1);
|
||||||
|
groupchats[self->num].peer_names[i][SIDEBAR_WIDTH-2] = '\0';
|
||||||
|
uint8_t *nick = strlen(groupchats[self->num].peer_names[i]) ? groupchats[self->num].peer_names[i] : (uint8_t *) UNKNOWN_NAME;
|
||||||
|
wprintw(ctx->sidebar, "%s\n", nick);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
wrefresh(self->window);
|
wrefresh(self->window);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void groupchat_onInit(ToxWindow *self, Tox *m)
|
static void groupchat_onInit(ToxWindow *self, Tox *m)
|
||||||
{
|
{
|
||||||
int x, y;
|
int x, y;
|
||||||
ChatContext *ctx = (ChatContext *) self->chatwin;
|
|
||||||
getmaxyx(self->window, y, x);
|
getmaxyx(self->window, y, x);
|
||||||
ctx->history = subwin(self->window, y-3, x, 0, 0);
|
|
||||||
|
ChatContext *ctx = (ChatContext *) self->chatwin;
|
||||||
|
ctx->history = subwin(self->window, y-CHATBOX_HEIGHT+1, x-SIDEBAR_WIDTH-1, 0, 0);
|
||||||
scrollok(ctx->history, 1);
|
scrollok(ctx->history, 1);
|
||||||
ctx->linewin = subwin(self->window, 2, x, y-4, 0);
|
ctx->linewin = subwin(self->window, 2, x, y-CHATBOX_HEIGHT, 0);
|
||||||
|
ctx->sidebar = subwin(self->window, y-CHATBOX_HEIGHT+1, SIDEBAR_WIDTH, 0, x-SIDEBAR_WIDTH);
|
||||||
|
|
||||||
print_groupchat_help(ctx);
|
print_groupchat_help(ctx);
|
||||||
wmove(self->window, y - CURS_Y_OFFSET, 0);
|
wmove(self->window, y-CURS_Y_OFFSET, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ToxWindow new_group_chat(Tox *m, int groupnum)
|
ToxWindow new_group_chat(Tox *m, int groupnum)
|
||||||
@ -225,6 +257,7 @@ ToxWindow new_group_chat(Tox *m, int groupnum)
|
|||||||
ret.onDraw = &groupchat_onDraw;
|
ret.onDraw = &groupchat_onDraw;
|
||||||
ret.onInit = &groupchat_onInit;
|
ret.onInit = &groupchat_onInit;
|
||||||
ret.onGroupMessage = &groupchat_onGroupMessage;
|
ret.onGroupMessage = &groupchat_onGroupMessage;
|
||||||
|
ret.onGroupNamelistChange = &groupchat_onGroupNamelistChange;
|
||||||
// ret.onNickChange = &groupchat_onNickChange;
|
// ret.onNickChange = &groupchat_onNickChange;
|
||||||
// ret.onStatusChange = &groupchat_onStatusChange;
|
// ret.onStatusChange = &groupchat_onStatusChange;
|
||||||
// ret.onAction = &groupchat_onAction;
|
// ret.onAction = &groupchat_onAction;
|
||||||
|
@ -2,4 +2,18 @@
|
|||||||
* Toxic -- Tox Curses Client
|
* Toxic -- Tox Curses Client
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* The sidebar will take up y/n of the window width where x is the full width of the window */
|
||||||
|
#define SIDEBAR_WIDTH 16
|
||||||
|
#define CHATBOX_HEIGHT 4
|
||||||
|
|
||||||
|
/* Limits # of peers in sidepanel (make this go away) */
|
||||||
|
#define MAX_GROUP_PEERS 100
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int chatwin;
|
||||||
|
bool active;
|
||||||
|
int num_peers;
|
||||||
|
uint8_t peer_names[MAX_GROUP_PEERS][TOX_MAX_NAME_LENGTH];
|
||||||
|
} GroupChat;
|
||||||
|
|
||||||
int init_groupchat_win(ToxWindow *prompt, Tox *m, int groupnum);
|
int init_groupchat_win(ToxWindow *prompt, Tox *m, int groupnum);
|
||||||
|
@ -56,7 +56,7 @@ void on_window_resize(int sig)
|
|||||||
clear();
|
clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void init_term()
|
static void init_term(void)
|
||||||
{
|
{
|
||||||
/* Setup terminal */
|
/* Setup terminal */
|
||||||
signal(SIGWINCH, on_window_resize);
|
signal(SIGWINCH, on_window_resize);
|
||||||
@ -107,6 +107,7 @@ static Tox *init_tox()
|
|||||||
tox_callback_action(m, on_action, NULL);
|
tox_callback_action(m, on_action, NULL);
|
||||||
tox_callback_group_invite(m, on_groupinvite, NULL);
|
tox_callback_group_invite(m, on_groupinvite, NULL);
|
||||||
tox_callback_group_message(m, on_groupmessage, NULL);
|
tox_callback_group_message(m, on_groupmessage, NULL);
|
||||||
|
tox_callback_group_namelistchange(m, on_group_namelistchange, NULL);
|
||||||
tox_callback_file_sendrequest(m, on_file_sendrequest, NULL);
|
tox_callback_file_sendrequest(m, on_file_sendrequest, NULL);
|
||||||
tox_callback_file_control(m, on_file_control, NULL);
|
tox_callback_file_control(m, on_file_control, NULL);
|
||||||
tox_callback_file_data(m, on_file_data, NULL);
|
tox_callback_file_data(m, on_file_data, NULL);
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
* Toxic -- Tox Curses Client
|
* Toxic -- Tox Curses Client
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
|
||||||
|
|
||||||
/* convert a hex string to binary */
|
/* convert a hex string to binary */
|
||||||
unsigned char *hex_string_to_bin(char hex_string[]);
|
unsigned char *hex_string_to_bin(char hex_string[]);
|
||||||
|
|
||||||
|
@ -61,6 +61,7 @@ struct ToxWindow_ {
|
|||||||
void(*onAction)(ToxWindow *, Tox *, int, uint8_t *, uint16_t);
|
void(*onAction)(ToxWindow *, Tox *, int, uint8_t *, uint16_t);
|
||||||
void(*onGroupMessage)(ToxWindow *, Tox *, int, int, uint8_t *, uint16_t);
|
void(*onGroupMessage)(ToxWindow *, Tox *, int, int, uint8_t *, uint16_t);
|
||||||
void(*onGroupInvite)(ToxWindow *, Tox *, int, uint8_t *);
|
void(*onGroupInvite)(ToxWindow *, Tox *, int, uint8_t *);
|
||||||
|
void(*onGroupNamelistChange)(ToxWindow *, Tox*, int);
|
||||||
void(*onFileSendRequest)(ToxWindow *, Tox *, int, uint8_t, uint64_t, uint8_t *, uint16_t);
|
void(*onFileSendRequest)(ToxWindow *, Tox *, int, uint8_t, uint64_t, uint8_t *, uint16_t);
|
||||||
void(*onFileControl)(ToxWindow *, Tox *, int, uint8_t, uint8_t, uint8_t, uint8_t *, uint16_t);
|
void(*onFileControl)(ToxWindow *, Tox *, int, uint8_t, uint8_t, uint8_t, uint8_t *, uint16_t);
|
||||||
void(*onFileData)(ToxWindow *, Tox *, int, uint8_t, uint8_t *, uint16_t);
|
void(*onFileData)(ToxWindow *, Tox *, int, uint8_t, uint8_t *, uint16_t);
|
||||||
@ -91,13 +92,9 @@ typedef struct {
|
|||||||
size_t pos;
|
size_t pos;
|
||||||
WINDOW *history;
|
WINDOW *history;
|
||||||
WINDOW *linewin;
|
WINDOW *linewin;
|
||||||
|
WINDOW *sidebar;
|
||||||
} ChatContext;
|
} ChatContext;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int chatwin;
|
|
||||||
bool active;
|
|
||||||
} GroupChat;
|
|
||||||
|
|
||||||
/* Start file transfer code */
|
/* Start file transfer code */
|
||||||
|
|
||||||
#define MAX_FILES 256
|
#define MAX_FILES 256
|
||||||
@ -153,11 +150,12 @@ void on_statusmessagechange(Tox *m, int friendnumber, uint8_t *string, uint16_t
|
|||||||
void on_friendadded(Tox *m, int friendnumber);
|
void on_friendadded(Tox *m, int friendnumber);
|
||||||
void on_groupmessage(Tox *m, int groupnumber, int peernumber, uint8_t *message, uint16_t length, void *userdata);
|
void on_groupmessage(Tox *m, int groupnumber, int peernumber, uint8_t *message, uint16_t length, void *userdata);
|
||||||
void on_groupinvite(Tox *m, int friendnumber, uint8_t *group_pub_key, void *userdata);
|
void on_groupinvite(Tox *m, int friendnumber, uint8_t *group_pub_key, void *userdata);
|
||||||
|
void on_group_namelistchange(Tox *m, int groupnumber, void *userdata);
|
||||||
void on_file_sendrequest(Tox *m, int friendnumber, uint8_t filenumber, uint64_t filesize, uint8_t *pathname, uint16_t pathname_length, void *userdata);
|
void on_file_sendrequest(Tox *m, int friendnumber, uint8_t filenumber, uint64_t filesize, uint8_t *pathname, uint16_t pathname_length, void *userdata);
|
||||||
void on_file_control(Tox *m, int friendnumber, uint8_t receive_send, uint8_t filenumber, uint8_t control_type, uint8_t *data, uint16_t length, void *userdata);
|
void on_file_control(Tox *m, int friendnumber, uint8_t receive_send, uint8_t filenumber, uint8_t control_type, uint8_t *data, uint16_t length, void *userdata);
|
||||||
void on_file_data(Tox *m, int friendnumber, uint8_t filenumber, uint8_t *data, uint16_t length, void *userdata);
|
void on_file_data(Tox *m, int friendnumber, uint8_t filenumber, uint8_t *data, uint16_t length, void *userdata);
|
||||||
|
|
||||||
ToxWindow *init_windows();
|
ToxWindow *init_windows(Tox *mToAssign);
|
||||||
void draw_active_window(Tox *m);
|
void draw_active_window(Tox *m);
|
||||||
int add_window(Tox *m, ToxWindow w);
|
int add_window(Tox *m, ToxWindow w);
|
||||||
void del_window(ToxWindow *w);
|
void del_window(ToxWindow *w);
|
||||||
|
@ -127,6 +127,16 @@ void on_groupinvite(Tox *m, int friendnumber, uint8_t *group_pub_key, void *user
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void on_group_namelistchange(Tox *m, int groupnumber, void *userdata)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
|
||||||
|
if (windows[i].onGroupNamelistChange != NULL)
|
||||||
|
windows[i].onGroupNamelistChange(&windows[i], m, groupnumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void on_file_sendrequest(Tox *m, int friendnumber, uint8_t filenumber, uint64_t filesize,
|
void on_file_sendrequest(Tox *m, int friendnumber, uint8_t filenumber, uint64_t filesize,
|
||||||
uint8_t *filename, uint16_t filename_length, void *userdata)
|
uint8_t *filename, uint16_t filename_length, void *userdata)
|
||||||
{
|
{
|
||||||
@ -253,7 +263,7 @@ ToxWindow *init_windows(Tox *mToAssign)
|
|||||||
return prompt;
|
return prompt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void draw_bar()
|
static void draw_bar(void)
|
||||||
{
|
{
|
||||||
static int odd = 0;
|
static int odd = 0;
|
||||||
int blinkrate = 30;
|
int blinkrate = 30;
|
||||||
|
Loading…
Reference in New Issue
Block a user