Feature Addition: Hide Post By User

New feature: Muting

Community does what devs don’t. Thanks to the efforts of SleepProgger, we’ve been able to add Mute as a feature1 on this board.

Feature contains substances known to the state of California to cause cancer. By using this feature, you agree to indemnify us (“hapless hosts”) against liability for things including, but not limited to: extraneous mutant limbs, glow-in-the-dark skin, and a hankering for human flesh.

This feature is now live on all themes.

How to use:


Alt text: Simply use the microphone icon below the post

Added: safety prompt

No longer will fat-fingers hide posts you want to reply to. You will be prompted before muting or unmuting a poster.

Limitations

  • Muting doesn’t carry over across browsers or devices (stored client-side)
  • Muting may do weird things to quoted text

Installation for Discourse Admins:

added 4 February 2018

In the admin panel, choose Customize. Select theme. Click edit CSS/HTML. Add the following code to each respective section.

CSS

@keyframes nodeInserted {
from {
outline-color: #fff;
}
to {
outline-color: #000;
}
}

@-moz-keyframes nodeInserted {
from {
outline-color: #fff;
}
to {
outline-color: #000;
}
}

@-webkit-keyframes nodeInserted {
from {
outline-color: #fff;
}
to {
outline-color: #000;
}
}

@-ms-keyframes nodeInserted {
from {
outline-color: #fff;
}
to {
outline-color: #000;
}
}

@-o-keyframes nodeInserted {
from {
outline-color: #fff;
}
to {
outline-color: #000;
}
}

article, #article, .article {
animation-duration: 0.01s;
-o-animation-duration: 0.01s;
-ms-animation-duration: 0.01s;
-moz-animation-duration: 0.01s;
-webkit-animation-duration: 0.01s;
animation-name: nodeInserted;
-o-animation-name: nodeInserted;
-ms-animation-name: nodeInserted;
-moz-animation-name: nodeInserted;
-webkit-animation-name: nodeInserted;
}

Atchung!:
change this line to reflect your site name:

var GR_COOKIE_NAME = ‘community_mute_users’;

Head/javascript
<script type="text/javascript">
var run_script = false;

$(document).ready(function(){
    if (window.location.href.indexOf("/t/") > 0) {
        run_script = true;
        MakeMagic();
    }
});    

if (!this.GM_getValue || (this.GM_getValue.toString && this.GM_getValue.toString().indexOf("not supported")>-1)) {
    this.GM_getValue=function (key,def) {
        return localStorage[key] || def;
    };
    this.GM_setValue=function (key,value) {
        return localStorage[key]=value;
    };
    this.GM_deleteValue=function (key) {
        return delete localStorage[key];
    };
}

var GR_COOKIE_NAME = 'community_mute_users';
var hide_ids = $.parseJSON(GM_getValue(GR_COOKIE_NAME, '{}'));

(function(){
    event = function(event){
        if (event.animationName == 'nodeInserted') {
            RecastSpell();
        }
    }
        
document.addEventListener('animationstart', event, false);
document.addEventListener('MSAnimationStart', event, false);
document.addEventListener('webkitAnimationStart', event, false);
})();

function RecastSpell(){
    if (run_script == true) {
        MakeMagic();
    }
}

