Applescript para silenciar a discórdia

2

Editar: Minha pergunta inicial não parece ter uma solução. Em vez disso, usei um método alternativo. Role para baixo para ver o método alternativo.

Estou procurando uma solução para silenciar meu microfone no Discord, que posso adicionar à minha barra de toque por meio da bettertouchtool.

O BTT não pode enviar combinações de teclas ao Discord por qualquer motivo. Tanto quanto posso dizer, tenho duas opções.

  1. Use o AppleScript para ativar a janela Discord, envie a tecla pressionada e oculte a janela. Isso funciona, mas atualizar o aplicativo por um momento é irritante. Pior ainda quando estiver em outra área de trabalho, pois irá inverter as áreas de trabalho.

  2. Use o AppleScript para clicar no menu superior (este menu)para clicar no menu Discord e percorra os elementos da interface do usuário para clicar no botão Mute.

Não tenho experiência suficiente com o AppleScript para fazer a segunda opção funcionar, mas acho que poderia funcionar. Usando o navegador da interface do usuário, consegui obter o caminho para o elemento da interface do usuário: insira a descrição da imagem aqui

Como posso fazer isso funcionar? Qualquer ajuda é muito apreciada. obrigado

Editar RH

SOLUÇÃO ALTERNATIVA

O que estou querendo fazer aqui não parece ser possível, por isso estou apenas silenciando meu microfone no nível do sistema operacional em vez do Discord e adicionando um botão de alternância à minha barra de toque com o BetterTouchTool. Isso tem o benefício adicional de trabalhar em todo o sistema. Aqui está o vídeo em ação:

GIF

Streamable

Caso alguém mais queira fazer isso, estas são as etapas que eu segui:

1. Crie um novo Applescript com o seguinte script:

property storedInputLevel : missing value
if input volume of (get volume settings) is 0 then
    set volume input volume storedInputLevel
    return 1
else
    tell application "System Events"
        set storedInputLevel to input volume of (get volume settings)
    end tell
    set volume input volume 0
    return 2
end if

Salve o script em algum lugar.

2. Abra a Better Touch Tool, crie um novo widget Touch Bar e defina o widget comoRun Apple Script and Show Return Value insira a descrição da imagem aqui

3. Na janela exibida após a seleção, Run Apple Script and Show Return Valuevocê deseja apagar a linha de teste na caixa e dar um nome ao seu widget: insira a descrição da imagem aqui

3.a Clique no botão aparência e configurações

insira a descrição da imagem aqui

4. Na Appearance and Settingsjanela, você deseja definir as seguintes configurações: insira a descrição da imagem aqui

Você não precisa definir uma cor de fundo alternativa, mas é útil ver que você está sem som de relance.

Para os ícones, você pode usar estes:

insira a descrição da imagem aquiinsira a descrição da imagem aqui

Certifique-se de definir a Alternate color and icon if result matches regexconfiguração como 2 .

Clique em Save .

5. No novo widget que você criou, clique no menu suspenso Predefined actione escolha Run Apple Script (async in background).

insira a descrição da imagem aqui

6. Na janela exibida, clique em Select Apple Script Filee, em seguida, Choose Apple Script file from Disknavegue até o arquivo de script que você criou anteriormente. Clique em Salvar e pronto.

image13

É isso aí. Seu widget deve ativar e desativar o microfone e a alteração deve ser refletida no ícone na barra de toque.

Spaisekraft
fonte
A propósito, com sua primeira opção, você menciona "enviar [ing] a tecla pressionada" . A que isso se refere? Que tecla você está enviando, o que está fazendo e por que o aplicativo está piscando?
CJK
@CJK Eu tentei isso: activate application "Discord" tell application "System Events" key code 46 using {shift down, command down} -- shift-command-left end tell. Ele muda para o aplicativo e envia a tecla para silenciar meu microfone, mas ao ativar, o aplicativo é exibido.
Spaisekraft
E o que ⌘⇧ ← faz (eu sei que isso silencia o microfone)? Suponho que quero dizer, como isso acontece: é um atalho de menu no aplicativo ou uma combinação de teclas incorporada?
CJK
Ah, sim, é um conjunto de teclas definido no Discord. E você está certo em sua edição de que ele funciona sem foco no aplicativo. Eu tenho usado a combinação de teclas para ativar e desativar o som, mas eu queria torná-lo um botão na minha barra de toque com o BTT.
Spaisekraft
Como seus próprios testes revelaram, os pressionamentos de tecla simulados não estão sendo captados pelos atalhos de teclado do Discord . Em teoria, não haveria necessidade de segmentar o aplicativo Discord , pois ele é um sistema de ligação de teclas em todo o sistema. Portanto, dizendo Eventos do sistema apenas para emitir os keyevents apropriadas deve ter, na minha opinião, funcionou. Mas isso não aconteceu. Verifiquei duas vezes para ter certeza de que não era um bug do AppleScript e escrevi um código de Objective C para simular os eventos de chave e o Discord de destino (o que você pode fazer com o ObjC, mas não com o AppleScript). Falhou. Continua ...
CJK 30/12

Respostas:

3

