aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordequis <dx@dxzone.com.ar>2015-10-13 02:05:22 -0300
committerdequis <dx@dxzone.com.ar>2015-10-13 02:05:22 -0300
commit64bed24b810fa3c44d23132b2aa8792fc78ffe77 (patch)
treeffc3b30753048432c754a672e6ef46333e86d0e9
parentfdc6d84a32e87c3486ac99b7aee282153d65b23e (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.c34
-rw-r--r--protocols/skype/t/groupchat-invite-bitlbee.mock2
-rw-r--r--protocols/skype/t/groupchat-invite-skyped.mock2
-rw-r--r--protocols/skype/t/groupchat-invited-bitlbee.mock2
-rw-r--r--protocols/skype/t/groupchat-leave-bitlbee.mock2
-rw-r--r--protocols/skype/t/groupchat-leave-skyped.mock10
-rw-r--r--protocols/skype/t/groupchat-msg-bitlbee.mock2
-rw-r--r--protocols/skype/t/groupchat-msg-skyped.mock10
-rw-r--r--protocols/skype/t/groupchat-topic-bitlbee.mock2
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