irc: send typing status as TAGMSG to other users
This commit is contained in:
parent
dccf605e66
commit
b108e97085
@ -40,6 +40,9 @@
|
||||
#include "irc-input.h"
|
||||
|
||||
|
||||
char *irc_channel_typing_status_string[IRC_CHANNEL_NUM_TYPING_STATUSES] =
|
||||
{ "off", "typing", "paused", "done" };
|
||||
|
||||
/* default CHANTYPES */
|
||||
char *irc_channel_default_chantypes = "#&";
|
||||
|
||||
@ -508,6 +511,8 @@ irc_channel_new (struct t_irc_server *server, int channel_type,
|
||||
irc_modelist_new (new_channel, ptr_chanmode[0]);
|
||||
}
|
||||
new_channel->join_smart_filtered = NULL;
|
||||
new_channel->typing_status = IRC_CHANNEL_TYPING_STATUS_OFF;
|
||||
new_channel->typing_status_sent = 0;
|
||||
new_channel->buffer = ptr_buffer;
|
||||
new_channel->buffer_as_string = NULL;
|
||||
|
||||
@ -1584,6 +1589,8 @@ irc_channel_hdata_channel_cb (const void *pointer, void *data,
|
||||
WEECHAT_HDATA_VAR(struct t_irc_channel, modelists, POINTER, 0, NULL, "irc_modelist");
|
||||
WEECHAT_HDATA_VAR(struct t_irc_channel, last_modelist, POINTER, 0, NULL, "irc_modelist");
|
||||
WEECHAT_HDATA_VAR(struct t_irc_channel, join_smart_filtered, HASHTABLE, 0, NULL, NULL);
|
||||
WEECHAT_HDATA_VAR(struct t_irc_channel, typing_status, INTEGER, 0, NULL, NULL);
|
||||
WEECHAT_HDATA_VAR(struct t_irc_channel, typing_status_sent, TIME, 0, NULL, NULL);
|
||||
WEECHAT_HDATA_VAR(struct t_irc_channel, buffer, POINTER, 0, NULL, "buffer");
|
||||
WEECHAT_HDATA_VAR(struct t_irc_channel, buffer_as_string, STRING, 0, NULL, NULL);
|
||||
WEECHAT_HDATA_VAR(struct t_irc_channel, prev_channel, POINTER, 0, NULL, hdata_name);
|
||||
@ -1774,6 +1781,8 @@ irc_channel_print_log (struct t_irc_channel *channel)
|
||||
channel->join_smart_filtered,
|
||||
weechat_hashtable_get_string (channel->join_smart_filtered,
|
||||
"keys_values"));
|
||||
weechat_log_printf (" typing_status. . . . . . : %d", channel->typing_status);
|
||||
weechat_log_printf (" typing_status_sent . . . : %lld", (long long)channel->typing_status_sent);
|
||||
weechat_log_printf (" buffer . . . . . . . . . : 0x%lx", channel->buffer);
|
||||
weechat_log_printf (" buffer_as_string . . . . : '%s'", channel->buffer_as_string);
|
||||
weechat_log_printf (" prev_channel . . . . . . : 0x%lx", channel->prev_channel);
|
||||
|
@ -32,6 +32,16 @@
|
||||
struct t_irc_server;
|
||||
struct t_irc_modelist;
|
||||
|
||||
enum t_irc_channel_typing_status
|
||||
{
|
||||
IRC_CHANNEL_TYPING_STATUS_OFF = 0,
|
||||
IRC_CHANNEL_TYPING_STATUS_TYPING,
|
||||
IRC_CHANNEL_TYPING_STATUS_PAUSED,
|
||||
IRC_CHANNEL_TYPING_STATUS_DONE,
|
||||
/* number of channel typing statuses */
|
||||
IRC_CHANNEL_NUM_TYPING_STATUSES,
|
||||
};
|
||||
|
||||
struct t_irc_channel_speaking
|
||||
{
|
||||
char *nick; /* nick speaking */
|
||||
@ -73,12 +83,15 @@ struct t_irc_channel
|
||||
struct t_irc_modelist *modelists; /* modelists in the channel */
|
||||
struct t_irc_modelist *last_modelist; /* last modelist in the channel */
|
||||
struct t_hashtable *join_smart_filtered; /* smart filtered joins */
|
||||
int typing_status; /* typing status */
|
||||
time_t typing_status_sent; /* last time typing status was sent */
|
||||
struct t_gui_buffer *buffer; /* buffer allocated for channel */
|
||||
char *buffer_as_string; /* used to return buffer info */
|
||||
struct t_irc_channel *prev_channel; /* link to previous channel */
|
||||
struct t_irc_channel *next_channel; /* link to next channel */
|
||||
};
|
||||
|
||||
extern char *irc_channel_typing_status_string[IRC_CHANNEL_NUM_TYPING_STATUSES];
|
||||
extern char *irc_channel_default_chantypes;
|
||||
|
||||
extern int irc_channel_valid (struct t_irc_server *server,
|
||||
|
@ -98,6 +98,7 @@ struct t_config_option *irc_config_look_part_closes_buffer;
|
||||
struct t_config_option *irc_config_look_pv_buffer;
|
||||
struct t_config_option *irc_config_look_pv_tags;
|
||||
struct t_config_option *irc_config_look_raw_messages;
|
||||
struct t_config_option *irc_config_look_send_typing_status;
|
||||
struct t_config_option *irc_config_look_server_buffer;
|
||||
struct t_config_option *irc_config_look_smart_filter;
|
||||
struct t_config_option *irc_config_look_smart_filter_account;
|
||||
@ -3115,6 +3116,13 @@ irc_config_init ()
|
||||
"closed (messages will be displayed when opening raw data buffer)"),
|
||||
NULL, 0, 65535, "256", NULL, 0,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
irc_config_look_send_typing_status = weechat_config_new_option (
|
||||
irc_config_file, ptr_section,
|
||||
"send_typing_status", "boolean",
|
||||
N_("send typing status to channels (capability \"message-tags\" must "
|
||||
"be enabled)"),
|
||||
NULL, 0, 0, "off", NULL, 0,
|
||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
irc_config_look_server_buffer = weechat_config_new_option (
|
||||
irc_config_file, ptr_section,
|
||||
"server_buffer", "integer",
|
||||
|
@ -138,6 +138,7 @@ extern struct t_config_option *irc_config_look_part_closes_buffer;
|
||||
extern struct t_config_option *irc_config_look_pv_buffer;
|
||||
extern struct t_config_option *irc_config_look_pv_tags;
|
||||
extern struct t_config_option *irc_config_look_raw_messages;
|
||||
extern struct t_config_option *irc_config_look_send_typing_status;
|
||||
extern struct t_config_option *irc_config_look_server_buffer;
|
||||
extern struct t_config_option *irc_config_look_smart_filter;
|
||||
extern struct t_config_option *irc_config_look_smart_filter_account;
|
||||
|
@ -3734,6 +3734,34 @@ irc_server_timer_cb (const void *pointer, void *data, int remaining_calls)
|
||||
ptr_redirect = ptr_next_redirect;
|
||||
}
|
||||
|
||||
/* send typing status on channels */
|
||||
if (weechat_config_boolean (irc_config_look_send_typing_status))
|
||||
{
|
||||
for (ptr_channel = ptr_server->channels; ptr_channel;
|
||||
ptr_channel = ptr_channel->next_channel)
|
||||
{
|
||||
if ((ptr_channel->typing_status != IRC_CHANNEL_TYPING_STATUS_OFF)
|
||||
&& (ptr_channel->typing_status_sent + 3 < current_time))
|
||||
{
|
||||
irc_server_sendf (
|
||||
ptr_server,
|
||||
IRC_SERVER_SEND_OUTQ_PRIO_LOW, NULL,
|
||||
"@+typing=%s TAGMSG %s",
|
||||
irc_channel_typing_status_string[ptr_channel->typing_status],
|
||||
ptr_channel->name);
|
||||
if (ptr_channel->typing_status == IRC_CHANNEL_TYPING_STATUS_TYPING)
|
||||
{
|
||||
ptr_channel->typing_status_sent = current_time;
|
||||
}
|
||||
else
|
||||
{
|
||||
ptr_channel->typing_status = IRC_CHANNEL_TYPING_STATUS_OFF;
|
||||
ptr_channel->typing_status_sent = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* purge some data (every 10 minutes) */
|
||||
if (current_time > ptr_server->last_data_purge + (60 * 10))
|
||||
{
|
||||
|
@ -159,6 +159,53 @@ irc_signal_upgrade_cb (const void *pointer, void *data,
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Callback for signals "typing_*".
|
||||
*/
|
||||
|
||||
int
|
||||
irc_signal_typing_cb (const void *pointer, void *data,
|
||||
const char *signal, const char *type_data,
|
||||
void *signal_data)
|
||||
{
|
||||
struct t_irc_server *ptr_server;
|
||||
struct t_irc_channel *ptr_channel;
|
||||
int new_status;
|
||||
|
||||
/* make C compiler happy */
|
||||
(void) pointer;
|
||||
(void) data;
|
||||
(void) signal;
|
||||
(void) type_data;
|
||||
|
||||
/* search server/channel with buffer */
|
||||
irc_buffer_get_server_and_channel (signal_data, &ptr_server, &ptr_channel);
|
||||
if (!ptr_server || !ptr_channel)
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
/* typing works only if capability "message-tags" is enabled */
|
||||
if (!weechat_hashtable_has_key (ptr_server->cap_list, "message-tags"))
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
new_status = -1;
|
||||
if (strcmp (signal, "typing_active") == 0)
|
||||
new_status = IRC_CHANNEL_TYPING_STATUS_TYPING;
|
||||
else if (strcmp (signal, "typing_paused") == 0)
|
||||
new_status = IRC_CHANNEL_TYPING_STATUS_PAUSED;
|
||||
else if (strcmp (signal, "typing_cleared") == 0)
|
||||
new_status = IRC_CHANNEL_TYPING_STATUS_DONE;
|
||||
else if (strcmp (signal, "typing_sent") == 0)
|
||||
new_status = IRC_CHANNEL_TYPING_STATUS_OFF;
|
||||
|
||||
if ((new_status >= 0) && (new_status != ptr_channel->typing_status))
|
||||
{
|
||||
ptr_channel->typing_status = new_status;
|
||||
ptr_channel->typing_status_sent = 0;
|
||||
}
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initializes IRC plugin.
|
||||
*/
|
||||
@ -200,6 +247,8 @@ weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[])
|
||||
&irc_server_xfer_send_accept_resume_cb, NULL, NULL);
|
||||
weechat_hook_signal ("irc_input_send",
|
||||
&irc_input_send_cb, NULL, NULL);
|
||||
weechat_hook_signal ("typing_*",
|
||||
&irc_signal_typing_cb, NULL, NULL);
|
||||
|
||||
/* hook hsignals for redirection */
|
||||
weechat_hook_hsignal ("irc_redirect_pattern",
|
||||
|
Loading…
x
Reference in New Issue
Block a user