static void cb_group_invite(Tox *m, int32_t friendnumber, uint8_t type, const uint8_t *group_pub_key, uint16_t length, void *userdata) { if (!friend_is_master(m, friendnumber)) return; char name[TOX_MAX_NAME_LENGTH]; tox_friend_get_name(m, friendnumber, (uint8_t *) name, NULL); size_t len = tox_friend_get_name_size(m, friendnumber, NULL); name[len] = '\0'; int groupnum = -1; if (type == TOX_GROUPCHAT_TYPE_TEXT) groupnum = tox_join_groupchat(m, friendnumber, group_pub_key, length); else if (type == TOX_GROUPCHAT_TYPE_AV) groupnum = toxav_join_av_groupchat(m, friendnumber, group_pub_key, length, NULL, NULL); if (groupnum == -1) { fprintf(stderr, "Invite from %s failed (core failure)\n", name); return; } if (group_add(groupnum, type, NULL) == -1) { fprintf(stderr, "Invite from %s failed (group_add failed)\n", name); tox_del_groupchat(m, groupnum); return; } printf("Accepted groupchat invite from %s [%d]\n", name, groupnum); }
static void cmd_title_set(Tox *m, uint32_t friendnum, int argc, char (*argv)[MAX_COMMAND_LENGTH]) { const char *outmsg = NULL; if (!friend_is_master(m, friendnum)) { authent_failed(m, friendnum); return; } if (argc < 2) { outmsg = "Error: Two arguments are required"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } if (argv[2][0] != '\"') { outmsg = "Error: title must be enclosed in quotes"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } int groupnum = atoi(argv[1]); if (groupnum == 0 && strcmp(argv[1], "0")) { outmsg = "Error: Invalid group number"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } /* remove opening and closing quotes */ char title[MAX_COMMAND_LENGTH]; snprintf(title, sizeof(title), "%s", &argv[2][1]); int len = strlen(title) - 1; title[len] = '\0'; char name[TOX_MAX_NAME_LENGTH]; tox_friend_get_name(m, friendnum, (uint8_t *) name, NULL); size_t nlen = tox_friend_get_name_size(m, friendnum, NULL); name[nlen] = '\0'; TOX_ERR_CONFERENCE_TITLE err; if (!tox_conference_set_title(m, groupnum, (uint8_t *) title, len, &err)) { printf("%s failed to set the title '%s' for group %d\n", name, title, groupnum); outmsg = "Failed to set title. This may be caused by an invalid group number or an empty room"; send_error(m, friendnum, outmsg, err); return; } int idx = group_index(groupnum); memcpy(Tox_Bot.g_chats[idx].title, title, len + 1); Tox_Bot.g_chats[idx].title_len = len; outmsg = "Group title set"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); printf("%s set group %d title to %s\n", name, groupnum, title); }
static void cmd_master(Tox *m, uint32_t friendnum, int argc, char (*argv)[MAX_COMMAND_LENGTH]) { const char *outmsg = NULL; if (!friend_is_master(m, friendnum)) { authent_failed(m, friendnum); return; } if (argc < 1) { outmsg = "Error: Tox ID required"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } const char *id = argv[1]; if (strlen(id) != TOX_ADDRESS_SIZE * 2) { outmsg = "Error: Invalid Tox ID"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } FILE *fp = fopen(MASTERLIST_FILE, "a"); if (fp == NULL) { outmsg = "Error: could not find masterkeys file"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } fprintf(fp, "%s\n", id); fclose(fp); char name[TOX_MAX_NAME_LENGTH]; tox_friend_get_name(m, friendnum, (uint8_t *) name, NULL); size_t len = tox_friend_get_name_size(m, friendnum, NULL); name[len] = '\0'; printf("%s added master: %s\n", name, id); outmsg = "ID added to masterkeys list"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); }
static void cmd_leave(Tox *m, uint32_t friendnum, int argc, char (*argv)[MAX_COMMAND_LENGTH]) { const char *outmsg = NULL; if (!friend_is_master(m, friendnum)) { authent_failed(m, friendnum); return; } if (argc < 1) { outmsg = "Error: Group number required"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } int groupnum = atoi(argv[1]); if (groupnum == 0 && strcmp(argv[1], "0")) { outmsg = "Error: Invalid group number"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } if (!tox_conference_delete(m, groupnum, NULL)) { outmsg = "Error: Invalid group number"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } char msg[MAX_COMMAND_LENGTH]; char name[TOX_MAX_NAME_LENGTH]; tox_friend_get_name(m, friendnum, (uint8_t *) name, NULL); size_t len = tox_friend_get_name_size(m, friendnum, NULL); name[len] = '\0'; group_leave(groupnum); printf("Left group %d (%s)\n", groupnum, name); snprintf(msg, sizeof(msg), "Left group %d", groupnum); tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) msg, strlen(msg), NULL); }
static void cmd_status(Tox *m, uint32_t friendnum, int argc, char (*argv)[MAX_COMMAND_LENGTH]) { const char *outmsg = NULL; if (!friend_is_master(m, friendnum)) { authent_failed(m, friendnum); return; } if (argc < 1) { outmsg = "Error: status required"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } TOX_USER_STATUS type; const char *status = argv[1]; if (strcasecmp(status, "online") == 0) { type = TOX_USER_STATUS_NONE; } else if (strcasecmp(status, "away") == 0) { type = TOX_USER_STATUS_AWAY; } else if (strcasecmp(status, "busy") == 0) { type = TOX_USER_STATUS_BUSY; } else { outmsg = "Invalid status. Valid statuses are: online, busy and away."; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } tox_self_set_status(m, type); char name[TOX_MAX_NAME_LENGTH]; tox_friend_get_name(m, friendnum, (uint8_t *) name, NULL); size_t nlen = tox_friend_get_name_size(m, friendnum, NULL); name[nlen] = '\0'; printf("%s set status to %s\n", name, status); save_data(m, DATA_FILE); }
static void cmd_statusmessage(Tox *m, uint32_t friendnum, int argc, char (*argv)[MAX_COMMAND_LENGTH]) { const char *outmsg = NULL; if (!friend_is_master(m, friendnum)) { authent_failed(m, friendnum); return; } if (argc < 1) { outmsg = "Error: message required"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } if (argv[1][0] != '\"') { outmsg = "Error: message must be enclosed in quotes"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } /* remove opening and closing quotes */ char msg[MAX_COMMAND_LENGTH]; snprintf(msg, sizeof(msg), "%s", &argv[1][1]); int len = strlen(msg) - 1; msg[len] = '\0'; tox_self_set_status_message(m, (uint8_t *) msg, len, NULL); char name[TOX_MAX_NAME_LENGTH]; tox_friend_get_name(m, friendnum, (uint8_t *) name, NULL); size_t nlen = tox_friend_get_name_size(m, friendnum, NULL); name[nlen] = '\0'; printf("%s set status message to \"%s\"\n", name, msg); save_data(m, DATA_FILE); }
static void cmd_purge(Tox *m, uint32_t friendnum, int argc, char (*argv)[MAX_COMMAND_LENGTH]) { const char *outmsg = NULL; if (!friend_is_master(m, friendnum)) { authent_failed(m, friendnum); return; } if (argc < 1) { outmsg = "Error: number > 0 required"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } uint64_t days = (uint64_t) atoi(argv[1]); if (days <= 0) { outmsg = "Error: number > 0 required"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } uint64_t seconds = days * SECONDS_IN_DAY; Tox_Bot.inactive_limit = seconds; char name[TOX_MAX_NAME_LENGTH]; tox_friend_get_name(m, friendnum, (uint8_t *) name, NULL); size_t nlen = tox_friend_get_name_size(m, friendnum, NULL); name[nlen] = '\0'; char msg[MAX_COMMAND_LENGTH]; snprintf(msg, sizeof(msg), "Purge time set to %"PRIu64" days", days); tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) msg, strlen(msg), NULL); printf("Purge time set to %"PRIu64" days by %s\n", days, name); }
static void cmd_name(Tox *m, uint32_t friendnum, int argc, char (*argv)[MAX_COMMAND_LENGTH]) { const char *outmsg = NULL; if (!friend_is_master(m, friendnum)) { authent_failed(m, friendnum); return; } if (argc < 1) { outmsg = "Error: Name required"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } char name[TOX_MAX_NAME_LENGTH]; int len = 0; if (argv[1][0] == '\"') { /* remove opening and closing quotes */ snprintf(name, sizeof(name), "%s", &argv[1][1]); len = strlen(name) - 1; } else { snprintf(name, sizeof(name), "%s", argv[1]); len = strlen(name); } name[len] = '\0'; tox_self_set_name(m, (uint8_t *) name, (uint16_t) len, NULL); char m_name[TOX_MAX_NAME_LENGTH]; tox_friend_get_name(m, friendnum, (uint8_t *) m_name, NULL); size_t nlen = tox_friend_get_name_size(m, friendnum, NULL); m_name[nlen] = '\0'; printf("%s set name to %s\n", m_name, name); save_data(m, DATA_FILE); }
static void cmd_default(Tox *m, uint32_t friendnum, int argc, char (*argv)[MAX_COMMAND_LENGTH]) { const char *outmsg = NULL; if (!friend_is_master(m, friendnum)) { authent_failed(m, friendnum); return; } if (argc < 1) { outmsg = "Error: Room number required"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } int groupnum = atoi(argv[1]); if ((groupnum == 0 && strcmp(argv[1], "0")) || groupnum < 0) { outmsg = "Error: Invalid room number"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } Tox_Bot.default_groupnum = groupnum; char msg[MAX_COMMAND_LENGTH]; snprintf(msg, sizeof(msg), "Default room number set to %d", groupnum); tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) msg, strlen(msg), NULL); char name[TOX_MAX_NAME_LENGTH]; tox_friend_get_name(m, friendnum, (uint8_t *) name, NULL); size_t len = tox_friend_get_name_size(m, friendnum, NULL); name[len] = '\0'; printf("Default room number set to %d by %s", groupnum, name); }
static void cmd_help(Tox *m, uint32_t friendnum, int argc, char (*argv)[MAX_COMMAND_LENGTH]) { const char *outmsg = NULL; outmsg = "info : Print my current status and list active group chats"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); outmsg = "id : Print my Tox ID"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); outmsg = "invite : Request invite to default group chat"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); outmsg = "invite <n> <p> : Request invite to group chat n (with password p if protected)"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); outmsg = "group <type> <pass> : Creates a new groupchat with type: text | audio (optional password)"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); if (friend_is_master(m, friendnum)) { outmsg = "For a list of master commands see the commands.txt file"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); } }
static void cmd_gmessage(Tox *m, uint32_t friendnum, int argc, char (*argv)[MAX_COMMAND_LENGTH]) { const char *outmsg = NULL; if (!friend_is_master(m, friendnum)) { authent_failed(m, friendnum); return; } if (argc < 1) { outmsg = "Error: Group number required"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } if (argc < 2) { outmsg = "Error: Message required"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } int groupnum = atoi(argv[1]); if (groupnum == 0 && strcmp(argv[1], "0")) { outmsg = "Error: Invalid group number"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } if (group_index(groupnum) == -1) { outmsg = "Error: Invalid group number"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } if (argv[2][0] != '\"') { outmsg = "Error: Message must be enclosed in quotes"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } /* remove opening and closing quotes */ char msg[MAX_COMMAND_LENGTH]; snprintf(msg, sizeof(msg), "%s", &argv[2][1]); int len = strlen(msg) - 1; msg[len] = '\0'; TOX_ERR_CONFERENCE_SEND_MESSAGE err; if (!tox_conference_send_message(m, groupnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) msg, strlen(msg), &err)) { outmsg = "Error: Failed to send message."; send_error(m, friendnum, outmsg, err); return; } char name[TOX_MAX_NAME_LENGTH]; tox_friend_get_name(m, friendnum, (uint8_t *) name, NULL); size_t nlen = tox_friend_get_name_size(m, friendnum, NULL); name[nlen] = '\0'; outmsg = "Message sent."; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); printf("<%s> message to group %d: %s\n", name, groupnum, msg); }
static void cmd_passwd(Tox *m, uint32_t friendnum, int argc, char (*argv)[MAX_COMMAND_LENGTH]) { const char *outmsg = NULL; if (!friend_is_master(m, friendnum)) { authent_failed(m, friendnum); return; } if (argc < 1) { outmsg = "Error: group number required"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } int groupnum = atoi(argv[1]); if (groupnum == 0 && strcmp(argv[1], "0")) { outmsg = "Error: Invalid group number"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } int idx = group_index(groupnum); if (idx == -1) { outmsg = "Error: Invalid group number"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } char name[TOX_MAX_NAME_LENGTH]; tox_friend_get_name(m, friendnum, (uint8_t *) name, NULL); size_t nlen = tox_friend_get_name_size(m, friendnum, NULL); name[nlen] = '\0'; /* no password */ if (argc < 2) { Tox_Bot.g_chats[idx].has_pass = false; memset(Tox_Bot.g_chats[idx].password, 0, MAX_PASSWORD_SIZE); outmsg = "No password set"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); printf("No password set for group %d by %s\n", groupnum, name); return; } if (strlen(argv[2]) >= MAX_PASSWORD_SIZE) { outmsg = "Password too long"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); return; } Tox_Bot.g_chats[idx].has_pass = true; snprintf(Tox_Bot.g_chats[idx].password, sizeof(Tox_Bot.g_chats[idx].password), "%s", argv[2]); outmsg = "Password set"; tox_friend_send_message(m, friendnum, TOX_MESSAGE_TYPE_NORMAL, (uint8_t *) outmsg, strlen(outmsg), NULL); printf("Password for group %d set by %s\n", groupnum, name); }