function MakeMagic(){
    hide_ids = $.parseJSON(GM_getValue(GR_COOKIE_NAME, '{}'));
	function handle_post_node(node){
		var tid = node.getAttribute('data-user-id');
		var name = $('[data-user-id="'+tid+'"]').find('.username a').first().text();
		function mute_foo(){
		    //var name = $(node).find('.names').text;
		    var confirmString = "Really mute " + name + "?";  
		    if (confirm(confirmString) == true) {
 	                this.innerHTML = "Unmute;"
			$(node).find('.contents').hide();
			$(node).find('.names').hide();
			$(node).find('.avatar').hide();
			$(this).unbind('click', mute_foo);
			$(this).click(umute_foo);
			hide_ids[tid] = 1;
			GM_setValue(GR_COOKIE_NAME, JSON.stringify(hide_ids));
			$('[data-user-id="'+tid+'"]').find('.mute_btn').remove();
			$('[data-user-id="'+tid+'"]').each(function(){ handle_post_node(this) });         
		    }
		}
		function umute_foo(){
		    var confirmString = "Unmute " + name + "?";  
		    if (confirm(confirmString) == true) {
			this.innerHTML = "Mute";
			$(node).find('.contents').show();
			$(node).find('.names').show();
			$(node).find('.avatar').show();
			$(this).unbind('click', umute_foo);
			$(this).click(mute_foo);
			delete hide_ids[tid];
			GM_setValue(GR_COOKIE_NAME, JSON.stringify(hide_ids));
			$('[data-user-id="'+tid+'"]').find('.umute_btn').remove();
			$('[data-user-id="'+tid+'"]').each(function(){ $(this).find('.contents').show(); handle_post_node(this) });
		    }
		}
		if(hide_ids[tid]){			
			$(node).find('.contents').hide();
			$(node).find('.names').hide();
			$(node).find('.avatar').hide();
			if($(node).find('.umute_btn').length > 0) return;
			var btn = $('<button class="umute_btn" title="Unmute this user." style="background-color: Transparent; background-repeat:no-repeat; border: none; cursor:pointer; overflow: hidden; outline:none; margin-left: 3px; "><i class="fa fa-microphone"></i></button>');
			$(node).find('.post-info').first().prepend(btn);
			btn.click(umute_foo);
		}else {
			if($(node).find('.mute_btn').length > 0) return;
			var btn = $('<button title="Mute this user." style="background: none;" class="mute_btn"><i class="fa fa-microphone-slash"></i></button>');
			btn.insertBefore($(node).find('.create').last());
			btn.click(mute_foo);
		}
	}
	
	$('article').each(function(){handle_post_node(this)});
	var observer = new MutationObserver(function(mutations) {
		for(var i=0; i < mutations.length; ++i){
			var mutation = mutations[i];
			for(var j=0; j < mutation.addedNodes.length; ++j){
				if(mutation.addedNodes[j].nodeName == "#text") continue;
				var node = mutation.addedNodes[j];
				//console.log(node);
				if(node.className == 'container posts'){
					$(node).find('article').each(function(){handle_post_node(this)});
					continue;
				}
				// just to be sure (TODO: sometimes when jumping to a thread via notification the posts aren't handled.
				// This "hack" (should) ensure that all posts are handled )
				if(node.className == 'topic-link'){
					$(window.document).find('article').each(function(){handle_post_node(this)});
					continue;
				}
				if(node.className == 'ember-view post-cloak'){
					node = $(node).find('article').get(0);
				}
				if(node.nodeName == "ARTICLE" && node.getAttribute('data-user-id')){
					handle_post_node(node);	
				}
			}
		}
	});
	observer.observe(document, { subtree: true, childList: true});
}
</script>

Original userscript by SleepProgger.
CSS event method invented by Daniel Buchner


Original post

Jeff (Discourse dev) refused to implement a block system, but I’ll make one for here anyway by converting an existing userscript into theme-embedded JavaScript.

Limitations:

  • Blocking will not hide quotations

Just a PSA from your friendly neighbourhood spiderman: Jeff’s a clueless dude. https://meta.discourse.org/t/ability-to-block-or-mute-another-user/6001/95

7 Likes

Good idea.

10 Likes

Reading that is pretty awful.

Did you ever wonder if he won’t do things like that so his Mr. Hyde has the tools available? That back and forth he had about rapists is just shocking - Some part of me wonders if he won’t put in features like a block list so that nobody can use it on him?

6 Likes

@staff - feature has been rolled out to Earthtones. Earthtones does have issues on some mobile browsers (though not on Firefox Focus and Chrome). Requesting permission to roll out to all themes.

