mirror of
https://github.com/Tha14/toxic.git
synced 2024-11-15 03:13:03 +01:00
implement banning/unbanning
This commit is contained in:
parent
52a3367b5e
commit
928134da7a
@ -85,6 +85,7 @@ static struct cmd_func chat_commands[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct cmd_func group_commands[] = {
|
static struct cmd_func group_commands[] = {
|
||||||
|
{ "/ban", cmd_ban },
|
||||||
{ "/chatid", cmd_chatid },
|
{ "/chatid", cmd_chatid },
|
||||||
{ "/ignore", cmd_ignore },
|
{ "/ignore", cmd_ignore },
|
||||||
{ "/kick", cmd_kick },
|
{ "/kick", cmd_kick },
|
||||||
@ -95,6 +96,7 @@ static struct cmd_func group_commands[] = {
|
|||||||
{ "/prune", cmd_prune },
|
{ "/prune", cmd_prune },
|
||||||
{ "/rejoin", cmd_rejoin },
|
{ "/rejoin", cmd_rejoin },
|
||||||
{ "/topic", cmd_set_topic },
|
{ "/topic", cmd_set_topic },
|
||||||
|
{ "/unban", cmd_unban },
|
||||||
{ "/unignore", cmd_unignore },
|
{ "/unignore", cmd_unignore },
|
||||||
{ "/unmod", cmd_unmod },
|
{ "/unmod", cmd_unmod },
|
||||||
#ifdef AUDIO
|
#ifdef AUDIO
|
||||||
|
@ -77,14 +77,8 @@ 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);
|
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])
|
static void cmd_kickban_helper(ToxWindow *self, Tox *m, const char *nick, bool set_ban)
|
||||||
{
|
{
|
||||||
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);
|
int peernumber = group_get_nick_peernumber(self->num, nick);
|
||||||
|
|
||||||
if (peernumber == -1) {
|
if (peernumber == -1) {
|
||||||
@ -92,24 +86,103 @@ void cmd_kick(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MA
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ret = tox_group_kick_peer(m, self->num, (uint32_t) peernumber);
|
const char *type_str = set_ban ? "ban" : "kick";
|
||||||
|
int ret = tox_group_remove_peer(m, self->num, (uint32_t) peernumber, set_ban);
|
||||||
|
|
||||||
switch (ret) {
|
switch (ret) {
|
||||||
case 0: {
|
case 0: {
|
||||||
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 1, RED, "You have kicked %s from the group.", nick);
|
type_str = set_ban ? "banned" : "kicked";
|
||||||
|
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 1, RED, "You have %s %s from the group.", type_str, nick);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case -1: {
|
case -1: {
|
||||||
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to kick %s from the group.", nick);
|
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to %s %s from the group.", type_str, nick);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
case -2: {
|
case -2: {
|
||||||
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "You do not have permission to kick %s.", nick);
|
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "You do not have permission to %s %s.", type_str, nick);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd_kickban_helper(self, m, argv[1], false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmd_ban(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
|
||||||
|
{
|
||||||
|
if (argc < 1) {
|
||||||
|
int banlist_size = tox_group_get_ban_list_size(m, self->num);
|
||||||
|
|
||||||
|
if (banlist_size == -1) {
|
||||||
|
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to get the ban list.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (banlist_size == 0) {
|
||||||
|
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Ban list is empty.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Tox_Group_Ban *ban_list = malloc(banlist_size);
|
||||||
|
|
||||||
|
if (ban_list == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int num_banned = tox_group_get_ban_list(m, self->num, ban_list);
|
||||||
|
|
||||||
|
if (num_banned == -1) {
|
||||||
|
free(ban_list);
|
||||||
|
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to get the ban list.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < num_banned; ++i) {
|
||||||
|
struct tm tm_set = *localtime((const time_t *) &ban_list[i].time_set);
|
||||||
|
char time_str[64];
|
||||||
|
strftime(time_str, sizeof(time_str), "%c", &tm_set);
|
||||||
|
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "[ID: %d] %s : %s : %s", ban_list[i].id,
|
||||||
|
ban_list[i].ip_address, ban_list[i].nick, time_str);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(ban_list);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd_kickban_helper(self, m, argv[1], true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cmd_unban(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, "Ban ID must be specified.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ban_id = atoi(argv[1]);
|
||||||
|
|
||||||
|
if (ban_id == 0 && strcmp(argv[1], "0")) {
|
||||||
|
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Ban ID must be a non-negative interger.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tox_group_remove_ban_entry(m, self->num, ban_id) == -1) {
|
||||||
|
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Ban ID does not exist.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Ban list entry with id %d has been removed.", ban_id);
|
||||||
|
}
|
||||||
|
|
||||||
void cmd_mod(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
|
void cmd_mod(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE])
|
||||||
{
|
{
|
||||||
if (argc < 1) {
|
if (argc < 1) {
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "toxic.h"
|
#include "toxic.h"
|
||||||
|
|
||||||
|
void cmd_ban(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
|
||||||
void cmd_chatid(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
|
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_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_kick(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
|
||||||
@ -36,6 +37,7 @@ void cmd_set_peerlimit(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (
|
|||||||
void cmd_set_privacy(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]);
|
||||||
void cmd_rejoin(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
|
void cmd_rejoin(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
|
||||||
void cmd_set_topic(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
|
void cmd_set_topic(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
|
||||||
|
void cmd_unban(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
|
||||||
void cmd_unignore(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
|
void cmd_unignore(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
|
||||||
void cmd_unmod(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
|
void cmd_unmod(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX_STR_SIZE]);
|
||||||
|
|
||||||
|
@ -70,9 +70,9 @@ extern struct user_settings *user_settings;
|
|||||||
extern struct Winthread Winthread;
|
extern struct Winthread Winthread;
|
||||||
|
|
||||||
#ifdef AUDIO
|
#ifdef AUDIO
|
||||||
#define AC_NUM_GROUP_COMMANDS 34
|
#define AC_NUM_GROUP_COMMANDS 36
|
||||||
#else
|
#else
|
||||||
#define AC_NUM_GROUP_COMMANDS 30
|
#define AC_NUM_GROUP_COMMANDS 32
|
||||||
#endif /* AUDIO */
|
#endif /* AUDIO */
|
||||||
|
|
||||||
/* groupchat command names used for tab completion. */
|
/* groupchat command names used for tab completion. */
|
||||||
@ -80,6 +80,7 @@ static const char group_cmd_list[AC_NUM_GROUP_COMMANDS][MAX_CMDNAME_SIZE] = {
|
|||||||
{ "/accept" },
|
{ "/accept" },
|
||||||
{ "/add" },
|
{ "/add" },
|
||||||
{ "/avatar" },
|
{ "/avatar" },
|
||||||
|
{ "/ban" },
|
||||||
{ "/chatid" },
|
{ "/chatid" },
|
||||||
{ "/clear" },
|
{ "/clear" },
|
||||||
{ "/close" },
|
{ "/close" },
|
||||||
@ -104,6 +105,7 @@ static const char group_cmd_list[AC_NUM_GROUP_COMMANDS][MAX_CMDNAME_SIZE] = {
|
|||||||
{ "/requests" },
|
{ "/requests" },
|
||||||
{ "/status" },
|
{ "/status" },
|
||||||
{ "/topic" },
|
{ "/topic" },
|
||||||
|
{ "/unban" },
|
||||||
{ "/unignore" },
|
{ "/unignore" },
|
||||||
{ "/unmod" },
|
{ "/unmod" },
|
||||||
{ "/whisper" },
|
{ "/whisper" },
|
||||||
|
@ -245,13 +245,15 @@ static void help_draw_group(ToxWindow *self)
|
|||||||
|
|
||||||
wprintw(win, " /chatid : Print the group chat id to share with others.\n");
|
wprintw(win, " /chatid : Print the group chat id to share with others.\n");
|
||||||
wprintw(win, " /ignore <nick> : Ignore peer\n");
|
wprintw(win, " /ignore <nick> : Ignore peer\n");
|
||||||
|
wprintw(win, " /unignore <nick> : Unignore peer \n");
|
||||||
wprintw(win, " /kick <nick> : Kick peer\n");
|
wprintw(win, " /kick <nick> : Kick peer\n");
|
||||||
|
wprintw(win, " /ban <nick> : Ban peer (leave nick blank to see ban list)\n");
|
||||||
|
wprintw(win, " /unban <Ban ID> : Unban entry\n");
|
||||||
wprintw(win, " /passwd <password> : Set group password (leave blank to unset)\n");
|
wprintw(win, " /passwd <password> : Set group password (leave blank to unset)\n");
|
||||||
wprintw(win, " /peerlimit <num> : Set group peer limit\n");
|
wprintw(win, " /peerlimit <num> : Set group peer limit\n");
|
||||||
wprintw(win, " /privacy <state> : Set group privacy state: private|public\n");
|
wprintw(win, " /privacy <state> : Set group privacy state: private|public\n");
|
||||||
wprintw(win, " /rejoin : Rejoin the group\n");
|
wprintw(win, " /rejoin : Rejoin the group\n");
|
||||||
wprintw(win, " /topic <msg> : Set group topic (show current topic if no msg)\n");
|
wprintw(win, " /topic <msg> : Set group topic (show current topic if no msg)\n");
|
||||||
wprintw(win, " /unignore <nick> : Unignore peer \n");
|
|
||||||
wprintw(win, " /whisper <nick> <msg> : Send private message to nick\n\n");
|
wprintw(win, " /whisper <nick> <msg> : Send private message to nick\n\n");
|
||||||
|
|
||||||
#ifdef AUDIO
|
#ifdef AUDIO
|
||||||
@ -311,7 +313,7 @@ void help_onKey(ToxWindow *self, wint_t key)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 'r':
|
case 'r':
|
||||||
help_init_window(self, 15, 80);
|
help_init_window(self, 17, 80);
|
||||||
self->help->type = HELP_GROUP;
|
self->help->type = HELP_GROUP;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user