void cmd_quit(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) { exit_toxic(m); }
static void execute(ToxWindow *self, ChatContext *ctx, StatusBar *statusbar, Tox *m, char *cmd) { if (!strcmp(cmd, "/clear") || !strcmp(cmd, "/c")) { wclear(self->window); wclear(ctx->history); wprintw(ctx->history, "\n\n"); int x, y; getmaxyx(self->window, y, x); (void) x; wmove(self->window, y - CURS_Y_OFFSET, 0); } else if (!strcmp(cmd, "/help") || !strcmp(cmd, "/h")) print_help(ctx); else if (!strcmp(cmd, "/quit") || !strcmp(cmd, "/exit") || !strcmp(cmd, "/q")) { exit_toxic(m); } else if (!strncmp(cmd, "/me ", strlen("/me "))) { struct tm *timeinfo = get_time(); uint8_t *action = strchr(cmd, ' '); if (action == NULL) { wprintw(self->window, "Invalid syntax.\n"); return; } action++; wattron(ctx->history, COLOR_PAIR(CYAN)); wprintw(ctx->history, "[%02d:%02d:%02d] ", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec); wattroff(ctx->history, COLOR_PAIR(CYAN)); uint8_t selfname[TOX_MAX_NAME_LENGTH]; tox_getselfname(m, selfname, TOX_MAX_NAME_LENGTH); wattron(ctx->history, COLOR_PAIR(YELLOW)); wprintw(ctx->history, "* %s %s\n", selfname, action); wattroff(ctx->history, COLOR_PAIR(YELLOW)); if (!statusbar->is_online || tox_sendaction(m, self->friendnum, action, strlen(action) + 1) == 0) { wattron(ctx->history, COLOR_PAIR(RED)); wprintw(ctx->history, " * Failed to send action\n"); wattroff(ctx->history, COLOR_PAIR(RED)); } } else if (!strncmp(cmd, "/status ", strlen("/status "))) { char *status = strchr(cmd, ' '); if (status == NULL) { wprintw(ctx->history, "Invalid syntax.\n"); return; } status++; TOX_USERSTATUS status_kind; if (!strncmp(status, "online", strlen("online"))) { status_kind = TOX_USERSTATUS_NONE; wprintw(ctx->history, "Status set to: "); wattron(ctx->history, COLOR_PAIR(GREEN) | A_BOLD); wprintw(ctx->history, "[Online]\n"); wattroff(ctx->history, COLOR_PAIR(GREEN) | A_BOLD); } else if (!strncmp(status, "away", strlen("away"))) { status_kind = TOX_USERSTATUS_AWAY; wprintw(ctx->history, "Status set to: "); wattron(ctx->history, COLOR_PAIR(YELLOW) | A_BOLD); wprintw(ctx->history, "[Away]\n"); wattroff(ctx->history, COLOR_PAIR(YELLOW) | A_BOLD); } else if (!strncmp(status, "busy", strlen("busy"))) { status_kind = TOX_USERSTATUS_BUSY; wprintw(ctx->history, "Status set to: "); wattron(ctx->history, COLOR_PAIR(RED) | A_BOLD); wprintw(ctx->history, "[Busy]\n"); wattroff(ctx->history, COLOR_PAIR(RED) | A_BOLD); } else { wprintw(ctx->history, "Invalid status.\n"); return; } tox_set_userstatus(m, status_kind); prompt_update_status(self->prompt, status_kind); uint8_t *msg = strchr(status, ' '); if (msg != NULL) { msg++; uint16_t len = strlen(msg) + 1; tox_set_statusmessage(m, msg, len); prompt_update_statusmessage(self->prompt, msg, len); wprintw(ctx->history, "Personal note set to: %s\n", msg); } } else if (!strncmp(cmd, "/note ", strlen("/note "))) { uint8_t *msg = strchr(cmd, ' '); msg++; uint16_t len = strlen(msg) + 1; tox_set_statusmessage(m, msg, len); prompt_update_statusmessage(self->prompt, msg, len); wprintw(ctx->history, "Personal note set to: %s\n", msg); } else if (!strncmp(cmd, "/nick ", strlen("/nick "))) { uint8_t *nick = strchr(cmd, ' '); if (nick == NULL) { wprintw(ctx->history, "Invalid syntax.\n"); return; } int len = strlen(++nick); if (len > TOXIC_MAX_NAME_LENGTH) { nick[TOXIC_MAX_NAME_LENGTH] = L'\0'; len = TOXIC_MAX_NAME_LENGTH; } tox_setname(m, nick, len+1); prompt_update_nick(self->prompt, nick); wprintw(ctx->history, "Nickname set to: %s\n", nick); } else if (!strcmp(cmd, "/myid")) { char id[TOX_FRIEND_ADDRESS_SIZE * 2 + 1] = {'\0'}; size_t i; uint8_t address[TOX_FRIEND_ADDRESS_SIZE]; tox_getaddress(m, address); for (i = 0; i < TOX_FRIEND_ADDRESS_SIZE; i++) { char xx[3]; snprintf(xx, sizeof(xx), "%02X", address[i] & 0xff); strcat(id, xx); } wprintw(ctx->history, "%s\n", id); } else wprintw(ctx->history, "Invalid command.\n"); }
int main(int argc, char *argv[]) { char *user_config_dir = get_user_config_dir(); int config_err = 0; f_loadfromfile = 1; int f_flag = 0; int i = 0; for (i = 0; i < argc; ++i) { if (argv[i] == NULL) break; else if (argv[i][0] == '-') { if (argv[i][1] == 'f') { if (argv[i + 1] != NULL) DATA_FILE = strdup(argv[i + 1]); else f_flag = -1; } else if (argv[i][1] == 'n') { f_loadfromfile = 0; } } } config_err = create_user_config_dir(user_config_dir); if (DATA_FILE == NULL ) { if (config_err) { DATA_FILE = strdup("data"); } else { DATA_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen("data") + 1); if (DATA_FILE != NULL) { strcpy(DATA_FILE, user_config_dir); strcat(DATA_FILE, CONFIGDIR); strcat(DATA_FILE, "data"); } else { endwin(); fprintf(stderr, "malloc() failed. Aborting...\n"); exit(EXIT_FAILURE); } } } if (config_err) { SRVLIST_FILE = strdup(PACKAGE_DATADIR "/DHTservers"); } else { SRVLIST_FILE = malloc(strlen(user_config_dir) + strlen(CONFIGDIR) + strlen("DHTservers") + 1); if (SRVLIST_FILE != NULL) { strcpy(SRVLIST_FILE, user_config_dir); strcat(SRVLIST_FILE, CONFIGDIR); strcat(SRVLIST_FILE, "DHTservers"); } else { endwin(); fprintf(stderr, "malloc() failed. Aborting...\n"); exit(EXIT_FAILURE); } } free(user_config_dir); init_term(); Tox *m = init_tox(); if (m == NULL) { endwin(); fprintf(stderr, "Failed to initialize network. Aborting...\n"); exit(EXIT_FAILURE); } prompt = init_windows(m); if (f_loadfromfile) load_data(m, DATA_FILE); if (f_flag == -1) { attron(COLOR_PAIR(RED) | A_BOLD); wprintw(prompt->window, "You passed '-f' without giving an argument.\n" "defaulting to 'data' for a keyfile...\n"); attroff(COLOR_PAIR(RED) | A_BOLD); } if (config_err) { attron(COLOR_PAIR(RED) | A_BOLD); wprintw(prompt->window, "Unable to determine configuration directory.\n" "defaulting to 'data' for a keyfile...\n"); attroff(COLOR_PAIR(RED) | A_BOLD); } prompt_init_statusbar(prompt, m); while (true) { /* Update tox */ do_tox(m, prompt); /* Draw */ draw_active_window(m); } exit_toxic(m); return 0; }