I recognize that muting is not a perfect solution. But it is important to put the methods of control back in the hands of end-users. There are some situations where muting people rather than leaving the forum or forcing a confrontation is preferable; take for instance, my breakup. Both me and my ex float in the same online circles… and thanks to muting, we can co-exist.

Of course, Bad Faith Bears should be dealt with. This is not a replacement for moderators. But this is an important step forward for community members.

12 Likes

FFS. I wanna live on Jeff’s planet. Sounds waaay easier than this one.

Muting is good. Sometimes someone just irritates you, and it might not even be anything they’re doing wrong.

15 Likes

This sort of thing basically exacerbates what I see as the problems of online discourse. What I am “here” for is open dialectics and brainstorming - and I try to be patient as things get mired in tribalism, cliquishness, and interpersonal drama that all gets in the way of devising and implementing actual ideas and practices.

IMO people wish to have it both ways, open discussion - but only with those they feel some personal or ideological affinity for. Having private discussions in public. Being at a party where they can regulate others’ engagement. There is probably a place for such things, but discussing social issues is not one of them. I see the way forward as being inclusivity, intersectionality, plurality - versis exclusion, overspecialization, and monoculture as being more reactionary, a recipe for echo chamber.

“We” - the members of a (apparently hypothetical) discussion forum comprise a team. In this case, a collective of 141 members. If somebody does not abide the rules of membership, their membership is terminated. Otherwise, if people prefer to avoid others, they use private messages. If you want to avoid your team, your collective, it’s simple - you leave. What you don’t do is impose your personal preferences upon the discourse of the whole, splitting it into ingroups/outgroups. That’s antisocial and not ever going amount to anything. I have seen the flag-to-hide feature being used as a heckler’s veto far more often than to call out abuse, and I don’t expect this to be any better.

2 Likes

I feel like the addition of muting will improve our discussions by allowing people to self-select for engaging. Yes, it will result in bubbles where some people are almost completely ignored - however, this will also mean that those who do chat with the more… high-intensity folks will be the more cordial ones.

Community discussions are only as good as the patience levels of the participants. At scale, like back at the ranch for instance, more flags flew than a cocaine-addled linesman competition (admittedly, the flags I received were more than justified).

In this post-factual world, the only way to remain sane is to change reality itself. Humans do this naturally in meatspace by selecting their social groups. The code allows the digital equivalent.

11 Likes

I’m fine with that, although I’d prefer it were implemented as a plugin. Perfect is the enemy of good, etc…

4 Likes

LOL What got me about that place is that I could joke around and get really silly without being flagged as OT, yet it has always been what I thought were my most earnest and helpful posts that caused the most problems. I got an email from one of the staff there once saying that I had been flagged more than fifty times within an hour. They said that my posts were cool, but asked me to please cool it, as they were trying to enjoy their weekend.

That’s the thing, I don’t do this. I try to be socially active without personal affinity, because I think it is kind of selfish (for me at least). I see social activity as more formal than natural. We’ll see how it goes, I guess.

1 Like

I read somewhere the following: We are who we pretend to be.

I think one of the major problems at the ranch is that there’s just too damn many people. Anything above around 60 active posts, it gets damn near impossible to have a conversation. Can’t even have a good dialogue without dogpiles occuring.

Some folks get annoyed by topic derails. (Annoyance is proportional to the number of participants in the thread.) Personally, I like them. It’s what makes a conversation. There has to be a thesis, an antithesis, a synthesis, and a topic slide.

8 Likes

Mute isn’t a block but I’ll take it.

6 Likes

I see the way forward as being inclusivity, intersectionality, plurality

If you want to avoid your team, your collective, it’s simple - you leave.

It sounds like you’re trying to have it both ways. You can’t have inclusivity if the only alternative is to leave.

12 Likes

That’s pretty slick. Thank you.

