Example #1
0
static void
test_cb(GntWidget *button, gpointer null)
{
	PurpleSoundEventID id = GPOINTER_TO_INT(gnt_tree_get_selection_data(GNT_TREE(pref_dialog->events)));
	FinchSoundEvent * event = &sounds[id];
	char *enabled, *file, *tmpfile, *volpref;
	gboolean temp_value;
	int volume;

	enabled = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/enabled/%s",
			finch_sound_get_active_profile(), event->pref);
	file = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/file/%s",
			finch_sound_get_active_profile(), event->pref);
	volpref = g_strdup(make_pref("/volume"));

	temp_value = purple_prefs_get_bool(enabled);
	tmpfile = g_strdup(purple_prefs_get_path(file));
	volume = purple_prefs_get_int(volpref);

	purple_prefs_set_path(file, event->file);
	if (!temp_value) purple_prefs_set_bool(enabled, TRUE);
	purple_prefs_set_int(volpref, gnt_slider_get_value(GNT_SLIDER(pref_dialog->volume)));

	purple_sound_play_event(id, NULL);

	if (!temp_value) purple_prefs_set_bool(enabled, FALSE);
	purple_prefs_set_path(file, tmpfile);
	purple_prefs_set_int(volpref, volume);

	g_free(enabled);
	g_free(file);
	g_free(tmpfile);
	g_free(volpref);
}
Example #2
0
static void blist_save_state() {
	if(blist_ab) {
		if(purple_prefs_get_bool(PREF_DBLIST_DOCKABLE) && blist_ab->docked) {
			purple_prefs_set_int(PREF_DBLIST_HEIGHT, blist_ab->undocked_height);
			purple_prefs_set_int(PREF_DBLIST_SIDE, blist_ab->side);
			purple_prefs_set_bool(PREF_DBLIST_DOCKED, blist_ab->docked);
		} else
			purple_prefs_set_bool(PREF_DBLIST_DOCKED, FALSE);
	}
}
Example #3
0
void
otrg_prefs_global_save(gboolean enabled, gboolean automatic,
	gboolean onlyprivate, gboolean avoidloggingotr)
{
	if (!purple_prefs_exists("/OTR"))
		purple_prefs_add_none("/OTR");

	purple_prefs_set_bool("/OTR/enabled", enabled);
	purple_prefs_set_bool("/OTR/automatic", automatic);
	purple_prefs_set_bool("/OTR/onlyprivate", onlyprivate);
	purple_prefs_set_bool("/OTR/avoidloggingotr", avoidloggingotr);

	otrg_dialog_resensitize_all();
}
Example #4
0
static VALUE init(int argc, VALUE* argv, VALUE self)
{
  VALUE debug, path;
  const char *prefs_path = NULL;
  
  if( rb_cv_get( self, "@@prefs_path" ) != Qnil ) {
    prefs_path = RSTRING_PTR( rb_cv_get( self, "@@prefs_path" ) );
  }
  
  rb_scan_args(argc, argv, "02", &debug, &path);

  signal(SIGCHLD, SIG_IGN);
  signal(SIGPIPE, SIG_IGN);
  signal(SIGINT, sighandler);
  signal(SIGQUIT, sighandler);
  signal(SIGTERM, sighandler);

  data_hash_table = g_hash_table_new(NULL, NULL);
  fd_hash_table = g_hash_table_new(NULL, NULL);

  purple_debug_set_enabled((NIL_P(debug) || debug == Qfalse) ? FALSE : TRUE);

  if (!NIL_P(path)) {
    Check_Type(path, T_STRING);   
		purple_util_set_user_dir(RSTRING_PTR(path));
	}

  purple_core_set_ui_ops(&core_uiops);
  purple_eventloop_set_ui_ops(&glib_eventloops);
  
  if (!purple_core_init(UI_ID)) {
		rb_raise(rb_eRuntimeError, "libpurple initialization failed");
	}
  
  purple_util_set_user_dir( (const char *) prefs_path );
  
  /* Create and load the buddylist. */
  purple_set_blist(purple_blist_new());
  purple_blist_load();
  
  /* Load the preferences. */
  purple_prefs_load();
  purple_prefs_set_bool( "/purple/logging/log_ims", FALSE );
  purple_prefs_set_bool( "/purple/logging/log_chats", FALSE );

  /* Load the pounces. */
  purple_pounces_load();

  return Qnil;
}
static
void cb_custom_toggled(GtkCellRendererToggle *cell, char *path, gpointer data)
{
	GtkTreeIter iter;
	GtkTreeModel *model = (GtkTreeModel*) data;
	if (gtk_tree_model_get_iter_from_string(model, &iter, path)) {
                PurpleAccount *account;
                GValue value;
                memset(&value, 0, sizeof(value));
                gtk_tree_model_get_value(model, &iter, 5, &value);
                assert(G_VALUE_HOLDS_POINTER(&value));
                account = g_value_get_pointer(&value);
                g_value_unset(&value);

		gboolean flag;
		char pref[STRLEN];

		build_pref(pref, PREF_CUSTOM_DISABLED, purple_account_get_username(account), purple_account_get_protocol_name(account));

		memset(&value, 0, sizeof(value));
		gtk_tree_model_get_value(model, &iter, 3, &value);
		assert(G_VALUE_HOLDS_BOOLEAN(&value));
		flag = !g_value_get_boolean(&value);
		g_value_unset(&value);

		gtk_list_store_set(GTK_LIST_STORE(model), &iter, 3, flag, -1);
		purple_prefs_set_bool(pref, flag);
		if (flag) {
			set_status(account, "", 0);
		}
	}
}
static gboolean plugin_load(PurplePlugin *plugin)
{
	void *conv_handle;
	PurpleConversationUiOps *ui_ops;
	
	purple_prefs_set_bool(PURPLE_NICKCHANGE_PREF, FALSE);

	userstable = g_hash_table_new_full((GHashFunc)joinpart_key_hash,
	                              (GEqualFunc)joinpart_key_equal,
	                              (GDestroyNotify)joinpart_key_destroy,
	                              g_free);

	conv_handle = purple_conversations_get_handle();
	//purple_signal_connect(conv_handle, "chat-buddy-joining", plugin, PURPLE_CALLBACK(chat_buddy_joining_cb), userstable);
	//purple_signal_connect(conv_handle, "chat-buddy-leaving", plugin, PURPLE_CALLBACK(chat_buddy_leaving_cb), userstable);
	purple_signal_connect(conv_handle, "received-chat-msg", plugin, PURPLE_CALLBACK(received_chat_msg_cb), userstable);

	//purple_prefs_connect_callback(plugin, const char *name, PurplePrefCallback cb, gpointer data)
	
	//Attempt overriding the global UI ops
	ui_ops = pidgin_conversations_get_conv_ui_ops();
	
	/* Cleanup every 5 minutes */
	clean_user_timeout = purple_timeout_add_seconds(60 * 5, (GSourceFunc)clean_users_hash, userstable);
	
	if (ui_ops) {
		orig_chat_rename_user = ui_ops->chat_rename_user;
		ui_ops->chat_rename_user = nickchange_chat_rename_user;
	} else {
		//TODO make it work for !Pidgin too
		return FALSE;
	}

	return TRUE;
}
Example #7
0
static gboolean
plugin_unload(PurplePlugin *plugin, GError **error)
{
	purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/webview/inspector_enabled", FALSE);

	return TRUE;
}
Example #8
0
static void
toggle_keep_open_cb(GtkWidget *w, PidginXferDialog *dialog)
{
	dialog->keep_open = !dialog->keep_open;
	purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/filetransfer/keep_open",
						dialog->keep_open);
}
Example #9
0
static void
toggle_clear_finished_cb(GtkWidget *w, PidginXferDialog *dialog)
{
	dialog->auto_clear = !dialog->auto_clear;
	purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/filetransfer/clear_finished",
						dialog->auto_clear);
}
Example #10
0
/**************************************************************************
 * Callbacks
 **************************************************************************/
