diff options
author | dequis <dx@dxzone.com.ar> | 2015-10-13 02:05:22 -0300 |
---|---|---|
committer | dequis <dx@dxzone.com.ar> | 2015-10-13 02:05:22 -0300 |
commit | 64bed24b810fa3c44d23132b2aa8792fc78ffe77 (patch) | |
tree | ffc3b30753048432c754a672e6ef46333e86d0e9 | |
parent | fdc6d84a32e87c3486ac99b7aee282153d65b23e (diff) |
skype: create groupchat as soon as a message is received
Before this commit, the bee_chat_by_title() call just failed when
receiving a message in a groupchat we didn't know about, which is
probably something skype broke in their api at some point.
I'm fixing this since apparently the only way to access p2p based chats
is through the official skype desktop client (they won't be supported
through msnp24 or skypeweb. It's broken in mobile clients already), so
this plugin is probably the best way to access those.
This breaks the 'msg' test - now all chats are groupchats and there's no
way to tell them apart.
However, in reality, private messages aren't delivered at all over the
api, or at least I never managed to get them working. Probably if you
talk with someone who has a very old patched skype client.
-rw-r--r-- | protocols/skype/skype.c | 34 | ||||
-rw-r--r-- | protocols/skype/t/groupchat-invite-bitlbee.mock | 2 | ||||
-rw-r--r-- | protocols/skype/t/groupchat-invite-skyped.mock | 2 | ||||
-rw-r--r-- | protocols/skype/t/groupchat-invited-bitlbee.mock | 2 | ||||
-rw-r--r-- | protocols/skype/t/groupchat-leave-bitlbee.mock | 2 | ||||
-rw-r--r-- | protocols/skype/t/groupchat-leave-skyped.mock | 10 | ||||
-rw-r--r-- | protocols/skype/t/groupchat-msg-bitlbee.mock | 2 | ||||
-rw-r--r-- | protocols/skype/t/groupchat-msg-skyped.mock | 10 | ||||
-rw-r--r-- | protocols/skype/t/groupchat-topic-bitlbee.mock | 2 |
9 files changed, 32 insertions, 34 deletions
diff --git a/protocols/skype/skype.c b/protocols/skype/skype.c index ade5b8c6..a21af8ef 100644 --- a/protocols/skype/skype.c +++ b/protocols/skype/skype.c @@ -322,6 +322,24 @@ static struct skype_group *skype_group_by_name(struct im_connection *ic, char *n return NULL; } +static struct groupchat *skype_chat_get_or_create(struct im_connection *ic, char *id) +{ + struct skype_data *sd = ic->proto_data; + struct groupchat *gc = bee_chat_by_title(ic->bee, ic, id); + + if (!gc) { + gc = imcb_chat_new(ic, id); + imcb_chat_name_hint(gc, id); + imcb_chat_add_buddy(gc, sd->username); + + skype_printf(ic, "GET CHAT %s ADDER\n", id); + skype_printf(ic, "GET CHAT %s TOPIC\n", id); + skype_printf(ic, "GET CHAT %s ACTIVEMEMBERS\n", id); + } + + return gc; +} + static void skype_parse_users(struct im_connection *ic, char *line) { char **i, **nicks; @@ -686,7 +704,7 @@ static void skype_parse_chatmessage(struct im_connection *ic, char *line) } else if (!strncmp(info, "CHATNAME ", 9)) { info += 9; if (sd->handle && sd->body && sd->type) { - struct groupchat *gc = bee_chat_by_title(ic->bee, ic, info); + struct groupchat *gc = skype_chat_get_or_create(ic, info); int i; for (i = 0; i < g_list_length(sd->body); i++) { char *body = g_list_nth_data(sd->body, i); @@ -1024,16 +1042,9 @@ static void skype_parse_chat(struct im_connection *ic, char *line) imcb_chat_free(gc); } if (!strcmp(info, "STATUS MULTI_SUBSCRIBED")) { - gc = bee_chat_by_title(ic->bee, ic, id); - if (!gc) { - gc = imcb_chat_new(ic, id); - imcb_chat_name_hint(gc, id); - } - skype_printf(ic, "GET CHAT %s ADDER\n", id); - skype_printf(ic, "GET CHAT %s TOPIC\n", id); + skype_chat_get_or_create(ic, id); } else if (!strcmp(info, "STATUS DIALOG") && sd->groupchat_with) { - gc = imcb_chat_new(ic, id); - imcb_chat_name_hint(gc, id); + gc = skype_chat_get_or_create(ic, id); /* According to the docs this * is necessary. However it * does not seem the situation @@ -1044,11 +1055,8 @@ static void skype_parse_chat(struct im_connection *ic, char *line) g_snprintf(buf, IRC_LINE_SIZE, "%s@skype.com", sd->groupchat_with); imcb_chat_add_buddy(gc, buf); - imcb_chat_add_buddy(gc, sd->username); g_free(sd->groupchat_with); sd->groupchat_with = NULL; - skype_printf(ic, "GET CHAT %s ADDER\n", id); - skype_printf(ic, "GET CHAT %s TOPIC\n", id); } else if (!strcmp(info, "STATUS UNSUBSCRIBED")) { gc = bee_chat_by_title(ic->bee, ic, id); if (gc) { diff --git a/protocols/skype/t/groupchat-invite-bitlbee.mock b/protocols/skype/t/groupchat-invite-bitlbee.mock index bee689f1..b79a8faa 100644 --- a/protocols/skype/t/groupchat-invite-bitlbee.mock +++ b/protocols/skype/t/groupchat-invite-bitlbee.mock @@ -6,6 +6,6 @@ << PRIVMSG &bitlbee :account skype on >> :bob!bob@skype.com JOIN :&bitlbee << PRIVMSG &bitlbee :chat with bob ->> 353 alice = ##alice/$bob;a7ab206ec78 :@alice bob @root +>> 353 alice = ##alice/$bob;a7ab206ec78 :@alice @root << INVITE cecil ##alice/$bob;a7ab206ec78 >> cecil@skype.com JOIN :##alice/$bob;a7ab206ec78 diff --git a/protocols/skype/t/groupchat-invite-skyped.mock b/protocols/skype/t/groupchat-invite-skyped.mock index 214ebec0..472c6801 100644 --- a/protocols/skype/t/groupchat-invite-skyped.mock +++ b/protocols/skype/t/groupchat-invite-skyped.mock @@ -25,6 +25,8 @@ << CHAT #alice/$bob;a7ab206ec78060f1 NAME #alice/$bob;a7ab206ec78060f1 >> GET CHAT #alice/$bob;a7ab206ec78060f1 TOPIC << CHAT #alice/$bob;a7ab206ec78060f1 TOPIC +>> GET CHAT #alice/$bob;a7ab206ec78060f1 ACTIVEMEMBERS +<< CHAT #alice/$bob;a7ab206ec78060f1 ACTIVEMEMBERS << CHATMESSAGE 206 STATUS SENDING << CHAT #alice/$bob;a7ab206ec78060f1 STATUS DIALOG << CHATMEMBER 204 ROLE USER diff --git a/protocols/skype/t/groupchat-invited-bitlbee.mock b/protocols/skype/t/groupchat-invited-bitlbee.mock index bf950774..344d5f71 100644 --- a/protocols/skype/t/groupchat-invited-bitlbee.mock +++ b/protocols/skype/t/groupchat-invited-bitlbee.mock @@ -5,4 +5,4 @@ << PRIVMSG &bitlbee :account add skype alice foo << PRIVMSG &bitlbee :account skype on >> JOIN :##cecil/$bob;4d8cc996579 ->> 353 alice = ##cecil/$bob;4d8cc996579 :@alice bob cecil @root +>> 353 alice = ##cecil/$bob;4d8cc996579 :@alice @root diff --git a/protocols/skype/t/groupchat-leave-bitlbee.mock b/protocols/skype/t/groupchat-leave-bitlbee.mock index fefe54c0..0a1c02df 100644 --- a/protocols/skype/t/groupchat-leave-bitlbee.mock +++ b/protocols/skype/t/groupchat-leave-bitlbee.mock @@ -6,6 +6,6 @@ << PRIVMSG &bitlbee :account skype set skypeconsole_receive true << PRIVMSG &bitlbee :account skype on >> JOIN :##cecil/$bob;4d8cc996579 ->> 353 alice = ##cecil/$bob;4d8cc996579 :@alice bob cecil @root +>> 353 alice = ##cecil/$bob;4d8cc996579 :@alice @root << PART ##cecil/$bob;4d8cc996579 >> PRIVMSG &bitlbee :alice: CHAT #cecil/$bob;4d8cc9965791c6b9 STATUS UNSUBSCRIBED diff --git a/protocols/skype/t/groupchat-leave-skyped.mock b/protocols/skype/t/groupchat-leave-skyped.mock index 86150d1c..49601c28 100644 --- a/protocols/skype/t/groupchat-leave-skyped.mock +++ b/protocols/skype/t/groupchat-leave-skyped.mock @@ -35,14 +35,8 @@ << CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob >> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC << CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC ->> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER -<< CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob ->> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC -<< CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC ->> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER -<< CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob ->> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC -<< CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC +>> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ACTIVEMEMBERS +<< CHAT #cecil/$bob;4d8cc9965791c6b9 ACTIVEMEMBERS >> GET CHATMESSAGE 188 FROM_HANDLE << CHATMESSAGE 188 FROM_HANDLE bob >> GET CHATMESSAGE 188 BODY diff --git a/protocols/skype/t/groupchat-msg-bitlbee.mock b/protocols/skype/t/groupchat-msg-bitlbee.mock index eae6d6e9..114084ba 100644 --- a/protocols/skype/t/groupchat-msg-bitlbee.mock +++ b/protocols/skype/t/groupchat-msg-bitlbee.mock @@ -6,6 +6,6 @@ << PRIVMSG &bitlbee :account skype set skypeconsole_receive true << PRIVMSG &bitlbee :account skype on >> JOIN :##cecil/$bob;4d8cc996579 ->> 353 alice = ##cecil/$bob;4d8cc996579 :@alice bob cecil @root +>> 353 alice = ##cecil/$bob;4d8cc996579 :@alice @root << PRIVMSG ##cecil/$bob;4d8cc996579 :hello >> PRIVMSG &bitlbee :alice: CHAT #cecil/$bob;4d8cc9965791c6b9 ACTIVITY_TIMESTAMP diff --git a/protocols/skype/t/groupchat-msg-skyped.mock b/protocols/skype/t/groupchat-msg-skyped.mock index e939585c..c49604a2 100644 --- a/protocols/skype/t/groupchat-msg-skyped.mock +++ b/protocols/skype/t/groupchat-msg-skyped.mock @@ -35,14 +35,8 @@ << CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob >> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC << CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC ->> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER -<< CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob ->> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC -<< CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC ->> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER -<< CHAT #cecil/$bob;4d8cc9965791c6b9 ADDER bob ->> GET CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC -<< CHAT #cecil/$bob;4d8cc9965791c6b9 TOPIC +>> GET CHAT #cecil/$bob;4d8cc9965791c6b9 ACTIVEMEMBERS +<< CHAT #cecil/$bob;4d8cc9965791c6b9 ACTIVEMEMBERS bob cecil alice >> GET CHATMESSAGE 188 FROM_HANDLE << CHATMESSAGE 188 FROM_HANDLE bob >> GET CHATMESSAGE 188 BODY diff --git a/protocols/skype/t/groupchat-topic-bitlbee.mock b/protocols/skype/t/groupchat-topic-bitlbee.mock index 431493c9..fe995448 100644 --- a/protocols/skype/t/groupchat-topic-bitlbee.mock +++ b/protocols/skype/t/groupchat-topic-bitlbee.mock @@ -5,6 +5,6 @@ << PRIVMSG &bitlbee :account add skype alice foo << PRIVMSG &bitlbee :account skype on >> JOIN :##cecil/$bob;4d8cc996579 ->> 353 alice = ##cecil/$bob;4d8cc996579 :@alice bob cecil @root +>> 353 alice = ##cecil/$bob;4d8cc996579 :@alice @root << TOPIC ##cecil/$bob;4d8cc996579 :topic >> TOPIC ##cecil/$bob;4d8cc996579 :topic |