mute and bugfixes

This commit is contained in:
Hannes Mannerheim 2016-03-04 23:07:15 +01:00
parent 4d5b8e2907
commit 9bf92d11aa
39 changed files with 1094 additions and 144 deletions

View File

@ -153,6 +153,11 @@ class QvitterPlugin extends Plugin {
// route/reroute urls
public function onRouterInitialized($m)
{
$m->connect(':nickname/mutes',
array('action' => 'qvitter',
'nickname' => Nickname::INPUT_FMT));
$m->connect('api/qvitter/mutes.json',
array('action' => 'ApiQvitterMutes'));
$m->connect('api/qvitter/sandboxed.:format',
array('action' => 'ApiQvitterSandboxed',
'format' => '(xml|json)'));
@ -1291,6 +1296,16 @@ class QvitterPlugin extends Plugin {
$notification->whereAdd(sprintf('qvitternotification.from_profile_id IN (SELECT subscribed FROM subscription WHERE subscriber = %u)', $user_id));
}
// the user might have opted out from notifications from profiles they have muted
$hide_notifications_from_muted_users = Profile_prefs::getConfigData($profile, 'qvitter', 'hide_notifications_from_muted_users');
if($hide_notifications_from_muted_users == '1') {
$muted_ids = QvitterMuted::getMutedIDs($profile->id,0,10000); // get all (hopefully not more than 10 000...)
if($muted_ids !== false && count($muted_ids) > 0) {
$ids_imploded = implode(',',$muted_ids);
$notification->whereAdd('qvitternotification.from_profile_id NOT IN ('.$ids_imploded.')');
}
}
// the user might have opted out from certain notification types
$current_profile = $user->getProfile();
$disable_notify_replies_and_mentions = Profile_prefs::getConfigData($current_profile, 'qvitter', 'disable_notify_replies_and_mentions');

View File

@ -96,7 +96,7 @@ class ApiQvitterBlocksAction extends ApiPrivateAuthAction
}
/**
* Get the user's subscribers (followers) as an array of profiles
* Get the user's blocked profiles
*
* @return array Profiles
*/

182
actions/apiqvittermutes.php Normal file
View File

@ -0,0 +1,182 @@
<?php
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· API for getting all muted profiles for a profile ·
· ·
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· ·
· Q V I T T E R ·
· ·
· https://git.gnu.io/h2p/Qvitter ·
· ·
· ·
· <o) ·
· /_//// ·
· (____/ ·
· (o< ·
· o> \\\\_\ ·
· \\) \____) ·
· ·
· ·
· ·
· Qvitter is free software: you can redistribute it and / or modify it ·
· under the terms of the GNU Affero General Public License as published by ·
· the Free Software Foundation, either version three of the License or (at ·
· your option) any later version. ·
· ·
· Qvitter is distributed in hope that it will be useful but WITHOUT ANY ·
· WARRANTY; without even the implied warranty of MERCHANTABILTY or FITNESS ·
· FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for ·
· more details. ·
· ·
· You should have received a copy of the GNU Affero General Public License ·
· along with Qvitter. If not, see <http://www.gnu.org/licenses/>. ·
· ·
· Contact h@nnesmannerhe.im if you have any questions. ·
· ·
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · */
if (!defined('GNUSOCIAL')) { exit(1); }
class ApiQvitterMutesAction extends ApiPrivateAuthAction
{
var $profiles = null;
/**
* Take arguments for running
*
* @param array $args $_REQUEST args
*
* @return boolean success flag
*/
protected function prepare(array $args=array())
{
parent::prepare($args);
$this->format = 'json';
$this->count = (int)$this->arg('count', 100);
return true;
}
/**
* Handle the request
*
* Show the profiles
*
* @return void
*/
protected function handle()
{
parent::handle();
$this->target = Profile::current();
if(!$this->target instanceof Profile) {
$this->clientError(_('You have to be logged in to view your mutes.'), 403);
}
$this->profiles = $this->getProfiles();
$this->initDocument('json');
print json_encode($this->showProfiles());
$this->endDocument('json');
}
/**
* Get the user's muted profiles
*
* @return array Profiles
*/
protected function getProfiles()
{
$offset = ($this->page - 1) * $this->count;
$limit = $this->count;
$mutes = QvitterMuted::getMutedProfiles($this->target->id, $offset, $limit);
if($mutes) {
return $mutes;
} else {
return false;
}
}
/**
* Is this action read only?
*
* @param array $args other arguments
*
* @return boolean true
*/
function isReadOnly($args)
{
return true;
}
/**
* When was this feed last modified?
*
* @return string datestamp of the latest profile in the stream
*/
function lastModified()
{
if (!empty($this->profiles) && (count($this->profiles) > 0)) {
return strtotime($this->profiles[0]->modified);
}
return null;
}
/**
* An entity tag for this action
*
* Returns an Etag based on the action name, language, user ID, and
* timestamps of the first and last profiles in the subscriptions list
* There's also an indicator to show whether this action is being called
* as /api/statuses/(friends|followers) or /api/(friends|followers)/ids
*
* @return string etag
*/
function etag()
{
if (!empty($this->profiles) && (count($this->profiles) > 0)) {
$last = count($this->profiles) - 1;
return '"' . implode(
':',
array($this->arg('action'),
common_user_cache_hash($this->auth_user),
common_language(),
$this->target->id,
'Profiles',
strtotime($this->profiles[0]->modified),
strtotime($this->profiles[$last]->modified))
)
. '"';
}
return null;
}
/**
* Show the profiles as Twitter-style useres and statuses
*
* @return void
*/
function showProfiles()
{
$user_arrays = array();
if($this->profiles !== false) {
foreach ($this->profiles as $profile) {
$user_arrays[] = $this->twitterUserArray($profile, false );
}
}
return $user_arrays;
}
}

View File

@ -480,11 +480,8 @@ class QvitterAction extends ApiAction
<span class="caret-outer"></span>
<span class="caret-inner"></span>
</li>
<li class="fullwidth"><a id="logout"></a></li>
<li class="fullwidth"><a id="top-menu-profile-link" class="no-hover-card" href="<?php print $instanceurl.$logged_in_user_obj['screen_name']; ?>"><div id="top-menu-profile-link-fullname"><?php print $logged_in_user_obj['name']; ?></div><div id="top-menu-profile-link-view-profile"></div></a></li>
<li class="fullwidth dropdown-divider"></li>
<li class="fullwidth"><a id="edit-profile-header-link"></a></li>
<li class="fullwidth"><a id="settings" href="<?php print $instanceurl; ?>settings/profile" donthijack></a></li>
<li class="fullwidth"><a id="blocking-link" href="<?php print $instanceurl.$logged_in_user_obj['screen_name'].'/blocks'; ?>"></a></li>
<li class="fullwidth"><a id="faq-link"></a></li>
<li class="fullwidth"><a id="tou-link"></a></li>
<li class="fullwidth"><a id="shortcuts-link"></a></li>
@ -492,6 +489,8 @@ class QvitterAction extends ApiAction
<li class="fullwidth"><a id="invite-link" href="<?php print $instanceurl; ?>main/invite"></a></li>
<?php } ?>
<li class="fullwidth"><a id="classic-link"></a></li>
<li class="fullwidth dropdown-divider"></li>
<li class="fullwidth"><a id="logout"></a></li>
<li class="fullwidth language dropdown-divider"></li>
<?php
@ -601,7 +600,7 @@ class QvitterAction extends ApiAction
if($logged_in_user) { ?>
<div id="user-container" style="display:none;">
<div id="user-header" style="background-image:url('<?php print htmlspecialchars($logged_in_user_obj['cover_photo']) ?>')">
<div id="mini-edit-profile-button"></div>
<div id="mini-logged-in-user-cog-wheel"></div>
<div class="profile-header-inner-overlay"></div>
<div id="user-avatar-container"><img id="user-avatar" src="<?php print htmlspecialchars($logged_in_user_obj['profile_image_url_profile_size']) ?>" /></div>
<div id="user-name"><?php print htmlspecialchars($logged_in_user_obj['name']) ?></div>

View File

@ -48,6 +48,16 @@ class NotificationStream
$notification->whereAdd(sprintf('qvitternotification.from_profile_id IN (SELECT subscribed FROM subscription WHERE subscriber = %u)', $current_profile->id));
}
// the user might have opted out from notifications from profiles they have muted
$hide_notifications_from_muted_users = Profile_prefs::getConfigData($current_profile, 'qvitter', 'hide_notifications_from_muted_users');
if($hide_notifications_from_muted_users == '1') {
$muted_ids = QvitterMuted::getMutedIDs($current_profile->id,0,10000); // get all (hopefully not more than 10 000...)
if($muted_ids !== false && count($muted_ids) > 0) {
$ids_imploded = implode(',',$muted_ids);
$notification->whereAdd('qvitternotification.from_profile_id NOT IN ('.$ids_imploded.')');
}
}
// the user might have opted out from certain notification types
$disable_notify_replies_and_mentions = Profile_prefs::getConfigData($current_profile, 'qvitter', 'disable_notify_replies_and_mentions');
$disable_notify_favs = Profile_prefs::getConfigData($current_profile, 'qvitter', 'disable_notify_favs');

