void translate_sending_chat_message_cb(const gchar *original_phrase, const gchar *translated_phrase, const gchar *detected_language, gpointer userdata) { struct TranslateConvMessage *convmsg = userdata; gchar *html_text; int err = 0; html_text = purple_strdup_withhtml(translated_phrase); err = serv_chat_send(purple_account_get_connection(convmsg->account), purple_conv_chat_get_id(PURPLE_CONV_CHAT(convmsg->conv)), html_text, convmsg->flags); g_free(html_text); html_text = purple_strdup_withhtml(original_phrase); //if (err > 0) //{ // purple_conversation_write(convmsg->conv, convmsg->sender, html_text, convmsg->flags, time(NULL)); //} purple_signal_emit(purple_conversations_get_handle(), "sent-chat-msg", convmsg->account, html_text, purple_conv_chat_get_id(PURPLE_CONV_CHAT(convmsg->conv))); g_free(html_text); g_free(convmsg->sender); g_free(convmsg); }
void translate_receiving_chat_msg_cb(const gchar *original_phrase, const gchar *translated_phrase, const gchar *detected_language, gpointer userdata) { struct TranslateConvMessage *convmsg = userdata; PurpleChat *chat; gchar *html_text; const gchar *stored_lang = ""; const gchar *language_name = NULL; gchar *message; if (detected_language) { chat = purple_blist_find_chat(convmsg->account, convmsg->conv->name); stored_lang = purple_blist_node_get_string((PurpleBlistNode *)chat, DEST_LANG_SETTING); purple_blist_node_set_string((PurpleBlistNode *)chat, DEST_LANG_SETTING, detected_language); language_name = get_language_name(detected_language); if (language_name != NULL) { message = g_strdup_printf("Now translating to %s (auto-detected)", language_name); purple_conversation_write(convmsg->conv, NULL, message, PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG, time(NULL)); g_free(message); } } html_text = purple_strdup_withhtml(translated_phrase); purple_conversation_write(convmsg->conv, convmsg->sender, html_text, convmsg->flags, time(NULL)); g_free(html_text); g_free(convmsg->sender); g_free(convmsg); }
void SpectrumMUCConversation::handleMessage(AbstractUser *user, const char *who, const char *msg, PurpleMessageFlags flags, time_t mtime, const std::string ¤tBody) { std::string name(who); // // // send message to user // std::string message(purple_unescape_html(msg)); // Message s(Message::Groupchat, user->jid() + m_res, message); // s.setFrom(m_jid + "/" + name); // // Transport::instance()->send( s.tag() ); // Escape HTML characters. char *newline = purple_strdup_withhtml(msg); char *strip, *xhtml; purple_markup_html_to_xhtml(newline, &xhtml, &strip); std::string message(strip); std::string to = user->jid() + m_res; std::cout << user->jid() << " " << m_res << "\n"; Message s(Message::Groupchat, to, message); s.setFrom(m_jid + "/" + name); // <delay xmlns="urn:xmpp:delay" stamp="2010-02-16T15:49:19Z"/> // <x xmlns="jabber:x:delay" stamp="20100216T15:49:19"/> // Delayed messages, we have to count with some delay if ((unsigned long) time(NULL)-10 > (unsigned long) mtime) { char buf[80]; strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%SZ", gmtime(&mtime)); std::string timestamp(buf); DelayedDelivery *d = new DelayedDelivery(m_jid, timestamp); s.addExtension(d); } Tag *stanzaTag = s.tag(); g_free(newline); g_free(xhtml); g_free(strip); // std::string res = getResource(); // if (user->hasFeature(GLOOX_FEATURE_XHTML_IM, res) && m != message) { // Transport::instance()->parser()->getTag("<body>" + m + "</body>", sendXhtmlTag, stanzaTag); // return; // } Transport::instance()->send(stanzaTag); }
static void pb_got_everything(PushBulletAccount *pba, JsonNode *node, gpointer user_data) { JsonObject *rootobj = json_node_get_object(node); JsonArray *devices = json_object_has_member(rootobj, "devices") ? json_object_get_array_member(rootobj, "devices") : NULL; JsonArray *pushes = json_object_has_member(rootobj, "pushes") ? json_object_get_array_member(rootobj, "pushes") : NULL; JsonArray *contacts = json_object_has_member(rootobj, "contacts") ? json_object_get_array_member(rootobj, "contacts") : NULL; JsonArray *chats = json_object_has_member(rootobj, "chats") ? json_object_get_array_member(rootobj, "chats") : NULL; JsonArray *texts = json_object_has_member(rootobj, "texts") ? json_object_get_array_member(rootobj, "texts") : NULL; gint i; guint len; PurpleGroup *pbgroup; pbgroup = purple_find_group("PushBullet"); if (!pbgroup) { pbgroup = purple_group_new("PushBullet"); purple_blist_add_group(pbgroup, NULL); } if (json_object_has_member(rootobj, "error")) { JsonObject *error = json_object_get_object_member(rootobj, "error"); const gchar *type = json_object_get_string_member(error, "type"); const gchar *message = json_object_get_string_member(error, "message"); //TODO check type purple_connection_error_reason(pba->pc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, message); return; } if (devices != NULL) { for(i = 0, len = json_array_get_length(devices); i < len; i++) { JsonObject *device = json_array_get_object_element(devices, i); if (pba->main_sms_device == NULL && json_object_get_boolean_member(device, "has_sms")) { pba->main_sms_device = g_strdup(json_object_get_string_member(device, "iden")); purple_account_set_string(pba->account, "main_sms_device", pba->main_sms_device); pb_get_phonebook(pba, pba->main_sms_device); if (!pba->websocket) { pb_start_polling(pba); } break; //TODO handle more than one } } } if (pushes != NULL) { gint last_message_timestamp = purple_account_get_int(pba->account, "last_message_timestamp", 0); for(i = json_array_get_length(pushes); i > 0; i--) { JsonObject *push = json_array_get_object_element(pushes, i - 1); const gchar *type = json_object_get_string_member(push, "type"); gdouble modified; time_t timestamp; gboolean dismissed; if (!type) continue; modified = json_object_get_double_member(push, "modified"); timestamp = (time_t) modified; dismissed = json_object_get_boolean_member(push, "dismissed"); if (timestamp <= last_message_timestamp || dismissed) { continue; } // {"active":true,"iden":"uffvytgsjApuAUIFRk","created":1.438895081423904e+09,"modified":1.438895081432786e+09,"type":"file","dismissed":false,"guid":"153b70f0-f7a6-4db9-a6f4-28b99fa416f1","direction":"self","sender_iden":"uffvytg","sender_email":"*****@*****.**","sender_email_normalized":"*****@*****.**","sender_name":"Eion Robb","receiver_iden":"uffvytg","receiver_email":"*****@*****.**","receiver_email_normalized":"*****@*****.**","target_device_iden":"uffvytgsjz7O3P0Jl6","source_device_iden":"uffvytgsjAoIRwhIL6","file_name":"IMG_20150807_084618.jpg","file_type":"image/jpeg","file_url":"https://dl.pushbulletusercontent.com/FHOZdyzfvnoYZY0DP6oK1rGKiJpWCPc0/IMG_20150807_084618.jpg","image_width":4128,"image_height":2322,"image_url":"https://lh3.googleusercontent.com/WY5TK7h3mzD32qMcnxtqt-4PrYcWW1uWDHnRW2x1oJK8mnYk2v4HbZrRjIQkiYdxMKQSdNI8GGPqfO6s6tEyuRVLzeA"} if (purple_strequal(type, "note") || purple_strequal(type, "link") || purple_strequal(type, "file")) { const gchar *from = json_object_get_string_member(push, "sender_email_normalized"); const gchar *body = json_object_get_string_member(push, "body"); const gchar *direction = json_object_get_string_member(push, "direction"); gchar *body_html; if (from == NULL) { if (!json_object_has_member(push, "sender_name")) { purple_debug_error("pushbullet", "no sender name/email\n"); continue; } from = json_object_get_string_member(push, "sender_name"); } if (body && *body) { body_html = purple_strdup_withhtml(body); } else { const gchar *title = json_object_get_string_member(push, "title"); if (title && *title) { body_html = purple_strdup_withhtml(title); } else { body_html = "Message"; } } if (json_object_has_member(push, "url")) { gchar *body_with_link = g_strconcat("<a href=\"", json_object_get_string_member(push, "url"), "\">", body_html, "</a>", NULL); g_free(body_html); body_html = body_with_link; } else if (json_object_has_member(push, "image_url")) { const gchar *image_url = json_object_get_string_member(push, "image_url"); PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, from, pba->account); if (conv == NULL) { conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, pba->account, from); } pb_download_image_to_conv(image_url, conv); } else if (json_object_has_member(push, "file_url")) { gchar *body_with_link; const gchar *file_name = json_object_get_string_member(push, "file_name"); if (file_name && *file_name) { g_free(body_html); body_html = purple_strdup_withhtml(file_name); } body_with_link= g_strconcat("<a href=\"", json_object_get_string_member(push, "file_url"), "\">", json_object_get_string_member(push, "file_name"), "</a>", NULL); g_free(body_html); body_html = body_with_link; } if (direction[0] != 'o') { serv_got_im(pba->pc, from, body_html, PURPLE_MESSAGE_RECV, timestamp); } else { const gchar *guid = json_object_get_string_member(push, "guid"); from = json_object_get_string_member(push, "receiver_email_normalized"); if (!guid || !g_hash_table_remove(pba->sent_messages_hash, guid)) { PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, from, pba->account); if (conv == NULL) { conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, pba->account, from); } purple_conversation_write(conv, from, body_html, PURPLE_MESSAGE_SEND, timestamp); } } g_free(body_html); } purple_account_set_int(pba->account, "last_message_timestamp", MAX(purple_account_get_int(pba->account, "last_message_timestamp", 0), timestamp)); } } if (contacts != NULL) { for(i = 0, len = json_array_get_length(contacts); i < len; i++) { JsonObject *contact = json_array_get_object_element(contacts, i); const gchar *email = json_object_get_string_member(contact, "email_normalized"); const gchar *name = json_object_get_string_member(contact, "name"); const gchar *image_url = json_object_get_string_member(contact, "image_url"); PurpleBuddy *buddy = purple_find_buddy(pba->account, email); if (buddy == NULL) { buddy = purple_buddy_new(pba->account, email, name); purple_blist_add_buddy(buddy, NULL, pbgroup, NULL); } purple_prpl_got_user_status(pba->account, email, purple_primitive_get_id_from_type(PURPLE_STATUS_AVAILABLE), NULL); } } if (chats != NULL) { for(i = 0, len = json_array_get_length(chats); i < len; i++) { JsonObject *chat = json_array_get_object_element(chats, i); JsonObject *contact = json_object_get_object_member(chat, "with"); const gchar *email = json_object_get_string_member(contact, "email_normalized"); const gchar *name = json_object_get_string_member(contact, "name"); const gchar *image_url = json_object_get_string_member(contact, "image_url"); PurpleBuddy *buddy = purple_find_buddy(pba->account, email); if (buddy == NULL) { buddy = purple_buddy_new(pba->account, email, name); purple_blist_add_buddy(buddy, NULL, pbgroup, NULL); } purple_prpl_got_user_status(pba->account, email, purple_primitive_get_id_from_type(PURPLE_STATUS_AVAILABLE), NULL); } } if (texts != NULL) { for(i = 0, len = json_array_get_length(texts); i < len; i++) { JsonObject *text = json_array_get_object_element(texts, i); } } }
static void pb_got_phone_thread(PushBulletAccount *pba, JsonNode *node, gpointer user_data) { PurpleAccount *account = pba->account; PurpleConnection *pc = pba->pc; JsonObject *rootobj = json_node_get_object(node); JsonObject *data = json_object_get_object_member(rootobj, "data"); JsonArray *thread = json_object_get_array_member(data, "thread"); gint i; guint len; gchar *from = user_data; PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, from, account); gint purple_last_message_timestamp = purple_account_get_int(account, "last_message_timestamp", 0); gint newest_phone_message_id = purple_account_get_int(account, "newest_phone_message_id", 0); /* {"id":"652","type":"sms","timestamp":1440484608,"direction":"outgoing","body":"message","status":"sent"}, {"id":"5","type":"mms","timestamp":1440484096,"direction":"incoming","recipient_index":0,"body":"","image_urls":["url1234"]} */ for(i = json_array_get_length(thread); i > 0; i--) { JsonObject *message = json_array_get_object_element(thread, i - 1); gint64 timestamp = json_object_get_int_member(message, "timestamp"); const gchar *direction = json_object_get_string_member(message, "direction"); const gchar *body = json_object_get_string_member(message, "body"); gint id = atoi(json_object_get_string_member(message, "id")); if (timestamp > purple_last_message_timestamp || id > newest_phone_message_id) { gchar *body_html = purple_strdup_withhtml(body); if (direction[0] != 'o') { serv_got_im(pc, from, body_html, PURPLE_MESSAGE_RECV, timestamp); } else { const gchar *guid = json_object_get_string_member(message, "guid"); if (!guid || !g_hash_table_remove(pba->sent_messages_hash, guid)) { if (conv == NULL) { conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, from); } purple_conversation_write(conv, from, body_html, PURPLE_MESSAGE_SEND, timestamp); } } g_free(body_html); if (json_object_has_member(message, "image_urls")) { JsonArray *image_urls = json_object_get_array_member(message, "image_urls"); guint j, image_urls_len; if (conv == NULL) { conv = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, from); } for(j = 0, image_urls_len = json_array_get_length(image_urls); j < image_urls_len; j++) { const gchar *image_url = json_array_get_string_element(thread, j); pb_download_image_to_conv(image_url, conv); } } purple_account_set_int(account, "last_message_timestamp", MAX(purple_account_get_int(account, "last_message_timestamp", 0), timestamp)); purple_account_set_int(account, "newest_phone_message_id", MAX(purple_account_get_int(account, "newest_phone_message_id", 0), id)); } } g_free(from); }
void SpectrumConversation::handleMessage(AbstractUser *user, const char *who, const char *msg, PurpleMessageFlags flags, time_t mtime, const std::string ¤tBody) { std::string name(who); // Remove resource if it's XMPP JID size_t pos = name.find("/"); if (pos != std::string::npos) name.erase((int) pos, name.length() - (int) pos); AbstractSpectrumBuddy *s_buddy = NULL; #ifndef TESTS User *u = (User *) user; s_buddy = u->getRosterItem(name); #endif if (s_buddy && s_buddy->getFlags() & SPECTRUM_BUDDY_JID_ESCAPING) name = JID::escapeNode(name); else if (s_buddy) std::for_each( name.begin(), name.end(), replaceBadJidCharacters() ); // OK else if (m_room.empty()) name = JID::escapeNode(name); // Escape HTML characters. char *newline = purple_strdup_withhtml(msg); char *strip, *xhtml, *xhtml_linkified; purple_markup_html_to_xhtml(newline, &xhtml, &strip); xhtml_linkified = purple_markup_linkify(xhtml); std::string message(strip); std::string m(xhtml_linkified); g_free(newline); g_free(xhtml); g_free(xhtml_linkified); g_free(strip); std::string to; if (getResource().empty()) to = user->jid(); else to = user->jid() + "/" + getResource(); if (flags & PURPLE_MESSAGE_ERROR) { Message s(Message::Error, to, currentBody); if (!m_room.empty()) s.setFrom(m_room + "/" + name); else { std::transform(name.begin(), name.end(), name.begin(),(int(*)(int)) std::tolower); s.setFrom(name + std::string(getType() == SPECTRUM_CONV_CHAT ? "" : ("%" + JID(user->username()).server())) + "@" + Transport::instance()->jid() + "/bot"); } Error *c = new Error(StanzaErrorTypeModify, StanzaErrorNotAcceptable); c->setText(tr(user->getLang(), message)); s.addExtension(c); Transport::instance()->send(s.tag()); return; } Message s(Message::Chat, to, message); if (!m_room.empty()) s.setFrom(m_room + "/" + name); else { std::transform(name.begin(), name.end(), name.begin(),(int(*)(int)) std::tolower); s.setFrom(name + std::string(getType() == SPECTRUM_CONV_CHAT ? "" : ("%" + JID(user->username()).server())) + "@" + Transport::instance()->jid() + "/bot"); } // chatstates if (purple_value_get_boolean(user->getSetting("enable_chatstate"))) { if (user->hasFeature(GLOOX_FEATURE_CHATSTATES, getResource())) { ChatState *c = new ChatState(ChatStateActive); s.addExtension(c); } } // Delayed messages, we have to count with some delay if (mtime && (unsigned long) time(NULL)-10 > (unsigned long) mtime/* && (unsigned long) time(NULL) - 31536000 < (unsigned long) mtime*/) { char buf[80]; strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%SZ", gmtime(&mtime)); std::string timestamp(buf); DelayedDelivery *d = new DelayedDelivery(name + "@" + Transport::instance()->jid() + "/bot", timestamp); s.addExtension(d); } Tag *stanzaTag = s.tag(); std::string res = getResource(); if (user->hasFeature(GLOOX_FEATURE_XHTML_IM, res) && m != message) { if (m.find("<body") != 0) { m = "<body>" + m + "</body>"; } Transport::instance()->parser()->getTag(m, sendXhtmlTag, stanzaTag); return; } Transport::instance()->send(stanzaTag); }