mirror of
https://github.com/ZoiteChat/zoitechat.git
synced 2026-03-21 21:20:20 +00:00
Implement support for the IRCv3 account-tag specification. (#2572)
Co-authored-by: Patrick <tingping@tingping.se>
This commit is contained in:
@@ -569,6 +569,7 @@ typedef struct server
|
|||||||
unsigned int have_idmsg:1; /* freenode's IDENTIFY-MSG */
|
unsigned int have_idmsg:1; /* freenode's IDENTIFY-MSG */
|
||||||
unsigned int have_accnotify:1; /* cap account-notify */
|
unsigned int have_accnotify:1; /* cap account-notify */
|
||||||
unsigned int have_extjoin:1; /* cap extended-join */
|
unsigned int have_extjoin:1; /* cap extended-join */
|
||||||
|
unsigned int have_account_tag:1; /* cap account-tag */
|
||||||
unsigned int have_server_time:1; /* cap server-time */
|
unsigned int have_server_time:1; /* cap server-time */
|
||||||
unsigned int have_sasl:1; /* SASL capability */
|
unsigned int have_sasl:1; /* SASL capability */
|
||||||
unsigned int have_except:1; /* ban exemptions +e */
|
unsigned int have_except:1; /* ban exemptions +e */
|
||||||
|
|||||||
@@ -1671,6 +1671,8 @@ inbound_toggle_caps (server *serv, const char *extensions_str, gboolean enable)
|
|||||||
serv->have_server_time = enable;
|
serv->have_server_time = enable;
|
||||||
else if (!strcmp (extension, "away-notify"))
|
else if (!strcmp (extension, "away-notify"))
|
||||||
serv->have_awaynotify = enable;
|
serv->have_awaynotify = enable;
|
||||||
|
else if (!strcmp (extension, "account-tag"))
|
||||||
|
serv->have_account_tag = enable;
|
||||||
else if (!strcmp (extension, "sasl"))
|
else if (!strcmp (extension, "sasl"))
|
||||||
{
|
{
|
||||||
serv->have_sasl = enable;
|
serv->have_sasl = enable;
|
||||||
@@ -1726,6 +1728,7 @@ static const char * const supported_caps[] = {
|
|||||||
"chghost",
|
"chghost",
|
||||||
"setname",
|
"setname",
|
||||||
"invite-notify",
|
"invite-notify",
|
||||||
|
"account-tag",
|
||||||
|
|
||||||
/* ZNC */
|
/* ZNC */
|
||||||
"znc.in/server-time-iso",
|
"znc.in/server-time-iso",
|
||||||
|
|||||||
@@ -1010,6 +1010,7 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[],
|
|||||||
const message_tags_data *tags_data)
|
const message_tags_data *tags_data)
|
||||||
{
|
{
|
||||||
server *serv = sess->server;
|
server *serv = sess->server;
|
||||||
|
char *account;
|
||||||
char ip[128], nick[NICKLEN];
|
char ip[128], nick[NICKLEN];
|
||||||
char *text, *ex;
|
char *text, *ex;
|
||||||
int len = strlen (type);
|
int len = strlen (type);
|
||||||
@@ -1028,6 +1029,14 @@ process_named_msg (session *sess, char *type, char *word[], char *word_eol[],
|
|||||||
ex[0] = '!';
|
ex[0] = '!';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** Update the account for this message's source. */
|
||||||
|
if (serv->have_account_tag)
|
||||||
|
{
|
||||||
|
account = tags_data->account && *tags_data->account ? tags_data->account : "*";
|
||||||
|
inbound_account (serv, nick, account, tags_data);
|
||||||
|
}
|
||||||
|
|
||||||
if (len == 4)
|
if (len == 4)
|
||||||
{
|
{
|
||||||
guint32 t;
|
guint32 t;
|
||||||
@@ -1522,6 +1531,9 @@ handle_message_tags (server *serv, const char *tags_str,
|
|||||||
*value = '\0';
|
*value = '\0';
|
||||||
value++;
|
value++;
|
||||||
|
|
||||||
|
if (serv->have_account_tag && !strcmp (key, "account"))
|
||||||
|
tags_data->account = g_strdup (value);
|
||||||
|
|
||||||
if (serv->have_server_time && !strcmp (key, "time"))
|
if (serv->have_server_time && !strcmp (key, "time"))
|
||||||
handle_message_tag_time (value, tags_data);
|
handle_message_tag_time (value, tags_data);
|
||||||
}
|
}
|
||||||
@@ -1619,9 +1631,16 @@ irc_inline (server *serv, char *buf, int len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
xit:
|
xit:
|
||||||
|
message_tags_data_free (&tags_data);
|
||||||
g_free (pdibuf);
|
g_free (pdibuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
message_tags_data_free (message_tags_data *tags_data)
|
||||||
|
{
|
||||||
|
g_clear_pointer (&tags_data->account, g_free);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
proto_fill_her_up (server *serv)
|
proto_fill_her_up (server *serv)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
#define MESSAGE_TAGS_DATA_INIT \
|
#define MESSAGE_TAGS_DATA_INIT \
|
||||||
{ \
|
{ \
|
||||||
|
NULL, /* account name */ \
|
||||||
(time_t)0, /* timestamp */ \
|
(time_t)0, /* timestamp */ \
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,9 +37,12 @@
|
|||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
char *account;
|
||||||
time_t timestamp;
|
time_t timestamp;
|
||||||
} message_tags_data;
|
} message_tags_data;
|
||||||
|
|
||||||
|
void message_tags_data_free (message_tags_data *tags_data);
|
||||||
|
|
||||||
void proto_fill_her_up (server *serv);
|
void proto_fill_her_up (server *serv);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1784,6 +1784,7 @@ server_set_defaults (server *serv)
|
|||||||
serv->have_idmsg = FALSE;
|
serv->have_idmsg = FALSE;
|
||||||
serv->have_accnotify = FALSE;
|
serv->have_accnotify = FALSE;
|
||||||
serv->have_extjoin = FALSE;
|
serv->have_extjoin = FALSE;
|
||||||
|
serv->have_account_tag = FALSE;
|
||||||
serv->have_server_time = FALSE;
|
serv->have_server_time = FALSE;
|
||||||
serv->have_sasl = FALSE;
|
serv->have_sasl = FALSE;
|
||||||
serv->have_except = FALSE;
|
serv->have_except = FALSE;
|
||||||
|
|||||||
@@ -101,12 +101,14 @@ userlist_set_account (struct session *sess, char *nick, char *account)
|
|||||||
user = userlist_find (sess, nick);
|
user = userlist_find (sess, nick);
|
||||||
if (user)
|
if (user)
|
||||||
{
|
{
|
||||||
g_free (user->account);
|
|
||||||
|
|
||||||
if (strcmp (account, "*") == 0)
|
if (strcmp (account, "*") == 0)
|
||||||
user->account = NULL;
|
{
|
||||||
else
|
g_clear_pointer (&user->account, g_free);
|
||||||
|
} else if (g_strcmp0 (user->account, account))
|
||||||
|
{
|
||||||
|
g_free (user->account);
|
||||||
user->account = g_strdup (account);
|
user->account = g_strdup (account);
|
||||||
|
}
|
||||||
|
|
||||||
/* gui doesnt currently reflect login status, maybe later
|
/* gui doesnt currently reflect login status, maybe later
|
||||||
fe_userlist_rehash (sess, user); */
|
fe_userlist_rehash (sess, user); */
|
||||||
|
|||||||
Reference in New Issue
Block a user