105
classes/QvitterMuted.php Normal file
View File

@ -0,0 +1,105 @@
<?php
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· Get muted profiles for a profile ·
· ·
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
· ·
· ·
· Q V I T T E R ·
· ·
· https://git.gnu.io/h2p/Qvitter ·
· ·
· ·
· <o) ·
· /_//// ·
· (____/ ·
· (o< ·
· o> \\\\_\ ·
· \\) \____) ·
· ·
· ·
· ·
· Qvitter is free software: you can redistribute it and / or modify it ·
· under the terms of the GNU Affero General Public License as published by ·
· the Free Software Foundation, either version three of the License or (at ·
· your option) any later version. ·
· ·
· Qvitter is distributed in hope that it will be useful but WITHOUT ANY ·
· WARRANTY; without even the implied warranty of MERCHANTABILTY or FITNESS ·
· FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for ·
· more details. ·
· ·
· You should have received a copy of the GNU Affero General Public License ·
· along with Qvitter. If not, see <http://www.gnu.org/licenses/>. ·
· ·
· Contact h@nnesmannerhe.im if you have any questions. ·
· ·
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · */
if (!defined('GNUSOCIAL')) { exit(1); }
class QvitterMuted
{
public static function getMutedProfiles($profile_id, $offset = 0, $limit = PROFILES_PER_PAGE)
{
$ids = self::getMutedIDs($profile_id, $offset, $limit);
if(count($ids) === 0) {
return false;
} else {
$profiles = array();
foreach($ids as $id) {
try {
$profiles[] = Profile::getByID($id);
} catch (Exception $e) {
//
}
}
if(count($profiles) === 0) {
return false;
} else {
return $profiles;
}
}
}
public static function getMutedIDs($profile_id, $offset, $limit)
{
if(!is_numeric($profile_id)) {
return false;
}
$mutes = new Profile_prefs();
$mutes->selectAdd('topic');
$mutes->whereAdd("profile_id = ".$profile_id);
$mutes->whereAdd("namespace = 'qvitter'");
$mutes->whereAdd("data = '1'");
$mutes->whereAdd("topic LIKE 'mute:%'");
$mutes->orderBy('modified DESC');
$mutes->limit($offset, $limit);
if (!$mutes->find()) {
return array();
}
$topics = $mutes->fetchAll('topic');
$ids = array();
foreach($topics as $topic) {
$topic_exploded = explode(':',$topic);
if(is_numeric($topic_exploded[1])) {
$ids[] = $topic_exploded[1];
}
}
return $ids;
}
}

View File

@ -491,6 +491,7 @@ button.icon.nav-search span {
.dropdown-menu li.fullwidth:not(.dropdown-caret) {
width:100%;
text-align:left;
margin-left: 0;
}
body.rtl .dropdown-menu li:not(.dropdown-caret) {
text-align:right;
@ -517,11 +518,32 @@ body.rtl .dropdown-menu li:not(.dropdown-caret) {
width: 100%;
box-sizing:border-box;
}
.dropdown-menu li:not(.dropdown-caret) a:hover {
color: #FFFFFF;
text-decoration: none;
}
#top-menu-profile-link-fullname,
#top-menu-profile-link-view-profile {
width:100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size:11px;
color:#999;
}
#top-menu-profile-link-fullname {
font-size:13px;
font-weight:700;
color:#292f33;
margin-top:5px;
}
#top-menu-profile-link:hover div {
color:#fff;
}
/* dropdown menu from ellipsis button */
.action-ellipsis-container {
position:relative;
@ -549,6 +571,10 @@ body.rtl .dropdown-menu li:not(.dropdown-caret) {
content:' ';
}
.dropdown-menu .row-type-profile-prefs-toggle.tick-disabled::before {
content:' ';
}
/* these toggles are inverted, they appear the the user as disabled when enabled,
since they are enabled by default....*/
.dropdown-menu a#disable_notify_replies_and_mentions.disabled::before,
@ -1703,6 +1729,34 @@ body.rtl #history-container.menu-container a .chev-right {
display:block;
}
.stream-item.user.user-muted > .queet > .user-menu-cog::after,
.profile-card.user-muted .user-menu-cog::after,
.stream-item.notice.user-muted > .queet .account-group .name::after,
.stream-item.notification.user-muted > .queet .account-group .name::after {
display:block;
position: absolute;
width: 20px;
height: 20px;
left:-20px;
top:0;
color:#e81c4f;
content:'\f070';
font-family: fontAwesome;
}
.hover-card .profile-card.user-muted .user-menu-cog::after {
left:auto;
right:-25px;
}
.stream-item.notice.user-muted > .queet .account-group .name::after,
.stream-item.notification.user-muted > .queet .account-group .name::after {
display: inline-block;
height: auto;
left: auto;
margin: 0 5px;
position: relative;
width: auto;
}
.queet-streams {
bottom: 0;
color: #999999;
@ -2075,11 +2129,15 @@ body.rtl .queet.rtl .expanded-content {
color:#999999;
}
.stream-item:not(.expanded).profile-blocked-by-me {
.stream-item:not(.expanded):not(.user).profile-blocked-by-me,
.stream-item:not(.expanded):not(.user):not(.notification).user-muted,
#feed-body.hide-notifications-from-muted-users .stream-item:not(.expanded).user-muted {
height:15px;
overflow:hidden;
}
.stream-item:not(.expanded).profile-blocked-by-me::before {
.stream-item:not(.expanded):not(.user).profile-blocked-by-me::before,
.stream-item:not(.expanded):not(.user):not(.notification).user-muted::before,
#feed-body.hide-notifications-from-muted-users .stream-item:not(.expanded).user-muted::before {
display: block;
position: absolute;
left:0;
@ -2093,12 +2151,16 @@ body.rtl .queet.rtl .expanded-content {
box-sizing: border-box;
}
.stream-item:not(.expanded).profile-blocked-by-me .queet {
.stream-item:not(.expanded):not(.user).profile-blocked-by-me .queet,
.stream-item:not(.expanded):not(.user):not(.notification).user-muted .queet,
#feed-body.hide-notifications-from-muted-users .stream-item:not(.expanded).user-muted .queet {
width:20px;
position:absolute;
right:0;
}
.stream-item:not(.expanded).profile-blocked-by-me .queet::before {
.stream-item:not(.expanded):not(.user).profile-blocked-by-me .queet::before,
.stream-item:not(.expanded):not(.user):not(.notification).user-muted .queet::before,
#feed-body.hide-notifications-from-muted-users .stream-item:not(.expanded).user-muted .queet::before {
display: block;
position: absolute;
left:0;
@ -2117,6 +2179,10 @@ body.rtl .queet.rtl .expanded-content {
border-bottom:1px solid #ddd;
box-sizing: border-box;
}
.stream-item:not(.expanded):not(.user):not(.notification).user-muted .queet::before,
#feed-body.hide-notifications-from-muted-users .stream-item:not(.expanded).user-muted .queet::before {
content: '\f070';
}
#feed-body > .stream-item.activity {
display:none;
@ -3477,18 +3543,18 @@ span.inline-reply-caret .caret-inner {
content:'@';
}
#mini-edit-profile-button {
#mini-logged-in-user-cog-wheel {
width:30px;
height:30px;
position:absolute;
z-index:102;
z-index:201;
right:5px;
top:5px;
}
#mini-edit-profile-button:before {
#mini-logged-in-user-cog-wheel:before {
font-family: 'FontAwesome';
font-size:17px;
content:'\f044';
content:'\f013';
display:block;
position:absolute;
width:30px;
@ -3496,10 +3562,10 @@ span.inline-reply-caret .caret-inner {
line-height:30px;
text-align:center;
text-shadow:none;
color:rgba(255,255,255,0.7);
color:rgba(255,255,255,0.9);
z-index:102;
}
#mini-edit-profile-button:hover:before {
#mini-logged-in-user-cog-wheel:hover:before {
color:rgba(255,255,255,1);
}
@ -4709,14 +4775,16 @@ background:rgba(0,0,0,0.2);
content: " ";
clear: both;
}
.modal-container[id*="popup-reply-"] .modal-footer {
.modal-container[id*="popup-reply-"] .modal-footer,
#queet-thumb-popup .modal-footer {
padding:0;
}
.modal-container[id*="popup-reply-"] .modal-footer {}
.modal-footer .queet,
.modal-footer .stream-item {
border:0 none;
cursor:auto;
border-radius: 0 0 5px 5px;
}
.modal-footer .queet:hover {
background-color:#fff;
@ -5568,11 +5636,14 @@ body.rtl #feed-header-inner h2 {
z-index: 1;
}
#feed,
.profile-card {
#feed {
position:relative;
z-index:10;
}
.profile-card {
position:relative;
z-index:11;
}
#search-query-hint {
display:none;

