From 526bd02189800c3085c11f3264db38d53d726a93 Mon Sep 17 00:00:00 2001 From: Jfreegman Date: Tue, 26 May 2015 01:23:09 -0400 Subject: [PATCH] Add group peer kicking && update related callback --- src/execute.c | 4 +++- src/group_commands.c | 37 +++++++++++++++++++++++++++++++++++-- src/group_commands.h | 1 + src/groupchat.c | 44 +++++++++++++++++++++++--------------------- src/help.c | 3 ++- src/toxic.c | 2 +- src/toxic.h | 4 +++- src/windows.c | 22 +++++++++++----------- src/windows.h | 2 +- 9 files changed, 80 insertions(+), 39 deletions(-) diff --git a/src/execute.c b/src/execute.c index f4b4d9f..5a505f1 100644 --- a/src/execute.c +++ b/src/execute.c @@ -87,6 +87,7 @@ static struct cmd_func chat_commands[] = { static struct cmd_func group_commands[] = { { "/chatid", cmd_chatid }, { "/ignore", cmd_ignore }, + { "/kick", cmd_kick }, { "/passwd", cmd_set_passwd }, { "/peerlimit", cmd_set_peerlimit }, { "/privacy", cmd_set_privacy }, @@ -100,11 +101,12 @@ static struct cmd_func group_commands[] = { { NULL, NULL }, }; -#define NUM_SPECIAL_COMMANDS 8 +#define NUM_SPECIAL_COMMANDS 9 static const char special_commands[NUM_SPECIAL_COMMANDS][MAX_CMDNAME_SIZE] = { "/gaccept", "/group", "/ignore", + "/kick", "/nick", "/note", "/passwd", diff --git a/src/group_commands.c b/src/group_commands.c index 92cc4d2..b020b57 100644 --- a/src/group_commands.c +++ b/src/group_commands.c @@ -54,7 +54,7 @@ void cmd_chatid(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[ void cmd_ignore(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) { if (argc < 1) { - line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Who do you want to ignore?"); + line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Peer name must be specified."); return; } @@ -62,7 +62,7 @@ void cmd_ignore(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[ int peernum = group_get_nick_peernumber(self->num, nick); if (peernum == -1) { - line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Peer '%s' does not exist", nick); + line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name"); return; } @@ -77,6 +77,39 @@ void cmd_ignore(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[ line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, BLUE, "-!- Ignoring %s", nick); } +void cmd_kick(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) +{ + if (argc < 1) { + line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Peer name must be specified."); + return; + } + + const char *nick = argv[1]; + int peernumber = group_get_nick_peernumber(self->num, nick); + + if (peernumber == -1) { + line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name"); + return; + } + + int ret = tox_group_op_kick_peer(m, self->num, (uint32_t) peernumber); + + switch (ret) { + case 0: { + line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "You have kicked %s from the group.", nick); + return; + } + case -1: { + line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to kick %s from the group.", nick); + return; + } + case -2: { + line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "You do not have permission to kick %s.", nick); + return; + } + } +} + void cmd_set_passwd(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]) { const char *passwd = NULL; diff --git a/src/group_commands.h b/src/group_commands.h index bd536c0..0a43291 100644 --- a/src/group_commands.h +++ b/src/group_commands.h @@ -28,6 +28,7 @@ void cmd_chatid(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]); void cmd_ignore(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]); +void cmd_kick(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]); void cmd_set_passwd(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]); void cmd_set_peerlimit(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]); void cmd_set_privacy(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]); diff --git a/src/groupchat.c b/src/groupchat.c index e37e565..4a0f242 100644 --- a/src/groupchat.c +++ b/src/groupchat.c @@ -70,9 +70,9 @@ extern struct user_settings *user_settings; extern struct Winthread Winthread; #ifdef AUDIO -#define AC_NUM_GROUP_COMMANDS 31 +#define AC_NUM_GROUP_COMMANDS 32 #else -#define AC_NUM_GROUP_COMMANDS 27 +#define AC_NUM_GROUP_COMMANDS 28 #endif /* AUDIO */ /* groupchat command names used for tab completion. */ @@ -90,6 +90,7 @@ static const char group_cmd_list[AC_NUM_GROUP_COMMANDS][MAX_CMDNAME_SIZE] = { { "/help" }, { "/ignore" }, { "/join" }, + { "/kick" }, { "/log" }, { "/myid" }, { "/nick" }, @@ -210,9 +211,9 @@ void set_nick_all_groups(Tox *m, const char *nick, uint16_t length) int ret = tox_group_set_self_name(m, groupchats[i].groupnumber, (uint8_t *) nick, length); if (ret == -1 && groupchats[i].is_connected) - line_info_add(self, timefrmt, NULL, 0, SYS_MSG, 0, 0, "Invalid nick"); + line_info_add(self, NULL, NULL, 0, SYS_MSG, 0, 0, "Invalid nick"); else if (ret == -2) - line_info_add(self, timefrmt, NULL, 0, SYS_MSG, 0, RED, "-!- That nick is already in use"); + line_info_add(self, NULL, NULL, 0, SYS_MSG, 0, RED, "-!- That nick is already in use"); else line_info_add(self, timefrmt, NULL, nick, NAME_CHANGE, 0, MAGENTA, "You are now known as "); } @@ -571,32 +572,33 @@ static void groupchat_onGroupRejected(ToxWindow *self, Tox *m, int groupnum, uin line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 0, RED, "-!- %s", msg); } -static void groupchat_onGroupOpCertificate(ToxWindow *self, Tox *m, int groupnum, uint32_t src_peernum, - uint32_t tgt_peernum, uint8_t type) +static void groupchat_onGroupModeration(ToxWindow *self, Tox *m, int groupnum, uint32_t src_peernum, + uint32_t tgt_peernum, TOX_GROUP_MOD_TYPE type) { if (groupnum != self->num) return; char src_name[TOX_MAX_NAME_LENGTH]; - get_group_nick_truncate(m, src_name, src_peernum, groupnum); - char tgt_name[TOX_MAX_NAME_LENGTH]; - get_group_nick_truncate(m, tgt_name, tgt_peernum, groupnum); - const char *msg = NULL; + if (get_group_nick_truncate(m, src_name, src_peernum, groupnum) == -1) + return; + + if (get_group_nick_truncate(m, tgt_name, tgt_peernum, groupnum) == -1) + return; + + const char *eventstr = NULL; + int colour = RED; switch (type) { - case TOX_GC_BAN: - msg = "has banned"; + case TOX_MOD_KICK: + eventstr = "kicked"; break; - case TOX_GC_PROMOTE_OP: - msg = "has given operator status to"; + case TOX_MOD_BAN: + eventstr = "banned"; break; - case TOX_GC_REVOKE_OP: - msg = "has removed operator status from"; - break; - case TOX_GC_SILENCE: - msg = "has silenced"; + case TOX_MOD_SILENCE: + eventstr = "silenced"; break; default: return; @@ -604,7 +606,7 @@ static void groupchat_onGroupOpCertificate(ToxWindow *self, Tox *m, int groupnum char timefrmt[TIME_STR_SIZE]; get_time_str(timefrmt, sizeof(timefrmt)); - line_info_add(self, timefrmt, src_name, tgt_name, NAME_CHANGE, 0, MAGENTA, "%s", msg); + line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, colour, "-!- %s has been %s by %s", tgt_name, eventstr, src_name); } static void groupchat_onGroupNickChange(ToxWindow *self, Tox *m, int groupnum, uint32_t peernum, @@ -952,10 +954,10 @@ ToxWindow new_group_chat(Tox *m, int groupnum, const char *groupname, int length ret.onGroupPeerJoin = &groupchat_onGroupPeerJoin; ret.onGroupPeerExit = &groupchat_onGroupPeerExit; ret.onGroupTopicChange = &groupchat_onGroupTopicChange; - ret.onGroupOpCertificate = &groupchat_onGroupOpCertificate; ret.onGroupNickChange = &groupchat_onGroupNickChange; ret.onGroupSelfJoin = &groupchat_onGroupSelfJoin; ret.onGroupRejected = &groupchat_onGroupRejected; + ret.onGroupModeration = &groupchat_onGroupModeration; ChatContext *chatwin = calloc(1, sizeof(ChatContext)); Help *help = calloc(1, sizeof(Help)); diff --git a/src/help.c b/src/help.c index 4f0f065..21912ab 100644 --- a/src/help.c +++ b/src/help.c @@ -245,6 +245,7 @@ static void help_draw_group(ToxWindow *self) wprintw(win, " /chatid : Print the group chat id to share with others.\n"); wprintw(win, " /ignore : Ignore peer\n"); + wprintw(win, " /kick : Kick peer\n"); wprintw(win, " /passwd : Set group password (leave blank to unset)\n"); wprintw(win, " /peerlimit : Set group peer limit\n"); wprintw(win, " /privacy : Set group privacy state: private|public\n"); @@ -310,7 +311,7 @@ void help_onKey(ToxWindow *self, wint_t key) break; case 'r': - help_init_window(self, 14, 80); + help_init_window(self, 15, 80); self->help->type = HELP_GROUP; break; diff --git a/src/toxic.c b/src/toxic.c index f699450..e874925 100644 --- a/src/toxic.c +++ b/src/toxic.c @@ -571,7 +571,6 @@ static void init_tox_callbacks(Tox *m) tox_callback_group_message(m, on_group_message, NULL); tox_callback_group_action(m, on_group_action, NULL); tox_callback_group_private_message(m, on_group_private_message, NULL); - tox_callback_group_op_certificate(m, on_group_op_certificate, NULL); tox_callback_group_peerlist_update(m, on_group_namelistchange, NULL); tox_callback_group_peer_join(m, on_group_peer_join, NULL); tox_callback_group_peer_exit(m, on_group_peer_exit, NULL); @@ -579,6 +578,7 @@ static void init_tox_callbacks(Tox *m) tox_callback_group_topic_change(m, on_group_topic_change, NULL); tox_callback_group_self_join(m, on_group_self_join, NULL); tox_callback_group_rejected(m, on_group_rejected, NULL); + tox_callback_group_moderation(m, on_group_moderation, NULL); } static void init_tox_options(struct Tox_Options *tox_opts) diff --git a/src/toxic.h b/src/toxic.h index 2a7680a..de02c0b 100644 --- a/src/toxic.h +++ b/src/toxic.h @@ -125,7 +125,9 @@ void on_group_peer_join(Tox *m, int groupnumber, uint32_t peernumber, void *user void on_group_peer_exit(Tox *m, int groupnumber, uint32_t peernumber, const uint8_t *partmsg, uint16_t length, void *userdata); void on_group_topic_change(Tox *m, int groupnumber, uint32_t peernumber, const uint8_t *topic, uint16_t length, void *userdata); void on_group_nick_change(Tox *m, int groupnumber, uint32_t peernumber, const uint8_t *newname, uint16_t length, void *userdata); -void on_group_op_certificate(Tox *m, int groupnumber, uint32_t src_peernum, uint32_t tgt_peernum, uint8_t cert_type, void *userdata); void on_group_self_join(Tox *m, int groupnumber, void *userdata); void on_group_rejected(Tox *m, int groupnumber, uint8_t type, void *userdata); +void on_group_moderation(Tox *m, int groupnumber, uint32_t source_peernum, uint32_t target_peernum, + TOX_GROUP_MOD_TYPE type, void *userdata); + #endif /* #define TOXIC_H */ diff --git a/src/windows.c b/src/windows.c index 9801a1a..d7e1e95 100644 --- a/src/windows.c +++ b/src/windows.c @@ -272,17 +272,6 @@ void on_group_nick_change(Tox *m, int groupnumber, uint32_t peernumber, const ui } } -void on_group_op_certificate(Tox *m, int groupnumber, uint32_t src_peernum, uint32_t tgt_peernum, uint8_t cert_type, - void *userdata) -{ - size_t i; - - for (i = 0; i < MAX_WINDOWS_NUM; ++i) { - if (windows[i].onGroupOpCertificate != NULL) - windows[i].onGroupOpCertificate(&windows[i], m, groupnumber, src_peernum, tgt_peernum, cert_type); - } -} - void on_group_self_join(Tox *m, int groupnumber, void *userdata) { size_t i; @@ -303,6 +292,17 @@ void on_group_rejected(Tox *m, int groupnumber, uint8_t type, void *userdata) } } +void on_group_moderation(Tox *m, int groupnumber, uint32_t source_peernum, uint32_t target_peernum, + TOX_GROUP_MOD_TYPE type, void *userdata) +{ + size_t i; + + for (i = 0; i < MAX_WINDOWS_NUM; ++i) { + if (windows[i].onGroupModeration != NULL) + windows[i].onGroupModeration(&windows[i], m, groupnumber, source_peernum, target_peernum, type); + } +} + void on_file_chunk_request(Tox *m, uint32_t friendnumber, uint32_t filenumber, uint64_t position, size_t length, void *userdata) { diff --git a/src/windows.h b/src/windows.h index 9bfa502..1df5ee2 100644 --- a/src/windows.h +++ b/src/windows.h @@ -130,7 +130,6 @@ struct ToxWindow { void(*onGroupMessage)(ToxWindow *, Tox *, int, int, const char *, uint16_t); void(*onGroupAction)(ToxWindow *, Tox *, int, int, const char *, uint16_t); void(*onGroupPrivateMessage)(ToxWindow *, Tox *, int, uint32_t, const char *, uint16_t); - void(*onGroupOpCertificate)(ToxWindow *, Tox *, int, uint32_t, uint32_t, uint8_t); void(*onGroupNamelistChange)(ToxWindow *, Tox *, int); void(*onGroupPeerJoin)(ToxWindow *, Tox *, int, uint32_t); void(*onGroupPeerExit)(ToxWindow *, Tox *, int, uint32_t, const char *, uint16_t); @@ -138,6 +137,7 @@ struct ToxWindow { void(*onGroupTopicChange)(ToxWindow *, Tox *, int, uint32_t, const char *, uint16_t); void(*onGroupSelfJoin)(ToxWindow *, Tox *, int); void(*onGroupRejected)(ToxWindow *, Tox *, int, uint8_t); + void(*onGroupModeration)(ToxWindow *, Tox *, int, uint32_t, uint32_t, TOX_GROUP_MOD_TYPE); #ifdef AUDIO