/* merge this with the function below when we get everyone on the same page wrt /commands */ void jabber_chat_change_topic(JabberChat *chat, const char *topic) { if(topic && *topic) { JabberMessage *jm; jm = g_new0(JabberMessage, 1); jm->js = chat->js; jm->type = JABBER_MESSAGE_GROUPCHAT; jm->subject = purple_markup_strip_html(topic); jm->to = g_strdup_printf("%s@%s", chat->room, chat->server); jabber_message_send(jm); jabber_message_free(jm); } else { const char *cur = purple_conv_chat_get_topic(PURPLE_CONV_CHAT(chat->conv)); char *buf, *tmp, *tmp2; if(cur) { tmp = g_markup_escape_text(cur, -1); tmp2 = purple_markup_linkify(tmp); buf = g_strdup_printf(_("current topic is: %s"), tmp2); g_free(tmp); g_free(tmp2); } else buf = g_strdup(_("No topic is set")); purple_conv_chat_write(PURPLE_CONV_CHAT(chat->conv), "", buf, PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG, time(NULL)); g_free(buf); } }
void irc_msg_topic(struct irc_conn *irc, const char *name, const char *from, char **args) { char *chan, *topic, *msg, *nick, *tmp, *tmp2; PurpleConversation *convo; if (!strcmp(name, "topic")) { chan = args[0]; topic = irc_mirc2txt (args[1]); } else { chan = args[1]; topic = irc_mirc2txt (args[2]); } convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, chan, irc->account); if (!convo) { purple_debug(PURPLE_DEBUG_ERROR, "irc", "Got a topic for %s, which doesn't exist\n", chan); g_free(topic); return; } /* If this is an interactive update, print it out */ tmp = g_markup_escape_text(topic, -1); tmp2 = purple_markup_linkify(tmp); g_free(tmp); if (!strcmp(name, "topic")) { const char *current_topic = purple_conv_chat_get_topic(PURPLE_CONV_CHAT(convo)); if (!(current_topic != NULL && strcmp(tmp2, current_topic) == 0)) { char *nick_esc; nick = irc_mask_nick(from); nick_esc = g_markup_escape_text(nick, -1); purple_conv_chat_set_topic(PURPLE_CONV_CHAT(convo), nick, topic); if (*tmp2) msg = g_strdup_printf(_("%s has changed the topic to: %s"), nick_esc, tmp2); else msg = g_strdup_printf(_("%s has cleared the topic."), nick_esc); g_free(nick_esc); g_free(nick); purple_conv_chat_write(PURPLE_CONV_CHAT(convo), from, msg, PURPLE_MESSAGE_SYSTEM, time(NULL)); g_free(msg); } } else { char *chan_esc = g_markup_escape_text(chan, -1); msg = g_strdup_printf(_("The topic for %s is: %s"), chan_esc, tmp2); g_free(chan_esc); purple_conv_chat_set_topic(PURPLE_CONV_CHAT(convo), NULL, topic); purple_conv_chat_write(PURPLE_CONV_CHAT(convo), "", msg, PURPLE_MESSAGE_SYSTEM, time(NULL)); g_free(msg); } g_free(tmp2); g_free(topic); }
/** * A function to send a chat or im message to the specific conversation * without emitting "sending-im" or "sending-chat" signal, which would * cause an infinite loop for this plugin. * * taken from conversation.c with signal emission removed. */ static void splitter_common_send(PurpleConversation *conv, const char *message, PurpleMessageFlags msgflags) { PurpleConversationType type; PurpleAccount *account; PurpleConnection *gc; char *sent = NULL; if (strlen(message) == 0) return; account = purple_conversation_get_account(conv); #if PURPLE_VERSION_CHECK(3,0,0) gc = purple_conversation_get_connection(conv); #else gc = purple_conversation_get_gc(conv); #endif g_return_if_fail(account != NULL); g_return_if_fail(gc != NULL); type = purple_conversation_get_type(conv); if ((purple_conversation_get_features(conv) & PURPLE_CONNECTION_HTML) && !(msgflags & PURPLE_MESSAGE_RAW)) { sent = purple_markup_linkify(message); } else sent = g_strdup(message); msgflags |= PURPLE_MESSAGE_SEND; splitter_injected_message = TRUE; if (type == PURPLE_CONV_TYPE_IM) { if (sent != NULL && sent[0] != '\0') purple_conv_im_send_with_flags(PURPLE_CONV_IM(conv), sent, msgflags); } else { if (sent != NULL && sent[0] != '\0') purple_conv_chat_send_with_flags(PURPLE_CONV_CHAT(conv), sent, msgflags); } splitter_injected_message = FALSE; g_free(sent); }
static PurpleCmdRet skypeweb_cmd_topic(PurpleConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *data) { PurpleConnection *pc = NULL; PurpleChatConversation *chat; int id = -1; pc = purple_conversation_get_connection(conv); chat = PURPLE_CHAT_CONVERSATION(conv); id = purple_chat_conversation_get_id(chat); if (pc == NULL || id == -1) return PURPLE_CMD_RET_FAILED; if (!args || !args[0]) { gchar *buf; const gchar *topic = purple_chat_conversation_get_topic(chat); if (topic) { gchar *tmp, *tmp2; tmp = g_markup_escape_text(topic, -1); tmp2 = purple_markup_linkify(tmp); buf = g_strdup_printf(_("current topic is: %s"), tmp2); g_free(tmp); g_free(tmp2); } else { buf = g_strdup(_("No topic is set")); } purple_conv_chat_write(chat, NULL, buf, PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LOG, time(NULL)); g_free(buf); return PURPLE_CMD_RET_OK; } skypeweb_chat_set_topic(pc, id, args ? args[0] : NULL); return PURPLE_CMD_RET_OK; }
static void * pidgin_notify_userinfo(PurpleConnection *gc, const char *who, PurpleNotifyUserInfo *user_info) { char *info; void *ui_handle; char *key = userinfo_hash(purple_connection_get_account(gc), who); PidginUserInfo *pinfo = NULL; if (!userinfo) { userinfo = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); } info = purple_notify_user_info_get_text_with_newline(user_info, "<br />"); pinfo = g_hash_table_lookup(userinfo, key); if (pinfo != NULL) { GtkIMHtml *imhtml = g_object_get_data(G_OBJECT(pinfo->window), "info-widget"); char *linked_text = purple_markup_linkify(info); gtk_imhtml_clear(imhtml); gtk_imhtml_append_text(imhtml, linked_text, notify_imhtml_options()); g_free(linked_text); g_free(key); ui_handle = pinfo->window; pinfo->count++; } else { char *primary = g_strdup_printf(_("Info for %s"), who); ui_handle = pidgin_notify_formatted(_("Buddy Information"), primary, NULL, info); g_signal_handlers_disconnect_by_func(G_OBJECT(ui_handle), G_CALLBACK(formatted_close_cb), NULL); g_signal_connect(G_OBJECT(ui_handle), "destroy", G_CALLBACK(remove_userinfo), key); g_free(primary); pinfo = g_new0(PidginUserInfo, 1); pinfo->window = ui_handle; pinfo->count = 1; g_hash_table_insert(userinfo, key, pinfo); } g_free(info); return ui_handle; }
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); }
static void * pidgin_notify_formatted(const char *title, const char *primary, const char *secondary, const char *text) { GtkWidget *window; GtkWidget *vbox; GtkWidget *label; GtkWidget *button; GtkWidget *imhtml; GtkWidget *frame; char label_text[2048]; char *linked_text, *primary_esc, *secondary_esc; window = gtk_dialog_new(); gtk_window_set_title(GTK_WINDOW(window), title); gtk_container_set_border_width(GTK_CONTAINER(window), PIDGIN_HIG_BORDER); gtk_window_set_resizable(GTK_WINDOW(window), TRUE); g_signal_connect(G_OBJECT(window), "delete_event", G_CALLBACK(formatted_close_cb), NULL); /* Setup the main vbox */ vbox = GTK_DIALOG(window)->vbox; /* Setup the descriptive label */ primary_esc = g_markup_escape_text(primary, -1); secondary_esc = (secondary != NULL) ? g_markup_escape_text(secondary, -1) : NULL; g_snprintf(label_text, sizeof(label_text), "<span weight=\"bold\" size=\"larger\">%s</span>%s%s", primary_esc, (secondary ? "\n" : ""), (secondary ? secondary_esc : "")); g_free(primary_esc); g_free(secondary_esc); label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), label_text); gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment(GTK_MISC(label), 0, 0); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); gtk_widget_show(label); /* Add the imhtml */ frame = pidgin_create_imhtml(FALSE, &imhtml, NULL, NULL); gtk_widget_set_name(imhtml, "pidgin_notify_imhtml"); gtk_imhtml_set_format_functions(GTK_IMHTML(imhtml), gtk_imhtml_get_format_functions(GTK_IMHTML(imhtml)) | GTK_IMHTML_IMAGE); gtk_widget_set_size_request(imhtml, 300, 250); gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0); gtk_widget_show(frame); /* Add the Close button. */ button = gtk_dialog_add_button(GTK_DIALOG(window), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE); gtk_widget_grab_focus(button); g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK(formatted_close_cb), window); g_signal_connect(G_OBJECT(window), "key_press_event", G_CALLBACK(formatted_input_cb), NULL); /* Make sure URLs are clickable */ linked_text = purple_markup_linkify(text); gtk_imhtml_append_text(GTK_IMHTML(imhtml), linked_text, notify_imhtml_options()); g_free(linked_text); g_object_set_data(G_OBJECT(window), "info-widget", imhtml); /* Show the window */ pidgin_auto_parent_window(window); gtk_widget_show(window); return window; }