diff src/protocols/irc/msgs.c @ 9740:2bb5e2cd64bd

[gaim-migrate @ 10605] " A few days back, someone on #gaim was wondering how to block IM's from IRC, which isn't supported by gaim, as this isn't supported at a protocol level. I decided to implement gaim's privacy options (permit lists, deny lists, block all users, and permit people on buddy list) at a local level for IRC and Zephyr. Jabber, SILC, and Trepia don't seem to support deny or permit lists in Gaim, but I don't use the latter two protocols and wasn't sure about how to implemnt in in Jabber. When implementing it, I noticed that changes in privacy settings didn't automatically cause blist.xml to get scheduled for writing (even on exit). To fix this, I needed to make schedule_blist_save in blist.c non-static and call it from serv_set_permit_deny() in server.c, and gaim_privacy_{permit,deny}_{add,remove} in privacy.c ." --Arun A Tharuvai committer: Tailor Script <tailor@pidgin.im>
author Luke Schierer <lschiere@pidgin.im>
date Wed, 11 Aug 2004 23:52:48 +0000
parents a64febebdd1e
children b10d4c6ac7eb
line wrap: on
line diff
--- a/src/protocols/irc/msgs.c	Wed Aug 11 18:05:10 2004 +0000
+++ b/src/protocols/irc/msgs.c	Wed Aug 11 23:52:48 2004 +0000
@@ -28,6 +28,7 @@
 #include "util.h"
 #include "debug.h"
 #include "irc.h"
+#include "privacy.h"
 
 #include <stdio.h>
 
@@ -846,6 +847,8 @@
 	GaimConversation *convo;
 	char *nick = irc_mask_nick(from), *tmp, *msg;
 	int notice = 0;
+	GSList* l;
+	gboolean in_deny=0;
 
 	if (!args || !args[0] || !args[1] || !gc) {
 		g_free(nick);
@@ -859,6 +862,40 @@
 		return;
 	}
 
+	 
+	switch (gc->account->perm_deny) {
+	case GAIM_PRIVACY_ALLOW_ALL: 
+		in_deny = 0; break;
+	case GAIM_PRIVACY_DENY_ALL: 
+		in_deny = 1; break;
+	case GAIM_PRIVACY_ALLOW_USERS: /* See if stripped_sender is in gc->account->permit and allow appropriately */
+		in_deny = 1;
+		for(l=gc->account->permit;l!=NULL;l=l->next) {
+			if (!gaim_utf8_strcasecmp(nick, gaim_normalize(gc->account, (char *)l->data))) {
+				in_deny=0;
+				break;
+			} 
+		}
+		break;
+	case GAIM_PRIVACY_DENY_USERS: /* See if nick is in gc->account->deny and deny if so */ 
+		in_deny = 0;
+		for(l=gc->account->deny;l!=NULL;l=l->next) {
+			if (!gaim_utf8_strcasecmp(nick, gaim_normalize(gc->account, (char *)l->data))) {
+				in_deny=1;
+				break;
+			} 
+		}
+		break;
+	case GAIM_PRIVACY_ALLOW_BUDDYLIST: 
+		in_deny = 1;
+		if (gaim_find_buddy(gc->account,nick)!=NULL) {
+			in_deny = 0;
+		}
+		break;
+	default: 
+		in_deny=0; break;
+	}
+	 
 	msg = gaim_escape_html(tmp);
 	g_free(tmp);
 
@@ -872,9 +909,13 @@
 	}
 
 	if (!gaim_utf8_strcasecmp(args[0], gaim_connection_get_display_name(gc))) {
+		if (!in_deny) {
 		serv_got_im(gc, nick, msg, 0, time(NULL));
+		}
 	} else if (notice) {
+		if(!in_deny) {
 		serv_got_im(gc, nick, msg, 0, time(NULL));
+		}
 	} else {
 		convo = gaim_find_conversation_with_account(args[0], irc->account);
 		if (convo)