/* X-Chat * Copyright (C) 1998 Peter Zelezny. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #include #include #include #include "fe-gtk.h" #include #include #include #include #include #include #include #include #include #include #include #include "../common/xchat.h" #include "../common/util.h" #include "../common/userlist.h" #include "../common/modes.h" #include "../common/notify.h" #include "../common/xchatc.h" #include "gtkutil.h" #include "palette.h" #include "maingui.h" #include "menu.h" #include "pixmaps.h" #include "userlistgui.h" #ifdef USE_GTKSPELL #include #endif enum { COL_PIX=0, // GdkPixbuf * COL_NICK=1, // char * COL_HOST=2, // char * COL_USER=3, // struct User * COL_GDKCOLOR=4 // GdkColor * }; GdkPixbuf * get_user_icon (server *serv, struct User *user) { char *pre; int level; if (!user) return NULL; /* these ones are hardcoded */ switch (user->prefix[0]) { case 0: return NULL; case '@': return pix_op; case '%': return pix_hop; case '+': return pix_voice; } /* find out how many levels above Op this user is */ pre = strchr (serv->nick_prefixes, '@'); if (pre && pre != serv->nick_prefixes) { pre--; level = 0; while (1) { if (pre[0] == user->prefix[0]) { switch (level) { case 0: return pix_red; /* 1 level above op */ case 1: return pix_purple; /* 2 levels above op */ } break; /* 3+, no icons */ } level++; if (pre == serv->nick_prefixes) break; pre--; } } return NULL; } void fe_userlist_numbers (session *sess) { char tbuf[256]; if (sess == current_tab || !sess->gui->is_tab) { if (sess->total) { snprintf (tbuf, sizeof (tbuf), _("%d ops, %d total"), sess->ops, sess->total); tbuf[sizeof (tbuf) - 1] = 0; gtk_label_set_text (GTK_LABEL (sess->gui->namelistinfo), tbuf); } else { gtk_label_set_text (GTK_LABEL (sess->gui->namelistinfo), NULL); } if (sess->type == SESS_CHANNEL && prefs.gui_tweaks & 1) fe_set_title (sess); } } static void scroll_to_iter (GtkTreeIter *iter, GtkTreeView *treeview, GtkTreeModel *model) { GtkTreePath *path = gtk_tree_model_get_path (model, iter); if (path) { gtk_tree_view_scroll_to_cell (treeview, path, NULL, TRUE, 0.5, 0.5); gtk_tree_path_free (path); } } /* select a row in the userlist by nick-name */ void userlist_select (session *sess, char *name) { GtkTreeIter iter; GtkTreeView *treeview = GTK_TREE_VIEW (sess->gui->user_tree); GtkTreeModel *model = gtk_tree_view_get_model (treeview); GtkTreeSelection *selection = gtk_tree_view_get_selection (treeview); struct User *row_user; if (gtk_tree_model_get_iter_first (model, &iter)) { do { gtk_tree_model_get (model, &iter, COL_USER, &row_user, -1); if (sess->server->p_cmp (row_user->nick, name) == 0) { if (gtk_tree_selection_iter_is_selected (selection, &iter)) gtk_tree_selection_unselect_iter (selection, &iter); else gtk_tree_selection_select_iter (selection, &iter); /* and make sure it's visible */ scroll_to_iter (&iter, treeview, model); return; } } while (gtk_tree_model_iter_next (model, &iter)); } } char ** userlist_selection_list (GtkWidget *widget, int *num_ret) { GtkTreeIter iter; GtkTreeView *treeview = (GtkTreeView *) widget; GtkTreeSelection *selection = gtk_tree_view_get_selection (treeview); GtkTreeModel *model = gtk_tree_view_get_model (treeview); struct User *user; int i, num_sel; char **nicks; *num_ret = 0; /* first, count the number of selections */ num_sel = 0; if (gtk_tree_model_get_iter_first (model, &iter)) { do { if (gtk_tree_selection_iter_is_selected (selection, &iter)) num_sel++; } while (gtk_tree_model_iter_next (model, &iter)); } if (num_sel < 1) return NULL; nicks = malloc (sizeof (char *) * (num_sel + 1)); i = 0; gtk_tree_model_get_iter_first (model, &iter); do { if (gtk_tree_selection_iter_is_selected (selection, &iter)) { gtk_tree_model_get (model, &iter, COL_USER, &user, -1); nicks[i] = g_strdup (user->nick); i++; nicks[i] = NULL; } } while (gtk_tree_model_iter_next (model, &iter)); *num_ret = i; return nicks; } void fe_userlist_set_selected (struct session *sess) { GtkListStore *store = sess->res->user_model; GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (sess->gui->user_tree)); GtkTreeIter iter; struct User *user; /* if it's not front-most tab it doesn't own the GtkTreeView! */ if (store != (GtkListStore*) gtk_tree_view_get_model (GTK_TREE_VIEW (sess->gui->user_tree))) return; if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) { do { gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, COL_USER, &user, -1); if (gtk_tree_selection_iter_is_selected (selection, &iter)) user->selected = 1; else user->selected = 0; } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); } } static GtkTreeIter * find_row (GtkTreeView *treeview, GtkTreeModel *model, struct User *user, int *selected) { static GtkTreeIter iter; struct User *row_user; *selected = FALSE; if (gtk_tree_model_get_iter_first (model, &iter)) { do { gtk_tree_model_get (model, &iter, COL_USER, &row_user, -1); if (row_user == user) { if (gtk_tree_view_get_model (treeview) == model) { if (gtk_tree_selection_iter_is_selected (gtk_tree_view_get_selection (treeview), &iter)) *selected = TRUE; } return &iter; } } while (gtk_tree_model_iter_next (model, &iter)); } return NULL; } void userlist_set_value (GtkWidget *treeview, gfloat val) { gtk_adjustment_set_value ( gtk_tree_view_get_vadjustment (GTK_TREE_VIEW (treeview)), val); } gfloat userlist_get_value (GtkWidget *treeview) { return gtk_tree_view_get_vadjustment (GTK_TREE_VIEW (treeview))->value; } int fe_userlist_remove (session *sess, struct User *user)
/* This program is free software. It comes without any warranty, to
 * the extent permitted by applicable law. You can redistribute it
 * and/or modify it under the terms of the Do What The Fuck You Want
 * To Public License, Version 2, as published by Sam Hocevar. See
 * http://sam.zoy.org/wtfpl/COPYING or http://lwsitu.com/xchat/COPYING
 * for more details. */

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "xchat-plugin.h"

static xchat_plugin *ph;

static int
parse_command( char *word[], char *word_eol[], void *userdata ) {
	char *channel = NULL, *server = NULL, *token = NULL;
/*	char *save_ptr1 = NULL;*/
	char *str1 = NULL;
	char *delimiter = NULL;

	xchat_context *ctx = NULL;

	if( word[2] != NULL && word[3] != NULL ) {
		for( str1 = word[2]; ; str1 = NULL ) {
/*			token = strtok_r( str1, ",", &save_ptr1 );*/
			token = strtok( str1, "," );
/*			printf( "token: %s\n", token );*/

			if( token == NULL ) {
				break;
			}

			channel = strdup