changeset 2619:536198196dc6

[gaim-migrate @ 2632] i hate you mid. i have that IM Me song stuck in my head. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Fri, 26 Oct 2001 10:11:33 +0000
parents 047256035ec6
children a1b708ee93af
files ChangeLog src/conversation.c src/protocols/irc/irc.c
diffstat 3 files changed, 88 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Oct 26 09:17:13 2001 +0000
+++ b/ChangeLog	Fri Oct 26 10:11:33 2001 +0000
@@ -24,6 +24,7 @@
 	* MSN Privacy Options
 	* In MSN you can set a person's alias to their "friendly name" by
 	  right-click on their name while they're online.
+	* IRC can do /WHOIS
 
 version 0.46 (10/18/2001):
 	* New applet icons (courtesy David Raeman)
--- a/src/conversation.c	Fri Oct 26 09:17:13 2001 +0000
+++ b/src/conversation.c	Fri Oct 26 10:11:33 2001 +0000
@@ -2022,12 +2022,16 @@
 void update_buttons_by_protocol(struct conversation *c)
 {
 	if (!c->gc) {
-		gtk_widget_set_sensitive(c->info, FALSE);
-		gtk_widget_set_sensitive(c->send, FALSE);
-		gtk_widget_set_sensitive(c->warn, FALSE);
-		gtk_widget_set_sensitive(c->block, FALSE);
-		gtk_widget_set_sensitive(c->add, FALSE);
-
+		if (c->info)
+			gtk_widget_set_sensitive(c->info, FALSE);
+		if (c->send)
+			gtk_widget_set_sensitive(c->send, FALSE);
+		if (c->warn)
+			gtk_widget_set_sensitive(c->warn, FALSE);
+		if (c->block)
+			gtk_widget_set_sensitive(c->block, FALSE);
+		if (c->add)
+			gtk_widget_set_sensitive(c->add, FALSE);
 		if (c->whisper)
 			gtk_widget_set_sensitive(c->whisper, FALSE);
 		if (c->invite)
--- a/src/protocols/irc/irc.c	Fri Oct 26 09:17:13 2001 +0000
+++ b/src/protocols/irc/irc.c	Fri Oct 26 10:11:33 2001 +0000
@@ -59,6 +59,9 @@
 	char *chanmodes;
 	char *nickmodes;
 	gboolean six_modes;
+
+	gboolean in_whois;
+	GString *whois_str;
 };
 
 static char *irc_name()
@@ -563,11 +566,41 @@
 		handle_005(gc, word, word_eol);
 		break;
 	case 301:
-		irc_got_im(gc, word[4], word_eol[5], IM_FLAG_AWAY, time(NULL));
+		if (id->in_whois) {
+			id->whois_str = g_string_append(id->whois_str, "<BR><BR>");
+			id->whois_str = g_string_append(id->whois_str, word_eol[4]);
+		} else
+			irc_got_im(gc, word[4], word_eol[5], IM_FLAG_AWAY, time(NULL));
 		break;
 	case 303:
 		handle_list(gc, &word_eol[4][1]);
 		break;
+	case 311:
+	case 312:
+	case 313:
+	case 317:
+	case 319:
+		if (!id->in_whois) {
+			id->in_whois = TRUE;
+			id->whois_str = g_string_new("");
+		} else {
+			id->whois_str = g_string_append(id->whois_str, "<BR><BR>");
+			id->in_whois = TRUE;
+		}
+		id->whois_str = g_string_append(id->whois_str, word_eol[4]);
+		break;
+	case 318:
+		id->whois_str = g_string_append(id->whois_str, "<BR><BR>");
+		id->whois_str = g_string_append(id->whois_str, word_eol[4]);
+		{
+			GString *str = decode_html(id->whois_str->str);
+			g_show_info_text(str->str);
+			g_string_free(str, TRUE);
+		}
+		g_string_free(id->whois_str, TRUE);
+		id->whois_str = NULL;
+		id->in_whois = FALSE;
+		break;
 	case 324:
 		handle_mode(gc, word, word_eol, TRUE);
 		break;
@@ -580,6 +613,18 @@
 	case 376:
 		irc_request_buddy_update(gc);
 		break;
+	case 401:
+	case 402:
+	case 431:
+		if (!id->in_whois) {
+			id->in_whois = TRUE;
+			id->whois_str = g_string_new("");
+		} else {
+			id->whois_str = g_string_append(id->whois_str, "<BR><BR>");
+			id->in_whois = TRUE;
+		}
+		id->whois_str = g_string_append(id->whois_str, word_eol[4]);
+		break;
 	}
 }
 
