diff --git a/src/twc-commands.c b/src/twc-commands.c index 977635e..a52c737 100644 --- a/src/twc-commands.c +++ b/src/twc-commands.c @@ -838,10 +838,10 @@ twc_commands_init() "manage friends", "list" " || add
[]" - " || remove " + " || remove ||" " || requests" - " || accept |all" - " || decline |all", + " || accept |||all" + " || decline |||all", " list: list all friends\n" " add: add a friend by their public Tox address\n" "requests: list friend requests\n" @@ -849,10 +849,10 @@ twc_commands_init() " decline: decline friend requests\n", "list" " || add" - " || remove" + " || remove %(tox_friend_name)|%(tox_friend_tox_id)" " || requests" - " || accept" - " || decline", + " || accept %(tox_friend_name)|%(tox_friend_tox_id)" + " || decline %(tox_friend_name)|%(tox_friend_tox_id)", twc_cmd_friend, NULL); weechat_hook_command("group", @@ -878,10 +878,11 @@ twc_commands_init() weechat_hook_command("msg", "send a message to a Tox friend", - " []", - " id: friend number of the person to message\n" + "|| []", + "number, name, Tox ID: friend to message\n" "message: message to send", - NULL, twc_cmd_msg, NULL); + "%(tox_friend_name)|%(tox_friend_tox_id)", + twc_cmd_msg, NULL); weechat_hook_command("myid", "get your Tox ID to give to friends", diff --git a/src/twc-completion.c b/src/twc-completion.c index ae7ffc5..516ac81 100644 --- a/src/twc-completion.c +++ b/src/twc-completion.c @@ -22,6 +22,7 @@ #include "twc.h" #include "twc-list.h" #include "twc-profile.h" +#include "twc-utils.h" #include "twc-completion.h" @@ -32,6 +33,61 @@ enum TWC_UNLOADED_PROFILES, }; +enum +{ + TWC_COMPLETE_FRIEND_NAME = 2 << 0, + TWC_COMPLETE_FRIEND_ID = 1 << 1, +}; + +/** + * Complete a friends number, name and/or Tox ID. + */ +int +twc_completion_friend(void *data, + const char *completion_item, + struct t_gui_buffer *buffer, + struct t_gui_completion *completion) +{ + int flags = (int)(intptr_t)data; + struct t_twc_profile *profile = twc_profile_search_buffer(buffer); + + if (!profile) + return WEECHAT_RC_OK; + + uint32_t friend_count = tox_count_friendlist(profile->tox); + int32_t *friend_numbers = malloc(sizeof(int32_t) * friend_count); + tox_get_friendlist(profile->tox, friend_numbers, friend_count); + + for (uint32_t i = 0; i < friend_count; ++i) + { + if (flags & TWC_COMPLETE_FRIEND_ID) + { + uint8_t tox_id[TOX_CLIENT_ID_SIZE]; + char hex_id[TOX_CLIENT_ID_SIZE * 2 + 1]; + + tox_get_client_id(profile->tox, friend_numbers[i], tox_id); + twc_bin2hex(tox_id, TOX_CLIENT_ID_SIZE, hex_id); + + weechat_hook_completion_list_add(completion, + hex_id, + 0, + WEECHAT_LIST_POS_SORT); + } + + if (flags & TWC_COMPLETE_FRIEND_NAME) + { + char *name = twc_get_name_nt(profile->tox, friend_numbers[i]); + + weechat_hook_completion_list_add(completion, + name, + 0, + WEECHAT_LIST_POS_SORT); + } + } + + return WEECHAT_RC_OK; +} + /** * Complete a profile name, possibly filtering by loaded/unloaded profiles. */ @@ -69,12 +125,20 @@ twc_completion_init() twc_completion_profile, (void *)(intptr_t)TWC_ALL_PROFILES); weechat_hook_completion("tox_loaded_profiles", - "profile", + "loaded profile", twc_completion_profile, (void *)(intptr_t)TWC_LOADED_PROFILES); weechat_hook_completion("tox_unloaded_profiles", - "profile", + "unloaded profile", twc_completion_profile, (void *)(intptr_t)TWC_UNLOADED_PROFILES); + weechat_hook_completion("tox_friend_tox_id", + "friend Tox ID", + twc_completion_friend, + (void *)(intptr_t)TWC_COMPLETE_FRIEND_ID); + weechat_hook_completion("tox_friend_name", + "friend name", + twc_completion_friend, + (void *)(intptr_t)TWC_COMPLETE_FRIEND_NAME); }