8 Likes

Is there a way to unmute something? I was trying to bookmark a post and accidentally hit the wrong icon.

7 Likes

Brilliant; thanks.

7 Likes

Yeah, maybe this button needs a safety.

9 Likes

Well, cheers for being the one to reply, because it was your 2001/Future Shock post I was trying to bookmark!

I was able to unmute you because you did a reply to me, and that unmuted everything else.

Phew!

7 Likes

Or - being inclusive might mean not looking for alternatives to engaging with your group. I suspect that some would complain that “they are not my group!”. I guess some can find ways to rationalize that that isn’t somehow driving wedges between people.

I find a useful measure of inclusiveness to be whether or not we are facilitating others in the group. Are we helping for them and their views to be heard, or do we feel entitled to sabotage that process? If you feel entitled to exclude a person from participation, and that feeling is legitimate, then why not actually exclude them from membership in the group? If there’s abuse, that’s everyone’s problem. But if you simply don’t like them, that’s your problem and should not be made everyone else’s. Those who, in order to participate here, need pretend that some members of the group don’t exist IMO need to check themselves, and their impulse should IMO definitely not be baked into the forum code.

Here are the members of your team: https://bbs.elsewhere.cafe/u
If you feel compelled to silence people, then FFS try to silence some other adversarial group, not your own people. Or, better yet, leave your tribalism at the door when you come in.

ETA I am going to try muting myself to demonstrate my solidarity with the other muted. We’ll see what happens!

1 Like

You know muting someone isn’t silencing them, right? We already tools for that, which are flagging and suspension. This is adding a way to make it very easy for you to ignore someone without stopping their conversations with anyone else. Indeed, one possible problem is that people use it as a polite alternative to actually getting rid of objectionable material. From what I know of him, I bet that’s at least part of why Jeff didn’t permit it.

I don’t agree, though, with the notion that a community must require everyone to agree on what they want to discuss with whom. And frankly, it’s ridiculous to shout “tribalism” as those who don’t regard us all as a single “team” that needs to make all such decisions as a collective. We don’t need to be so uniform. It’s good how many different perspectives we have here.

Some of us post about politics, some about gardening, some about music, some about science – and those are organized into topics so that we can all engage with the ones we like and skip the rest. There’s no disaster in that. I’m not sure why it’s so much worse to help people talk to the ones they find interesting and ignore the ones they find frustrating and derailing, without forcing the same choice on everyone else.

20 Likes

Popo, ol’ Bawa of ours, you surely recognize the vast variety of mindsets and personalities present in any group of a size comparable to this one here. Some of us are loud, some are opinionated, some are introverted, some are introspective, some are helpful, some are collaborative, some are mavericks, some are clever, some are dull, some are young, some are not, some are passionate, some are reserved. And all of those characteristics are subjective, relativistic, and perceived rather than absolutes. Some voices can have the (perhaps unintended) effect of drowning others out, or inadvertently discouraging their participation one way or another.

Put simply, some people simply might have heard all they can stand about my pooping habits, my sympathy for unpopular opinion holders, my moral relativism, my ketchup-on-hotdogs apologism, or my oft-told and long-winded anecdotes about barely relevant experiences. Some people might simply do better without my contributions, even if the rest of the community thinks I’m as obviously awesome as I do. Now they can mute me. Doesn’t affect anyone else, just saves them from having to scroll past my scatology one more time.

This is not a failure of community technology. In fact, not seeing upsetting posts (in this case, posts by people from whom one feels the need to take a break) will not only help keep the peace, but might actually prevent certain community members’ disagreements from devolving into actual antipathy or hostility. And thus the conversation can carry on without being slowed or distracted or derailed by preventable fights.

We all have a right to speak here, but that does not equate to a blanket right to be listened to by all and sundry. Even I grow unbearably tiresome at times. No seriously, it’s true. Even I.

You can even ask my loved ones.

25 Likes