Greasy Fork is available in English.

GA follow

Быстрое управление подпиской в ленту. Кнопка "Читать/Отписаться" в поле информации об авторах постов.

// ==UserScript==
// @name        GA follow
// @namespace   glav.su
// @description Быстрое управление подпиской в ленту. Кнопка "Читать/Отписаться" в поле информации об авторах постов.
// @include     http://glav.su/forum/*
// @include     https://glav.su/forum/*
// @version     1.1
// @grant       none
// ==/UserScript==
function addStyle(styleText) {
	var style = document.createElement('style');
	if (document.head) {
		document.head.appendChild(style);
		style.innerHTML = styleText;
	}
}
addStyle([
	'.readButton, .unreadButton {',
		'cursor: pointer;',
		'display: inline-block;',
		'height: 20px;',
		'line-height: 20px;',
		'padding: 2px 6px;',
		'white-space: nowrap;',
		'width: 75px;',
		'text-align: center;',
		'border-radius: 5px;',
		'margin: 10px;',
	'}',
	'.readButton {',
		'color: #000;',
		'background-color: #fff;',
		'border: 1px solid #999;',
	'}',
	'.readButton:hover {',
		'background-color: #036;',
		'color: #fff;',
	'}',
	'.unreadButton {',
		'color: #fff;',
		'background-color: #369;',
		'border: 1px solid #036;',
	'}',
	'.unreadButton:hover {',
		'background-color: #900;',
	'}',
].join(''));

var myUID = $(".lUserPanelUserItemProfile").find('a[href^="'+APP_URL+'/members/"]')
		.attr('href').replace(/.*?\/members\/(\d+).*/, '$1');
		
var $sandbox = ( (s=$("#sandbox")).length == 1 )? 
		s : $('<div id="sandbox" style="display: none;">').appendTo( $(document.body) );//песочница
		
window.myFollows = ({
		list: {},
		update: function(callback){
			var _this = this;
			$.ajax({
				url: APP_URL + '/members/' + myUID + '/follows/',
				dataType: 'html',
				success: function(data){
					var dt = data.toString().replace(/[\n\r]/mg, '');
					$sandbox.empty()
						.html( dt.replace(/^.*(<div id="jsUF">.*?<\/table>\s*?<\/div>).*$/, '$1') );
					$sandbox.find('a').each(function(ax, a){
						_this.list[$(a).attr('href').replace(/.*?\/members\/(\d+).*/, '$1')] = 
							{ name: $(a).text(), };
					});
					$sandbox.empty();
					if( typeof callback == 'function' ){
						callback();
					}
				}
			});
			return this;
		},
		add_button: function(msg){
			var userUID = (nm_a = $(msg).find("td.fItem.forumMessagesListMessageAuthorName a")).length > 0 ?
					$(nm_a).attr('href').replace(/.*?\/members\/(\d+).*/, '$1') : '';
			if( userUID == myUID || userUID == ''){
				return true;
			}
			var messID = $(msg).attr("id").replace(/forumMessagesListMessage(\d+)/, "$1");
			var ifollow = +(typeof this.list[userUID] !== 'undefined');
			$(msg).find("td#forumMessagesListMessage" + messID + "AuthorInfo div.cBlock")
				.after($('<span class="' + ['readButton', 'unreadButton'][ifollow] + '" fw="' + ifollow + '">')
					.html( ['Читать', 'Читаю'][ifollow] )
					.hover(function(){
							$(this).html(['Читать', 'Отменить'][+($(this).attr('fw') == "1")]);
						},
						function(){
							$(this).html(['Читать', 'Читаю'][+($(this).attr('fw') == "1")]);
					})
					.click(function(){
						var _this = this;
						$.get(APP_URL + '/user/ajax/followmember/', {
								memberId: userUID,
							}, function (res) {
								if( res.status == 1 ){
									var fw = +(res.follower !== null);
									$(_this)
										.html( ['Читать', 'Читаю'][fw] )
										.attr( 'class', ['readButton', 'unreadButton'][fw] )
										.attr( 'fw', fw );
									if( fw == 0 ){
										delete window.myFollows.list[userUID];
									}else if( typeof window.myFollows.list[userUID] == 'undefined' ){
										window.myFollows.list[userUID] = res.follower;
									}
								}
							}, 'json');
					})
				);
		},
	}).update(function(){
		$("#forumMessagesList .forumMessagesListMessage").each(function(midx, msg){
			window.myFollows.add_button(msg);		
		});
	});