1
0
mirror of https://github.com/irssi/irssi.git synced 2024-10-13 05:03:45 -04:00

Merge pull request #1090 from ailin-nemui/incoming-tags

incoming irc message tags support
This commit is contained in:
ailin-nemui 2019-08-15 16:32:01 +02:00 committed by GitHub
commit d418989f0c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 7 deletions

View File

@ -144,6 +144,7 @@ sasl.c
irc.c: irc.c:
"server event", SERVER_REC, char *data, char *sender_nick, char *sender_address "server event", SERVER_REC, char *data, char *sender_nick, char *sender_address
"server event tags", SERVER_REC, char *data, char *sender_nick, char *sender_address, char *tags
"event "<cmd>, SERVER_REC, char *args, char *sender_nick, char *sender_address "event "<cmd>, SERVER_REC, char *args, char *sender_nick, char *sender_address
"default event", SERVER_REC, char *data, char *sender_nick, char *sender_address "default event", SERVER_REC, char *data, char *sender_nick, char *sender_address
"whois default event", SERVER_REC, char *args, char *sender_nick, char *sender_address "whois default event", SERVER_REC, char *args, char *sender_nick, char *sender_address

View File

@ -32,6 +32,7 @@
char *current_server_event; char *current_server_event;
static int signal_default_event; static int signal_default_event;
static int signal_server_event; static int signal_server_event;
static int signal_server_event_tags;
static int signal_server_incoming; static int signal_server_incoming;
#ifdef BLOCKING_SOCKETS #ifdef BLOCKING_SOCKETS
@ -158,6 +159,14 @@ static char *split_nicks(const char *cmd, char **pre, char **nicks, char **post,
*pre = g_strdup(cmd); *pre = g_strdup(cmd);
*post = *nicks = NULL; *post = *nicks = NULL;
if (**pre == '@') {
/* the message-tags "add" one space separated argument
in front of the non message-tagged IRC commands. So
the nicks are now off-set by one to the right. */
arg++;
}
for (p = *pre; *p != '\0'; p++) { for (p = *pre; *p != '\0'; p++) {
if (*p != ' ') if (*p != ' ')
continue; continue;
@ -342,13 +351,31 @@ static void irc_server_event(IRC_SERVER_REC *server, const char *line,
g_free(event); g_free(event);
} }
static char *irc_parse_prefix(char *line, char **nick, char **address) static void irc_server_event_tags(IRC_SERVER_REC *server, const char *line,
const char *nick, const char *address, const char *tags)
{
if (*line != '\0')
signal_emit_id(signal_server_event, 4, server, line, nick, address);
}
static char *irc_parse_prefix(char *line, char **nick, char **address, char **tags)
{ {
char *p; char *p;
*nick = *address = NULL; *nick = *address = *tags = NULL;
/* :<nick> [["!" <user>] "@" <host>] SPACE */ /* ["@" <tags> SPACE] :<nick> [["!" <user>] "@" <host>] SPACE */
if (*line == '@') {
*tags = ++line;
while (*line != '\0' && *line != ' ') {
line++;
}
if (*line == ' ') {
*line++ = '\0';
while (*line == ' ') line++;
}
}
if (*line != ':') if (*line != ':')
return line; return line;
@ -382,14 +409,14 @@ static char *irc_parse_prefix(char *line, char **nick, char **address)
/* Parse command line sent by server */ /* Parse command line sent by server */
static void irc_parse_incoming_line(IRC_SERVER_REC *server, char *line) static void irc_parse_incoming_line(IRC_SERVER_REC *server, char *line)
{ {
char *nick, *address; char *nick, *address, *tags;
g_return_if_fail(server != NULL); g_return_if_fail(server != NULL);
g_return_if_fail(line != NULL); g_return_if_fail(line != NULL);
line = irc_parse_prefix(line, &nick, &address); line = irc_parse_prefix(line, &nick, &address, &tags);
if (*line != '\0') if (*line != '\0' || tags != NULL)
signal_emit_id(signal_server_event, 4, server, line, nick, address); signal_emit_id(signal_server_event_tags, 5, server, line, nick, address, tags);
} }
/* input function: handle incoming server messages */ /* input function: handle incoming server messages */
@ -441,18 +468,21 @@ static void irc_init_server(IRC_SERVER_REC *server)
void irc_irc_init(void) void irc_irc_init(void)
{ {
signal_add("server event", (SIGNAL_FUNC) irc_server_event); signal_add("server event", (SIGNAL_FUNC) irc_server_event);
signal_add("server event tags", (SIGNAL_FUNC) irc_server_event_tags);
signal_add("server connected", (SIGNAL_FUNC) irc_init_server); signal_add("server connected", (SIGNAL_FUNC) irc_init_server);
signal_add("server incoming", (SIGNAL_FUNC) irc_parse_incoming_line); signal_add("server incoming", (SIGNAL_FUNC) irc_parse_incoming_line);
current_server_event = NULL; current_server_event = NULL;
signal_default_event = signal_get_uniq_id("default event"); signal_default_event = signal_get_uniq_id("default event");
signal_server_event = signal_get_uniq_id("server event"); signal_server_event = signal_get_uniq_id("server event");
signal_server_event_tags = signal_get_uniq_id("server event tags");
signal_server_incoming = signal_get_uniq_id("server incoming"); signal_server_incoming = signal_get_uniq_id("server incoming");
} }
void irc_irc_deinit(void) void irc_irc_deinit(void)
{ {
signal_remove("server event", (SIGNAL_FUNC) irc_server_event); signal_remove("server event", (SIGNAL_FUNC) irc_server_event);
signal_remove("server event tags", (SIGNAL_FUNC) irc_server_event_tags);
signal_remove("server connected", (SIGNAL_FUNC) irc_init_server); signal_remove("server connected", (SIGNAL_FUNC) irc_init_server);
signal_remove("server incoming", (SIGNAL_FUNC) irc_parse_incoming_line); signal_remove("server incoming", (SIGNAL_FUNC) irc_parse_incoming_line);
} }