Em primeiro lugar, é bom explorar e fazer sua própria pesquisa com a qual você veio armado para perguntar como ela pode ser aplicada para formar uma solução. Torna muito mais fácil fornecer ajuda útil.

Com isso em mente, a captura de tela do UI Browser é imensamente útil, pois literalmente estabelece a hierarquia dos elementos da UI que precisamos percorrer para alcançar o item de menu de destino e emitir um clique via AppleScript:

tell application "System Events"
    tell application process "Discord"
        tell menu bar 2
            tell menu bar item 1
                click

                tell (a reference to menu 1)
                    repeat until it exists
                        delay 0.2
                    end repeat
                    tell menu item "Mute"
                        click
                    end tell
                end tell
            end tell
        end tell
    end tell
end tell

No entanto, existe um fenômeno conhecido e bem consultado / documentado / queixado de um atraso inexplicável e irritante de 5 segundos entre o primeiro clickque mostra o menu e o segundo clickque seleciona o item de menu. Isso não é específico do Discord , mas parece se aplicar aos menus dos ícones da barra de menus.

Várias soluções foram apresentadas para contornar isso, mas não vou entrar em detalhes, porque nenhuma delas é a) confiável, b) sem efeitos colaterais ou c) limpa para implementar. Você, sem dúvida, fará uma pesquisa rápida e encontrará a solução mais comum, que é matar o processo de Eventos do Sistema entre os dois primeiros clickeventos. Mas você verá que, posteriormente, os usuários relatam que esse método para de funcionar; e, nesse ínterim, faz com que os Eventos do sistema gerem outros erros não relacionados onde antes não aconteciam.

Portanto, esta solução para você é agridoce, receio. Eu mostrei a você como AppleScript seu caminho para o item de menu que você deseja; mas o resultado final pode não ser mais atraente do que sua primeira opção.

Edição: Possível solução não-AppleScript

Depois de baixar uma cópia do Discord para ver o que é o quê, primeiro noto que minha versão do aplicativo não possui esse ícone da barra de menus. Deve ser um cenário que eu não tenha visto.

O que eu observei, no entanto, é a opção de definir uma combinação de teclas definida pelo usuário que aciona uma de uma seleção de funções, uma das quais é uma alternância para o microfone mudo:

Discord Keybindings in macOS

Aqui, montei um para ligar ao Toggle Mute . Como seria de esperar, ele funciona dentro do aplicativo. Surpreendentemente, ele também funciona com o aplicativo, quando não tem foco e mesmo quando é minimizado. Ainda mais surpreendentemente, funcionou quando o Discord residia em uma área de trabalho separada (espaço), e em nenhum momento o aplicativo Discord precisou obter foco ou a área de trabalho ativa foi afastada.

Acredito que esta é exatamente a solução que você procura - uma tecla de atalho que opera globalmente em seu sistema para silenciar seu microfone Discord .

CJK
fonte
Obrigado pela sua resposta CJK. Estou com um problema com o script que você escreveu. Quando chega à seção a seguir: repeat until it exists delay 0.2 end repeatEspera até eu clicar no menu. Acho que é porque o menu não existe até que eu o abra. Depois de abrir o menu, o script continua e clica em "Mudo". Você tem alguma sugestão sobre como resolver isso? Mais uma vez obrigado Editar: Vejo que a resposta do comentário ignora a formatação. Desculpa a bagunça.
Spaisekraft
Você está dizendo que o menu não será materializado a menos que você clique fisicamente no ícone da barra de menus? Nesse caso, isso significa que o primeiro clickcomando não teve efeito. Tente os seguintes ajustes separadamente: 1. altere o primeiro clickpara click it; então 2. mude click itpara perform its action "AXPress"; então, em um novo script, tente tell app "System Events" to click menu bar item 1 of menu bar 2 of process "Discord". Minha esperança é que (1) ou (2) resolvam o problema, mas sinto que não vai mudar nada. (3), espero, abrirá o menu (mas não clique em "Mudo").
CJK
PS. Caso nenhuma dessas alterações sugeridas funcione, isso implica que o problema está no aplicativo Discord e não no script. Em algum lugar do desenvolvimento, eles não definiram adequadamente as propriedades de acessibilidade do ícone da barra de menus para permitir eventos simulados do mouse de fontes externas ou algo de natureza paralela. Como o script funciona conforme o esperado com outros ícones da barra de menus de outros aplicativos, receio que não haja solução imediata. No entanto, publiquei uma edição da minha resposta que fornece uma segunda solução possível para o seu dilema. Deixe-me saber se funciona para você como para mim.
CJK
Sim, o script funciona para outros aplicativos, mas nenhuma das outras alterações funcionaria para o Discord. Acabei de criar um script para alternar o som do microfone no sistema operacional e, em seguida, executei o script na barra de toque usando o BTT. Vou acrescentar isso ao meu post original, caso alguém mais acabe aqui tentando fazer isso. Obrigado por toda a ajuda. Hoje eu aprendi mais algumas coisas sobre o AppleScript :)
Spaisekraft
Acabei de notar no seu comentário que você disse I first note that my version of the application has no such menu bar icon to speak of. It must be a setting I haven't gleaned upon.. Devo mencionar que o menu só aparece quando você está em um canal de voz.
Spaisekraft 31/12/19