grim/purple-spasm

Parents cffbcb39672a
Children 4c31b6e3d6e6
Add twitch.tv/tags support. We don't do anything with them yet, but they don't break anything either.
--- a/src/spasm-chat.c Mon Apr 20 15:51:14 2020 -0500
+++ b/src/spasm-chat.c Mon Apr 20 16:26:22 2020 -0500
@@ -46,6 +46,7 @@
};
typedef void (*SpasmChatMessageHandler)(SpasmChatService *sa,
+ const gchar *tags,
const gchar *prefix,
const gchar *middle,
const gchar *trailing);
@@ -59,7 +60,8 @@
*****************************************************************************/
static void
spasm_chat_service_regex_init(SpasmChatService *chat) {
- chat->regex_message = g_regex_new("(?::(?<prefix>[^ ]+) +)?"
+ chat->regex_message = g_regex_new("(?:@(?<tags>[^ ]+) )?"
+ "(?::(?<prefix>[^ ]+) +)?"
"(?<command>[^ :]+)"
"(?: (?<middle>(?:[^ :]+(?: [^ :]+)*)))*"
"(?<coda> +:(?<trailing>.*)?)?",
@@ -141,15 +143,17 @@
* Handlers
*****************************************************************************/
static void
-spasm_chat_service_handle_ping(SpasmChatService *chat, const gchar *prefix,
- const gchar *middle, const gchar *trailing)
+spasm_chat_service_handle_ping(SpasmChatService *chat, const gchar *tags,
+ const gchar *prefix, const gchar *middle,
+ const gchar *trailing)
{
spasm_chat_service_real_send(chat, "PONG :%s", trailing);
}
static void
-spasm_chat_service_handle_join(SpasmChatService *chat, const gchar *prefix,
- const gchar *middle, const gchar *trailing)
+spasm_chat_service_handle_join(SpasmChatService *chat, const gchar *tags,
+ const gchar *prefix, const gchar *middle,
+ const gchar *trailing)
{
PurpleAccount *account = spasm_account_get_account(chat->sa);
GMatchInfo *info = NULL;
@@ -206,8 +210,9 @@
}
static void
-spasm_chat_service_handle_names(SpasmChatService *chat, const gchar *prefix,
- const gchar *middle, const gchar *trailing)
+spasm_chat_service_handle_names(SpasmChatService *chat, const gchar *tags,
+ const gchar *prefix, const gchar *middle,
+ const gchar *trailing)
{
PurpleAccount *account = NULL;
PurpleConvChat *chat_conversation = NULL;
@@ -256,8 +261,9 @@
}
static void
-spasm_chat_service_handle_part(SpasmChatService *chat, const gchar *prefix,
- const gchar *middle, const gchar *trailing)
+spasm_chat_service_handle_part(SpasmChatService *chat, const gchar *tags,
+ const gchar *prefix, const gchar *middle,
+ const gchar *trailing)
{
PurpleAccount *account = spasm_account_get_account(chat->sa);
PurpleConnection *connection = NULL;
@@ -309,17 +315,21 @@
}
static void
-spasm_chat_service_handle_privmsg(SpasmChatService *chat, const gchar *prefix,
- const gchar *middle, const gchar *trailing)
+spasm_chat_service_handle_privmsg(SpasmChatService *chat, const gchar *tags,
+ const gchar *prefix, const gchar *middle,
+ const gchar *trailing)
{
GMatchInfo *info = NULL;
if(g_regex_match(chat->regex_target, middle, 0, &info)) {
PurpleAccount *account = NULL;
PurpleConversation *conversation = NULL;
- gchar *target = NULL, *nick = NULL;
+ gchar *nick = NULL, *target = NULL;
target = g_match_info_fetch_named(info, "target");
+
+ purple_debug_misc("spasm-chat", "privmsg tags: '%s'\n", tags);
+
nick = spasm_chat_service_nick_from_mask(prefix);
account = spasm_account_get_account(chat->sa);
@@ -344,12 +354,12 @@
}
static void
-spasm_chat_service_handle_cap(SpasmChatService *chat, const gchar *prefix,
- const gchar *middle, const gchar *trailing)
+spasm_chat_service_handle_cap(SpasmChatService *chat, const gchar *tags,
+ const gchar *prefix, const gchar *middle,
+ const gchar *trailing)
{
if(g_ascii_strcasecmp(middle, "ACK") == 0) {
spasm_chat_service_real_send(chat, "CAP END");
- //spasm_chat_read(chat);
} else {
purple_debug_misc("spasm-chat", "cap-middle: '%s'\n", middle);
purple_debug_misc("spasm-chat", "cap-trailing: '%s'\n", trailing);
@@ -390,7 +400,8 @@
const gchar *buffer)
{
GMatchInfo *info = NULL;
- gchar *prefix = NULL, *command = NULL, *middle = NULL, *trailing = NULL;
+ gchar *command = NULL, *middle = NULL, *prefix = NULL, *tags = NULL;
+ gchar *trailing = NULL;
gboolean matches = FALSE;
gpointer value;
@@ -405,6 +416,7 @@
return;
}
+ tags = g_match_info_fetch_named(info, "tags");
prefix = g_match_info_fetch_named(info, "prefix");
command = g_match_info_fetch_named(info, "command");
middle = g_match_info_fetch_named(info, "middle");
@@ -418,11 +430,12 @@
if(value != NULL) {
SpasmChatMessageHandler handler = (SpasmChatMessageHandler)value;
- handler(chat, prefix, middle, trailing);
+ handler(chat, tags, prefix, middle, trailing);
}
} else {
purple_debug_misc("spasm-chat", "no handler found for \"%s\"\n",
buffer);
+ purple_debug_misc("spasm-chat", "tags: \"%s\"\n", tags);
purple_debug_misc("spasm-chat", "prefix: \"%s\"\n", prefix);
purple_debug_misc("spasm-chat", "command: \"%s\"\n", command);
purple_debug_misc("spasm-chat", "middle: \"%s\"\n", middle);
@@ -430,6 +443,7 @@
purple_debug_misc("spasm-chat", "----\n");
}
+ g_free(tags);
g_free(prefix);
g_free(command);
g_free(middle);
@@ -525,7 +539,7 @@
chat->output_stream = g_io_stream_get_output_stream(G_IO_STREAM(chat->socket_connection));
/* first check that we have the right capabilities */
- spasm_chat_service_real_send(chat, "CAP REQ :twitch.tv/membership");
+ spasm_chat_service_real_send(chat, "CAP REQ :twitch.tv/membership twitch.tv/tags");
/* now do the login */
spasm_chat_service_real_send(