static void
toggle_keep_open_cb(GntWidget *w)
{
	xfer_dialog->keep_open = !xfer_dialog->keep_open;
	purple_prefs_set_bool("/finch/filetransfer/keep_open",
						xfer_dialog->keep_open);
}
Example #11
0
static void
alert_config_cb(GtkWidget *widget, gpointer data)
{
	gboolean on = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
	purple_prefs_set_bool("/plugins/gtk/unity/alert_chat_nick", on);
	alert_chat_nick = on;
}
Example #12
0
static void
pref_update(GtkWidget *widget, char *pref)
{
	if (purple_prefs_get_type(pref) == PURPLE_PREF_INT)
		purple_prefs_set_int(pref, gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget)));
	if (purple_prefs_get_type(pref) == PURPLE_PREF_BOOLEAN)
		purple_prefs_set_bool(pref, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
}
Example #13
0
void
action_toggle_status(PurplePluginAction *action)
{
	gboolean flag = !purple_prefs_get_bool("/plugins/core/musictracker/bool_disabled");
	purple_prefs_set_bool("/plugins/core/musictracker/bool_disabled", flag);
	if (flag)
		set_userstatus_for_active_accounts("", 0);
}
static
void cb_filter_toggled(GtkToggleButton *button, gpointer data)
{
	gboolean state = gtk_toggle_button_get_active(button);
	purple_prefs_set_bool(PREF_FILTER_ENABLE, state);
	gtk_widget_set_sensitive(filter_list, state);
	gtk_widget_set_sensitive(filter_mask, state);
}
Example #15
0
static void set_blist_trans(GtkWidget *w, const char *pref) {
	gboolean enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w));
	purple_prefs_set_bool(pref, enabled);
	if (blist) {
		set_wintrans(blist, purple_prefs_get_int(OPT_WINTRANS_BL_ALPHA),
			purple_prefs_get_bool(OPT_WINTRANS_BL_ENABLED),
			purple_prefs_get_bool(OPT_WINTRANS_IM_ONTOP));
	}
}
Example #16
0
/* Save the global OTR UI options */
static void otrg_gtk_ui_global_options_save(gboolean showotrbutton)
{
    if (! purple_prefs_exists("/OTR")) {
	purple_prefs_add_none("/OTR");
    }
    if (! purple_prefs_exists("/OTR/showotrbutton")) {
	purple_prefs_add_bool("/OTR/showotrbutton", showotrbutton);
    }
    purple_prefs_set_bool("/OTR/showotrbutton", showotrbutton);
}
/* General callbacks from main preferences */
static void logstats_response_cb (GtkDialog *dialog, gint id, 
  GtkWidget *widget) 
{
  purple_prefs_set_bool (
    "/plugins/gtk/autoprofile/components/logstat/enabled", TRUE);
  logstats_load (NULL);
  gtk_widget_set_sensitive (widget, TRUE);

  gtk_widget_destroy (GTK_WIDGET(dialog));
}
Example #18
0
xmlnode * _h_elim_set_prefs ( const char *name ,
                              const char *id   ,
                              SEXP_VALUE *args ,
                              gpointer    data )
{
    ASSERT_ALISTP( args, id, name );
    elim_ping();
    xmlnode    *rval  = xnode_new( "alist" );
    xmlnode    *set   = xnode_new( "alist" );
    GHashTable *prefs = ALIST_VAL_ALIST( args, "prefs" );
    SEXP_VALUE *PREFS = ALIST_VAL      ( args, "prefs" );

    AL_NODE( rval, "prefs", set );

    fprintf( stderr, "hash: %p; sexp: %p\n", prefs, PREFS );

    if( prefs )
    {
        GList *key  = NULL;
        GList *keys = g_hash_table_get_keys( prefs );

        fprintf( stderr, "keys: %p", keys );

        for( key = keys; key; key = key->next )
        {
            gboolean        done = TRUE;
            const char     *pref = key->data;
            PurplePrefType  type = purple_prefs_get_type( pref );
            switch( type )
            {
            case PURPLE_PREF_BOOLEAN:
                purple_prefs_set_bool  ( pref, ALIST_VAL_BOOL( PREFS, pref ) );
                break;
            case PURPLE_PREF_INT:
                purple_prefs_set_int   ( pref, ALIST_VAL_INT ( PREFS, pref ) );
                break;
            case PURPLE_PREF_STRING:
                purple_prefs_set_string( pref, ALIST_VAL_STR ( PREFS, pref ) );
                break;
            case PURPLE_PREF_PATH:
                purple_prefs_set_path  ( pref, ALIST_VAL_STR ( PREFS, pref ) );
                break;
            default:
                done = FALSE;
            }

            AL_BOOL( set, pref, done );
        }

        g_list_free( keys );
    }

    sexp_val_free( args );
    return response_value( 0, id, name, rval );
}
Example #19
0
static void
type_toggle_cb(GtkWidget *widget, gpointer data)
{
	gboolean on = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
	gchar pref[256];

	g_snprintf(pref, sizeof(pref), "/plugins/gtk/X11/notify/%s",
	           (char *)data);

	purple_prefs_set_bool(pref, on);
}
Example #20
0
void IM::setVoicedBuddies(bool enabled)
{
	if(hasVoicedBuddies() != enabled)
	{
		map<string, Account> accs = getAccountsList();

		purple_prefs_set_bool("/minbif/voiced_buddies", enabled);
		for(map<string, Account>::iterator it = accs.begin(); it != accs.end(); ++it)
			it->second.updatedAllBuddies();

	}
}
Example #21
0
static void
save_cb(GntWidget *button, gpointer win)
{
	GList * itr;

	purple_prefs_set_string(make_pref("/method"), gnt_combo_box_get_selected_data(GNT_COMBO_BOX(pref_dialog->method)));
	purple_prefs_set_path(make_pref("/command"), gnt_entry_get_text(GNT_ENTRY(pref_dialog->command)));
	purple_prefs_set_bool(make_pref("/conv_focus"), gnt_check_box_get_checked(GNT_CHECK_BOX(pref_dialog->conv_focus)));
	purple_prefs_set_int("/purple/sound/while_status", GPOINTER_TO_INT(gnt_combo_box_get_selected_data(GNT_COMBO_BOX(pref_dialog->while_status))));

	for (itr = gnt_tree_get_rows(GNT_TREE(pref_dialog->events)); itr; itr = itr->next) {
		FinchSoundEvent * event = &sounds[GPOINTER_TO_INT(itr->data)];
		char * filepref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/file/%s", finch_sound_get_active_profile(), event->pref);
		char * boolpref = g_strdup_printf(FINCH_PREFS_ROOT "/sound/profiles/%s/enabled/%s", finch_sound_get_active_profile(), event->pref);
		purple_prefs_set_bool(boolpref, gnt_tree_get_choice(GNT_TREE(pref_dialog->events), itr->data));
		purple_prefs_set_path(filepref, event->file ? event->file : "");
		g_free(filepref);
		g_free(boolpref);
	}
	gnt_widget_destroy(GNT_WIDGET(win));
}
Example #22
0
void finch_request_save_in_prefs(gpointer null, PurpleRequestFields *allfields)
{
	GList *list;
	for (list = purple_request_fields_get_groups(allfields); list; list = list->next) {
		PurpleRequestFieldGroup *group = list->data;
		GList *fields = purple_request_field_group_get_fields(group);
		
		for (; fields ; fields = fields->next) {
			PurpleRequestField *field = fields->data;
			PurpleRequestFieldType type = purple_request_field_get_type(field);
			PurplePrefType pt;
			gpointer val = NULL;
			const char *id = purple_request_field_get_id(field);

			switch (type) {
				case PURPLE_REQUEST_FIELD_LIST:
					val = purple_request_field_list_get_selected(field)->data;
					break;
				case PURPLE_REQUEST_FIELD_BOOLEAN:
					val = GINT_TO_POINTER(purple_request_field_bool_get_value(field));
					break;
				case PURPLE_REQUEST_FIELD_INTEGER:
					val = GINT_TO_POINTER(purple_request_field_int_get_value(field));
					break;
				case PURPLE_REQUEST_FIELD_STRING:
					val = (gpointer)purple_request_field_string_get_value(field);
					break;
				default:
					break;
			}

			pt = purple_prefs_get_type(id);
			switch (pt) {
				case PURPLE_PREF_INT:
				{
					long int tmp = GPOINTER_TO_INT(val);
					if (type == PURPLE_REQUEST_FIELD_LIST) /* Lists always return string */
						sscanf(val, "%ld", &tmp);
					purple_prefs_set_int(id, (gint)tmp);
					break;
				}
				case PURPLE_PREF_BOOLEAN:
					purple_prefs_set_bool(id, GPOINTER_TO_INT(val));
					break;
				case PURPLE_PREF_STRING:
					purple_prefs_set_string(id, val);
					break;
				default:
					break;
			}
		}
	}
}
Example #23
0
static void
toggle_clear_finished_cb(GntWidget *w)
{
	xfer_dialog->auto_clear = !xfer_dialog->auto_clear;
	purple_prefs_set_bool("/finch/filetransfer/clear_finished",
						xfer_dialog->auto_clear);
	if (xfer_dialog->auto_clear) {
		GList *iter = purple_xfers_get_all();
		while (iter) {
			PurpleXfer *xfer = iter->data;
			iter = iter->next;
			if (purple_xfer_is_completed(xfer) || purple_xfer_is_canceled(xfer))
			finch_xfer_dialog_remove_xfer(xfer);
		}
	}
}
Example #24
0
static void update_convs_wintrans(GtkWidget *toggle_btn, const char *pref) {
	purple_prefs_set_bool(pref, gtk_toggle_button_get_active(
		GTK_TOGGLE_BUTTON(toggle_btn)));

	if (purple_prefs_get_bool(OPT_WINTRANS_IM_ENABLED)) {
		GList *wins;

		for (wins = pidgin_conv_windows_get_list(); wins; wins = wins->next) {
			PidginWindow *win = wins->data;
			set_conv_window_trans(NULL, win);
		}

		if (!purple_prefs_get_bool(OPT_WINTRANS_IM_SLIDER))
			remove_sliders();
	}
	else
		remove_convs_wintrans(FALSE);
}
Example #25
0
void
purple_prefs_rename_boolean_toggle(const char *oldname, const char *newname)
{
		struct purple_pref *oldpref, *newpref;

		oldpref = find_pref(oldname);

		/* it's already been renamed, call off the cats */
		if(!oldpref)
			return;

		if (oldpref->type != PURPLE_PREF_BOOLEAN)
		{
			purple_debug_error("prefs", "Unable to rename %s to %s: old pref not a boolean\n", oldname, newname);
			return;
		}

		if (oldpref->first_child != NULL) /* can't rename parents */
		{
			purple_debug_error("prefs", "Unable to rename %s to %s: can't rename parents\n", oldname, newname);
			return;
		}


		newpref = find_pref(newname);

		if (newpref == NULL)
		{
			purple_debug_error("prefs", "Unable to rename %s to %s: new pref not created\n", oldname, newname);
			return;
		}

		if (oldpref->type != newpref->type)
		{
			purple_debug_error("prefs", "Unable to rename %s to %s: differing types\n", oldname, newname);
			return;
		}

		purple_debug_info("prefs", "Renaming and toggling %s to %s\n", oldname, newname);
		purple_prefs_set_bool(newname, !(oldpref->value.boolean));

		remove_pref(oldpref);
}
static gboolean plugin_unload(PurplePlugin *plugin)
{
	PurpleConversationUiOps *ui_ops;
	
	purple_prefs_set_bool(PURPLE_NICKCHANGE_PREF, TRUE);

	/* Destroy the hash table. The core plugin code will
	 * disconnect the signals, and since Purple is single-threaded,
	 * we don't have to worry one will be called after this. */
	g_hash_table_destroy(userstable);

	purple_timeout_remove(clean_user_timeout);
	
	if (orig_chat_rename_user) {
		ui_ops = pidgin_conversations_get_conv_ui_ops();
		ui_ops->chat_rename_user = orig_chat_rename_user;
	}
	
	return TRUE;
}
Example #27
0
static void
method_toggle_cb(GtkWidget *widget, gpointer data)
{
	gboolean on = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
	gchar pref[256];

	g_snprintf(pref, sizeof(pref), "/plugins/gtk/X11/notify/%s",
	           (char *)data);

	purple_prefs_set_bool(pref, on);

	if (!strcmp(data, "method_string")) {
		GtkWidget *entry = g_object_get_data(G_OBJECT(widget), "title-entry");
		gtk_widget_set_sensitive(entry, on);

		purple_prefs_set_string("/plugins/gtk/X11/notify/title_string",
		                      gtk_entry_get_text(GTK_ENTRY(entry)));
	}

	apply_method();
}
static void toggle_enable (GtkButton *button, gpointer data)
{
  GtkWidget *popup, *vbox, *label;
  vbox = data;

  if (purple_prefs_get_bool (
    "/plugins/gtk/autoprofile/components/logstat/enabled")) {
    logstats_unload (NULL);
    purple_prefs_set_bool (
      "/plugins/gtk/autoprofile/components/logstat/enabled", FALSE);
    gtk_widget_set_sensitive (vbox, FALSE);
  } else {
    popup = gtk_dialog_new_with_buttons (
      "Enable stats for logs", NULL, 0,
      GTK_STOCK_OK, 42, NULL);
    g_signal_connect (G_OBJECT(popup), "response",
      G_CALLBACK(logstats_response_cb), vbox);

    label = gtk_label_new(NULL);
    gtk_label_set_markup(GTK_LABEL(label), 
      "\nEnabling this component will have some minor side effects.  Doing so "
      "will cause Purple to take slightly longer to start up because it must "
      "parse a large amount of data to gather statistics.  On average, this "
      "can take slightly over a second for every 100,000 messages in your "
      "logs.\n\nThe time from when you press the OK button to the time "
      "when this dialog vanishes is a good approximation of how much extra "
      "time will elapse before the login screen is shown.\n"
    );
    gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
    gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(popup)->vbox), label, 
      FALSE, FALSE, 0);

    gtk_widget_show_all (popup);
  }
}
Example #29
0
static gboolean
receiving_im_cb(PurpleAccount *account, char **sender, char **buffer,
                PurpleConversation *conv, PurpleMessageFlags *flags, void *data)
{
    twitter_debug("called\n");
    twitter_debug("buffer = %s suppress_oops = %d\n", *buffer, suppress_oops);

    gint service;

    service = get_service_type_by_account(account, *sender);
    twitter_debug("service = %d\n", service);

#ifdef _WIN32
    /* suppress notification of incoming messages. */
    if(service != unknown_service &&
       purple_prefs_get_bool(OPT_PREVENT_NOTIFICATION)) {
        if(!blink_modified) {
            blink_modified = TRUE;
            blink_state = purple_prefs_get_bool(OPT_PIDGIN_BLINK_IM);
            purple_prefs_set_bool(OPT_PIDGIN_BLINK_IM, FALSE);
        }
    }
    else {
        if(blink_modified) {
            purple_prefs_set_bool(OPT_PIDGIN_BLINK_IM, blink_state);
            blink_modified = FALSE;
        }
    }
#endif

    if(service == wassr_service) {
        gchar *stripped = strip_html_markup(*buffer);
        /* suppress annoying completion message from wassr */
        if(strstr(*buffer, "<body>チャンネル投稿完了:")) {
            twitter_debug("clearing channel parrot message\n");
            g_free(*sender); *sender = NULL;
            g_free(*buffer); *buffer = NULL;
        }
        /* discard parrot message */
        else {
            GList *current = g_list_first(wassr_parrot_list);
            while(current) {
                GList *next = g_list_next(current);

                if(strstr(stripped, current->data)) {
                    twitter_debug("parrot clearing: buf = %s post = %s\n",
                                  *buffer, (char *)current->data);
                    g_free(*sender); *sender = NULL;
                    g_free(*buffer); *buffer = NULL;
                    g_free(current->data);
                    current->data = NULL;
                    wassr_parrot_list =
                        g_list_delete_link(wassr_parrot_list, current);
                    break;
                }

                current = next;
            }
        }
        g_free(stripped);
    }
    else if(service == identica_service) {
        /* discard parrot message */
        gchar *stripped = strip_html_markup(*buffer);
        GList *current = g_list_first(identica_parrot_list);
        while(current) {
            GList *next = g_list_next(current);

            if(strstr(stripped, current->data)) {
                twitter_debug("identica parrot clearing: buf = %s post = %s\n",
                              *buffer, (char *)current->data);
                g_free(*sender); *sender = NULL;
                g_free(*buffer); *buffer = NULL;
                g_free(current->data);
                current->data = NULL;
                identica_parrot_list =
                    g_list_delete_link(identica_parrot_list, current);
                break;
            }

            current = next;
        }
        g_free(stripped);
    }
    else if(service == ffeed_service) {
        /* discard parrot message */
        gchar *stripped = strip_html_markup(*buffer);
        GList *current = g_list_first(ffeed_parrot_list);
        while(current) {
            GList *next = g_list_next(current);

            if(strstr(stripped, current->data)) {
                twitter_debug("ffeed parrot clearing: buf = %s post = %s\n",
                              *buffer, (char *)current->data);
                g_free(*sender); *sender = NULL;
                g_free(*buffer); *buffer = NULL;
                g_free(current->data);
                current->data = NULL;
                ffeed_parrot_list =
                    g_list_delete_link(ffeed_parrot_list, current);
                break;
            }

            current = next;
        }
        g_free(stripped);
    }

    /* filtering */
    if(purple_prefs_get_bool(OPT_FILTER)) {
        apply_filter(sender, buffer, flags, service);
    }

    /* return here if it is not twitter */
    if(service != twitter_service) {
        return FALSE;
    }

    /* if we use api, discard all incoming IM messages. */
    if(purple_prefs_get_bool(OPT_API_BASE_POST)) {
        g_free(*sender); *sender = NULL;
        g_free(*buffer); *buffer = NULL;
    }

    if(!suppress_oops || !purple_prefs_get_bool(OPT_SUPPRESS_OOPS))
        return FALSE;

    if(strstr(*buffer, OOPS_MESSAGE)) {
        twitter_debug("clearing sender and buffer\n");
        g_free(*sender); *sender = NULL;
        g_free(*buffer); *buffer = NULL;
        suppress_oops = FALSE;
    }
    return FALSE;
}
Example #30
0
static void purple_init(account_t *acc)
{
	PurplePlugin *prpl = purple_plugins_find_with_id((char *) acc->prpl->data);
	PurplePluginProtocolInfo *pi = prpl->info->extra_info;
	PurpleAccount *pa;
	GList *i, *st;
	set_t *s;
	char help_title[64];
	GString *help;
	static gboolean dir_fixed = FALSE;

	/* Layer violation coming up: Making an exception for libpurple here.
	   Dig in the IRC state a bit to get a username. Ideally we should
	   check if s/he identified but this info doesn't seem *that* important.
	   It's just that fecking libpurple can't *not* store this shit.

	   Remember that libpurple is not really meant to be used on public
	   servers anyway! */
	if (!dir_fixed) {
		PurpleCertificatePool *pool;
		irc_t *irc = acc->bee->ui_data;
		char *dir;

		dir = g_strdup_printf("%s/purple/%s", global.conf->configdir, irc->user->nick);
		purple_util_set_user_dir(dir);
		g_free(dir);

		purple_blist_load();
		purple_prefs_load();

		if (proxytype == PROXY_SOCKS4A) {
			/* do this here after loading prefs. yes, i know, it sucks */
			purple_prefs_set_bool("/purple/proxy/socks4_remotedns", TRUE);
		}

		/* re-create the certificate cache directory */
		pool = purple_certificate_find_pool("x509", "tls_peers");
		dir = purple_certificate_pool_mkpath(pool, NULL);
		purple_build_dir(dir, 0700);
		g_free(dir);

		dir_fixed = TRUE;
	}

	help = g_string_new("");
	g_string_printf(help, "BitlBee libpurple module %s (%s).\n\nSupported settings:",
	                (char *) acc->prpl->name, prpl->info->name);

	if (pi->user_splits) {
		GList *l;
		g_string_append_printf(help, "\n* username: Username");
		for (l = pi->user_splits; l; l = l->next) {
			g_string_append_printf(help, "%c%s",
			                       purple_account_user_split_get_separator(l->data),
			                       purple_account_user_split_get_text(l->data));
		}
	}

	/* Convert all protocol_options into per-account setting variables. */
	for (i = pi->protocol_options; i; i = i->next) {
		PurpleAccountOption *o = i->data;
		const char *name;
		char *def = NULL;
		set_eval eval = NULL;
		void *eval_data = NULL;
		GList *io = NULL;
		GSList *opts = NULL;

		name = purple_account_option_get_setting(o);

		switch (purple_account_option_get_type(o)) {
		case PURPLE_PREF_STRING:
			def = g_strdup(purple_account_option_get_default_string(o));

			g_string_append_printf(help, "\n* %s (%s), %s, default: %s",
			                       name, purple_account_option_get_text(o),
			                       "string", def);

			break;

		case PURPLE_PREF_INT:
			def = g_strdup_printf("%d", purple_account_option_get_default_int(o));
			eval = set_eval_int;

			g_string_append_printf(help, "\n* %s (%s), %s, default: %s",
			                       name, purple_account_option_get_text(o),
			                       "integer", def);

			break;

		case PURPLE_PREF_BOOLEAN:
			if (purple_account_option_get_default_bool(o)) {
				def = g_strdup("true");
			} else {
				def = g_strdup("false");
			}
			eval = set_eval_bool;

			g_string_append_printf(help, "\n* %s (%s), %s, default: %s",
			                       name, purple_account_option_get_text(o),
			                       "boolean", def);

			break;

		case PURPLE_PREF_STRING_LIST:
			def = g_strdup(purple_account_option_get_default_list_value(o));

			g_string_append_printf(help, "\n* %s (%s), %s, default: %s",
			                       name, purple_account_option_get_text(o),
			                       "list", def);
			g_string_append(help, "\n  Possible values: ");

			for (io = purple_account_option_get_list(o); io; io = io->next) {
				PurpleKeyValuePair *kv = io->data;
				opts = g_slist_append(opts, kv->value);
				/* TODO: kv->value is not a char*, WTF? */
				if (strcmp(kv->value, kv->key) != 0) {
					g_string_append_printf(help, "%s (%s), ", (char *) kv->value, kv->key);
				} else {
					g_string_append_printf(help, "%s, ", (char *) kv->value);
				}
			}
			g_string_truncate(help, help->len - 2);
			eval = set_eval_list;
			eval_data = opts;

			break;

		default:
			/** No way to talk to the user right now, invent one when
			this becomes important.
			irc_rootmsg( acc->irc, "Setting with unknown type: %s (%d) Expect stuff to break..\n",
			             name, purple_account_option_get_type( o ) );
			*/
			g_string_append_printf(help, "\n* [%s] UNSUPPORTED (type %d)",
			                       name, purple_account_option_get_type(o));
			name = NULL;
		}

		if (name != NULL) {
			s = set_add(&acc->set, name, def, eval, acc);
			s->flags |= ACC_SET_OFFLINE_ONLY;
			s->eval_data = eval_data;
			g_free(def);
		}
	}

	g_snprintf(help_title, sizeof(help_title), "purple %s", (char *) acc->prpl->name);
	help_add_mem(&global.help, help_title, help->str);
	g_string_free(help, TRUE);

	s = set_add(&acc->set, "display_name", NULL, set_eval_display_name, acc);
	s->flags |= ACC_SET_ONLINE_ONLY;

	if (pi->options & OPT_PROTO_MAIL_CHECK) {
		s = set_add(&acc->set, "mail_notifications", "false", set_eval_bool, acc);
		s->flags |= ACC_SET_OFFLINE_ONLY;

		s = set_add(&acc->set, "mail_notifications_handle", NULL, NULL, acc);
		s->flags |= ACC_SET_OFFLINE_ONLY | SET_NULL_OK;
	}

	if (strcmp(prpl->info->name, "Gadu-Gadu") == 0) {
		s = set_add(&acc->set, "gg_sync_contacts", "true", set_eval_bool, acc);
	}

	/* Go through all away states to figure out if away/status messages
	   are possible. */
	pa = purple_account_new(acc->user, (char *) acc->prpl->data);
	for (st = purple_account_get_status_types(pa); st; st = st->next) {
		PurpleStatusPrimitive prim = purple_status_type_get_primitive(st->data);

		if (prim == PURPLE_STATUS_AVAILABLE) {
			if (purple_status_type_get_attr(st->data, "message")) {
				acc->flags |= ACC_FLAG_STATUS_MESSAGE;
			}
		} else if (prim != PURPLE_STATUS_OFFLINE) {
			if (purple_status_type_get_attr(st->data, "message")) {
				acc->flags |= ACC_FLAG_AWAY_MESSAGE;
			}
		}
	}
	purple_accounts_remove(pa);
}