;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Twitter vai limitar envio de mensagens em contas grátis para evitar spam

Reprodução/Twitter
Imagem: Reprodução/Twitter

De Tilt, em São Paulo

22/07/2023 12h58

Se você não paga o serviço de do Twitter, o Blue, vem mais limitações por aí.

A rede social informou que vai limitar o envio de DMs (mensagens diretas) para contas grátis na rede social. A decisão tem relação com a redução de envio de mensagens spams que, segundo a plataforma, aumentou consideravelmente recentemente.

Apesar do anúncio, o Twitter não detalhou o limite diário de mensagens que usuários que não pagam poderão enviar.

Contas não verificadas [ou que não pagam o Twitter Blue] terão limites diários no número de mensagens diretas que enviam
Conta oficial Twitter

Além de uma forma de limitar o envio de spams, outra consequência desse movimento tem relação em tentar aumentar o número de s do Twitter Blue. Junto com o tuíte anunciando a limitação de mensagens, há um link convidando as pessoas a em o serviço.

No dia 14 de julho, o Twitter lançou uma configuração para que pessoas limitem receber mensagens apenas de quem elas seguem contas verificadas.

Desde que comprou a rede social, o bilionário Elon Musk fala do seu objetivo de fazer com que o Twitter não dependa apenas de propagandas, mas que seja também bancado pela mensal de usuários.

No início do mês, Musk anunciou um limite de leitura de tuítes por dia para quem não pagasse o o à rede social. Inicialmente, o limite eram 300 posts; após toda a repercussão subiu para 1.000 postagens por dia. Quem paga pode ler até 10 mil.

Não custa lembrar que no início do ano o Twitter removeu o selo de verificado de todas as pessoas que não pagavam — a indicação era uma forma de mostrar que se tratava de uma conta real; celebridades, órgãos, influenciadores e vários jornalistas tinham o selo de verificação.

No Brasil, a do Twitter Blue custa R$ 42 por mês (ou R$ 440 por ano em promoção). Ao pagar, seus tuítes terão mais destaque, não haverá limite de caracteres, menos exibição de anúncios, além de permitir publicar vídeos com qualidade FullHD (1080p).