Fixed connecting/disconnecting.

This commit is contained in:
Håvard Pettersson 2014-09-20 09:03:31 +02:00
parent f7b086d38d
commit 7c81c9dcfc
5 changed files with 94 additions and 75 deletions

View File

@ -628,10 +628,11 @@ tox_weechat_cmd_tox(void *data, struct t_gui_buffer *buffer,
return WEECHAT_RC_OK; return WEECHAT_RC_OK;
} }
else if (argc == 3 && (weechat_strcasecmp(argv[1], "connect") == 0)) else if (argc >= 3 && (weechat_strcasecmp(argv[1], "connect") == 0))
{ {
char *name = argv[2]; for (int i = 2; i < argc; ++i)
{
char *name = argv[i];
struct t_tox_weechat_identity *identity = tox_weechat_identity_name_search(name); struct t_tox_weechat_identity *identity = tox_weechat_identity_name_search(name);
if (!identity) if (!identity)
{ {
@ -645,14 +646,16 @@ tox_weechat_cmd_tox(void *data, struct t_gui_buffer *buffer,
{ {
tox_weechat_identity_connect(identity); tox_weechat_identity_connect(identity);
} }
}
return WEECHAT_RC_OK; return WEECHAT_RC_OK;
} }
else if (argc == 3 && (weechat_strcasecmp(argv[1], "disconnect") == 0)) else if (argc >= 3 && (weechat_strcasecmp(argv[1], "disconnect") == 0))
{ {
char *name = argv[2]; for (int i = 2; i < argc; ++i)
{
char *name = argv[i];
struct t_tox_weechat_identity *identity = tox_weechat_identity_name_search(name); struct t_tox_weechat_identity *identity = tox_weechat_identity_name_search(name);
if (!identity) if (!identity)
{ {
@ -666,6 +669,7 @@ tox_weechat_cmd_tox(void *data, struct t_gui_buffer *buffer,
{ {
tox_weechat_identity_disconnect(identity); tox_weechat_identity_disconnect(identity);
} }
}
return WEECHAT_RC_OK; return WEECHAT_RC_OK;
} }
@ -740,8 +744,8 @@ tox_weechat_commands_init()
"list" "list"
" || create <name>" " || create <name>"
" || delete <name> -yes|-keepdata" " || delete <name> -yes|-keepdata"
" || connect <name>" " || connect [<name>...]"
" || disconnect <name>", " || disconnect [<name>...]",
" list: list all Tox identity\n" " list: list all Tox identity\n"
" create: create a new Tox identity\n" " create: create a new Tox identity\n"
" delete: delete a Tox identity; requires either " " delete: delete a Tox identity; requires either "
@ -752,7 +756,7 @@ tox_weechat_commands_init()
"list" "list"
" || create" " || create"
" || delete %(tox_identities) -yes|-keepdata" " || delete %(tox_identities) -yes|-keepdata"
" || connect %(tox_disconnected_identities)" " || connect %(tox_disconnected_identities)|%*"
" || disconnect %(tox_connected_identities)", " || disconnect %(tox_connected_identities)|%*",
tox_weechat_cmd_tox, NULL); tox_weechat_cmd_tox, NULL);
} }

View File

@ -39,10 +39,7 @@ bar_item_away(void *data,
{ {
struct t_tox_weechat_identity *identity = tox_weechat_identity_for_buffer(buffer); struct t_tox_weechat_identity *identity = tox_weechat_identity_for_buffer(buffer);
if (!identity) if (!identity || !(identity->tox))
return NULL;
if (identity->tox == NULL || identity->tox_online == false)
return NULL; return NULL;
char *status = NULL;; char *status = NULL;;
@ -68,7 +65,7 @@ bar_item_input_prompt(void *data,
{ {
struct t_tox_weechat_identity *identity = tox_weechat_identity_for_buffer(buffer); struct t_tox_weechat_identity *identity = tox_weechat_identity_for_buffer(buffer);
if (identity->tox == NULL || identity->tox_online == false) if (!identity || !(identity->tox))
return NULL; return NULL;
return tox_weechat_get_self_name_nt(identity->tox); return tox_weechat_get_self_name_nt(identity->tox);
@ -88,11 +85,14 @@ bar_item_buffer_plugin(void *data, struct t_gui_bar_item *item,
const char *identity_name = identity->name; const char *identity_name = identity->name;
snprintf(string, sizeof(string), snprintf(string, sizeof(string),
"%s%s/%s%s", "%s%s/%s%s%s/%s%s",
plugin_name, plugin_name,
weechat_color("bar_delim"), weechat_color("bar_delim"),
weechat_color("bar_fg"), weechat_color("bar_fg"),
identity_name); identity_name,
weechat_color("bar_delim"),
weechat_color("bar_fg"),
identity->tox_online ? "online" : "offline");
return strdup(string); return strdup(string);
} }

View File

@ -175,6 +175,14 @@ tox_weechat_bootstrap_tox(Tox *tox, const char *address, uint16_t port, const ch
return result; return result;
} }
void
tox_weechat_bootstrap_random_node(Tox *tox)
{
int i = rand() % tox_weechat_bootstrap_count;
tox_weechat_bootstrap_tox(tox, tox_weechat_bootstrap_addresses[i],
tox_weechat_bootstrap_ports[i],
tox_weechat_bootstrap_keys[i]);
}
struct t_tox_weechat_identity * struct t_tox_weechat_identity *
tox_weechat_identity_new(const char *name) tox_weechat_identity_new(const char *name)
@ -207,15 +215,6 @@ tox_weechat_identity_new(const char *name)
return identity; return identity;
} }
void
tox_weechat_bootstrap_random_node(Tox *tox)
{
int i = rand() % tox_weechat_bootstrap_count;
tox_weechat_bootstrap_tox(tox, tox_weechat_bootstrap_addresses[i],
tox_weechat_bootstrap_ports[i],
tox_weechat_bootstrap_keys[i]);
}
void void
tox_weechat_identity_connect(struct t_tox_weechat_identity *identity) tox_weechat_identity_connect(struct t_tox_weechat_identity *identity)
{ {
@ -230,6 +229,12 @@ tox_weechat_identity_connect(struct t_tox_weechat_identity *identity)
tox_weechat_identity_buffer_close_callback, identity); tox_weechat_identity_buffer_close_callback, identity);
} }
weechat_printf(identity->buffer,
"%s%s: identity %s connecting",
weechat_prefix("network"),
weechat_plugin->name,
identity->name);
// create Tox // create Tox
identity->tox = tox_new(NULL); identity->tox = tox_new(NULL);
@ -302,10 +307,12 @@ tox_weechat_identity_disconnect(struct t_tox_weechat_identity *identity)
free(path); free(path);
} }
tox_weechat_identity_set_online_status(identity, false);
// stop Tox timer // stop Tox timer
weechat_unhook(identity->tox_do_timer); weechat_unhook(identity->tox_do_timer);
// have to refresh and hide bar items even if we were already offline
tox_weechat_identity_refresh_online_status(identity);
tox_weechat_identity_set_online_status(identity, false);
} }
void void
@ -320,17 +327,24 @@ tox_weechat_identity_autoconnect()
} }
} }
void
tox_weechat_identity_refresh_online_status(struct t_tox_weechat_identity *identity)
{
weechat_bar_item_update("buffer_plugin");
weechat_bar_item_update("input_prompt");
weechat_bar_item_update("away");
}
void void
tox_weechat_identity_set_online_status(struct t_tox_weechat_identity *identity, tox_weechat_identity_set_online_status(struct t_tox_weechat_identity *identity,
bool online) bool online)
{ {
identity->tox_online = identity->tox && online; if (identity->tox_online ^ online)
{
weechat_bar_item_update("input_prompt"); identity->tox_online = online;
weechat_bar_item_update("away"); tox_weechat_identity_refresh_online_status(identity);
struct t_gui_buffer *buffer = identity->buffer ?: NULL; struct t_gui_buffer *buffer = identity->buffer ?: NULL;
if (identity->tox_online) if (identity->tox_online)
{ {
weechat_printf(buffer, weechat_printf(buffer,
@ -348,6 +362,7 @@ tox_weechat_identity_set_online_status(struct t_tox_weechat_identity *identity,
identity->name); identity->name);
} }
} }
}
struct t_tox_weechat_identity * struct t_tox_weechat_identity *
tox_weechat_identity_name_search(const char *name) tox_weechat_identity_name_search(const char *name)

View File

@ -70,6 +70,9 @@ tox_weechat_identity_disconnect(struct t_tox_weechat_identity *identity);
void void
tox_weechat_identity_autoconnect(); tox_weechat_identity_autoconnect();
void
tox_weechat_identity_refresh_online_status(struct t_tox_weechat_identity *identity);
void void
tox_weechat_identity_set_online_status(struct t_tox_weechat_identity *identity, tox_weechat_identity_set_online_status(struct t_tox_weechat_identity *identity,
bool online); bool online);

View File

@ -45,11 +45,8 @@ tox_weechat_do_timer_cb(void *data,
// check connection status // check connection status
int connected = tox_isconnected(identity->tox); int connected = tox_isconnected(identity->tox);
if (connected ^ identity->tox_online)
{
tox_weechat_identity_set_online_status(identity, connected); tox_weechat_identity_set_online_status(identity, connected);
} }
}
return WEECHAT_RC_OK; return WEECHAT_RC_OK;
} }