@@ -951,6 +996,8 @@
 	g_free(idata->nickmodes);
 
 	g_string_free(idata->str, TRUE);
+	if (idata->whois_str)
+		g_string_free(idata->whois_str, TRUE);
 
 	if (idata->timer)
 		g_source_remove(idata->timer);
@@ -1166,8 +1213,6 @@
 		else
 			g_snprintf(buf, sizeof(buf), "KICK %s %s\r\n", who, word[2]);
 		irc_write(id->fd, buf, strlen(buf));
-	} else if (!g_strcasecmp(pdibuf, "BAN")) {
-	} else if (!g_strcasecmp(pdibuf, "KICKBAN")) {
 	} else if (!g_strcasecmp(pdibuf, "JOIN")) {
 		if (!*word[2])
 			return -EINVAL;
@@ -1193,6 +1238,9 @@
 			g_snprintf(buf, sizeof(buf), _("You have left %s"), chan);
 			do_error_dialog(buf, _("IRC Part"));
 		}
+	} else if (!g_strcasecmp(pdibuf, "WHOIS")) {
+		g_snprintf(buf, sizeof(buf), "WHOIS %s\r\n", word_eol[2]);
+		irc_write(id->fd, buf, strlen(buf));
 	} else if (!g_strcasecmp(pdibuf, "HELP")) {
 		struct conversation *c = NULL;
 		if (is_channel(gc, who)) {
@@ -1203,7 +1251,7 @@
 		if (!c)
 			return -EINVAL;
 		write_to_conv(c, "<B>Currently supported commands:<BR>"
-				 "JOIN PART TOPIC<BR>"
+				 "JOIN PART TOPIC WHOIS<BR>"
 				 "OP DEOP VOICE DEVOICE KICK<BR>"
 				 "NICK ME MSG QUOTE SAY</B>",
 				 WFLAG_NOLOG, NULL, time(NULL));
@@ -1335,6 +1383,29 @@
 	return irc_icon_xpm;
 }
 
+static void irc_get_info(struct gaim_connection *gc, char *who)
+{
+	struct irc_data *idata = gc->proto_data;
+	char buf[IRC_BUF_LEN];
+
+	g_snprintf(buf, sizeof(buf), "WHOIS %s\r\n", who);
+	irc_write(idata->fd, buf, strlen(buf));
+}
+
+static GList *irc_buddy_menu(struct gaim_connection *gc, char *who)
+{
+	GList *m = NULL;
+	struct proto_buddy_menu *pbm;
+
+	pbm = g_new0(struct proto_buddy_menu, 1);
+	pbm->label = _("Get Info");
+	pbm->callback = irc_get_info;
+	pbm->gc = gc;
+	m = g_list_append(m, pbm);
+
+	return m;
+}
+
 static struct prpl *my_protocol = NULL;
 
 void irc_init(struct prpl *ret)
@@ -1355,6 +1426,8 @@
 	ret->chat_send = irc_chat_send;
 	ret->away_states = irc_away_states;
 	ret->set_away = irc_set_away;
+	ret->get_info = irc_get_info;
+	ret->buddy_menu = irc_buddy_menu;
 	my_protocol = ret;
 }