JAWS Scripts For Discord
Doug Lee
Last Revised July, 2024
This document describes the scripts for Discord and provides
tips for using this application with JAWS.
This document can be opened from within the application via a double press
of JAWSKey+F1 (or Insert+F1)
when the scripts are running.
These scripts are written for both the Discord Windows app and the web client that can be run from
http://discord.com/app.
The scripts are more often tested against the Windows app, however.
Warning:
Discord is an evolving application and is sometimes subject to sudden and significant change. As
a result, the commands and behaviors supported by and documented for these scripts may also be
subject to change or failure without warning if a change in Discord causes scripts to fail.
Table of Contents
System Requirements For JAWS Users
In addition to any system requirements for the application, the following
apply for JAWS users:
- The computer should be running Windows 10 or later.
Older Windows versions may also work but have not been tested.
- JAWS 17.0 or later should be used. The scripts will not
work with or install into JAWS versions older than 17.0.
JAWS versions older than 2019 have not been carefully tested.
Script Installation Instructions
To install these scripts on a new system:
- Load JAWS if this has not already been done. This will require
administrative privileges on the computer.
- Run JAWS as the user for whom the scripts are to be installed.
This and the following steps must be performed for each user of the computer
who will be using JAWS with these scripts.
- Download and run, or run directly, the installer for
these scripts; and follow the on-screen
directions. Be sure to install the scripts in the currently running
JAWS version if a JAWS version list is presented.
- To verify successful installation, type Insert+Q from
within the application. Part of the JAWS spoken response should be a
revision number. If you do not hear a revision number, the scripts are
not correctly loaded.
In some cases, restarting JAWS may fix this issue.
Key Sequences
These scripts incorporate commands that consist of sequences of keystrokes, all beginning with a common prefix, or "command keystroke."
This approach allows many script commands without the risk of conflicting with application keystrokes.
See the "Multi-Key Command Sequences" section of the "Common Script Elements" document for further details, including
how to explore the available script commands (similar to exploring a menu system),
and how to change the Command keystroke if necessary.
By default, the Command keystroke for these scripts is [.
This document may refer to this keystroke as [ or Command;
so, for example, [ Tab and Command Tab both refer to typing the prefix keystroke, then separately the Tab key.
Some sequences may consist of more than two keystrokes, or "levels"; for example, [ d r would refer to typing [, then d, then finally r.
Native Discord Accessibility Features
Discord itself includes various accessibility features as of this writing. Chief among these is a
large set of keyboard shortcuts, documented on the Discord site under
"Windows
Discord hotkeys."
One pair of keystrokes that may not be mentioned in the Discord keyboard shortcuts document is
Ctrl+Tab and Ctrl+Shift+Tab, which cycle forward and backward through the servers in
the server list.
Script Commands and Features
These scripts provide a number of commands and features beyond those provided by Discord itself. These will
be described in subsections organized by category.
General Commands
The sequence [ A will announce the contents of the "Active Now" section of the
Friends page, if it is showing.
(Note that typing Ctrl+1 twice is a fast way to reach this page from many places in Discord.)
This section tends to list friends who are in voice channels, playing games, etc.
The language spoken comes directly from Discord and may sometimes seem a bit redundant.
At this writing for example (April, 2023), two friends in one voice channel may be announced as,
"Doug, Online Doug and Bob In a Voice Channel MAM Men Against Madness General Doug Bob."
[ B brings up a list of buttons for activation.
This is similar but not identical to the built-in JAWS JAWSKey+Ctrl+B command for listing buttons in
an HTML document:
- [ B removes duplicate buttons that are actually names of chat participants.
- [ B activates (presses) the chosen button, whereas JAWSKey+Ctrl+B merely moves the
virtual cursor to it.
JAWSKey+Q, along with announcing the active configuration name, will announce the revision number
of these scripts.
Insert+F1, typed twice in quick succession, opens this document in the default browser.
Navigating Among Discord Areas
[ E moves to the first edit control on the current screen.
This is intended to speed the finding of the chat message entry box for channels and direct messages.
Discord natively makes Esc move to this box, but this does not seem to work in all circumstances.
[ S moves to the server tree and activates forms mode if necessary.
The Home link and links to any new items appear at the top of this tree.
If this command does not at first move to the tree, press Tab once and then try again.
Call and Channel Connection Management
[ D presses the Disconnect button when available on screen.
This includes both the normal Disconnect button for a voice channel and the "Disconnect Quietly" button for
a stage channel.
If more than one is present, this sequence clicks the last one.
This can happen when the user has turned on and back off the camera, in which case there can be two Disconnect
buttons that do the same thing (tested in Discord 0.0308 as updated on Monday, October 5, 2020).
[ P reports, when visible on screen, the ping time between this Discord client and the server.
This will only be on screen when you are in a voice channel.
Handling Chats (Text Conversations)
These scripts provide three sets of commands for efficiently reading chat messages (direct and in-channel).
Note that these commands will not work when a modal dialog has been opened on top of a chat window.
Examples of such dialogs include the Inbox, opened with Ctrl+I, and an event dialog, which can
automatically pop open when some servers or channels take focus and which can be closed by pressing
Esc.
The following two sets of commands keep track of a current position among messages that will be remembered
until changed or until JAWS is restarted or the current Discord window is replaced with
another that supports chat navigation.
A position is remembered separately for each Discord chat navigated with this system.
- For those (like this author) who like to keep hands on the home row on a QWERTY keyboard, use the [
key followed by any sequence of H for first available message, J for previous message,
K for the current message, L for the next message, and ; for the last available
message.
[ K also indicates the count of messages and the position of the current message among them.
Only messages are included here, not date headers, scroll bars, etc.
Typing K twice quickly spells the content of the current message.
Additionally, Shift+H moves to the "Unread" marker in the message history when visible, and
Shift+K moves focus to the current message, which is useful for messages containing
buttons such as for playing media.
Since this last command does not require focus already to be in the message list, it also provides a fast way to
move focus from anywhere else on a conversation screen over to a message in the list.
- For those who prefer arrow keys, equivalent navigations are provided: Use the [ key followed by any
combination of Home for the first message, Left for the previous message, Numpad5
for the current message, Right for the next message, and End for the last available message.
Shift+Home is the "jump to Unread marker" command in this set, and Shift+Numpad5 moves
focus to the current message such as for handling media buttons.
Typing Numpad5 twice quickly spells the content of the current message.
the third set of commands, by contrast, read messages without altering the scripts' idea of
which message is "current":
- [ followed by digits will read recent messages:
1 reads the most recent, 2 the next most recent, 9 the ninth most recent, etc.;
and [ 0 reads the tenth most recent message.
As with the commands listed above, use Esc when done reading.
Note: These message navigation commands are limited to visible messages due to the way Discord
is written. However, reading messages via this system also scrolls the messages being read onto the screen,
which may cause repositioning in a long chat history.
This behavior is subject to change as the preferred behavior becomes clear through experience and
experimentation.
In a chat or text channel, [ T announces whether someone is currently typing.
Discord may also natively announce who is typing when multiple persons are typing at once.
[ W announces information about the current direct message or channel.
For a DM, this includes any other names by which the person is known on other servers, each with the server name.
For a channel, this command speaks the topic for the channel.
These scripts include a modification to the command for virtualizing the current control, JAWSKey+Shift+V,
so that
it virtualizes the current message in a conversation history. This may also apply to other elements across
Discord, depending on how Discord itself implements various controls.
Note that the format of text that appears for this command is solely dependent on Discord's UIA
implementation.
In particular, lines may split or not split at surprising points in the text.
This representation will, however, include bullets and numbers in lists that appear inside a message, which at
this writing is not true otherwise because of how Discord presents messages to assistive technology.
How is this implemented?
Discord provides accessible names to assistive technology such as JAWS for chat messages. These names include
various items as appropriate - message text, web preview material, etc.
However, at this writing (August 30, 2023), bullets and numbers from lists are not included in these names.
These scripts implement the virtualization of chat messages by obtaining text from the focused UIA element's
DocumentRange
text, wherever the focused element supports this request.
This text, again at this writing, is not always formatted just as it appears: lines may be unexpectedly
divided or merged, list items may not begin on a new line, etc.
The scripts also cause newly arriving messages in the currently focused chat to speak as they appear.
Handling Pinned Messages
A channel can have "pinned messages" which stay easily available though the message list may grow very long.
The scripts provide a [ Shift+P command to press the Pinned Messages button for the current
channel.
This will pop up a list of any pinned messages for the channel.
When there are no pinned messages, a message to this effect will instead appear.
Note though that this "no pinned messages" message may appear briefly and be spoken even when
pinned messages exist, while Discord is collecting them for display.
To read any messages that do appear, use the Up and Down arrow keys.
The chat navigation system just discussed does not work for this list of pinned
messages.
Press Esc when done reading, to return to the original channel screen.
Handling Threads
Regular text channels may contain "threads," or subtopic areas, whose messages do not appear in the main
conversation window.
The scripts provide the key sequence [ Shift+T to open and close the dialog that lists any
threads in the active channel. This dialog also provides a button for creating a new thread.
When the thread dialog is open, Tab will move through the available threads, which show as
buttons. Pressing Space or Enter on one of these will open the thread. Messages then
appear in the same manner as for channel messages. The scripted
chat navigation system also works for thread messages.
To return to the channel, move to the channel list, locate the channel, and press Enter to
redisplay its messages.
The thread itself may also appear below the channel in the list of channels.
While focus is on a thread's entry in either the Threads dialog or the channel list, the Application menu
for the thread will contain a "Join" or "Leave" option. A thread can also be joined from the text channel
message where it was created, by tabbing to the button for the thread and opening the Application menu for
the button.
There are distinct advantages to joining a thread that you wish to follow; see the section on
joining threads and following forum posts for further information.
Handling Forum Channels and Posts
A Discord "forum channel" is a channel in which all messages are grouped into topics, called "posts," much
as some messages in a normal channel may be grouped into threads. A forum channel contains no messages
outside of this topic-oriented structure.
In place of the message list normally seen for a channel, a forum channel will show a list of posts by
subject. Pressing Enter on a post will open it and reveal all of its messages.
Posts are ordered so that those with the most recent activity appear first.
Up and Down arrows will move among posts in a forum's post list. However, whereas the
input edit box for a new message appears below the message list in a channel, the edit box for a forum
channel will appear at the top of the list when you use arrows to navigate.
A forum post can be "followed," much as a thread from a regular channel can be "joined,"
from the Application menu for the post. See the section on
joining threads and following forum posts for more on the advantages of doing this
for interesting posts.
Joining Threads and Following Forum Posts
Discord allows you to join a thread and to follow a forum post. In practice, these two actions have the same
effects:
- The thread or post will be added to your channel list, below the channel that contained it, while there
is continuing activity in the thread or post.
- When the thread or post is activated, as with a normal channel, its messages will appear just as do
those for a normal channel.
There is no need to open the thread or post first.
- The Context menu for the thread or post will include an option for changing its notification settings.
Be aware that, in many community server channels and likely in most forum channels on any server,
the default notification setting will be "Only mentions." This means that, by default, you will likely only
see mentions in a thread or post that you follow. It may very well be helpful to change this to "All
messages" for a thread or post when you join or follow it.
Handling the Inbox Dialog
The scripts improve the user experience in the Inbox dialog in several ways.
The Inbox dialog can be opened by typing Ctrl+I.
- The list of unread messages in the Unreads tab reads each message as you navigate with Up and
Down arrows in the list.
By default, these items would only say "Jump."
To jump to a message in its context, Tab once to the Jump button and press Enter.
- The For You tab's list does not support navigation with arrow keys and presents the entire list as a
single control name.
The scripts reformat this name to consist of comma-separated items, each prefixed with a Discord-abbreviated
indicator of its age, such as "4 d" for four days or "2 mo" for two months.
- The JAWS command for virtualizing the current control, JAWSKey+Shift+V, will display this list
in a JAWS virtual view, with the age on a line by itself followed by the summary, and with blank lines
separating items.
Press Esc to return to Discord after using this command.
Additional Script Features
These scripts also provide the following features:
- Additional information announcement during arrowing through various lists with the virtual PC cursor
turned off:
- For a voice channel in a server's channel list, the list of current participants, with mute and deafen
statuses for each.
JAWS will also include a plus sign (+) and a count of missed users if it appears that not all users
in the channel are found.
- For a stage channel, whatever information is shown for its participants - typically presenters and an audience
member count but not audience
participant names.
- For any channel with a note like "Limited", the text of the note.
- In a DM list:
the online status of a DM contact,
the user's name if it was locally changed via "Add friend nickname",
and the member count for a group conversation.
- In the Members list for a channel, the heading immediately above the current item when one is found.
Examples include "Online" and "Offline" with a count of how many members fall into that category.
- When encountering a poll among messages in a channel, the poll question, options, instructions, and vote count.
Individual vote counts and percentages are also included if the Show Results button has been pressed.
- JAWSKey+T, the
SayWindowTitle
JAWS command, says the name of the application
and the name of the active chat instead of just saying "Dialog" in many cases.
It may also include any of the following as applicable, in this order:
- In a private channel, the online status of the other participant if displayed.
- For any pending event badges on screen, the name and count from the badge; i.e., a short list of who's said
how many things you haven't seen yet.
Counts may not be available as of November 6, 2020.
- Indications of whether the Mute or Deafen switches are currently on.
- The primary screen section name when possible, such as the name of the server shown or "Private channels."
- If you are in a voice channel, the name of that channel including its server name.
- The text of any on-screen notices or alerts, such as the alert that may appear when Discord is not detecting
sound on the active microphone.
Alerts announced here may also include
calendar event notices,
success notices for actions,
and the "Update Ready!" notice when a Discord update is available.
Tips and Tricks
The Confusing Functions of the Up Arrow Key In a Message Box
Three different things can happen if Up is pressed while focus is in a message entry edit box:
- If the box has content, Up moves up a line in the text.
- If the box is empty but a message was typed into this chat at some point, Up may start editing
the last entered message and move into its content.
- If Up does neither of these things, it moves to the last message in the message list.
To make sure Up moves to the last message in the message list from the message entry box,
- Make sure the edit box is empty.
- Press Tab or Shift+Tab after typing and sending a message. This has the effect of
preventing the Up arrow key from starting an edit of the last sent message.
Catching Up With Unread Messages
A quick way to catch up with messages across all servers:
- If you are already in a chat window, use the script command sequence [ Shift+H to find the New
Messages bar, then read sequential
messages by pressing L until you hear a click indicating the end of the message list.
Press Esc at that point to exit the message reading layer.
- Use Alt+Shift+Down to move to the next server with unread messages.
If this command does nothing, use Insert+T to see if any alerts are on screen. If so, press Esc
to clear them and then try Alt+Shift+Down again.
As a last resort if Alt+Shift+Down still does nothing,
type the sequence [ U and then try again.
This last suggestion gets focus out of servers where the message edit box is disabled, the messages are divided
into topics, etc.
- Repeat these steps until the above command does not move to another server.
Finding Active Voice Channels
A quick way to find all participants in all voice channels on a server (not including stage channels):
- Move to the channel list for the server, such as by typing the scripted command sequence [ N
until you reach it.
- Press Home to move to the top entry in the list. On a community server, this will often be an
events channel.
- Start pressing Tab. This will move through tabbable buttons.
- If you land on a button that is named after a Discord participant, you have found an active voice channel. Press
the Up arrow to find out which channel, and to hear a list of everyone in it.
- Press Down to move to the next channel after the active one, then start tabbing again to look
for more participants. Repeat the above step on finding any.
- Stop when your tabbing reaches the Status button in the user area.
Determining Who Posted Reactions
There are two ways to do this:
- When focus is on the message, use the Application menu's "View Reactions" option, then use the JAWS
virtual cursor to examine reactions and who posted each. Remember to turn the virtual cursor back off when
done, and press Esc to close the dialog. OR
- From a message, Tab until focus reaches a reaction; then
RouteJAWSToPC
to hear
who posted the reaction.
Unfortunately, it may be necessary to Alt+Tab out of and back into Discord to return focus to the
conversation window.
Known Issues
The following issues are known and may be encountered during use of the application with these JAWS scripts.
These issues may be fixed in a future update to the scripts or to the application itself.
JAWS does not announce bullets or numbers from lists that appear in a chat message.
This is because these items do not appear in Discord's names for these chat elements.
As a workaround, use JAWSKey+Shift+V to
virtualize a chat message; but note that the format of this result may include
unexpected splits and merges of lines.
JAWS does not indicate the presence of block quotes in a chat message.
Again this is because Discord does not indicate this condition to assistive technology in its name for the
focused chat message element.
The JAWSKey+Shift+V workaround just mentioned will also miss the presence of block quotes at this
time, as there is no reasonable way for Discord to include this information in the UIA
DocumentRange
text for a chat element.
The JAWS virtual cursor will show where block quotes exist in a message.
In User Settings, Notifications tab, Sounds section,
enabling the "Enable same-channel message notifications" option makes Discord produce a unique sound when a
message arrives in the channel or DM that is currently on screen.
However, it also causes Discord to cease sending Windows Desktop notifications for such messages while that
channel is in focus. This remains true even when Discord itself is not displayed on screen.
This is a Discord issue and is not related to JAWS or scripts.
Pending event counts may be out of date from time to time in the JAWS virtual view of the Discord window. Typing
the screen refresh command, Insert+Esc, will fix this.
The "Roles" list control in a user information popup dialog is not reachable via the keyboard; only its
heading can be found in the JAWS virtual view.
To find out what roles a user has, press the Menu or Application key on the user's name,
rather than pressing Enter.
In the resulting context menu, arrow Up to the Roles submenu, then arrow Right and then
Up and Down to read any assigned roles.
Braille support is not well tested and is likely incomplete.
Revision History
This is the revision history of these scripts, most recent revision first:
Revision 245, July 15, 2024, tested against application version 1.0.9153
- [ E moves to the first edit box on screen.
This is intended to speed the finding of the chat message entry box for channels and direct messages.
Discord natively makes Esc move to this box, but this does not seem to work in all circumstances.
- Alt+Tab into Discord from another window should no longer repeat the window title several
times. This was caused by several nested Discord windows with the same name.
- The [ D sequence for disconnecting from a voice channel now also works to click the
"Disconnect Quietly" button for a stage channel.
- The JAWSKey+T
SayWindowTitle
command again includes muted and deafened statuses
when applicable. A discord change required a minor code revision for this.
- Similarly and for similar reasons, the scripts are updated to make JAWSKey+T again include the
online status of a DM contact.
- There is a new [ Shift+P command for
showing pinned messages for a channel.
- During arrowing through a Members list for a channel, JAWS will announce the heading immediately above
an entry when one is found.
Examples include "Online" and "Offline" with a count of how many members fall into that category.
- When the current user is connected to a voice channel from a different client
and the user arrows to that voice channel in the channel list,
the scripts will make JAWS include the user name alongside the phrase "Connected to another client"
to avoid any confusion.
- JAWS will more meaningfully announce messages that are polls, and also their results when the Show
Results button for a poll has been pressed.
Translators: There are changes in one message file.
Diff showing message file changes
Lines starting with a dash are old, with a plus are new, and with a space are for context.
This material is offered experimentally to see if it helps translators keep up with project changes.
=== modified file 'discord_lang.xml'
--- old/discord_lang.xml 2024-04-14 21:06:17 +0000
+++ new/discord_lang.xml 2024-07-15 15:17:15 +0000
@@ -23,9 +23,11 @@
a=Say who is active now if the Friends page is showing
b=List buttons
d=Disconnect from voice or video
+e=Move to the first edit box
n=@
shift+n=@
p=Say ping time if visible
+Shift+p=Show pinned messages
s=Move into the server tree
t=Say who is typing
Shift+t=Toggle threads when the button is visible
@@ -80,6 +82,10 @@
<message name="scThreads">
Threads
</message>
+<!-- The exact, case-sensitive name of the Pinned Messages button when present for a channel. -->
+<message name="scPinnedMessages">
+Pinned Messages
+</message>
<!-- The suffix on the name of the server area. Case insensitive but punctuation matters. -->
<message name="msgServerSuffix">
(server)
@@ -88,10 +94,18 @@
<message name="scDisconnect">
Disconnect
</message>
+<!-- The on-screen name of the disconnect button in a stage channel. -->
+<message name="scDisconnectStage">
+Disconnect Quietly
+</message>
<!-- The exact, case-sensitive text shown when a Discord update is available. -->
<message name="scUpdateName">
Update Ready!
</message>
+<!-- The exact, case-sensitive name of the Members screen area for a channel. -->
+<message name="scMembers">
+Members
+</message>
<!-- What to say in a special focus situation like a menu or JAWS buffer when the user-initiated script is not meant for that setting. -->
<message name="msgSpecial">
This command does not work in menus or JAWS dialogs
@@ -118,6 +132,10 @@
<message name="msgForumChannel">
(text forum channel)
</message>
+<!-- The exact, case-sensitive text displayed for the current client when connected to a voice channel from another client. -->
+<message name="scConnectedElsewhere">
+Connected on another client
+</message>
<!-- The exact, case-sensitive name of the "Active Now" section of the Friends page. -->
<message name="scActiveNow">
Active Now
@@ -190,6 +208,10 @@
<message name="chat___scMessagesPrefix">
Messages in
</message>
+<!-- An on-screen text identifier used to identify polls in a chat message list. Case sensitive. -->
+<message name="chat___scPollOptions">
+Poll options
+</message>
<!-- A list of words/phrases, in order, to remove from reaction descriptions to make them shorter. -->
<!-- These are case sensitive. -->
<message name="chat___scReactionRemovals">
Revision 233, April 18, 2024, tested against application version 1.0.9042
- There is a new [ Shift+T key sequence for opening and closing the Threads dialog for a text
channel, and a new
Handling Threads section
describing how to use threads in Discord with the scripts.
- There are also new documentation sections on
handling forum channels and posts and on
joining threads and following forum posts.
Much of this documentation applies with or without JAWS or these scripts.
- The chat navigation system works better in an open post from a forum channel.
- Fixed several issues with reactions, including
an occasional leftover s from the word reactions and confusing wording when reactions included
one posted by the current user.
- Reactions should no longer read both before and after messages during list navigation.
This could occur because Discord began including reactions as part of the message itself.
JAWS may still read the long form of reactions before the short form and the message as you arrow to a new
message; this again seems to be a thing that Discord has been telling JAWS to do for a while.
Translators: There are a few additions to one message file.
Diff showing message file changes
Lines starting with a dash are old, with a plus are new, and with a space are for context.
This material is offered experimentally to see if it helps translators keep up with project changes.
=== modified file 'discord_lang.xml'
--- old/discord_lang.xml 2024-03-09 16:37:50 +0000
+++ new/discord_lang.xml 2024-04-18 16:11:36 +0000
@@ -28,6 +28,7 @@
p=Say ping time if visible
s=Move into the server tree
t=Say who is typing
+Shift+t=Toggle threads when the button is visible
u=Move to the user area
w=Say who is the current chat participant in more detail
Home or h=Read first visible chat message
@@ -71,6 +72,14 @@
<message name="scUserArea">
User area
</message>
+<!-- The exact, case-sensitive name of the channel header area. -->
+<message name="scChannelHeader">
+Channel header
+</message>
+<!-- The exact, case-sensitive name of the Threads button when present for a channel. -->
+<message name="scThreads">
+Threads
+</message>
<!-- The suffix on the name of the server area. Case insensitive but punctuation matters. -->
<message name="msgServerSuffix">
(server)
@@ -181,6 +190,15 @@
<message name="chat___scMessagesPrefix">
Messages in
</message>
+<!-- A list of words/phrases, in order, to remove from reaction descriptions to make them shorter. -->
+<!-- These are case sensitive. -->
+<message name="chat___scReactionRemovals">
+press to remove your reaction
+press to react
+Add Reaction
+reactions
+reaction
+</message>
<!-- Messages for the ev (event handling) module. -->
<!-- What to say when event setup fails. -->
Revision 220, March 9, 2024, tested against application version 1.0.9035
Updates to the chat navigation system:
- The system works in DM group chats, regardless of how they are named.
Note that because a chat's name is used to keep track of position information in this system, renaming a
chat will cause your position in it to be lost.
- Commands for moving to the current chat-system message,
[ Shift+K and [ Shift+NumPad5, move PC focus rather than the virtual cursor.
This is both fast and far more reliable than attempting to position the virtual cursor programmatically.
If you need the virtual cursor to move to a message, activate it normally after getting PC focus to move there.
These commands are also a fast way to move focus from anywhere else on a conversation screen over to a
message in the list.
- The chat navigation system is disabled while a modal dialog, such as the Inbox, is on screen.
Beware that this will also require that popup event dialogs be closed with Esc before reading chat
messages.
Other updates:
- When a message list contains no messages but does contain a notice, JAWS reads the notice
when the list takes focus.
This was prompted by a Discord server whose welcome text channel did not grant history-reading permission to
its members, resulting in an unspoken "You do not have permission to read the history" notice in an
otherwise empty listbox.
- The list in the Inbox dialog's For You tab reads better and has virtualization support.
- Reading in the Inbox dialog's Unreads tab is again improved to say messages instead of just "Jump" for
messages under each category.
There are still some known issues with this reading though, caused by the way Discord presents message
information in this tab:
- Replies read the message being replied to before the time, author, and content of the actual reply.
- Voice messages indicate time and author but nothing else.
- The time stamp and author name can run together with no intervening space.
- This document's Script Commands and Features section is significantly reorganized
to split the information into categories by function.
- This update continues the process of improving performance under at least JAWS 2024.
This includes the following changes:
- Removal of 2019 code for identifying Pressed or Collapsed states of some buttons.
By now, some or all of these should indicate their own states natively in Discord.
- Removal of 2020 code for naming some buttons, because the code required much analysis that could slow
things down in other situations.
- Refactor of how the scripts improve reading in the Inbox dialog.
- Reductions in how often the scripts request from JAWS a full copy of the Discord accessibility tree.
This appeared to be faster in JAWS versions before 2024 and/or in smaller Discord servers.
Translators: There are several changes to one message file.
Diff showing message file changes
Lines starting with a dash are old, with a plus are new, and with a space are for context.
This material is offered experimentally to see if it helps translators keep up with project changes.
=== modified file 'discord_lang.xml'
--- old/discord_lang.xml 2024-03-01 16:32:56 +0000
+++ new/discord_lang.xml 2024-03-09 17:35:03 +0000
@@ -34,7 +34,7 @@
Shift+Home or Shift+H=Go to and announce the Unread chat message marker if visible
LeftArrow or J=Read previous chat message
K or NumPad5=Read current chat message and its position and the message count
-Shift+K or Shift+NumPad5=Jump virtual cursor to current message
+Shift+K or Shift+NumPad5=Move PC focus to the current message.
L or RightArrow=Read next chat message
End or Semicolon=Read latest visible chat message
1 through 9 and 0=Read most recent visible chat messages without altering remembered position
@@ -63,6 +63,10 @@
<message name="scHome">
Home
</message>
+<!-- The name of the Inbox Unreads tab links that jump to unread messages. -->
+<message name="scJump">
+Jump
+</message>
<!-- The name of the user area. This may not need translation from English. Case matters. -->
<message name="scUserArea">
User area
@@ -79,15 +83,6 @@
<message name="scUpdateName">
Update Ready!
</message>
-<!-- The names of the video controls labeled by these scripts. -->
-<!-- The Mute/Unmute label is also used for the mute button for a stream. -->
-<message name="msgVideoControlNames">
-Play/Pause|Mute/Unmute|Expand/Restore
-</message>
-<!-- The label of the "control volume" control that is actually a mute button for streams. Case sensitive. -->
-<message name="scControlVolume">
-Control volume
-</message>
<!-- What to say in a special focus situation like a menu or JAWS buffer when the user-initiated script is not meant for that setting. -->
<message name="msgSpecial">
This command does not work in menus or JAWS dialogs
@@ -172,6 +167,10 @@
<message name="chat___msgNoContent">
No content
</message>
+<!-- What to say when the user tries to focus a message separator element (generally a date header). -->
+<message name="chat___msgNoSep">
+Can't focus a message separator
+</message>
<!-- How to name the unread-messages separator element. -->
<!-- This is actually the (non-punctuation) text of the bar's UIA element automationId. -->
<message name="chat___msgUnreadBar">
Revision 207, March 2, 2024, tested against application version 1.0.9034
This is an interim script release that continues to address serious performance concerns under at least JAWS 2024.
It also improves the reliability of message reaction reporting.
Specific changes in this release:
- Navigating with Up and Down arrows in a conversation's message list is faster by
orders of magnitude and should not slow down noticeably when the number of displayed messages grows very large.
This applies with the virtual cursor off, which is the default in these scripts. There is a known JAWS 2024 issue
that causes slowing or freezing during arrow navigation in a chat message list area with the virtual cursor;
that issue is not addressed here and is not a script issue.
- The chat navigation commands are similarly much faster and should scale well.
Note however that, when present, the scroll bars for scrolling the chat history up and down are represented
in this chat navigation system by "no content" entries, and that scrolling via these controls may alter your
position in the chat history at this time.
- During navigation by either of the means just mentioned, reactions to a message are briefly
summarized before the message is read, to make them easy to find.
Discord itself sometimes, but not consistently, reports reactions after messages and in a longer format.
This feature may for now result in occasional duplicate reaction announcements for a message, but this
script author regards that as better than not being told of reactions at all.
It is still necessary to
RouteJAWSToPC
to find out who posted reactions, and it then might be
necessary to Alt+Tab out of and back in to Discord in order to get navigation keys to work as
expected again; these are issues remaining to be addressed.
- The chat navigation system is documented to save the current position for each conversation separately.
Due to the required rewrite for speed, however, the last position for a particular conversation may be
effectively forgotten if a different conversation is opened. This may be fixed, or alternatively the
documentation updated, depending on what people appear to want done.
- When a channel's message history is empty except for a notice of lacking permission to see message
history in that channel, the chat navigation system will include that notice as if it were a message.
At this time, normal navigation in Discord will not report this notice, with or without scripts, except
perhaps via the virtual cursor.
- The feature of naming gifs in a chat message is removed, because it relied on access to gif URLs, which
Discord no longer provides. This feature was introduced in script revision 129 (December, 2022).
- Translators: No changes in this revision for translation, though the
above-mentioned pre-message announcement of reactions may be more verbose in non-English Discord versions.
Revision 196, February 26, 2024, tested against application version 1.0.9034
- Some operations are faster in JAWS 2024 than before, though this is an ongoing effort.
- The sequence [ U moves to the user area, and usually to the Set Status button within it.
This is helpful when using the Shift+Alt+Down Discord command to move among channels with unread
messages, as a means to move out of a
list control where that keystroke does not perform the desired function.
- The following commands work as expected in Discord instead of saying "Not in table":
- Ctrl+Alt+Up and Ctrl+Alt+Down, for moving to the previous and next server in the
server list, respectively.
- Ctrl+Shift+Alt+Up and Ctrl+Shift+Alt+Down, for moving to the previous and next
unread channel with mentions.
- JAWS will include, during arrowing through channels, indications of
- When a channel has limited access (this was broken by recent Discord changes but works again).
Note that some community servers will show this icon beside most channels.
- When a channel is age-restricted.
- When a text channel contains active threads.
- When a channel is a forum channel rather than a normal text channel.
JAWS will say "text forum channel" for these.
- For a stage channel, whatever information about its participants is shown, similar to what
is done for voice channels.
For a stage channel, this will typically be presenter information and a count of audience members but without
their names.
- The [ T sequence for identifying who is typing is included in the
help system for exploring available script command
sequences.
- The sequence [ S for moving to the server tree may work in a few situations where it did not.
- This document includes, in Tips and Tricks, a short subsection on the
multiple behaviors of the Up arrow key in a chat message entry box.
- Translators: There are several changes to one message file.
Diff showing message file changes
Lines starting with a dash are old, with a plus are new, and with a space are for context.
This material is offered experimentally to see if it helps translators keep up with project changes.
=== modified file 'discord_lang.xml'
--- old/discord_lang.xml 2024-01-08 22:26:25 +0000
+++ new/discord_lang.xml 2024-02-26 23:23:29 +0000
@@ -22,12 +22,14 @@
=|Command
a=Say who is active now if the Friends page is showing
b=List buttons
-d=Disconnect
+d=Disconnect from voice or video
n=@
shift+n=@
p=Say ping time if visible
s=Move into the server tree
-w=Who is the current chat participant in more detail
+t=Say who is typing
+u=Move to the user area
+w=Say who is the current chat participant in more detail
Home or h=Read first visible chat message
Shift+Home or Shift+H=Go to and announce the Unread chat message marker if visible
LeftArrow or J=Read previous chat message
@@ -99,6 +101,23 @@
<message name="scVoice">
(voice channel),
</message>
+<!-- The same for a stage channel. -->
+<message name="scStage">
+(stage channel)
+</message>
+<!-- The same for a text channel. -->
+<message name="scText">
+(text channel)
+</message>
+<!-- The prefix on the name of a channel icon (image) that says it's a forum channel. -->
+<message name="scForum">
+Forum
+</message>
+<!-- How to identify a forum channel. -->
+<!-- This is made to replace the above text channel indicator on output. -->
+<message name="msgForumChannel">
+(text forum channel)
+</message>
<!-- The exact, case-sensitive name of the "Active Now" section of the Friends page. -->
<message name="scActiveNow">
Active Now
Revision 179, January 8, 2024, tested against application version 1.0.9028
- This document includes a new Tips and Tricks section with guidance on ways to perform
various tasks efficiently.
- Typing sounds and announcements are now disabled because this feature can slow down interaction in some
conversation windows, especially busy ones
and windows that contain numerous messages.
The corresponding Quick Settings options are also removed.
The key sequence [ T will identify who is typing at any given moment in the current chat or channel
window.
- Various efforts have been made to speed up interaction in chat windows, notably when tabbing to find Play
and Download buttons on messages
containing media.
- The following features that stopped working in recent Discord updates should work again:
- The [ T sequence for checking to see who is typing in a chat or channel window.
- Inclusion of active voice channel name and its server name in Insert+T
when you are in a voice channel.
Also, when the server containing the voice channel is also the current server, JAWS will no longer say the server
name an extra time.
- Inclusion in Insert+T of the online/idle status of a chat participant when applicable.
- The [ P key sequence for reporting ping time when you are in a voice channel.
- Announcement of voice channel participants during arrowing through a channel list.
JAWS will also include a plus sign (+) and a count of missed users if it appears that not all users
in the channel are found.
This may happen if some of the members' names are scrolled off of the screen.
- The [ W sequence for reporting channel and participant information.
- The announcement of arrow key names in the Keybinds tab of User Settings.
- The "New Messages" announcement after using a chat navigation key sequence to move to
the indicator above unread messages.
- JAWS no longer repeats the server name on Insert+T. This information was at some point added by
Discord itself to the window title.
Revision 161, August 30, 2023, tested against application version 1.0.9016
- JAWSKey+Shift+V, a standard JAWS keystroke, virtualizes chat messages to
provide an alternate and reviewable representation of their text.
- Group headings in the User Settings screen that separate tabs into groups now say "group" instead of
"button," for clarity.
- In the Keybinds tab of User Settings, JAWS will announce the arrow keys that are part of various
keystrokes even though they are drawn in Discord with SVG and without accessible names.
This code is written in a way that will hopefully stop altering JAWS output if Discord one day addresses
this issue internally.
- Documented the same-channel notification issue (Discord no longer sending Windows
notifications when a message arrives in the currently focused channel, even when Discord itself is not on
screen, if the checkbox requesting a sound for such messages is checked in User Settings).
- Typing into conversation edit boxes may in some cases be faster / more responsive.
Under certain conditions, the code for detecting typing indicators in these windows was taking more time
than desired and should now run much faster.
Thanks to Anthony for testing assistance for this update.
Revision 151, July 10, 2023, tested against application version 1.0.9012
- Focused expand/collapsed buttons in message lists no longer say "pressed" when they shouldn't.
- Virtual cursor navigation in message lists should be faster.
- Fixed the double press of JAWSKey+F1 failing to load the script help document. Thanks to Chris
Duffly for catching this.
- Minor efficiency improvements in HTML processing code, via removal of old code to support JAWS 14.0.
Revision 149, June 24, 2023, tested against application version 1.0.9012
- The sequence [ A will announce the
contents of the "Active Now" section of the Friends page,
if it is showing.
- Insert+T reports DM participant online status in current Discord versions as it did in older ones.
- During arrowing through various lists with the JAWS virtual PC cursor turned off,
JAWS will say more about the current item:
- For a voice channel in a server's channel list, the list of current participants, with mute and deafen
statuses for each.
- For a server's channel list, any special
notes for a channel.
Currently, the only note tested is "Limited," which is how Discord now identifies channels that were once
called "Locked."
(This script feature replaces the locked channel indicator from revision 90.)
- For the direct message list, the following as appropriate after the normal name announcement:
- When a single DM contact is locally renamed via the "Add friend nickname" context menu option, the current
name for the user that would apply without the local renaming.
- For a single DM contact, the online status (online, online via mobile, offline, idle, etc.).
- For a group DM entry, the number of members in the conversation.
- Various virtual cursor issues are fixed:
- JAWS announces group start and end lines correctly instead of saying "Chrome legacy window."
- Buttons say "collapsed" when they should.
This script author apologizes for these, which were the result of insufficient testing with virtual cursor
navigation in the message area.
- The web preview announcement feature, added in script revision 129, is removed
because Discord by now includes this material natively.
- The UIA support is refactored significantly and updated to account for recent increases in JAWS' UIA support.
A JAWS restart after installing this script update is recommended, though not required.
This refactor is being applied to several projects.
Users who use several of this author's script sets may notice a slight reduction in JAWS' memory consumption as
these updates progress.
Revision 131, January 15, 2023, tested against application version 1.0.9008
Revision 130, January 1, 2023, tested against application version 1.0.9008
- Chat navigation commands work in current Discord versions.
- When encountering a reply message, the chat navigation commands no longer read the answered message before
the one requested.
Revision 129, December 26, 2022, tested against application version 1.0.9008
- Gifs in conversation messages are described when possible.
This feature relies on certain structural elements of Discord's Gif inclusion in a conversation message.
This feature does not use OCR nor send anything to a recognition service.
- When web preview material appears in a Discord message, such as for a Youtube or Twitter link, it will
speak after the message itself.
Revision 125, November 19, 2022, tested against application version 1.0.9007
- A new command for announcing information about the current DM or channel, [
W, has been added.
- Typing indicator sounds and announcements are possible in a chat or text channel, and the sequence [ T
announces whether a user is currently typing. Quick Settings includes two new related settings for
this feature. By default, sounds are enabled and automatic spoken announcements are not.
- When encountered during navigation among chat messages via the scripts' chat navigation commands, the
separator bar that indicates the start of new messages will be announced as "New messages."
Revision 114, January 31, 2022, tested against application version 1.0.9003
Note: This is a significant revision, and installing it correctly requires use of the script
installer rather than just the BX Update approach, for those who frequently use that.
For those who must install the scripts without using the installer, note that there are additions to the
discord_directives.txt
file in this revision.
Finally, note that some commands are removed from this revision as explained below.
Changes:
- The scripts now turn off the JAWS virtual cursor, as is common to do for Electron-based apps such as Discord.
This change permits navigation of message lists, channel lists, etc. with arrows.
It also permits JAWS users to take direct advantage of the accessibility features that Discord has been
incorporating, including keystrokes and specific formats of messages and lists.
You may still activate the virtual cursor by using the Insert+Z JAWS command as necessary.
The virtual cursor is still useful in at least the following situations:
- Setup screens.
- The Home screen, to reach the summary at the bottom of who is in what voice channel on which server.
- The key sequences [ N and Shift+N duplicate the Discord-native keystrokes
F6 and Shift+F6 for moving forward and backward among screen regions. This is for those
whose keyboards do not conveniently support sending function keys such as F6.
- The command sequences for moving to the top of the voice and text categories in the
channel list,
[ V and [ C, are removed. These commands relied on the virtual cursor being active, and that
cursor is now turned off by the scripts. Also, these commands relied on default Discord channel naming and
organization schemes, which many server owners choose to replace.
The recommended way to find channels is now to use the new sequence [ N, or the Discord-native
equivalent F6, to move to the channel list; then use Up and Down arrows to
move among channels.
Text and voice channels may be mixed, even within the same category, according to server owner preferences.
- JAWS announces user statuses like "offline" during navigation through the DM list on the Home screen with
the virtual cursor off.
- The auto-complete script code for mentions etc. is removed as Discord happily made this code unnecessary.
- Incoming messages should again announce correctly. For a while, JAWS just announced a colon for an
incoming message.
This change involved a rewrite of how to determine the text of an incoming message, as the structure of
messages changed since initial script publication.
- Arrows in the Mentions tree under Inbox read messages without also repeating numerous messages that are
not in focus.
- Arrows in Inbox > Unreads announce messages instead of just saying "Jump" for a message.
- Messages no longer repeat during chat message navigation when an end of the list is encountered.
- The sound produced on hitting an end of the message list is changed from a system beep to a short click.
Revision 96, January 27, 2021, tested against application version 0.0.308 as updated November 6, 2020
- The JAWS
LeftMouseButton
and RightMouseButton
commands, when issued while the PC
or virtual cursor is active, will click at the current virtual cursor position when possible.
This may serve to help with clicking items that are otherwise hard to click.
- Removed the [ Space sequence for clicking buttons, as it no longer seems necessary and is
effectively replaced with the above enhancement, with the added benefit of including right-click support as well as
left-click support.
- Removed the special support for the system tray menu, as Discord now natively permits arrows and Enter
to work there as expected.
This also removes extra beeps during navigation through context menus such as for a Discord user in a voice channel.
- Updated the autocomplete documentation to mention the need to escape arrows to make them
move among options if the JAWS "auto forms mode" behavior is in effect.
- Very minor code update to improve support for JAWS 2021.
Revision 92, December 08, 2020, tested against application version 0.0.308 as updated November 6, 2020
- Mention autocomplete support works in the Discord update from December 7, 2020.
This Discord update improved assistive technology support by replacing non-standard MSAA element roles with
standard ones; the scripts just needed an update to adjust to the change.
- Mention autocomplete support is skipped when the virtual cursor is active, so those who prefer the virtual-cursor
methods of handling mentions can still do things that way.
Revision 90, November 29, 2020, tested against application version 0.0.308 as updated November 6, 2020
- The system tray context menu is usable: Use Up and Down arrows to select an item and
Enter to execute it.
Note that it is still necessary to Alt+Tab to exit the menu.
- JAWS announces autocomplete items when an autocomplete box appears and when the user arrows
through its options.
- System messages and messages that contain mentions should read correctly via the chat navigation system.
- When using the chat navigation system, commands that read the current message will spell
its content if typed twice quickly.
For example, typing [ and then K twice quickly will spell the current message.
- Locked channels will say "locked."
Note that this does not necessarily mean you are not allowed into the channel; it means the channel is restricted.
- In the November 26, 2020 Discord update, the chat navigation system no longer includes blank entries at the
start and end of the visible message range.
Revision 78, November 07, 2020, tested against application version 0.0.308 as updated November 6, 2020
- [ S moves to the server tree and activates forms mode if necessary.
The Home link and links to any new items appear at the top of this tree.
- Fixed Insert+T's ability to report screens with unread content for Discord versions released
starting in early November, 2020..
- Incoming chat messages in the current window speak again as they did in older Discord versions.
This fix was actually slipped into the previous (revision 74) release but not announced there.
Revision 74, November 02, 2020, tested against application version 0.0.308 as updated October 30, 2020
This release is largely aimed at addressing some problems that appeared in the Friday, October 30, 2020 Discord
release.
This Discord version can be identified by the Home link being part of, rather than above, the server tree.
There are also other features that are not related to the Discord update, as listed below.
- Incoming messages in the current window speak as they did before the October 30 Discord update.
- The chat navigation commands work again.
- The sequence [ Space, when the cursor is on a server tree item and forms mode is active, will
activate that server.
This feature is included as a workaround to Discord having stopped doing this on Enter in this Discord
update, though the issue is also being addressed in Discord itself in the near future according to reports.
- There is a command for listing buttons for activation.
- The "Control volume" button for a stream is named "Mute/Unmute" because that is the function of the button.
- The command sequence [ O for moving to the Home link is removed, as the Home link is now a graphic
within and at the top of, rather than outside and above, the server tree.
- JAWSKey+T includes more warning text, such as when a stream is unable to include audio.
Revision 68, October 25, 2020, tested against application version 0.0.308 as updated October 12, 2020
- These scripts load under more conditions, as Discord seems sometimes to present itself to JAWS differently
("Discord," "discord.com", etc.).
These scripts also load for the http://discord.com/app web Discord app.
- Incoming chat messages in the current window read automatically.
- The chat reading system finally works and has a new command structure.
This system includes means to read chats sequentially while remembering the current position in all available
chats at once, means to check the most recent (visible) chat messages without altering position, a way to jump to
the marker above the first unread chat according to Discord itself, and a command for moving the virtual cursor
to just above the text of the current chat message, such as in order to handle buttons for playing media within a
chat message.
- When the JAWS virtual cursor is active in a user's modal popup information dialog and it crosses the Roles
list, JAWS will announce any roles listed for the user.
This makes it possible to determine who on a server is an admin, moderator, etc.
- [ D presses the Disconnect button when available on screen.
- [ O moves to the Home link.
- The JAWS
SayWindowTitle
command, Insert+T, will include several new
items as applicable.
- Added the [ C and [ V commands for moving to the Text chat and Voice channel categories.
(These were then removed in November, 2021 because they were only effective with
the virtual cursor active and on servers where the channel organization was not altered from Discord
defaults.)
- Buttons in video controls within a chat message are named rather than being "Unlabeled."
- Stopped accidentally labeling as "Close" a "Dismiss" button that is already named properly by Discord itself.
- The installer contains version and product information visible from the Details tab in Windows Explorer,
to better identify its contents. This update is being applied to all projects.
- A "directives" text file is included that provides information on how to install this set of scripts manually.
See "Handling Directives Files" in the "Common
Script Elements" document for further information.
- For those who need to change the Command key, the left bracket ([) by default, the system is
significantly improved, so that you need not type the key or key combination out as a name or string of key
names. You may
edit the keystroke names before accepting them, but JAWS will type them out for you now.
The system is documented in more detail in the Multi-Key
Command Sequence section of my Common Script Elements page.
- Keystroke names in this document are more consistent, and there are other minor documentation improvements.
- Fixed a bug that could cause some localized strings not to be spoken where expected.
- Many more internal code updates not listed individually here.
Revision 16, May 9, 2019, tested against application version 0.0.305
Initial release for Aleric to test:
- The Insert+T fix appears to work.
- [ Space clicks badges and buttons that otherwise don't respond to keystrokes.
- Some Close buttons are named properly.
- Pressed buttons, like Member List, report the "pressed" state as appropriate.
- Chat commands exist but say "Not yet implemented."