Tony Olagbaiye 3 years ago
parent 4e2e7d91cc
commit 020da2710e
No known key found for this signature in database
GPG Key ID: 9E2FF3BDEBDFC910

@ -89,13 +89,14 @@
** TODO [#A] Implement essential functionality (milestone v0.2) ** TODO [#A] Implement essential functionality (milestone v0.2)
* [X] Opening PMs with initial message * [X] Opening PMs with initial message
* [X] OOB media messages * [X] OOB media messages
* [ ] Buffer autoswitch on enter/open * [X] Buffer autoswitch on enter/open
* [ ] Handle open/enter jids with a resource without breaking * [X] Handle open/enter jids with a resource without breaking
* [ ] Allow /close without crashing * [X] Allow /close without crashing
* [ ] [#B] Handle wide errors gracefully * [ ] [#B] Handle wide errors gracefully
* [ ] [#B] Event-driven MUC entrance * [ ] [#B] Event-driven MUC entrance
* [ ] MUCs * [ ] MUCs
* [X] Opening (/enter) * [X] Opening (/enter)
* [ ] Leave on /close
* [X] Receiving * [X] Receiving
* [X] Sending * [X] Sending
* [ ] [#B] Edits * [ ] [#B] Edits

@ -352,7 +352,6 @@ void account__disconnect(struct t_account *account, int reconnect)
(void) reconnect; (void) reconnect;
struct t_channel *ptr_channel; struct t_channel *ptr_channel;
(void) ptr_channel;
if (account->is_connected) if (account->is_connected)
{ {
@ -415,7 +414,9 @@ void account__disconnect(struct t_account *account, int reconnect)
account__set_lag (account); account__set_lag (account);
account->monitor = 0; account->monitor = 0;
account->monitor_time = 0; account->monitor_time = 0;
*/
/*
if (reconnect if (reconnect
&& IRC_SERVER_OPTION_BOOLEAN(account, IRC_SERVER_OPTION_AUTORECONNECT)) && IRC_SERVER_OPTION_BOOLEAN(account, IRC_SERVER_OPTION_AUTORECONNECT))
account__reconnect_schedule(account); account__reconnect_schedule(account);
@ -437,10 +438,8 @@ void account__disconnect(struct t_account *account, int reconnect)
*/ */
/* send signal "account_disconnected" with account name */ /* send signal "account_disconnected" with account name */
/* (void) weechat_hook_signal_send("xmpp_account_disconnected",
(void) weechat_hook_signal_send("account_disconnected",
WEECHAT_HOOK_SIGNAL_STRING, account->name); WEECHAT_HOOK_SIGNAL_STRING, account->name);
*/
} }
void account__disconnect_all() void account__disconnect_all()
@ -516,6 +515,9 @@ int account__connect(struct t_account *account)
connection__connect(account, &account->connection, account_jid(account), connection__connect(account, &account->connection, account_jid(account),
account_password(account), account_tls(account)); account_password(account), account_tls(account));
(void) weechat_hook_signal_send("xmpp_account_connected",
WEECHAT_HOOK_SIGNAL_STRING, account->name);
return account->is_connected; return account->is_connected;
} }

@ -21,6 +21,9 @@ void buffer__get_account_and_channel(struct t_gui_buffer *buffer,
if (!buffer) if (!buffer)
return; return;
*account = NULL;
*channel = NULL;
/* look for a account or channel using this buffer */ /* look for a account or channel using this buffer */
for (ptr_account = accounts; ptr_account; for (ptr_account = accounts; ptr_account;
ptr_account = ptr_account->next_account) ptr_account = ptr_account->next_account)
@ -45,8 +48,6 @@ void buffer__get_account_and_channel(struct t_gui_buffer *buffer,
} }
} }
} }
/* no account or channel found */
} }
char *buffer__typing_bar_cb(const void *pointer, void *data, char *buffer__typing_bar_cb(const void *pointer, void *data,
@ -73,7 +74,7 @@ char *buffer__typing_bar_cb(const void *pointer, void *data,
buffer__get_account_and_channel(buffer, &account, &channel); buffer__get_account_and_channel(buffer, &account, &channel);
if (!channel) if (!channel)
return strdup(""); return strndup("", 0);
typecount = 0; typecount = 0;
@ -105,7 +106,7 @@ char *buffer__typing_bar_cb(const void *pointer, void *data,
} }
else else
{ {
return strdup(""); return strndup("", 0);
} }
} }
@ -140,24 +141,50 @@ int buffer__close_cb(const void *pointer, void *data,
struct t_account *ptr_account = NULL; struct t_account *ptr_account = NULL;
struct t_channel *ptr_channel = NULL; struct t_channel *ptr_channel = NULL;
buffer_plugin = weechat_buffer_get_pointer(buffer, "plugin");
if (buffer_plugin == weechat_plugin)
buffer__get_account_and_channel(buffer,
&ptr_account, &ptr_channel);
(void) pointer; (void) pointer;
(void) data; (void) data;
(void) buffer;
if (ptr_account) buffer_plugin = weechat_buffer_get_pointer(buffer, "plugin");
if (buffer_plugin != weechat_plugin)
return WEECHAT_RC_OK;
buffer__get_account_and_channel(buffer, &ptr_account, &ptr_channel);
const char* type = weechat_buffer_get_string(buffer, "localvar_type");
if (weechat_strcasecmp(type, "server") == 0)
{ {
if (!ptr_account->disconnected) if (ptr_account)
{ {
//command_quit_account(ptr_account, NULL); if (!ptr_account->disconnected)
account__disconnect(ptr_account, 0); {
} account__disconnect(ptr_account, 0);
}
ptr_account->buffer = NULL; ptr_account->buffer = NULL;
}
}
else if (weechat_strcasecmp(type, "channel") == 0)
{
if (ptr_account && ptr_channel)
{
if (!ptr_account->disconnected)
{
channel__free(ptr_account, ptr_channel);
}
}
}
else if (weechat_strcasecmp(type, "private") == 0)
{
if (ptr_account && ptr_channel)
{
if (!ptr_account->disconnected)
{
channel__free(ptr_account, ptr_channel);
}
}
}
else
{
} }
return WEECHAT_RC_OK; return WEECHAT_RC_OK;

@ -101,6 +101,9 @@ struct t_channel_typing *channel__typing_search(struct t_channel *channel,
void channel__add_typing(struct t_channel *channel, void channel__add_typing(struct t_channel *channel,
struct t_user *user); struct t_user *user);
void channel__free(struct t_account *account,
struct t_channel *channel);
void channel__free_all(struct t_account *account); void channel__free_all(struct t_account *account);
void channel__update_topic(struct t_channel *channel, void channel__update_topic(struct t_channel *channel,

@ -4,6 +4,7 @@
#include <strophe.h> #include <strophe.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h>
#include <string.h> #include <string.h>
#include <weechat/weechat-plugin.h> #include <weechat/weechat-plugin.h>
@ -237,6 +238,66 @@ int command__account_connect(int argc, char **argv)
return (connect_ok) ? WEECHAT_RC_OK : WEECHAT_RC_ERROR; return (connect_ok) ? WEECHAT_RC_OK : WEECHAT_RC_ERROR;
} }
int command__disconnect_account(struct t_account *account)
{
if (!account)
return 0;
if (!account->is_connected)
{
weechat_printf(
NULL,
_("%s%s: not connected to account \"%s\"!"),
weechat_prefix("error"), WEECHAT_XMPP_PLUGIN_NAME,
account->name);
}
account__disconnect(account, 0);
return 1;
}
int command__account_disconnect(int argc, char **argv)
{
int i, nb_disconnect, disconnect_ok;
struct t_account *ptr_account;
(void) argc;
(void) argv;
disconnect_ok = 1;
nb_disconnect = 0;
for (i = 2; i < argc; i++)
{
nb_disconnect++;
ptr_account = account__search(argv[i]);
if (ptr_account)
{
if (!command__disconnect_account(ptr_account))
{
disconnect_ok = 0;
}
}
else
{
weechat_printf(
NULL,
_("%s%s: account not found \"%s\" "),
weechat_prefix("error"), WEECHAT_XMPP_PLUGIN_NAME,
argv[i]);
}
}
return (disconnect_ok) ? WEECHAT_RC_OK : WEECHAT_RC_ERROR;
}
int command__account_reconnect(int argc, char **argv)
{
command__account_disconnect(argc, argv);
return command__account_connect(argc, argv);
}
void command__account_delete(int argc, char **argv) void command__account_delete(int argc, char **argv)
{ {
struct t_account *account; struct t_account *account;
@ -316,6 +377,18 @@ int command__account(const void *pointer, void *data,
return WEECHAT_RC_OK; return WEECHAT_RC_OK;
} }
if (weechat_strcasecmp(argv[1], "disconnect") == 0)
{
command__account_disconnect(argc, argv);
return WEECHAT_RC_OK;
}
if (weechat_strcasecmp(argv[1], "reconnect") == 0)
{
command__account_reconnect(argc, argv);
return WEECHAT_RC_OK;
}
if (weechat_strcasecmp(argv[1], "delete") == 0) if (weechat_strcasecmp(argv[1], "delete") == 0)
{ {
command__account_delete(argc, argv); command__account_delete(argc, argv);
@ -385,18 +458,23 @@ int command__enter(const void *pointer, void *data,
xmpp_stanza_t *pres__x = xmpp_stanza_new(ptr_account->context); xmpp_stanza_t *pres__x = xmpp_stanza_new(ptr_account->context);
xmpp_stanza_set_name(pres__x, "x"); xmpp_stanza_set_name(pres__x, "x");
xmpp_stanza_set_ns(pres__x, "http://jabber.org/protocol/muc"); xmpp_stanza_set_ns(pres__x, "http://jabber.org/protocol/muc");
xmpp_stanza_add_child(pres, pres__x); xmpp_stanza_add_child(pres, pres__x);
xmpp_stanza_release(pres__x); xmpp_stanza_release(pres__x);
xmpp_send(ptr_account->connection, pres); xmpp_send(ptr_account->connection, pres);
xmpp_stanza_release(pres); xmpp_stanza_release(pres);
if (argc > 2) if (argc > 2)
{ {
text = argv_eol[2]; text = argv_eol[2];
channel__send_message(ptr_account, ptr_channel, jid, text); channel__send_message(ptr_account, ptr_channel, jid, text);
} }
char buf[16];
int num = weechat_buffer_get_integer(ptr_channel->buffer, "number");
snprintf(buf, sizeof(buf), "/buffer %d", num);
weechat_command(ptr_account->buffer, buf);
} }
weechat_string_free_split(jids); weechat_string_free_split(jids);
} }
@ -432,24 +510,35 @@ int command__open(const void *pointer, void *data,
if (argc > 1) if (argc > 1)
{ {
jid = xmpp_jid_bare(ptr_account->context, argv[1]); int n_jid = 0;
char **jids = weechat_string_split(argv[1], ",", NULL, 0, 0, &n_jid);
for (int i = 0; i < n_jid; i++)
{
jid = xmpp_jid_bare(ptr_account->context, jids[i]);
pres = xmpp_presence_new(ptr_account->context); pres = xmpp_presence_new(ptr_account->context);
xmpp_stanza_set_to(pres, jid); xmpp_stanza_set_to(pres, jid);
xmpp_stanza_set_from(pres, account_jid(ptr_account)); xmpp_stanza_set_from(pres, account_jid(ptr_account));
xmpp_send(ptr_account->connection, pres); xmpp_send(ptr_account->connection, pres);
xmpp_stanza_release(pres); xmpp_stanza_release(pres);
ptr_channel = channel__search(ptr_account, jid); ptr_channel = channel__search(ptr_account, jid);
if (!ptr_channel) if (!ptr_channel)
ptr_channel = channel__new(ptr_account, CHANNEL_TYPE_PM, jid, jid); ptr_channel = channel__new(ptr_account, CHANNEL_TYPE_PM, jid, jid);
if (argc > 2) if (argc > 2)
{ {
text = argv_eol[2]; text = argv_eol[2];
channel__send_message(ptr_account, ptr_channel, jid, text);
}
channel__send_message(ptr_account, ptr_channel, jid, text); char buf[16];
int num = weechat_buffer_get_integer(ptr_channel->buffer, "number");
snprintf(buf, sizeof(buf), "/buffer %d", num);
weechat_command(ptr_account->buffer, buf);
} }
weechat_string_free_split(jids);
} }
return WEECHAT_RC_OK; return WEECHAT_RC_OK;
@ -517,14 +606,20 @@ void command__init()
N_("list" N_("list"
" || add <account>" " || add <account>"
" || connect <account>" " || connect <account>"
" || disconnect <account>"
" || reconnect <account>"
" || delete <account>"), " || delete <account>"),
N_(" list: list accounts\n" N_(" list: list accounts\n"
" add: add a xmpp account\n" " add: add a xmpp account\n"
"connect: connect to a xmpp account\n" " connect: connect to a xmpp account\n"
" delete: delete a xmpp account\n"), "disconnect: disconnect from a xmpp account\n"
" reconnect: reconnect an xmpp account\n"
" delete: delete a xmpp account\n"),
"list" "list"
" || add %(xmpp_account)" " || add %(xmpp_account)"
" || connect %(xmpp_account)" " || connect %(xmpp_account)"
" || disconnect %(xmpp_account)"
" || reconnect %(xmpp_account)"
" || delete %(xmpp_account)", " || delete %(xmpp_account)",
&command__account, NULL, NULL); &command__account, NULL, NULL);
if (!hook) if (!hook)

Loading…
Cancel
Save