View File

@ -81,22 +81,31 @@ function getMenu(menuArray) {
// enabled?
var prefEnabledOrDisabled = 'disabled';
if(typeof window.qvitterProfilePrefs[this.topic] != 'undefined'
&& window.qvitterProfilePrefs[this.topic] !== null
&& window.qvitterProfilePrefs[this.topic] != ''
&& window.qvitterProfilePrefs[this.topic] !== false
&& window.qvitterProfilePrefs[this.topic] != 0
&& window.qvitterProfilePrefs[this.topic] != '0') {
if(isQvitterProfilePrefEnabled(this.topic)) {
prefEnabledOrDisabled = 'enabled';
}
// sometimes we want another label when the toggle is enabled
var labelToUse = this.label;
if(isQvitterProfilePrefEnabled(this.topic) && typeof this.enabledLabel != 'undefined') {
labelToUse = this.enabledLabel;
}
// the tick can be disabled
var disableTickClass = '';
if(typeof this.tickDisabled != 'undefined' && this.tickDisabled === true) {
var disableTickClass = ' tick-disabled';
}
// get row html
menuHTML = menuHTML + buildMenuRowFullwidth(this.label, {
menuHTML = menuHTML + buildMenuRowFullwidth(labelToUse, {
id: this.topic,
class: 'row-type-' + this.type + ' ' + prefEnabledOrDisabled,
class: 'row-type-' + this.type + ' ' + prefEnabledOrDisabled + disableTickClass,
'data-menu-row-type': this.type,
'data-profile-prefs-topic': this.topic,
'data-profile-prefs-namespace': this.namespace,
'data-profile-prefs-label': replaceHtmlSpecialChars(this.label),
'data-profile-prefs-enabled-label': replaceHtmlSpecialChars(this.enabledLabel),
'data-profile-pref-state': prefEnabledOrDisabled,
'data-profile-pref-callback': this.callback
});
@ -380,6 +389,11 @@ function buildProfileCard(data) {
if(data.is_sandboxed === true) {
is_sandboxed = ' sandboxed';
}
// muted?
var is_muted = '';
if(isUserMuted(data.id)) {
is_muted = ' user-muted';
}
var followButton = '';
@ -406,7 +420,7 @@ function buildProfileCard(data) {
// full card html
data.profileCardHtml = '\
<div class="profile-card' + is_me + logged_in + '">\
<div class="profile-card' + is_me + logged_in + is_muted + '">\
<div class="profile-header-inner' + is_silenced + is_sandboxed + '" style="' + coverPhotoHtml + '" data-user-id="' + data.id + '" data-screen-name="' + data.screen_name + '">\
<div class="profile-header-inner-overlay"></div>\
<a class="profile-picture" href="' + data.profile_image_url_original + '">\
@ -495,6 +509,12 @@ function buildExternalProfileCard(data) {
is_sandboxed = ' sandboxed';
}
// muted?
var is_muted = '';
if(isUserMuted(data.local.id)) {
is_muted = ' user-muted';
}
// local id/screen_name
var localUserId = data.local.id;
var localUserScreenName = data.local.screen_name;
@ -532,7 +552,7 @@ function buildExternalProfileCard(data) {
data.screenNameWithServer = '@' + data.screen_name + '@' + serverUrl;
data.profileCardHtml = '\
<div class="profile-card' + is_me + logged_in + '">\
<div class="profile-card' + is_me + logged_in + is_muted + '">\
<div class="profile-header-inner' + is_silenced + is_sandboxed + '" style="background-image:url(\'' + cover_photo + '\')" data-user-id="' + localUserId + '" data-screen-name="' + localUserScreenName + '">\
<div class="profile-header-inner-overlay"></div>\
<a class="profile-picture"><img src="' + data.profile_image_url_profile_size + '" /></a>\
@ -813,6 +833,10 @@ function setNewCurrentStream(streamObject,setLocation,fallbackId,actionOnSuccess
markAllNoticesFromBlockedUsersAsBlockedInJQueryObject(oldStreamState);
}
// mark all notices and profile cards from muted users as muted
markAllNoticesFromMutedUsersAsMutedInJQueryObject(oldStreamState);
markAllProfileCardsFromMutedUsersAsMutedInDOM();
// hide dublicate repeats, only show the first/oldest instance of a notice
oldStreamState = hideAllButOldestInstanceOfStreamItem(oldStreamState);
@ -1367,7 +1391,7 @@ function cleanUpAfterCollapseQueet(streamItem) {
streamItem.find('.view-more-container-top').remove();
streamItem.find('.view-more-container-bottom').remove();
streamItem.find('.inline-reply-queetbox').remove();
streamItem.find('.stream-item.conversation').remove();
streamItem.children('.stream-item.conversation').remove();
streamItem.find('.show-full-conversation').remove();
streamItem.removeAttr('style');
queet.removeAttr('style');
@ -1734,7 +1758,11 @@ function addToFeed(feed, after, extraClasses) {
var notificationTime = parseTwitterDate(obj.created_at);
if(obj.is_seen == '0') {
extraClassesThisRun += ' not-seen'
extraClassesThisRun += ' not-seen';
}
if(isUserMuted(obj.from_profile.id)) {
extraClassesThisRun += ' user-muted';
}
// external
@ -1743,10 +1771,9 @@ function addToFeed(feed, after, extraClasses) {
ostatusHtml = '<a target="_blank" data-tooltip="' + window.sL.goToOriginalNotice + '" class="ostatus-link" href="' + obj.from_profile.statusnet_profile_url + '"></a>';
}
if(obj.ntype == 'like') {
var noticeTime = parseTwitterDate(obj.notice.created_at);
var notificationHtml = '<div data-quitter-id-in-stream="' + obj.id + '" id="stream-item-n-' + obj.id + '" class="stream-item ' + extraClassesThisRun + ' notification like">\
var notificationHtml = '<div data-user-id="' + obj.from_profile.id + '" data-quitter-id-in-stream="' + obj.id + '" id="stream-item-n-' + obj.id + '" class="stream-item ' + extraClassesThisRun + ' notification like">\
<div class="queet">\
<div class="dogear"></div>\
' + ostatusHtml + '\
@ -1772,7 +1799,7 @@ function addToFeed(feed, after, extraClasses) {
}
else if(obj.ntype == 'repeat') {
var noticeTime = parseTwitterDate(obj.notice.created_at);
var notificationHtml = '<div data-quitter-id-in-stream="' + obj.id + '" id="stream-item-n-' + obj.id + '" class="stream-item ' + extraClassesThisRun + ' notification repeat">\
var notificationHtml = '<div data-user-id="' + obj.from_profile.id + '" data-quitter-id-in-stream="' + obj.id + '" id="stream-item-n-' + obj.id + '" class="stream-item ' + extraClassesThisRun + ' notification repeat">\
<div class="queet">\
<div class="dogear"></div>\
' + ostatusHtml + '\
@ -1803,7 +1830,7 @@ function addToFeed(feed, after, extraClasses) {
var notificationHtml = buildQueetHtml(obj.notice, obj.id, extraClassesThisRun + ' notification reply');
}
else if(obj.ntype == 'follow') {
var notificationHtml = '<div data-quitter-id-in-stream="' + obj.id + '" id="stream-item-n-' + obj.id + '" class="stream-item ' + extraClassesThisRun + ' notification follow">\
var notificationHtml = '<div data-user-id="' + obj.from_profile.id + '" data-quitter-id-in-stream="' + obj.id + '" id="stream-item-n-' + obj.id + '" class="stream-item ' + extraClassesThisRun + ' notification follow">\
<div class="queet">\
<div class="queet-content">\
' + ostatusHtml + '\
@ -2015,6 +2042,11 @@ function buildUserStreamItemHtml(obj) {
if(window.loggedIn !== false) {
loggedInClass = ' logged-in';
}
// muted?
var mutedClass = '';
if(isUserMuted(obj.id)) {
mutedClass = ' user-muted';
}
var followButton = '';
if(typeof window.loggedIn.screen_name != 'undefined' // if logged in
@ -2024,7 +2056,7 @@ function buildUserStreamItemHtml(obj) {
}
}
return '<div id="stream-item-' + obj.id + '" class="stream-item user' + silencedClass + sandboxedClass + '" data-user-id="' + obj.id + '">\
return '<div id="stream-item-' + obj.id + '" class="stream-item user' + silencedClass + sandboxedClass + mutedClass + '" data-user-id="' + obj.id + '">\
<div class="queet ' + rtlOrNot + '">\
' + followButton + '\
<div class="user-menu-cog' + silencedClass + sandboxedClass + loggedInClass + '" data-tooltip="' + window.sL.userOptions + '" data-user-id="' + obj.id + '" data-screen-name="' + obj.screen_name + '"></div>\
@ -2069,6 +2101,11 @@ function buildQueetHtml(obj, idInStream, extraClasses, requeeted_by, isConversat
});
}
// muted? (if class is not already added)
if(isUserMuted(obj.user.id) && extraClasses.indexOf(' user-muted') == -1) {
extraClasses += ' user-muted';
blockingTooltip = ' data-tooltip="' + window.sL.thisIsANoticeFromAMutedUser + '"';
}
// silenced?
if(obj.user.is_silenced === true) {
extraClasses += ' silenced';

View File

@ -3,4 +3,4 @@
* https://github.com/ded/bowser
* MIT License | (c) Dustin Diaz 2015
*/
!function(e,t){typeof module!="undefined"&&module.exports?module.exports=t():typeof define=="function"&&define.amd?define(t):this[e]=t()}("bowser",function(){function t(t){function n(e){var n=t.match(e);return n&&n.length>1&&n[1]||""}function r(e){var n=t.match(e);return n&&n.length>1&&n[2]||""}var i=n(/(ipod|iphone|ipad)/i).toLowerCase(),s=/like android/i.test(t),o=!s&&/android/i.test(t),u=/CrOS/.test(t),a=n(/edge\/(\d+(\.\d+)?)/i),f=n(/version\/(\d+(\.\d+)?)/i),l=/tablet/i.test(t),c=!l&&/[^-]mobi/i.test(t),h;/opera|opr/i.test(t)?h={name:"Opera",opera:e,version:f||n(/(?:opera|opr)[\s\/](\d+(\.\d+)?)/i)}:/yabrowser/i.test(t)?h={name:"Yandex Browser",yandexbrowser:e,version:f||n(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)}:/windows phone/i.test(t)?(h={name:"Windows Phone",windowsphone:e},a?(h.msedge=e,h.version=a):(h.msie=e,h.version=n(/iemobile\/(\d+(\.\d+)?)/i))):/msie|trident/i.test(t)?h={name:"Internet Explorer",msie:e,version:n(/(?:msie |rv:)(\d+(\.\d+)?)/i)}:u?h={name:"Chrome",chromeBook:e,chrome:e,version:n(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:/chrome.+? edge/i.test(t)?h={name:"Microsoft Edge",msedge:e,version:a}:/chrome|crios|crmo/i.test(t)?h={name:"Chrome",chrome:e,version:n(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:i?(h={name:i=="iphone"?"iPhone":i=="ipad"?"iPad":"iPod"},f&&(h.version=f)):/sailfish/i.test(t)?h={name:"Sailfish",sailfish:e,version:n(/sailfish\s?browser\/(\d+(\.\d+)?)/i)}:/seamonkey\//i.test(t)?h={name:"SeaMonkey",seamonkey:e,version:n(/seamonkey\/(\d+(\.\d+)?)/i)}:/firefox|iceweasel/i.test(t)?(h={name:"Firefox",firefox:e,version:n(/(?:firefox|iceweasel)[ \/](\d+(\.\d+)?)/i)},/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(t)&&(h.firefoxos=e)):/silk/i.test(t)?h={name:"Amazon Silk",silk:e,version:n(/silk\/(\d+(\.\d+)?)/i)}:o?h={name:"Android",version:f}:/phantom/i.test(t)?h={name:"PhantomJS",phantom:e,version:n(/phantomjs\/(\d+(\.\d+)?)/i)}:/blackberry|\bbb\d+/i.test(t)||/rim\stablet/i.test(t)?h={name:"BlackBerry",blackberry:e,version:f||n(/blackberry[\d]+\/(\d+(\.\d+)?)/i)}:/(web|hpw)os/i.test(t)?(h={name:"WebOS",webos:e,version:f||n(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)},/touchpad\//i.test(t)&&(h.touchpad=e)):/bada/i.test(t)?h={name:"Bada",bada:e,version:n(/dolfin\/(\d+(\.\d+)?)/i)}:/tizen/i.test(t)?h={name:"Tizen",tizen:e,version:n(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i)||f}:/safari/i.test(t)?h={name:"Safari",safari:e,version:f}:h={name:n(/^(.*)\/(.*) /),version:r(/^(.*)\/(.*) /)},!h.msedge&&/(apple)?webkit/i.test(t)?(h.name=h.name||"Webkit",h.webkit=e,!h.version&&f&&(h.version=f)):!h.opera&&/gecko\//i.test(t)&&(h.name=h.name||"Gecko",h.gecko=e,h.version=h.version||n(/gecko\/(\d+(\.\d+)?)/i)),!h.msedge&&(o||h.silk)?h.android=e:i&&(h[i]=e,h.ios=e);var p="";h.windowsphone?p=n(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i):i?(p=n(/os (\d+([_\s]\d+)*) like mac os x/i),p=p.replace(/[_\s]/g,".")):o?p=n(/android[ \/-](\d+(\.\d+)*)/i):h.webos?p=n(/(?:web|hpw)os\/(\d+(\.\d+)*)/i):h.blackberry?p=n(/rim\stablet\sos\s(\d+(\.\d+)*)/i):h.bada?p=n(/bada\/(\d+(\.\d+)*)/i):h.tizen&&(p=n(/tizen[\/\s](\d+(\.\d+)*)/i)),p&&(h.osversion=p);var d=p.split(".")[0];if(l||i=="ipad"||o&&(d==3||d==4&&!c)||h.silk)h.tablet=e;else if(c||i=="iphone"||i=="ipod"||o||h.blackberry||h.webos||h.bada)h.mobile=e;return h.msedge||h.msie&&h.version>=10||h.yandexbrowser&&h.version>=15||h.chrome&&h.version>=20||h.firefox&&h.version>=20||h.safari&&h.version>=6||h.opera&&h.version>=10||h.ios&&h.osversion&&h.osversion.split(".")[0]>=6||h.blackberry&&h.version>=10.1?h.a=e:h.msie&&h.version<10||h.chrome&&h.version<20||h.firefox&&h.version<20||h.safari&&h.version<6||h.opera&&h.version<10||h.ios&&h.osversion&&h.osversion.split(".")[0]<6?h.c=e:h.x=e,h}var e=!0,n=t(typeof navigator!="undefined"?navigator.userAgent:"");return n.test=function(e){for(var t=0;t<e.length;++t){var r=e[t];if(typeof r=="string"&&r in n)return!0}return!1},n._detect=t,n})
!function(e,t){typeof module!="undefined"&&module.exports?module.exports=t():typeof define=="function"&&define.amd?define(t):this[e]=t()}("bowser",function(){function t(t){function n(e){var n=t.match(e);return n&&n.length>1&&n[1]||""}function r(e){var n=t.match(e);return n&&n.length>1&&n[2]||""}var i=n(/(ipod|iphone|ipad)/i).toLowerCase(),s=/like android/i.test(t),o=!s&&/android/i.test(t),u=/CrOS/.test(t),a=n(/edge\/(\d+(\.\d+)?)/i),f=n(/version\/(\d+(\.\d+)?)/i),l=/tablet/i.test(t),c=!l&&/[^-]mobi/i.test(t),h;/opera|opr/i.test(t)?h={name:"Opera",opera:e,version:f||n(/(?:opera|opr)[\s\/](\d+(\.\d+)?)/i)}:/yabrowser/i.test(t)?h={name:"Yandex Browser",yandexbrowser:e,version:f||n(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)}:/windows phone/i.test(t)?(h={name:"Windows Phone",windowsphone:e},a?(h.msedge=e,h.version=a):(h.msie=e,h.version=n(/iemobile\/(\d+(\.\d+)?)/i))):/msie|trident/i.test(t)?h={name:"Internet Explorer",msie:e,version:n(/(?:msie |rv:)(\d+(\.\d+)?)/i)}:u?h={name:"Chrome",chromeBook:e,chrome:e,version:n(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:/chrome.+? edge/i.test(t)?h={name:"Microsoft Edge",msedge:e,version:a}:/chrome|crios|crmo/i.test(t)?h={name:"Chrome",chrome:e,version:n(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)}:i?(h={name:i=="iphone"?"iPhone":i=="ipad"?"iPad":"iPod"},f&&(h.version=f)):/sailfish/i.test(t)?h={name:"Sailfish",sailfish:e,version:n(/sailfish\s?browser\/(\d+(\.\d+)?)/i)}:/seamonkey\//i.test(t)?h={name:"SeaMonkey",seamonkey:e,version:n(/seamonkey\/(\d+(\.\d+)?)/i)}:/firefox|iceweasel/i.test(t)?(h={name:"Firefox",firefox:e,version:n(/(?:firefox|iceweasel)[ \/](\d+(\.\d+)?)/i)},/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(t)&&(h.firefoxos=e)):/silk/i.test(t)?h={name:"Amazon Silk",silk:e,version:n(/silk\/(\d+(\.\d+)?)/i)}:o?h={name:"Android",version:f}:/phantom/i.test(t)?h={name:"PhantomJS",phantom:e,version:n(/phantomjs\/(\d+(\.\d+)?)/i)}:/blackberry|\bbb\d+/i.test(t)||/rim\stablet/i.test(t)?h={name:"BlackBerry",blackberry:e,version:f||n(/blackberry[\d]+\/(\d+(\.\d+)?)/i)}:/(web|hpw)os/i.test(t)?(h={name:"WebOS",webos:e,version:f||n(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)},/touchpad\//i.test(t)&&(h.touchpad=e)):/bada/i.test(t)?h={name:"Bada",bada:e,version:n(/dolfin\/(\d+(\.\d+)?)/i)}:/tizen/i.test(t)?h={name:"Tizen",tizen:e,version:n(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i)||f}:/safari/i.test(t)?h={name:"Safari",safari:e,version:f}:h={name:n(/^(.*)\/(.*) /),version:r(/^(.*)\/(.*) /)},!h.msedge&&/(apple)?webkit/i.test(t)?(h.name=h.name||"Webkit",h.webkit=e,!h.version&&f&&(h.version=f)):!h.opera&&/gecko\//i.test(t)&&(h.name=h.name||"Gecko",h.gecko=e,h.version=h.version||n(/gecko\/(\d+(\.\d+)?)/i)),!h.msedge&&(o||h.silk)?h.android=e:i&&(h[i]=e,h.ios=e);var p="";h.windowsphone?p=n(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i):i?(p=n(/os (\d+([_\s]\d+)*) like mac os x/i),p=p.replace(/[_\s]/g,".")):o?p=n(/android[ \/-](\d+(\.\d+)*)/i):h.webos?p=n(/(?:web|hpw)os\/(\d+(\.\d+)*)/i):h.blackberry?p=n(/rim\stablet\sos\s(\d+(\.\d+)*)/i):h.bada?p=n(/bada\/(\d+(\.\d+)*)/i):h.tizen&&(p=n(/tizen[\/\s](\d+(\.\d+)*)/i)),p&&(h.osversion=p);var d=p.split(".")[0];if(l||i=="ipad"||o&&(d==3||d==4&&!c)||h.silk)h.tablet=e;else if(c||i=="iphone"||i=="ipod"||o||h.blackberry||h.webos||h.bada)h.mobile=e;return h.msedge||h.msie&&h.version>=10||h.yandexbrowser&&h.version>=15||h.chrome&&h.version>=20||h.firefox&&h.version>=20||h.safari&&h.version>=6||h.opera&&h.version>=10||h.ios&&h.osversion&&h.osversion.split(".")[0]>=6||h.blackberry&&h.version>=10.1?h.a=e:h.msie&&h.version<10||h.chrome&&h.version<20||h.firefox&&h.version<20||h.safari&&h.version<6||h.opera&&h.version<10||h.ios&&h.osversion&&h.osversion.split(".")[0]<6?h.c=e:h.x=e,h}var e=!0,n=t(typeof navigator!="undefined"?navigator.userAgent:"");return n.test=function(e){for(var t=0;t<e.length;++t){var r=e[t];if(typeof r=="string"&&r in n)return!0}return!1},n._detect=t,n})

View File

@ -117,9 +117,15 @@ function removeOldestLocalStorageEntries(callback) {
}
});
console.log('removed 100 old localstorage items');
console.log('removed ' + i + ' old localstorage items');
callback();
if(i>0) {
callback();
return true;
}
else {
return false;
}
}
@ -290,9 +296,18 @@ function localStorageIsEnabled() {
}
catch(e) {
if (e.name == 'QUOTA_EXCEEDED_ERR' || e.name == 'NS_ERROR_DOM_QUOTA_REACHED' || e.name == 'QuotaExceededError' || e.name == 'W3CException_DOM_QUOTA_EXCEEDED_ERR') {
removeOldestLocalStorageEntries(function(){
localStorageIsEnabled();
// if localstorage is empty but returns a full error, we assume it's disabled (in an ugly way)
if(localStorage.length === 0) {
return false;
}
var successfulRemoval = removeOldestLocalStorageEntries(function(){
return localStorageIsEnabled();
});
if(successfulRemoval === false) {
return false;
}
}
else {
return false;
@ -454,6 +469,58 @@ function markAllNoticesFromBlockedUsersAsBlockedInJQueryObject(obj) {
}
/* ·
·
· Marks all notices from muted users in an jQuery object as muted
·
· · · · · · · · · */
function markAllNoticesFromMutedUsersAsMutedInJQueryObject(obj) {
$.each(obj.find('.stream-item'),function(){
if(isUserMuted($(this).attr('data-user-id'))) {
$(this).addClass('user-muted');
$(this).children('.queet').attr('data-tooltip',window.sL.thisIsANoticeFromAMutedUser);
}
else {
$(this).children('.queet').removeAttr('data-tooltip');
$(this).removeClass('user-muted');
}
});
}
/* ·
·
· Marks all profile cards from muted users as muted in DOM
·
· · · · · · · · · */
function markAllProfileCardsFromMutedUsersAsMutedInDOM() {
$.each($('body').find('.profile-header-inner'),function(){
if(isUserMuted($(this).attr('data-user-id'))) {
$(this).parent('.profile-card').addClass('user-muted');
}
else {
$(this).parent('.profile-card').removeClass('user-muted');
}
});
}
/* ·
·
· Function invoked after mute and unmute
·
· · · · · · · · · */
function hideOrShowNoticesAfterMuteOrUnmute() {
markAllNoticesFromMutedUsersAsMutedInJQueryObject($('#feed-body'));
markAllProfileCardsFromMutedUsersAsMutedInDOM();
}
/* ·
·
· Sandbox/unsandbox user and do necessary stuff
@ -494,6 +561,39 @@ function silenceCreateOrDestroy(arg, callback) {
});
}
/* ·
·
· Get the logged in user's menu array
·
· · · · · · · · · */
function loggedInUsersMenuArray() {
return [
{
type: 'function',
functionName: 'goToEditProfile',
label: window.sL.editMyProfile
},
{
type: 'link',
href: window.siteInstanceURL + 'settings/profile',
label: window.sL.settings
},
{
type:'divider'
},
{
type: 'link',
href: window.siteInstanceURL + window.loggedIn.screen_name + '/mutes',
label: window.sL.userMuted
},
{
type: 'link',
href: window.siteInstanceURL + window.loggedIn.screen_name + '/blocks',
label: window.sL.userBlocked
}];
}
/* ·
·
@ -611,20 +711,36 @@ function isLocalURL(url) {
· · · · · · · · · */
function maybeShowTheNewQueetsBar() {
var new_queets_num = $('#feed-body').find('.stream-item.hidden:not(.always-hidden):not(.hidden-repeat)').length;
if(new_queets_num > 0) {
var newQueetsNum = $('#feed-body').find('.stream-item.hidden:not(.always-hidden):not(.hidden-repeat)').length;
// subtract the number of hidden notices from muted users if this isn't the notifications stream,
// or if this is the notifications stream but the user has opted out of seeing notifications from muted users
var mutedHiddenNum = 0;
if(window.currentStreamObject.name == 'notifications') {
if($('#feed-body').hasClass('hide-notifications-from-muted-users')) {
mutedHiddenNum = $('#feed-body').find('.stream-item.hidden.user-muted:not(.always-hidden):not(.hidden-repeat)').length;
}
}
else {
var mutedHiddenNum = $('#feed-body').find('.stream-item.hidden.user-muted:not(.always-hidden):not(.hidden-repeat)').length;
}
newQueetsNum = newQueetsNum - mutedHiddenNum;
if(newQueetsNum > 0) {
$('#new-queets-bar').parent().removeClass('hidden');
// bar label
if(new_queets_num == 1) { var q_txt = window.sL.newQueet; }
if(newQueetsNum == 1) { var q_txt = window.sL.newQueet; }
else { var q_txt = window.sL.newQueets; }
if(window.currentStreamObject.name == 'notifications') {
if(new_queets_num == 1) { var q_txt = window.sL.newNotification; }
if(newQueetsNum == 1) { var q_txt = window.sL.newNotification; }
else { var q_txt = window.sL.newNotifications; }
}
$('#new-queets-bar').html(q_txt.replace('{new-notice-count}',new_queets_num));
$('#new-queets-bar').html(q_txt.replace('{new-notice-count}',newQueetsNum));
}
}
@ -1319,19 +1435,9 @@ function rememberStreamStateInLocalStorage() {
var feed = $('<div/>').append(firstTwentyVisibleHTML);
// we add these again (with updated blocking list) when the notices are fetched from the cache
feed.children('.stream-item').removeClass('profile-blocked-by-me');
feed.children('.stream-item').children('.queet').removeAttr('data-tooltip'); // can contain tooltip about blocked user
// we add some of these things again when the notices are fetched from the cache
cleanStreamItemsFromClassesAndConversationElements(feed);
feed.find('.temp-post').remove();
feed.children('.stream-item').removeClass('not-seen');
feed.children('.stream-item').removeClass('hidden-repeat'); // this means we need hide repeats when adding cached notices to feed later
feed.children('.stream-item').removeClass('selected-by-keyboard');
feed.find('.dropdown-menu').remove();
feed.find('.stream-item').removeClass('expanded').removeClass('next-expanded').removeClass('hidden').removeClass('collapsing').addClass('visible');
feed.children('.stream-item').each(function() {
cleanUpAfterCollapseQueet($(this));
});
var feedHtml = feed.html();
var profileCardHtml = $('#feed').siblings('.profile-card').outerHTML();
var streamData = {
@ -1343,6 +1449,30 @@ function rememberStreamStateInLocalStorage() {
}
}
/* ·
·
· Clean stream items from classes and conversation elements,
· to use e.g. for caching and including in popup footers
·
· @param streamItems: jQuery object with stream items as children
·
· · · · · · · · · */
function cleanStreamItemsFromClassesAndConversationElements(streamItems) {
streamItems.children('.stream-item').removeClass('profile-blocked-by-me');
streamItems.children('.stream-item').children('.queet').removeAttr('data-tooltip'); // can contain tooltip about blocked user
streamItems.find('.temp-post').remove();
streamItems.children('.stream-item').removeClass('not-seen');
streamItems.children('.stream-item').removeClass('hidden-repeat'); // this means we need hide repeats when adding cached notices to feed later
streamItems.children('.stream-item').removeClass('selected-by-keyboard');
streamItems.find('.dropdown-menu').remove();
streamItems.find('.stream-item').removeClass('expanded').removeClass('next-expanded').removeClass('hidden').removeClass('collapsing').addClass('visible');
streamItems.children('.stream-item').each(function() {
cleanUpAfterCollapseQueet($(this));
});
}
/* ·
·
@ -1440,6 +1570,38 @@ function appendUserToMentionsSuggestionsArray(user) {
}
/* ·
·
· Is a profile pref in the qvitter namespace enabled?
·
· · · · · · · · · */
function isQvitterProfilePrefEnabled(topic) {
if(typeof window.qvitterProfilePrefs != 'undefined' && typeof window.qvitterProfilePrefs[topic] != 'undefined'
&& window.qvitterProfilePrefs[topic] !== null
&& window.qvitterProfilePrefs[topic] != ''
&& window.qvitterProfilePrefs[topic] !== false
&& window.qvitterProfilePrefs[topic] != 0
&& window.qvitterProfilePrefs[topic] != '0') {
return true;
}
return false;
}
/* ·
·
· Is this user muted?
·
· · · · · · · · · */
function isUserMuted(userID) {
if(isQvitterProfilePrefEnabled('mute:' + userID)) {
return true;
}
else {
return false;
}
}
/* ·
@ -1508,6 +1670,12 @@ function iterateRecursiveReplaceHtmlSpecialChars(obj) {
return obj;
}
function replaceHtmlSpecialChars(text) {
// don't do anything if the text is undefined
if(typeof text == 'undefined') {
return text;
}
var map = {
'&': '&amp;',
'<': '&lt;',

View File

@ -258,6 +258,11 @@ $('body').on('mouseover',function (e) {
return true;
}
// no hover card if the element has the no-hover-card class
if(targetElement.hasClass('no-hover-card')) {
return true;
}
// no hovercard for anchor links
if(hrefAttr.substring(0,1) == '#') {
return true;
@ -943,15 +948,16 @@ function proceedToSetLanguageAndLogin(data){
$('#invite-link').html(window.sL.inviteAFriend);
$('#classic-link').html(window.sL.classicInterface);
$('#edit-profile-header-link').html(window.sL.editMyProfile);
$('#mini-edit-profile-button').attr('data-tooltip',window.sL.editMyProfile);
$('#mini-logged-in-user-cog-wheel').attr('data-tooltip',window.sL.profileSettings);
$('#accessibility-toggle-link').html(window.sL.accessibilityToggleLink);
$('#settingslink .nav-session').attr('data-tooltip',window.sL.tooltipTopMenu);
$('#settingslink .nav-session').attr('data-tooltip',window.sL.profileAndSettings);
$('#top-compose').attr('data-tooltip',window.sL.compose);
$('button.upload-image').attr('data-tooltip',window.sL.tooltipAttachImage);
$('button.shorten').attr('data-tooltip',window.sL.tooltipShortenUrls);
$('.reload-stream').attr('data-tooltip',window.sL.tooltipReloadStream);
$('#clear-history').html(window.sL.clearHistory);
$('#user-screen-name, #user-avatar, #user-name').attr('data-tooltip', window.sL.viewMyProfilePage);
$('#top-menu-profile-link-view-profile').html(window.sL.viewMyProfilePage);
// show site body now
$('#user-container').css('display','block');
@ -1207,21 +1213,7 @@ $('body').on('click','.user-menu-cog',function(e){
// settings etc if it's me
if(userID == window.loggedIn.id) {
menuArray.push({
type: 'function',
functionName: 'triggerEditProfileButtonClick',
label: window.sL.editMyProfile
});
menuArray.push({
type: 'link',
href: window.siteInstanceURL + 'settings/profile',
label: window.sL.settings
});
menuArray.push({
type: 'link',
href: window.siteInstanceURL + window.loggedIn.screen_name + '/blocks',
label: window.sL.userBlocks
});
menuArray = loggedInUsersMenuArray();
}
// block etc if it not me
else {
@ -1246,6 +1238,17 @@ $('body').on('click','.user-menu-cog',function(e){
});
}
// mute profile pref
menuArray.push({
type: 'profile-prefs-toggle',
namespace: 'qvitter',
topic: 'mute:' + userID,
label: window.sL.muteUser,
enabledLabel: window.sL.unmuteUser,
tickDisabled: true,
callback: 'hideOrShowNoticesAfterMuteOrUnmute'
});
// moderator actions
menuArray = appendModeratorUserActionsToMenuArray(menuArray,userID,userScreenName,sandboxed,silenced);
}
@ -1364,6 +1367,17 @@ $('body').on('click','.sm-ellipsis',function(e){
label: window.sL.blockUser.replace('{username}',streamItemUsername)
});
}
// mute profile pref
menuArray.push({
type: 'profile-prefs-toggle',
namespace: 'qvitter',
topic: 'mute:' + streamItemUserID,
label: window.sL.muteUser,
enabledLabel: window.sL.unmuteUser,
tickDisabled: true,
callback: 'hideOrShowNoticesAfterMuteOrUnmute'
});
}
// moderator actions
@ -1402,7 +1416,7 @@ $('body').on('click','.row-type-function',function(e){
thisFunctionRow.addClass('clicked');
var functionName = $(this).attr('data-function-name');
if($(this).attr('data-function-arguments') == 'undefined') {
if(typeof $(this).attr('data-function-arguments') == 'undefined' || $(this).attr('data-function-arguments') == 'undefined') {
var functionArguments = false;
}
else {
@ -1445,6 +1459,8 @@ $('body').on('click','.row-type-profile-prefs-toggle',function(e){
var prefNamespace = thisToggle.attr('data-profile-prefs-namespace');
var prefTopic = thisToggle.attr('data-profile-prefs-topic');
var prefLabel = thisToggle.attr('data-profile-prefs-label');
var prefEnabledLabel = thisToggle.attr('data-profile-prefs-enabled-label');
// only prefs in the 'qvitter' namespace allowed
if(prefNamespace != 'qvitter') {
@ -1462,12 +1478,18 @@ $('body').on('click','.row-type-profile-prefs-toggle',function(e){
thisToggle.removeClass('disabled');
thisToggle.addClass('enabled');
thisToggle.attr('data-profile-pref-state','enabled');
if(prefEnabledLabel != 'undefined') {
thisToggle.html(prefEnabledLabel);
}
window.qvitterProfilePrefs[prefTopic] = '1';
}
else if(thisToggle.attr('data-profile-pref-state') == 'enabled') {
thisToggle.removeClass('enabled');
thisToggle.addClass('disabled');
thisToggle.attr('data-profile-pref-state','disabled');
if(prefEnabledLabel != 'undefined') {
thisToggle.html(prefLabel);
}
window.qvitterProfilePrefs[prefTopic] = '0';
}
@ -1519,14 +1541,10 @@ function showOrHideEmbeddedContentInTimelineFromProfilePref() {
var showHide = window.qvitterProfilePrefs['hide_embedded_in_timeline:' + window.currentStreamObject.path];
if(parseInt(showHide,10) == 1) {
$('#feed-body').addClass('embedded-content-hidden-by-user');
}
else {
$('#feed-body').removeClass('embedded-content-hidden-by-user');
return;
}
}
else {
$('#feed-body').removeClass('embedded-content-hidden-by-user');
}
$('#feed-body').removeClass('embedded-content-hidden-by-user');
}
/* ·
@ -1540,14 +1558,28 @@ function showOrHideQuotesInTimelineFromProfilePref() {
var showHide = window.qvitterProfilePrefs['hide_quotes_in_timeline:' + window.currentStreamObject.path];
if(parseInt(showHide,10) == 1) {
$('#feed-body').addClass('quotes-hidden-by-user');
}
else {
$('#feed-body').removeClass('quotes-hidden-by-user');
return;
}
}
else {
$('#feed-body').removeClass('quotes-hidden-by-user');
$('#feed-body').removeClass('quotes-hidden-by-user');
}
/* ·
·
· Show or hide notices from muted users in notifications?
·
· · · · · · · · · · · · · */
function showOrHideNoticesFromMutedUsersInNotifications() {
if(typeof window.qvitterProfilePrefs['hide_notifications_from_muted_users'] != 'undefined') {
var showHide = window.qvitterProfilePrefs['hide_notifications_from_muted_users'];
if(parseInt(showHide,10) == 1) {
$('#feed-body').addClass('hide-notifications-from-muted-users');
return;
}
}
$('#feed-body').removeClass('hide-notifications-from-muted-users')
}
@ -1724,8 +1756,8 @@ $('body').on('click','.member-button',function(event){
· · · · · · · · · · · · · */
$('#user-header').on('click',function(e){
// not if we're clicking the mini-edit-profile-button
if($(e.target).is('#mini-edit-profile-button')) {
// not if we're clicking the mini-logged-in-user-cog-wheel
if($(e.target).is('#mini-logged-in-user-cog-wheel')) {
return;
}
setNewCurrentStream(pathToStreamRouter(window.loggedIn.screen_name),true,false);
@ -2137,15 +2169,13 @@ $('body').on('click','.stream-item .queet img.attachment-thumb',function (event)
var thisAttachmentThumbSrc = $(this).attr('src');
var parentStreamItem = $(this).closest('.stream-item');
var $parentStreamItemClone = $('<div/>').append(parentStreamItem.outerHTML());
if(!parentStreamItem.hasClass('conversation')) {
$parentStreamItemClone.find('.stream-item.conversation').remove();
}
var $queetThumbsClone = $('<div/>').append($parentStreamItemClone.find('.queet-thumbs').outerHTML());
$parentStreamItemClone.find('.queet-thumbs, .expanded-content, .inline-reply-queetbox, .stream-item-footer').remove();
var footerHTML = $parentStreamItemClone.find('.queet').outerHTML();
// cleaned version of the stream item to show in the footer
cleanStreamItemsFromClassesAndConversationElements($parentStreamItemClone);
$parentStreamItemClone.find('.context,.stream-item-footer').remove();
var parentStreamItemHTMLWithoutFooter = $parentStreamItemClone.outerHTML();
$thumbToDisplay = $queetThumbsClone.find('img.attachment-thumb[src="' + thisAttachmentThumbSrc + '"]');
$thumbToDisplay.parent().addClass('display-this-thumb');
@ -2188,7 +2218,7 @@ $('body').on('click','.stream-item .queet img.attachment-thumb',function (event)
$thisImgInQueetThumbsClone.parent('.thumb-container').children('iframe').attr('height',calculatedDimensions.displayImgHeight);
// open popup
popUpAction('queet-thumb-popup', '', '' + $queetThumbsClone.outerHTML() + '', footerHTML, calculatedDimensions.popUpWidth);
popUpAction('queet-thumb-popup', '', '' + $queetThumbsClone.outerHTML() + '', parentStreamItemHTMLWithoutFooter, calculatedDimensions.popUpWidth);
disableOrEnableNavigationButtonsInImagePopup($('#queet-thumb-popup'));
}
}
@ -2597,12 +2627,13 @@ $('body').on('click','.action-reply-container',function(){
var this_stream_item_id = this_stream_item.attr('data-quitter-id');
this_stream_item.addClass('replying-to');
// grabbing the queet and view it in the popup, stripped of footer, reply box and other sruff
var $queetHtml = $(this_stream_item.outerHTML());
$queetHtml.children('.stream-item.conversation').remove();
$queetHtml.find('.context,.stream-item-footer,.inline-reply-queetbox,.expanded-content').remove();
var queetHtmlWithoutFooter = $queetHtml.outerHTML();
popUpAction('popup-reply-' + this_stream_item_id, window.sL.replyTo + ' ' + this_stream_item.children('.queet').find('.screen-name').html(),replyFormHtml(this_stream_item,this_stream_item_id),queetHtmlWithoutFooter);
// grabbing the stream-item and view it in the popup, stripped of conversation footer, reply box and other sruff
var streamItemHTML = $('<div/>').html(this_stream_item.outerHTML());
cleanStreamItemsFromClassesAndConversationElements(streamItemHTML);
streamItemHTML.find('.context,.stream-item-footer').remove();
var streamItemHTMLWithoutFooter = streamItemHTML.outerHTML();
popUpAction('popup-reply-' + this_stream_item_id, window.sL.replyTo + ' ' + this_stream_item.children('.queet').find('.screen-name').html(),replyFormHtml(this_stream_item,this_stream_item_id),streamItemHTMLWithoutFooter);
$('#popup-reply-' + this_stream_item_id).find('.modal-body').find('.queet-box').trigger('click'); // expand
@ -4140,20 +4171,62 @@ function uploadAttachment(e, thisUploadButton) {
/* ·
·
· Small edit profile button on mini-card. Go-to user stream and hit edit button
· Small edit profile button on hover cards goes to edit profile
·
· · · · · · · · · · · · · */
$('body').on('click','#mini-edit-profile-button, #edit-profile-header-link, .hover-card .edit-profile-button, .row-type-edit-profile-menu-link',function(){
$('body').on('click','.hover-card .edit-profile-button',function(){
goToEditProfile();
});
/* ·
·
· User menu when clicking the mini cog wheel in the logged in mini card
·
· · · · · · · · · · · · · */
$('body').on('click','#mini-logged-in-user-cog-wheel:not(.dropped)',function(){
var menu = $(getMenu(loggedInUsersMenuArray())).appendTo(this);
alignMenuToParent(menu,$(this));
$(this).addClass('dropped');
});
// hide when clicking it again
$('body').on('click','#mini-logged-in-user-cog-wheel.dropped',function(e){
if($(e.target).is('#mini-logged-in-user-cog-wheel')) {
$('#mini-logged-in-user-cog-wheel').children('.dropdown-menu').remove();
$('#mini-logged-in-user-cog-wheel').removeClass('dropped');
}
});
// hide the menu when clicking outside it
$('body').on('click',function(e){
if($('#mini-logged-in-user-cog-wheel').hasClass('dropped') && !$(e.target).closest('#mini-logged-in-user-cog-wheel').length>0) {
$('#mini-logged-in-user-cog-wheel').children('.dropdown-menu').remove();
$('#mini-logged-in-user-cog-wheel').removeClass('dropped');
}
});
/* ·
·
· Goes to edit profile
·
· · · · · · · · · · · · · */
function goToEditProfile(arg, callback) {
if(window.currentStreamObject.name == 'my profile') {
$('#page-container > .profile-card .edit-profile-button').trigger('click');
if(typeof callback == 'function') {
callback(true);
}
}
else {
setNewCurrentStream(pathToStreamRouter(window.loggedIn.screen_name), true, false, function(){
$('#page-container > .profile-card .edit-profile-button').trigger('click');
if(typeof callback == 'function') {
callback(true);
}
});
}
});
function triggerEditProfileButtonClick() {
$('#user-header #mini-edit-profile-button').trigger('click');
}

View File

@ -583,6 +583,13 @@ function pathToStreamRouter(path) {
label: window.sL.onlyShowNotificationsFromUsersIFollow,
callback: 'reloadCurrentStreamAndClearCache'
},
{
type: 'profile-prefs-toggle',
namespace: 'qvitter',
topic: 'hide_notifications_from_muted_users',
label: window.sL.hideNotificationsFromMutedUsers,
callback: 'showOrHideNoticesFromMutedUsersInNotifications'
},
{
type: 'divider'
},
@ -617,7 +624,8 @@ function pathToStreamRouter(path) {
];
streamObject.callbacks = [
'showOrHideEmbeddedContentInTimelineFromProfilePref',
'showOrHideQuotesInTimelineFromProfilePref'
'showOrHideQuotesInTimelineFromProfilePref',
'showOrHideNoticesFromMutedUsersInNotifications'
];
}
return streamObject;
@ -692,8 +700,7 @@ function pathToStreamRouter(path) {
if(pathSplit.length == 2 && /^[a-zA-Z0-9]+$/.test(pathSplit[0]) && pathSplit[1] == 'blocks') {
streamObject.name = 'user blocks';
streamObject.nickname = pathSplit[0];
streamObject.parentPath = streamObject.nickname;
streamObject.streamHeader = '@' + replaceHtmlSpecialChars(streamObject.nickname);
streamObject.streamHeader = window.sL.userBlocked;
streamObject.streamSubHeader = window.sL.userBlocks;
streamObject.stream = 'qvitter/blocks.json?count=20&id=' + streamObject.nickname + '&withuserarray=1';
streamObject.maxIdOrPage = 'page';
@ -701,6 +708,19 @@ function pathToStreamRouter(path) {
return streamObject;
}
// {screen_name}/mutes
if(pathSplit.length == 2 && /^[a-zA-Z0-9]+$/.test(pathSplit[0]) && pathSplit[1] == 'mutes') {
streamObject.name = 'user mutes';
streamObject.nickname = pathSplit[0];
streamObject.streamHeader = window.sL.userMuted;
streamObject.streamSubHeader = window.sL.userMutes;
streamObject.streamDescription = window.sL.mutedStreamDescription;
streamObject.stream = 'qvitter/mutes.json?count=20&withuserarray=1';
streamObject.maxIdOrPage = 'page';
streamObject.type = 'users';
return streamObject;
}
// {screen_name}/groups
if(pathSplit.length == 2 && /^[a-zA-Z0-9]+$/.test(pathSplit[0]) && pathSplit[1] == 'groups') {
streamObject.name = 'user group list';

View File

@ -118,7 +118,7 @@
"cropAndSave": "قُص و احفظ.",
"showTerms": "Read our Terms of Use",
"ellipsisMore": "More",
"blockUser": "Block {username}",
"blockUser": "Block",
"goToOriginalNotice": "Go to original notice",
"goToTheUsersRemoteProfile": "Go to the user's remote profile",
"clickToDrag":"Click to drag",
@ -169,7 +169,7 @@
"buttonUnblock":"Unblock",
"failedBlockingUser":"Failed to block the user.",
"failedUnblockingUser":"Failed to unblock the user.",
"unblockUser": "Unblock {username}",
"unblockUser": "Unblock",
"tooltipBlocksYou":"You are blocked from following {username}.",
"silenced":"Silenced",
"silencedPlural":"Silenced profiles",
@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -118,7 +118,7 @@
"cropAndSave": "Crop and save",
"showTerms": "Read our Terms of Use",
"ellipsisMore": "More",
"blockUser": "Block {username}",
"blockUser": "Block",
"goToOriginalNotice": "Go to the original quip",
"goToTheUsersRemoteProfile": "Go to the user's remote profile",
"clickToDrag":"Click to drag",
@ -169,7 +169,7 @@
"buttonUnblock":"Unblock",
"failedBlockingUser":"Failed to block the user.",
"failedUnblockingUser":"Failed to unblock the user.",
"unblockUser": "Unblock {username}",
"unblockUser": "Unblock",
"tooltipBlocksYou":"You are blocked from following {username}.",
"silenced":"Silenced",
"silencedPlural":"Silenced profiles",
@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Malsilentigi {nickname}",
"unSandboxThisUser":"Malsablokesti {nickname}",
"ERRORfailedSandboxingUser":"Malsukcesis sablokestigi/malsablokestigi la uzanton",
"ERRORfailedSilencingUser":"Malsukcesis silentigi/malsilentigi la uzanton"
"ERRORfailedSilencingUser":"Malsukcesis silentigi/malsilentigi la uzanton",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -187,5 +187,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Opphev forstumming for {nickname}",
"unSandboxThisUser":"Opphev lekekasse for {nickname}",
"ERRORfailedSandboxingUser":"Feilet ved forsøk på å sette i lekekasse/oppheve lekekasse av bruker",
"ERRORfailedSilencingUser":"Feilet ved forstumming/oppheving av forstumming av bruker"
"ERRORfailedSilencingUser":"Feilet ved forstumming/oppheving av forstumming av bruker",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Ontdemp {nickname}",
"unSandboxThisUser":"Beperking opheffen {nickname}",
"ERRORfailedSandboxingUser":"Beperking/beperking opheffen voor gebruiker gefaald.",
"ERRORfailedSilencingUser":"Dempen/ontdempen gebruiker gefaald."
"ERRORfailedSilencingUser":"Dempen/ontdempen gebruiker gefaald.",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Permitir {nickname}",
"unSandboxThisUser":"Liberar {nickname}",
"ERRORfailedSandboxingUser":"Falha ao restringir/liberar o usuário",
"ERRORfailedSilencingUser":"Falha ao silenciar/permitir o usuário"
"ERRORfailedSilencingUser":"Falha ao silenciar/permitir o usuário",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -184,5 +184,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -164,7 +164,7 @@
"continueRant":"Fortsätt harangen",
"hideEmbeddedInTimeline":"Dölj inbäddat innehåll i detta flöde",
"hideQuotesInTimeline":"Dölj citat i detta flöde",
"userBlocks":"Konton du blockerar",
"userBlocks":"Konton som du blockerar",
"buttonBlocked":"Blockerad",
"buttonUnblock":"Avblockera",
"failedBlockingUser":"Misslyckades med att blockera användaren.",
@ -186,5 +186,15 @@
"unSilenceThisUser":"Ta bort nedtystning av {nickname}",
"unSandboxThisUser":"Ta {nickname} ur sandlådan",
"ERRORfailedSandboxingUser":"Misslyckades med att sätta/ta ur användaren i sandlådan",
"ERRORfailedSilencingUser":"Misslyckades med att tysta ner eller ta bort nedtystning"
"ERRORfailedSilencingUser":"Misslyckades med att tysta ner eller ta bort nedtystning",
"muteUser":"Ignorera",
"unmuteUser":"Sluta ignorera",
"hideNotificationsFromMutedUsers":"Dölj notiser från användare som du ignorerar",
"thisIsANoticeFromAMutedUser":"Det här är en qvittring från en användare som du ignorerar. Klicka här för att visa kvittringen.",
"userMutes":"Konton som du ignorerar",
"userBlocked":"Blockerade konton",
"userMuted":"Ignorerade konton",
"mutedStreamDescription":"Du har dolt dessa användare från dina flöden. Du kommer fortfarande få notiser från dem, om du inte väljer &quot;Dölj notiser från användare som du ignorerar&quot; från kugghjulsmenyn på notissidan.",
"profileAndSettings":"Profil och inställningar",
"profileSettings":"Profilinställningar"
}

View File

@ -186,5 +186,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -185,5 +185,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}

View File

@ -185,5 +185,15 @@
"unSilenceThisUser":"Unsilence {nickname}",
"unSandboxThisUser":"Unsandbox {nickname}",
"ERRORfailedSandboxingUser":"Failed sandboxing/unsandboxing the user",
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user"
"ERRORfailedSilencingUser":"Failed silencing/unsilencing the user",
"muteUser":"Mute",
"unmuteUser":"Unmute",
"hideNotificationsFromMutedUsers":"Hide notifications from muted users",
"thisIsANoticeFromAMutedUser":"You have muted the author of this quip. Click here to show it anyway.",
"userMutes":"Accounts you're muting",
"userBlocked":"Blocked accounts",
"userMuted":"Muted accounts",
"mutedStreamDescription":"You've hidden these accounts from your timeline. You will still recieve notifications from these accounts, unless you select &quot;Hide notifications from muted users&quot; from the cog wheel menu on the notifications page.",
"profileAndSettings":"Profile and settings",
"profileSettings":"Profile settings"
}