diff --git a/Commands/index.html b/Commands/index.html index 64588e76..ae1bdb80 100644 --- a/Commands/index.html +++ b/Commands/index.html @@ -1334,7 +1334,7 @@
Chatterino comes with a collection of built-in commands to help with channel management, Twitch interaction, and other misc. features.
/banid
¶Usage: /banid <userID>
1
Usage: /banid <userID>
Bans a user by their userID instead of their username. Useful for banning users who are temporarily suspended from Twitch, which /ban
cannot do anymore.
Note:
If you ban a suspended user this way, they cannot be unbanned from Chatterino, you must wait until their suspension ends or unban them from browser chat.
/block
& /unblock
¶Added in 2.4.2 ↩
-When running on Windows, Chatterino 2.4.1 and later will automatically save information about a crash in a minidump.
+When running on Windows, Chatterino will automatically save information about a crash in a minidump.
Crashdumps are saved inside the Crashes/reports
folder in your Chatterino folder.
Minidumps contain the stacks of all threads, their state (registers), the exception associated with the crash, and some metadata about the CPU and the OS. If you are unsure if your crashdump contains sensitive information, ask a Chatterino developer on the Discord server.
There are several ways of analyzing crashes. To get started, you need to have a symbol (PDB) file for your installation. These files are unique per build meaning that you need to download the file (this is especially important when using nightly builds). For GitHub builds, you can find the PDB file in the release - it's zipped in an archive ending in .pdb.7z
. For simplicity, extract the .pdb
to the location of your chatterino.exe
.
Available since nightly 69bdac9 ↩↩↩
+ @@ -1738,7 +1738,7 @@NOTE:
A Verified Phone Number is NOT the same thing as Two-Factor Authentication.On February 24th 2023 Twitch shutdown the service old versions of Chatterino used to send whispers. You must update to 2.4.0 or newer to continue sending whispers.
You need to be logged in to see emotes. Try hitting F5 once to manually refresh the emotes.
@@ -1400,7 +1380,7 @@5d0bdc1
.
+Chatterino supports custom-made themes since 2.5.1.
Custom themes are JSON files that are stored in the Themes
folder inside your Chatterino folder.
To create a theme, it's best to use one of the built-in themes as the starting point. @@ -1095,7 +1095,7 @@
This wiki provides information for Chatterino.
"},{"location":"Commands/","title":"Commands","text":"Commands are used as shortcuts for long messages. If a message starts with the \"trigger\" then the message will be replaced with the Command.
"},{"location":"Commands/#built-in-commands","title":"Built-in commands","text":"Chatterino comes with a collection of built-in commands to help with channel management, Twitch interaction, and other misc. features.
"},{"location":"Commands/#banid","title":"/banid
","text":"Usage: /banid <userID>
1
Bans a user by their userID instead of their username. Useful for banning users who are temporarily suspended from Twitch, which /ban
cannot do anymore.
Note:
If you ban a suspended user this way, they cannot be unbanned from Chatterino, you must wait until their suspension ends or unban them from browser chat.
/block
& /unblock
","text":"Usage: /(block|unblock) <user>
Blocks or unblocks the specified user. Blocking will hide that user's messages/whispers as well as disassociate them from you on Twitch. For more information about blocking, see Twitch's help article.
"},{"location":"Commands/#chatters","title":"/chatters
","text":"Usage: /chatters
Shows the total amount of chatters currently connected to the channel.
"},{"location":"Commands/#clearmessages","title":"/clearmessages
","text":"Usage: /clearmessages
Clears all messages from the current split/channel. This command is purely visual and is not related to the /clear
moderator command.
/clip
","text":"Usage: /clip
Creates a clip from the last 30 seconds of the current channel. Also provides an edit link to edit a clip from the current point in time.
"},{"location":"Commands/#debug-args","title":"/debug-args
","text":"Usage: /debug-args
Displays the arguments that chatterino was launched with.
"},{"location":"Commands/#delete","title":"/delete
","text":"Usage: /delete <msg-id>
Moderator only, deletes a message in chat with the provided ID. Usually used in mod actions as they can pass through the message ID.
"},{"location":"Commands/#fakemsg","title":"/fakemsg
","text":"Usage: /fakemsg <raw message>
Displays the provided IRC messsage in chat as if it was sent from Twitch's IRC server.
"},{"location":"Commands/#marker","title":"/marker
","text":"Usage: /marker
Editor only, creates a stream marker in the current stream. Streamer must be live to create markers.
"},{"location":"Commands/#openurl","title":"/openurl
","text":"Usage: /openurl <url>
Opens a URL in the default web browser. Useful in custom commands.
"},{"location":"Commands/#popout","title":"/popout
","text":"Usage: /popout [channel]
Opens the current channel or provided channel's chat in Twitch's popout webchat, using your default browser.
"},{"location":"Commands/#popup","title":"/popup
","text":"Usage: /popup [channel]
Opens the current channel or provided channel's chat in a new window.
"},{"location":"Commands/#r","title":"/r
","text":"Usage: /r <message>
Replies to the last received whisper.
"},{"location":"Commands/#setgame","title":"/setgame
","text":"Usage: /setgame <game>
Broadcaster only, sets the current channel's game to the best match of the provided game name.
"},{"location":"Commands/#settitle","title":"/settitle
","text":"Usage: /settitle <title>
Broadcaster only, sets the current channel's title to the provided text.
"},{"location":"Commands/#streamlink","title":"/streamlink
","text":"Usage: /streamlink [channel]
Attempts to open current or specified stream in streamlink. For more information, see Streamlink's website.
"},{"location":"Commands/#uptime","title":"/uptime
","text":"Usage: /uptime
Displays the uptime of the current channel's livestream.
"},{"location":"Commands/#user","title":"/user
","text":"Usage: /user <user> [channel]
Opens the specified user's Twitch usercard for the given channel (or the channel provided) in the default browser.
"},{"location":"Commands/#usercard","title":"/usercard
","text":"Usage: /usercard <user> [channel]
Opens the specified user's Chatterino usercard for the given channel or the channel provided.
"},{"location":"Commands/#w-whisper","title":"/w
(Whisper)","text":"Usage: /w <user> <message>
Whispers the provided text to a user on Twitch. See Chatterino's whisper FAQ item for whisper-related issues.
"},{"location":"Commands/#custom-commands","title":"Custom commands","text":""},{"location":"Commands/#example","title":"Example","text":"Add Command Hello chat :)
with the trigger /hello
. Now typing /hello
in chat will send Hello chat :)
instead of /hello
.
/
{1}
, {2}
, {3}
and so on can be used to insert the 1st, 2nd, 3rd, ... word after the trigger. Example: Add Command /timeout {1} 1
with trigger /warn
. Now typing /warn user123
will send /timeout user123 1
Similarly {1+}
and so on can be used to insert all words starting with the 1st, ... word. Example: Add Command Have a {1+} day!
with trigger /day
. Now typing /day very super nice
will send Have a very super nice day!
You can use {{1}
if you want to send {1}
literally.
{channel.name}
can be used to insert the name of the current channel. Example: Add Command /openurl https://twitch.tv/{channel.name}
with trigger /openchannel
. Now typing /openchannel
will open the current channel in your browser.
{channel.id}
can be used to insert the Twitch account ID of the owner of current channel.
{my.name}
can be used to insert the Twitch username of the currently selected account.
{my.id}
can be used to insert the Twitch account ID of the currently selected account.
{stream.title}
can be used to insert the title set in the current channel. Only works if the channel is live. Example: Add Command The title is {stream.title}
with trigger /title
. Now typing /title
will send a message like The title is Programming.S04E74.1440p.MP4-XD.NVENC
{stream.game}
can be used to insert the game set in the current channel. Only works if the channel is live. Example: Add Command I'm currently playing {stream.game}
with trigger /game
. Now typing /game
will send a message like I'm currently playing World of Warcraft
.
Added in 2.4.2\u00a0\u21a9
This is a set of guidelines for contributing to Chatterino. The goal is to teach programmers without C++ background (java/python/etc.), people who haven't used Qt or otherwise have different experience the idioms of the codebase. Thus, we will focus on those which are different from those other environments. There are extra guidelines available here, but they are considered as extras and not as important.
"},{"location":"Contributing%20for%20Developers/#tooling","title":"Tooling","text":""},{"location":"Contributing%20for%20Developers/#formatting","title":"Formatting","text":"Code is automatically formatted using clang-format
. It takes the burden off of the programmer and ensures that all contributors use the same style (even if mess something up accidentally). We recommend that you set up automatic formatting on file save in your editor.
Comments should only be used to:
Try to structure your code so that comments are not required.
"},{"location":"Contributing%20for%20Developers/#good-example","title":"Good example","text":"/**\n * @return 0 if a == b, negative if a < b and positive if b > a. (1)\n */\nint /* (2)! */ compare(const QString &a, const QString &b);\n
/*\n * Matches a link and returns boost::none if it failed and a\n * QRegularExpressionMatch on success. (1)\n *\n * @param text The text that will be checked if it contains a link. (2)\n */\nboost::optional<QRegularExpressionMatch> matchLink(const QString &text);\n
Arithmetic types (like char
, int
, float
or size_t
), bool
, and pointers are NOT initialized by default in C++. They keep whatever value is already at their position in the memory. This makes debugging harder and is unpredictable, so we initialize them to zero by using {}
after their name when declaring them.
class ArithmeticTypes\n{\n // DO\n int n{}; // (1)!\n bool isEnabled{}; // (2)!\n QWidget *myPtr{}; // (3)!\n int thisIs5 = 5; // (4)!\n std::vector<int> myVec; // (5)!\n\n // DON'T\n int m; // (6)!\n bool isHidden; // (7)!\n QWidget *yourPtr; // (8)!\n std::vector<int> myVec{}; // (9)!\n};\n
0
.false
.nullptr
.5
.{}
.{}
as the default constructor will be called even without {}
.The way a parameter is passed signals how it is going to be used inside the function. C++ doesn't have multiple return values, so there is \"out parameters\" (reference to a variable that is going to be assigned inside the function) to simulate multiple return values.
Cheap to copy types like int/enum/etc. can be passed in per value since copying them is fast.
void setValue(int value /* (1)! */) {\n this->value_ = value;\n}\n\nvoid sendGreeting(const /* (2)! */ User &user /* (3)! */, MessageFlags flags /* (4)! */) {\n this->sendMessage(user.id(), user.name(), flags);\n}\n
int
s are cheap to copy. Here, the parameter will likely be passed in a register.const
.User
is a class that contains the user's name and other fields, thus it's expensive to copy - so a reference is used.MessageFlags
is an enum, so it's cheap to copy.References mean that the variable doesn't need to be copied when it is passed to a function.
Type Meaningconst Type& name
in Parameter. It is NOT going to be modified and may be copied inside the function. Type& name
out or in+out Parameter. It will be modified. Pointers signal that objects are managed manually. While the above are only guaranteed to live as long as the function call (= don't store and use later) these may have more complex lifetimes.
Type MeaningType* name
The lifetime of the parameter may exceed the length of the function call. It may use the QObject
parent/children system (see QObject Classes). R-value references &&
work similar to regular references but signal the parameter should be \"consumed\".
void storeLargeObject(LargeObject &&object) {\n // ...\n}\n\nvoid storeObject(std::unique_ptr<Object> &&object) {\n // ...\n}\n\nvoid main() {\n LargeObject large = { /*...*/ };\n\n storeLargeObject(std::move(large)); // (1)!\n\n std::unique_ptr<Object> unique = std::make_unique(/*...*/);\n storeObject(std::move(unique)); // (2)!\n\n assert(unique.get() == nullptr); // (3)!\n}\n
storeLargeObject
accepts an r-value reference, and we use std::move()
, thus we move the object and avoid the need to copy.std::unique_ptr
, so we need to move here.storeObject
, so it just holds a null pointer now.Generally the lowest level of requirement should be used e.g. passing Channel&
instead of std::shared_ptr<Channel>&
(aka ChannelPtr
) if possible.
All functions names are in camelCase
. Private member variables are in camelCase_
(note the underscore at the end). We don't use the get
prefix for getters. We mark functions as const
if applicable.
class NamedObject\n{\npublic:\n const QString &name() const; // (1)!\n void setName(const QString &name);\n bool hasLongName() const; // (2)!\n\n static void myStaticFunction(); // (3)!\n QString publicName;\n\nprivate:\n QString name_; // (4)!\n // QString name; (5)\n\n void myPrivateMethod(); // (6)!\n};\n\nvoid myFreeStandingFunction(); // (7)!\n
get
prefix.has
or is
prefix is okay._
suffix.name()
accessor._
suffix.(type)variable
.type(variable)
void example(float f, Base *b, const User &user, int p) {\n // DO\n int i = int(f); // (1)!\n Derived* derived = dynamic_cast<Derived*>(base); // (2)!\n if (derived != nullptr) // (3)!\n {\n // use derived\n }\n\n // BE CAREFUL\n const_cast<User &>(c).setName(\"foo\"); // (4)!\n float *pp = reinterpret_cast<float*>(&p); // (5)!\n\n // DON'T (6)\n int i = (int)f;\n Derived* derived = (Derived*)base;\n ((int &)c) = 123;\n float *pp = (float*)&p;\n}\n
Always use this
to refer to instance members to make it clear where we use either locals or members.
class Test\n{\n void testFunc(int a);\n int testInt_{};\n}\n\nTest::testFunc(int a)\n{\n // DO\n this->testInt_ += 2;\n this->testFunc();\n\n // DON'T\n testInt_ -= 123;\n testFunc(2);\n this->testFunc(testInt_/*(1)!*/ + 1);\n}\n
Keep the element on the stack if possible. If you need a pointer or have complex ownership you should use one of these classes:
std::unique_ptr
if the resource has a single owner.std::shared_ptr
if the resource has multiple owners.variable->deleteLater()
instead of delete variable
. This ensures that it will be deleted on the correct thread.std::unique_ptr<Type, DeleteLater>
with DeleteLater
from \"common/Common.hpp\". This will call deleteLater()
on the pointer once it goes out of scope or the object is destroyed.When running on Windows, Chatterino 2.4.1 and later will automatically save information about a crash in a minidump.
Crashdumps are saved inside the Crashes/reports
folder in your Chatterino folder.
Minidumps contain the stacks of all threads, their state (registers), the exception associated with the crash, and some metadata about the CPU and the OS. If you are unsure if your crashdump contains sensitive information, ask a Chatterino developer on the Discord server.
There are several ways of analyzing crashes. To get started, you need to have a symbol (PDB) file for your installation. These files are unique per build meaning that you need to download the file (this is especially important when using nightly builds). For GitHub builds, you can find the PDB file in the release - it's zipped in an archive ending in .pdb.7z
. For simplicity, extract the .pdb
to the location of your chatterino.exe
.
For analyzing with a GUI, install WinDbg. After the installation, you should be able to open the crashdumps (.dmp
files) right from the Windows Explorer. By default, you won't get much information.
To add names to functions (symbols), open the settings (Home > Settings), go to Debugging Settings, and add the directory you extracted your symbol file to the Symbol path. If there's no srv*
entry, consider adding one - this will try to load symbols from servers for system libraries.
To add source-files, clone the repository and checkout the source-tree at the version of your executable. Then add this path to Source Path in the Debugging Settings.
Note: You might need to reload your window to have your changes be picked up.
Example Settings"},{"location":"Crash%20Analysis/#minidump-stackwalk","title":"minidump-stackwalk","text":"If you want to use the terminal or don't have a Windows machine, you can use minidump-stackwalk
. Install minidump-stackwalk
and dump_syms
with cargo (installation): cargo install <app>
.
First, you need to generate a symbol-store from the PDB file with dump_syms
:
dump_syms chatterino.exe -s <store-path> # (1)!\n
After you dumped the symbols, run:
minidump-stackwalk <path-to-crashdump> --symbols-path <store-path>\n
Since Chatterino has quite a few threads, the output will be long. Most of the time, you're interested in the first thread (GUI thread) since it's the crashing thread.
"},{"location":"Environment%20Variables/","title":"Environment Variables","text":"Below I have tried to list all environment variables that can be used to modify the behaviour of Chatterino. Used for things that I don't feel like fit in the settings system.
"},{"location":"Environment%20Variables/#chatterino2_recent_messages_url","title":"CHATTERINO2_RECENT_MESSAGES_URL","text":"Used to change the URL that Chatterino2 uses when trying to load historic Twitch chat messages (if the setting is enabled). Default value: https://recent-messages.robotty.de/api/v2/recent-messages/%1
(an open-source service written and currently run by @RAnders00 - visit the homepage for more details about the service) Arguments:
%1
= Name of the Twitch channelUsed to change the URL that Chatterino2 uses when trying to get link information to display in the tooltip on hover. Default value: https://braize.pajlada.com/chatterino/link_resolver/%1
Arguments:
%1
= Escaped URL the link resolver should resolveUsed to change the URL that Chatterino2 uses when trying to get emote set information Default value: https://braize.pajlada.com/chatterino/twitchemotes/set/%1/
Arguments:
%1
= Emote set IDString value used to change what Twitch chat server host to connect to. Default value: irc.chat.twitch.tv
Number value used to change what port to use when connecting to Twitch chat servers. Currently known valid ports for secure usage: 6697, 443. Currently known valid ports for non-secure usage (CHATTERINO2_TWITCH_SERVER_SECURE set to false): 6667, 80. Default value: 443
Bool value used to tell Chatterino whether to try to connect securely (secure irc) to the Twitch chat server. Default value: true
Used to set a proxy for network interactions of Chatterino. Both HTTP and SOCKS51 proxies are supported. The URL supports username and password authentication. Example: http://username:password@127.0.0.1:1080
or socks5://127.0.0.1
(defaults to port 1080
).
Used to enable/disable logging at run time. For example: QT_LOGGING_RULES=\"chatterino.*.debug=true\"
to enable debug logging in release builds. (It's on by default in debug builds). See Qt docs for more details.
Used to customize logging at run time. For example: QT_MESSAGE_PATTERN=\"%{time hh:mm:ss.zzz} %{category}: %{function} %{message}\"
enables a timestamp and function name in log messages. See Qt docs for more details.
When using a SOCKS5 proxy, WebSockets (Twitch PubSub, 7TV EventAPI, and BTTV EventSockets) are not proxied. Only IRC and HTTP requests are proxied.\u00a0\u21a9
We support Twitch's Chat Replies feature.
A reply can be executed by right-clicking a message, and selecting Reply to message
, or by opening an existing Reply Thread and sending your message there. Users who replied to your message, or messages sent in a reply thread you participated in, are highlighted and can be customized in the highlight setting Participated Reply Threads
.
Filters are a powerful tool to create your own custom, filtered channel splits. Filters allow you to selectively show messages that satisfy your own custom criteria: show subscribers' messages, moderator messages, channel point redemptions, new subscriptions, and more.
Looking for inspiration? Look at some example filters.
"},{"location":"Filters/#introduction-to-filters","title":"Introduction to Filters","text":"Filters can be applied to splits to provide a selective view of messages. Filters are created in the Settings page and are applied by opening the Split menu (three dots) and selecting \"Set filters\". Applied filters are saved when you close and open Chatterino.
Multiple filters can be applied to a Split. A message must pass all applied filters for it to be displayed.
Simple filters are available through the Channel Filter Creator dialog. Advanced filters take inspiration from many programming languages, and the full description of keywords and operators can be found below.
"},{"location":"Filters/#writing-your-own-filters","title":"Writing your own filters","text":"To begin writing your own filters, take a look at the available operators and variables below.
For most tasks involving the message content, you can make use of the contains
operator, or the matches
operator with a regular expression. Then, try to break your desired behavior into multiple conditions. Combine them like this:
condition1 && condition2
)condition1 || condition2
)!(condition)
Consider the following intention: \"Only show me messages that are from moderators and mention me\". We can break this filter into two individual conditions:
We can then write the corresponding filter parts:
author.badges contains \"moderator\"
message.content contains \"@my_name\"
Finally, because we want both of these conditions to be true, we combine them with the AND operator &&
and end up with this final filter:
(author.badges contains \"moderator\") && (message.content contains \"@my_name\")
If you already have a filter, you can use the Quick Add
button and paste your filter into the Filter
section.
Here is some terminology that you'll encounter in the rest of this document.
message.content
represents the text of a message+
can add two numbers, 1 + 1
or concatenate strings, \"a\" + \"b\"
message.content contains \"hello\"
hello
message.length < 40 || author.subbed
channel.name == \"somestreamer\" && author.badges contains \"moderator\"
somestreamer
AND are from users with a moderator badgeThis section is aimed at technical users who have experience with general purpose programming languages.
A filter must be a valid expression. An expression is comprised of conditions and values which are evaluated to a single True
or False
value to decide whether to filter a message. Evaluating to something other than True
or False
will lead to all messages being filtered out.
A value can be:
123
, 5
)\"hello\"
, \"this is a string\"
)author.name
, message.length
)r\"\\d\\d\\d\\d\"
){123, \"hello\", author.name}
)Regular expressions are similar to strings, but are denoted with an r
before the opening quotation mark (e.g. r\"something\"
). To make a regular expression case-insensitive, use ri
before the opening quotation mark (e.g. ri\"something\"
).
Literals:
Name Example Int123
, 5
String \"Hello there\"
, \"Escaped \\\" quote\"
RegEx r\"\\d\\d\\d\\d\"
, ri\"something.*\"
List {\"list item\", 123}
"},{"location":"Filters/#operators","title":"Operators","text":"Binary operators act on two values:
1 + 2
author.subbed && flags.highlighted
\"long sentence\" contains \"ten\"
Unary operators act on one value:
!author.subbed
The following operators are available:
Operator Description&&
Logical AND ||
Logical OR !
Negation ==
Equals !=
Not equals <
Less than <=
Less than or equal to >
Greater than >=
Greater than or equal to contains
String, List, or Map contains startswith
String or List starts with text or value, respectively endswith
String or List ends with text or value, respectively match
Match string with regular expression +
Add (or string concatenation) -
Subtract *
Multiply /
Divide (integer) %
Modulus Please read about the type rules to better understand the evaluation semantics for operators that take multiple data types.
"},{"location":"Filters/#variables","title":"Variables","text":"The following variables are available:
Variable Type Description Author User who sent the messageauthor.badges
List List of author's badges author.color
Color* Color code of author, or none author.name
String Display name of author author.no_color
Bool Whether the author has no color set (i.e. gray name) author.subbed
Bool Whether author is subscribed author.sub_length
Int How long author has been subscribed (or zero) Channel The channel where the message was sent channel.name
String Channel name channel.watching
Bool Whether the channel is being watched (requires Chatterino extension) channel.live
Bool Whether the channel is currently live Flags Message-specific flags flags.highlighted
Bool Whether the message is highlighted flags.reward_message
Bool Whether the message is a redeemed channel point reward message (except \"Highlight my Message\") flags.points_redeemed
Bool Whether the message was redeemed through the channel point reward \"Highlight my Message\" flags.sub_message
Bool Whether the message is a sub/resub/gift message flags.system_message
Bool Whether the message is a system message (i.e. timeout/ban/info) flags.first_message
Bool Whether the message is the author's first message in the channel flags.cheer_message
Bool Whether the message includes bits flags.whisper
Bool Whether the message is a whisper flags.reply
Bool Whether the message is a reply flags.automod
Bool Whether the message has automod information or actions Message Actual message sent message.content
String Message content message.length
Int Message length Reward Information about the channel point redemption of this message, if any reward.title
1 String Title of the redemption (e.g. Drink water!) reward.cost
1 Int Cost of the redemption (e.g. 500) reward.id
1 String ID of the redemption (e.g. 1ed437f5-9dc3-4510-8a3f-abcad67985e1) *Note: To compare a Color
, compare it to a color hex code string: author.color == \"#FF0000\"
The Chatterino filter language is typed, meaning that every value has a type and only specific combinations of types are allowed when using operators. Generally, you won't run in to issues. The type system exists to warn you about any mistakes that your filter contains.
"},{"location":"Filters/#type-rules","title":"Type Rules","text":"Operator Form Result Description+
Int + Int
Int
Adds two integers +
String + Any
String
Concatenates the first string with the second argument -
Int - Int
Int
Subtracts two integers *
Int * Int
Int
Multiplies two integers /
Int / Int
Int
Divides two integers, discarding the remainder %
Int % Int
Int
Computes the modulus of two integers &&
Bool && Bool
Bool
Logical AND of two booleans ||
Bool || Bool
Bool
Logical OR of two booleans ==
Any == Any
Bool
Equality comparison of any two values !=
Any != Any
Bool
Inequality comparison of any two values >
Int > Int
Bool
Greater than comparison of two integers >=
Int >= Int
Bool
Greater than or equal to comparison of two integers <
Int < Int
Bool
Less than comparison of two integers <=
Int <= Int
Bool
Less than or equal to comparison of two integers startswith
List startswith Any
Bool
Checks whether the list has the given value as its first value startswith
String startswith String
Bool
Checks whether the first string starts with the second string endswith
List endswith Any
Bool
Checks whether the list has the given value as its last value endswith
String endswith String
Bool
Checks whether the first string ends with the second string contains
List contains Any
Bool
Checks whether the list contains the given value contains
Map contains Any
Bool
Checks whether the map has the given value as a key contains
String contains String
Bool
Checks whether the first string contains the second string match
String match RegEx
Bool
Checks whether the string matches the given regular expression match
String match {RegEx, n : Int}
String
Returns the n
th matching capture group, or the empty string"},{"location":"Filters/#regular-expressions","title":"Regular Expressions","text":"Chatterino can match string variables to a regular expression, returning whether the expression matched or, optionally, the value of a capture group.
"},{"location":"Filters/#simple-matching","title":"Simple matching","text":"\"some string\" match r\"some regex\"
returns True
or False
.
For example: message.content match r\"\\d\\d\"
\"some string\" match {r\"some regex\", capture number}
returns False
if no match or the value of the nth captured group.
For example: message.content match {r\"(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)\", 3}
matches the year component of a date like 12/31/2020
.
(message.content match {r\"(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)\", 3}) == \"2020\"
will filter only messages that contain a written date with 2020 as the year.
The order of operations in filters may not be exactly what you expect.
2 + 3 * 4
yields 20
, not 14
.a && b || c && d
is evaluated as (a && b) || (c && d)
a || b && c || d
is evaluated as a || (b && c) || d
Basically, if you're unsure about the order of operations, use extra parentheses.
Available since nightly 69bdac9 \u21a9\u21a9\u21a9
Explain common words used in Chatterino.
"},{"location":"Glossary/#anatomy-of-a-chatterino-window","title":"Anatomy of a Chatterino window","text":"Term Description Split Includes the chat, input field and a split header Split Header Contains split title, moderation actions, viewer list, split menu button and add split button Split Menu Settings or actions for the specific split Tab Can contain multiple splits"},{"location":"Glossary/#moderation","title":"Moderation","text":"Term Description Moderation buttons Allow you to quickly delete messages, timeout users or execute custom commands. They can be configured in Settings > Moderation > Moderation buttons Moderation mode button Toggles whether Moderation buttons are shown Usercard Contains useful information about a user, action buttons as well as their recent messages. Can be opened by clicking someone's username in chat or by typing/usercard username
User Timeout Buttons Allow you time a user out from their Usercard. They can be configured in Settings > Moderation > User Timeout Buttons"},{"location":"Glossary/#replies","title":"Replies","text":"Term Description Reply Context Contains the message a user was replying to. Reply Thread Contains the history of replies to a message that Chatterino has loaded Reply Input The input box to send a reply. Available in both the normal Chatterino window, and the Reply Thread."},{"location":"Help/","title":"Help","text":"Having issues with Chatterino or need general assistance? Check the below troubleshooting below corresponding to your operating system for assistance!
Please search for your problem in the GitHub Issues. If there is no such issue, please create a new one. If you have more questions, feel free to join the Discord.
"},{"location":"Help/#basic-troubleshooting","title":"Basic troubleshooting","text":"Prior to starting on the below, you should first try the basic troubleshooting steps listed here. These steps can resolve a variety of issues:
choco install vcredist140
System Preferences
go to Security & Privacy [General Tab]
and select Open Anyway
or see this Apple support article. Chatterino extension issues should be posted here.
"},{"location":"Help/#chatterino-not-startingcrashing-upon-startup","title":"Chatterino not starting/Crashing upon startup","text":"Fresh Install
option in the installer.Unfortunately not. This is a limitation due to Twitch using internal APIs for channel points. This will however work with most chatbots, as they simply take you being connected to chat as \"watching the stream\".
"},{"location":"Help/#can-i-use-chatterino-as-my-chat-overlay-for-my-stream","title":"Can I use Chatterino as my chat overlay for my stream?","text":"You definitely can, but it's not recommended. We suggest using a service similar to KapChat.
"},{"location":"Help/#why-are-my-messages-being-sent-in-webchat-but-not-in-chatterino","title":"Why are my messages being sent in webchat, but not in Chatterino?","text":"There's a few things to cover here:
If all else fails, you may be having connection issues to Twitch or your network may be blocking the necessary IRC ports in order to connect.
"},{"location":"Help/#chatterino-is-repeatedly-disconnecting-from-twitch-chat","title":"Chatterino is repeatedly disconnecting from Twitch chat","text":"If you are having troubles with Chatterino repeatedly connecting/disconnecting, it is likely due to the large amount of channels you are connected to. The maximum channel limit is usually around the 100 mark, but may differ from user to user. Try closing splits in Chatterino in order to fix this.
"},{"location":"Help/#i-am-unable-to-send-whispers-from-chatterino","title":"I am unable to send whispers from Chatterino","text":"You may be unable to send a whisper via Chatterino for the following reasons:
"},{"location":"Help/#you-dont-have-a-verified-phone-number-attached-to-your-twitch-account","title":"You don't have a verified phone number attached to your Twitch account.","text":"Twitch requires users to have a verified Phone Number attached to their account to send whispers from Chatterino. NOTE:
A Verified Phone Number is NOT the same thing as Two-Factor Authentication. You can add a phone number to your account in Twitch Settings.
On February 24th 2023 Twitch shutdown the service old versions of Chatterino used to send whispers. You must update to 2.4.0 or newer to continue sending whispers.
"},{"location":"Help/#ffzbttv-emotes-are-not-working","title":"FFZ/BTTV emotes are not working","text":"You need to be logged in to see emotes. Try hitting F5 once to manually refresh the emotes.
Chatterino only makes a connection to the necessary APIs to fetch these emotes, if you are still having issues fetching them, then your network may be blocking requests to those APIs.
"},{"location":"Help/#i-have-link-information-turned-on-but-am-unable-to-see-the-information-when-hovering-over-a-link","title":"I have link information turned on, but am unable to see the information when hovering over a link","text":"Donate \u20ac10 to fourtf here (can be done in multiple donations). You should get your badge automatically after about 5 minutes. Make sure to restart Chatterino if you can't see the badge. If you still can't see it, ask fourtf on Chatterino Discord for assistance.
"},{"location":"Help/#how-do-i-disable-the-supporter-badge","title":"How do I disable the supporter badge?","text":"Log in to the badge manager and click on Disable My Chatterino Badge.
"},{"location":"Help/#login-expired-error","title":"Login expired error","text":"If you're getting the Login expired for user <user>! Try adding your account again.
error, simply re-add your account and it will start working again.
This is not natively supported, but there is a workaround:
Always on top
in Chatterino.Popup
.Nightly is a \"developer release\" of Chatterino. It is released every time there's a new change added to source code. It includes some features that may not be available in the latest stable release.
"},{"location":"Help/#installation","title":"Installation","text":"chatterino-windows-x86-64.zip
Chatterino-x86_64.AppImage
chatterino-osx.dmg
Extract All
> Extract
(Override files if prompted). Open the newly extracted folder and create a shortcut for the chatterino.exe
file to the Desktop for easy access.chmod +x Chatterino-x86_64.AppImage && sudo mv Chatterino-x86_64.AppImage /usr/local/bin
Nightly ignores version checking and it will not attempt to update on its own. Because of that it will not notify you when a new stable update is available. To update, repeat steps above. If you want to switch back to stable release, download and install it from Chatterino's website.
"},{"location":"Help/#issues","title":"Issues","text":"Since nightly is a testing release, it may be a little unstable. If you find any bugs, make sure to report an issue on GitHub. Before opening an issue make sure you're on latest nightly (to check it, go to Settings > About and compare commit hash) and that there's no duplicate issue already open.
"},{"location":"Help/#i-see-white-borders-on-full-screen","title":"I see white borders on full screen","text":"This is a Windows issue, it can be mitigated by turning on Compatibility mode for Chatterino. Right click chatterino.exe
-> Properties -> Compatibility -> Enable \"Run this program in compatibility mode for:\" -> Select Windows 8 in the drop-down menu.
Twitch updated replies to add the functionally we needed to correct this, it was fixed in 5209e47 and the fixed version can be obtained by downloading the latest nightly build.
"},{"location":"Hotkeys/","title":"Hotkeys","text":""},{"location":"Hotkeys/#introduction-to-hotkeys","title":"Introduction to Hotkeys","text":"By default, Chatterino contains a set of default hotkeys. A hotkey can be described using five parameters:
Categories describe where in the app the hotkeys action takes place. For example:
An action simply describes what a hotkey does. For example:
TODO: Short blurb how more advanced keybindings work
"},{"location":"Hotkeys/#arguments","title":"Arguments","text":"Arguments describe the specifics of how the action will behave. For example:
in
, out
, or reset
) which tells Chatterino to either zoom in or zoom out.You can drag and drop images to Chatterino or paste them from clipboard to upload them to an external service.
By default, the image uploader is turned off. You can enable by checking the Chatterino Settings -> External Tools -> Image Uploader -> Enable image uploader
option and configuring per one of the below options.
Note to advanced users: This module sends multipart-form requests via POST method, so uploading via SFTP/FTP won't work. However, popular hosts like imgur.com and s-ul.eu are supported. Scroll down to see example configurations.
"},{"location":"Image%20Uploader/#configuration-explanation","title":"Configuration Explanation","text":"Row Description Request URL Link to an API endpoint, which is requested by Chatterino. Any needed URL parameters should be included here. Form field Name of a field, which contains image data. Extra headers Extra headers, that will be included in the request. Header name and value must be separated by colon (:
). Multiple headers need to be separated with semicolons (;
).Example: Authorization: supaKey ; NextHeader: value
. Image link Schema that tells where is the link in service's response. Leave empty if server's response is just the link itself. Refer to json properties by {property}
. Supports dot-notation, example: {property.anotherProperty}
. Deletion link Same as above."},{"location":"Image%20Uploader/#examples","title":"Examples","text":""},{"location":"Image%20Uploader/#inuulscom","title":"i.nuuls.com","text":"Row Description Request URL https://i.nuuls.com/upload
Form field attachment
Other fields empty.
"},{"location":"Image%20Uploader/#imgurcom","title":"imgur.com","text":"Row Description Request URLhttps://api.imgur.com/3/image
Form field image
Extra headers Authorization: Client-ID c898c0bb848ca39
Image link {data.link}
Deletion link https://imgur.com/delete/{data.deletehash}
You can also upload images to your imgur account by putting the following as Extra headers
:
Replace XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
with the token which you can obtain here.
Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Replace XXXXXXXXXXXXXXX
with your API key from s-ul.eu. It can be found on your account's configuration page.
https://s-ul.eu/api/v1/upload?wizard=true&key=XXXXXXXXXXXXXXX
Form field file
Extra headers Image link {url}
Deletion link https://s-ul.eu/delete.php?file={filename}&key=XXXXXXXXXXXXXXX
"},{"location":"Image%20Uploader/#ifourtfcom","title":"i.fourtf.com","text":"This is not a hosted service, but rather a service that can be self-hosted. Click on the URL for more information. Replace XXXXXXXXXXXXXXX
with your Base64-encoded user and password
https://i.yourwebsite.com/upload
Form field file
Extra headers Authorization: Basic XXXXXXXXXXXXXXX
Image link Deletion link"},{"location":"Image%20Uploader/#kappalol","title":"kappa.lol","text":"Row Description Request URL https://kappa.lol/api/upload
Form field file
Extra headers Image link {link}
Deletion link {delete}
"},{"location":"Image%20Uploader/#unsupported-sites","title":"Unsupported sites","text":"catbox.moe
: It's not possible yet to upload to catbox.moe due to how their upload method is constructed.Link Previews make it easy to check what's behind a link without visiting the link in the browser. All links go through github.com/chatterino/api to protect your IP from any leaks.
"},{"location":"Link%20Previews/#privacy-policy-terms-of-service","title":"Privacy Policy & Terms of Service","text":"Enabling this feature means your client will send additional data to our API to power this feature. You should read the Privacy Policy and Terms of Service before enabling this feature. If you have any questions about this, please contact us through the GitHub repo.
"},{"location":"Link%20Previews/#enabling","title":"Enabling","text":"By default link previews are disabled. Turn them on under \"Link Previews\" in the settings. Optionally also turn on thumbnails in your preferred size for an even richer link experience.
"},{"location":"Link%20Previews/#supported-links","title":"Supported Links","text":"By default chatterino will use Open Graph tags to enrich tooltips. To enhance the tooltips even more, we have custom integrations for the following sites:
Chatterino contains a slew of features to assist moderators in moderating.
"},{"location":"Moderation/#chat-mode","title":"Chat Mode","text":"You can easily change the chat modes in Chatterino using the button on the streamer bar.
You can choose from: Emote only, Subscriber only, Slow mode, R9K mode and Followers only mode.
"},{"location":"Moderation/#logging","title":"Logging","text":"Moderators are able to log all the channels they are in using the logging feature.
"},{"location":"Moderation/#moderation-mode","title":"Moderation Mode","text":"Moderation mode is enabled by clicking in a channel that you moderate. Available variables are {user.name}
, {msg.id}
, {msg.text}
& {channel.name}
. Below is a list of examples that can be used:
/ban {user.name}
Unban a user /unban {user.name}
Timeout a user /timeout {user.name} 600
Delete a user's message /delete {msg.id}
pajbot2 report /w botname #{channel.name} !report {user.name} being rude
pajbot2 longreport /w botname #{channel.name} !longreport {user.name} being very rude
Open the user's usercard /user {user.name}
pajbot banphrase /w botname !add banphrase {msg.text}
"},{"location":"Moderation/#user-timeout-buttons","title":"User Timeout Buttons","text":"User timeout buttons are very useful while looking at a user's logs. All 8 buttons can be configured to various timeout lengths:
User timeout buttons look like this:
"},{"location":"Regex/","title":"Regex","text":"Regular expressions (or short regexes) are often used to check if a text matches a certain pattern. For example the regex ab?c
would match abc
or ac
, but not abbc
or 123
. In Chatterino, you can use them to highlight messages (and more) based on complex conditions.
You can try out your regex patterns on a website like regex101, using the PCRE2
flavor.
Basic patterns:
Pattern Matchesx?
nothing or x
x*
x
, repeated any number of times x+
x
, repeated any number of times but at least 1 ^
The start of the text $
The end of the text x|y
x
or y
You can group multiple statements with ()
:
asd?
asd
or as
(asd)?
asd
or nothing \\(asd\\)
(asd)
, literally You can also group multiple characters with []
:
[xyz]
x
, y
or z
[1-5a-f]
1
,2
,3
,4
,5
,a
,b
,c
,d
,e
,f
[^abc]
Anything, except a
, b
and c
[\\-]
-
, literally (escaped with \\
) \\[xyz\\]
[xyz]
, literally Special patterns:
Pattern Matches\\d
Digit characters (0-9) \\D
Non-digit characters \\w
Word characters (a-zA-Z0-9_) \\W
Non-word characters \\s
Spaces, tabs, etc. \\S
Not spaces, tabs, etc. \\b
Word boundaries (between \\w and \\W) \\B
Non-word boundaries"},{"location":"Search/","title":"Search","text":"Chatterino has a Search Popup which lets you quickly find messages in the chat. You can open it with the Ctrl+F
shortcut.
You can use several search filters (format filter:value
) to narrow down your search. value
can have multiple comma-separated entries (look at examples below). Surround value
in quotation marks to use whitespaces within it, useful for dealing with the regex filter. Starting in 2.4.1 the ability to negate searches is possible. (format !filter:value
)
from:<username>
- shows messages from certain usershas:<flags>
- shows messages containing specified elements. List of flags:link
- filters messages with linksin:<channel>
- shows messages that originate from certain channels, useful in #/mentions
channelis:<flags>
- shows certain types of messages. List of flags:deleted
or disabled
- shows deleted messagessub
or subscription
- shows subscription messagestimeout
or ban
- shows moderation messageshighlighted
- shows highlighted messagessystem
- shows system messages (grey text ones like: \"Now hosting username\", \"streamer is live\", etc.)first-msg
- shows a user's first message in the channelcheer-msg
- shows messages containing bitsredemption
- shows messages that cost the user Twitch channel pointsreply
- shows messages sent using the Twitch reply featureregex:<regex>
- shows messages matching a given regexbadge:<value>
- shows messages from users that have a given badgesubtier:<value>
- shows messages from users that are subscribed at a given tierfourtf
containing word merge
","text":"from:fourtf merge
pajbot
and zneix
that have links containing word chatterino
","text":"has:link from:pajbot,zneix chatterino
pajlada
and supinic
from user supibot
","text":"in:pajlada,supinic from:supibot
is:sub
vanish
","text":"is:deleted vanish
is:timeout
is:highlighted
regex:^gachi\\w*$
badge:no_video
subtier:3
!from:gazatu
!has:link
On Windows: %APPDATA%/Chatterino2
On Linux: $HOME/.local/share/chatterino
On Mac: $HOME/Library/Application Support/chatterino
Commands and Settings have a small backup mechanism that saves the older version in a file like commands.json.bkp-2 in case you want to return to older versions of the file.
Navigate to your Chatterino folder and remove corresponding folders.
This is usually a case because Chatterino is unable to save settings on your disk. To fix that, try following steps:
Fresh Install
option is checked.Beta Warning
Custom themes are not yet stable. There may be breaking changes in the future (see Migrations).
Chatterino supports custom-made themes since nightly 5d0bdc1
.
Custom themes are JSON files that are stored in the Themes
folder inside your Chatterino folder.
To create a theme, it's best to use one of the built-in themes as the starting point. You can find them in the resources/themes
folder inside the source-code. Copy one into the Themes
folder and restart Chatterino. When you open the settings and select a theme, you should see one prefixed with Custom:
. Make sure, you're familiar with the common words used in Chatterino.
Chatterino themes have a JSON schema that must match in order for the theme to be displayed correctly. Many editors support JSON schemas out of the box and warn you about invalid values and provide completions.
If you used one of the base themes, then the $schema
key inside the JSON is invalid, since its value is configured to work inside the Chatterino source-code. You should change the value of $schema
to https://github.com/Chatterino/chatterino2/raw/master/docs/ChatterinoTheme.schema.json
as shown below. If you want to pin the schema to a specific version, replace master
with your desired version (for example v2.4.4
).
{\n \"$schema\": \"https://github.com/Chatterino/chatterino2/raw/master/docs/ChatterinoTheme.schema.json\",\n // ...\n}\n
"},{"location":"Themes/#auto-reloading","title":"Auto Reloading","text":"When developing themes, you often want to reload your changes and see how they look. To aid you in doing that, Chatterino can automatically reload your theme. Use the /c2-theme-autoreload
command in any chat to toggle auto-reload.
Warning
Make sure to disable auto-reloading after you're done with your changes to reduce resource usage.
"},{"location":"Themes/#colors","title":"Colors","text":"Colors in themes can be specified in various ways. All values that expect a qt-color
accept one of the following values. Make sure you're using the schema to get editor feedback. Technically, the values are passed to QColor
which does the parsing.
A
, R
, G
, and B
are single hex digits (0-9, a-f, A-F).
#RGB
#RRGGBB
#AARRGGBB
This format is different from the CSS Color Moudle Level 4 <hex-color>
, where the alpha value is at the end.
#RRRGGGBBB
#RRRRGGGGBBBB
red
, mediumspringgreen
. Note that these color names are technically case-insensitive and accept spaces, but this isn't supported by the schema, which only accepts lower-case names.transparent
These are some alternate ways of creating your own custom themes:
doge41732
This section contains added, updated, and removed properties in a release, and commit for nightly versions.
"},{"location":"Third_party_services/","title":"Third party services","text":"Chatterino integrates with a bunch of third party services to provide extended functionality for you.
"},{"location":"Third_party_services/#betterttv","title":"BetterTTV","text":"For Twitch channels, we load emotes from BetterTTV.
BetterTTV provides global emotes that are available in every channel. These can be disabled with the \"Show BTTV global emotes\" setting.
BetterTTV provides channel-specific emotes. What emotes are loaded is up to the owner of the channel you're in. These can be disabled with the \"Show BTTV channel emotes\" setting.
"},{"location":"Third_party_services/#frankerfacez","title":"FrankerFaceZ","text":"For Twitch channels, we load emotes and badges from FrankerFaceZ.
FrankerFaceZ provides global emotes that are available in every channel. These can be disabled with the \"Show FFZ global emotes\" setting.
FrankerFaceZ provides channel-specific emotes. What emotes are loaded is up to the owner of the channel you're in. These can be disabled with the \"Show FFZ channel emotes\" setting.
Badges are for developers & supporters of FrankerFaceZ and will be displayed next to their username. These can be disabled with the \"FrankerFaceZ\" setting under Advanced -> Visible badges.
FrankerFaceZ allows supporters to upload custom moderator and VIP badges for their channel, these can be disabled with the \"Use custom FrankerFaceZ moderator badges\" and \"Use custom FrankerFaceZ VIP badges\" settings.
"},{"location":"Third_party_services/#7tv","title":"7TV","text":"For Twitch channels, we load emotes and badges from 7TV.
7TV provides global emotes that are available in every channel. These can be disabled with the \"Show 7TV global emotes\" setting.
7TV provides channel-specific emotes. What emotes are loaded is up to the owner of the channel you're in. These can be disabled with the \"Show 7TV channel emotes\" setting.
7TV provides a streaming Event API that posts live updates when emotes change in channels. These can be disabled with the \"Enable 7TV live emote updates\" setting.
7TV provides the ability to use unlisted emotes. By default, Chatterino will not display these emotes even if they're added to a Channel. You can modify this behaviour with the \"Show unlisted 7TV emotes\" setting.
Badges are for developers & supporters of 7TV and will be displayed next to their username. These can be disabled with the \"7TV\" setting under Advanced -> Visible badges.
"},{"location":"Third_party_services/#chatterino-api","title":"Chatterino API","text":""}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Chatterino Wiki","text":"This wiki provides information for Chatterino.
"},{"location":"Commands/","title":"Commands","text":"Commands are used as shortcuts for long messages. If a message starts with the \"trigger\" then the message will be replaced with the Command.
"},{"location":"Commands/#built-in-commands","title":"Built-in commands","text":"Chatterino comes with a collection of built-in commands to help with channel management, Twitch interaction, and other misc. features.
"},{"location":"Commands/#banid","title":"/banid
","text":"Usage: /banid <userID>
Bans a user by their userID instead of their username. Useful for banning users who are temporarily suspended from Twitch, which /ban
cannot do anymore.
Note:
If you ban a suspended user this way, they cannot be unbanned from Chatterino, you must wait until their suspension ends or unban them from browser chat.
/block
& /unblock
","text":"Usage: /(block|unblock) <user>
Blocks or unblocks the specified user. Blocking will hide that user's messages/whispers as well as disassociate them from you on Twitch. For more information about blocking, see Twitch's help article.
"},{"location":"Commands/#chatters","title":"/chatters
","text":"Usage: /chatters
Shows the total amount of chatters currently connected to the channel.
"},{"location":"Commands/#clearmessages","title":"/clearmessages
","text":"Usage: /clearmessages
Clears all messages from the current split/channel. This command is purely visual and is not related to the /clear
moderator command.
/clip
","text":"Usage: /clip
Creates a clip from the last 30 seconds of the current channel. Also provides an edit link to edit a clip from the current point in time.
"},{"location":"Commands/#debug-args","title":"/debug-args
","text":"Usage: /debug-args
Displays the arguments that chatterino was launched with.
"},{"location":"Commands/#delete","title":"/delete
","text":"Usage: /delete <msg-id>
Moderator only, deletes a message in chat with the provided ID. Usually used in mod actions as they can pass through the message ID.
"},{"location":"Commands/#fakemsg","title":"/fakemsg
","text":"Usage: /fakemsg <raw message>
Displays the provided IRC messsage in chat as if it was sent from Twitch's IRC server.
"},{"location":"Commands/#marker","title":"/marker
","text":"Usage: /marker
Editor only, creates a stream marker in the current stream. Streamer must be live to create markers.
"},{"location":"Commands/#openurl","title":"/openurl
","text":"Usage: /openurl <url>
Opens a URL in the default web browser. Useful in custom commands.
"},{"location":"Commands/#popout","title":"/popout
","text":"Usage: /popout [channel]
Opens the current channel or provided channel's chat in Twitch's popout webchat, using your default browser.
"},{"location":"Commands/#popup","title":"/popup
","text":"Usage: /popup [channel]
Opens the current channel or provided channel's chat in a new window.
"},{"location":"Commands/#r","title":"/r
","text":"Usage: /r <message>
Replies to the last received whisper.
"},{"location":"Commands/#setgame","title":"/setgame
","text":"Usage: /setgame <game>
Broadcaster only, sets the current channel's game to the best match of the provided game name.
"},{"location":"Commands/#settitle","title":"/settitle
","text":"Usage: /settitle <title>
Broadcaster only, sets the current channel's title to the provided text.
"},{"location":"Commands/#streamlink","title":"/streamlink
","text":"Usage: /streamlink [channel]
Attempts to open current or specified stream in streamlink. For more information, see Streamlink's website.
"},{"location":"Commands/#uptime","title":"/uptime
","text":"Usage: /uptime
Displays the uptime of the current channel's livestream.
"},{"location":"Commands/#user","title":"/user
","text":"Usage: /user <user> [channel]
Opens the specified user's Twitch usercard for the given channel (or the channel provided) in the default browser.
"},{"location":"Commands/#usercard","title":"/usercard
","text":"Usage: /usercard <user> [channel]
Opens the specified user's Chatterino usercard for the given channel or the channel provided.
"},{"location":"Commands/#w-whisper","title":"/w
(Whisper)","text":"Usage: /w <user> <message>
Whispers the provided text to a user on Twitch. See Chatterino's whisper FAQ item for whisper-related issues.
"},{"location":"Commands/#custom-commands","title":"Custom commands","text":""},{"location":"Commands/#example","title":"Example","text":"Add Command Hello chat :)
with the trigger /hello
. Now typing /hello
in chat will send Hello chat :)
instead of /hello
.
/
{1}
, {2}
, {3}
and so on can be used to insert the 1st, 2nd, 3rd, ... word after the trigger. Example: Add Command /timeout {1} 1
with trigger /warn
. Now typing /warn user123
will send /timeout user123 1
Similarly {1+}
and so on can be used to insert all words starting with the 1st, ... word. Example: Add Command Have a {1+} day!
with trigger /day
. Now typing /day very super nice
will send Have a very super nice day!
You can use {{1}
if you want to send {1}
literally.
{channel.name}
can be used to insert the name of the current channel. Example: Add Command /openurl https://twitch.tv/{channel.name}
with trigger /openchannel
. Now typing /openchannel
will open the current channel in your browser.
{channel.id}
can be used to insert the Twitch account ID of the owner of current channel.
{my.name}
can be used to insert the Twitch username of the currently selected account.
{my.id}
can be used to insert the Twitch account ID of the currently selected account.
{stream.title}
can be used to insert the title set in the current channel. Only works if the channel is live. Example: Add Command The title is {stream.title}
with trigger /title
. Now typing /title
will send a message like The title is Programming.S04E74.1440p.MP4-XD.NVENC
{stream.game}
can be used to insert the game set in the current channel. Only works if the channel is live. Example: Add Command I'm currently playing {stream.game}
with trigger /game
. Now typing /game
will send a message like I'm currently playing World of Warcraft
.
This is a set of guidelines for contributing to Chatterino. The goal is to teach programmers without C++ background (java/python/etc.), people who haven't used Qt or otherwise have different experience the idioms of the codebase. Thus, we will focus on those which are different from those other environments. There are extra guidelines available here, but they are considered as extras and not as important.
"},{"location":"Contributing%20for%20Developers/#tooling","title":"Tooling","text":""},{"location":"Contributing%20for%20Developers/#formatting","title":"Formatting","text":"Code is automatically formatted using clang-format
. It takes the burden off of the programmer and ensures that all contributors use the same style (even if mess something up accidentally). We recommend that you set up automatic formatting on file save in your editor.
Comments should only be used to:
Try to structure your code so that comments are not required.
"},{"location":"Contributing%20for%20Developers/#good-example","title":"Good example","text":"/**\n * @return 0 if a == b, negative if a < b and positive if b > a. (1)\n */\nint /* (2)! */ compare(const QString &a, const QString &b);\n
/*\n * Matches a link and returns boost::none if it failed and a\n * QRegularExpressionMatch on success. (1)\n *\n * @param text The text that will be checked if it contains a link. (2)\n */\nboost::optional<QRegularExpressionMatch> matchLink(const QString &text);\n
Arithmetic types (like char
, int
, float
or size_t
), bool
, and pointers are NOT initialized by default in C++. They keep whatever value is already at their position in the memory. This makes debugging harder and is unpredictable, so we initialize them to zero by using {}
after their name when declaring them.
class ArithmeticTypes\n{\n // DO\n int n{}; // (1)!\n bool isEnabled{}; // (2)!\n QWidget *myPtr{}; // (3)!\n int thisIs5 = 5; // (4)!\n std::vector<int> myVec; // (5)!\n\n // DON'T\n int m; // (6)!\n bool isHidden; // (7)!\n QWidget *yourPtr; // (8)!\n std::vector<int> myVec{}; // (9)!\n};\n
0
.false
.nullptr
.5
.{}
.{}
as the default constructor will be called even without {}
.The way a parameter is passed signals how it is going to be used inside the function. C++ doesn't have multiple return values, so there is \"out parameters\" (reference to a variable that is going to be assigned inside the function) to simulate multiple return values.
Cheap to copy types like int/enum/etc. can be passed in per value since copying them is fast.
void setValue(int value /* (1)! */) {\n this->value_ = value;\n}\n\nvoid sendGreeting(const /* (2)! */ User &user /* (3)! */, MessageFlags flags /* (4)! */) {\n this->sendMessage(user.id(), user.name(), flags);\n}\n
int
s are cheap to copy. Here, the parameter will likely be passed in a register.const
.User
is a class that contains the user's name and other fields, thus it's expensive to copy - so a reference is used.MessageFlags
is an enum, so it's cheap to copy.References mean that the variable doesn't need to be copied when it is passed to a function.
Type Meaningconst Type& name
in Parameter. It is NOT going to be modified and may be copied inside the function. Type& name
out or in+out Parameter. It will be modified. Pointers signal that objects are managed manually. While the above are only guaranteed to live as long as the function call (= don't store and use later) these may have more complex lifetimes.
Type MeaningType* name
The lifetime of the parameter may exceed the length of the function call. It may use the QObject
parent/children system (see QObject Classes). R-value references &&
work similar to regular references but signal the parameter should be \"consumed\".
void storeLargeObject(LargeObject &&object) {\n // ...\n}\n\nvoid storeObject(std::unique_ptr<Object> &&object) {\n // ...\n}\n\nvoid main() {\n LargeObject large = { /*...*/ };\n\n storeLargeObject(std::move(large)); // (1)!\n\n std::unique_ptr<Object> unique = std::make_unique(/*...*/);\n storeObject(std::move(unique)); // (2)!\n\n assert(unique.get() == nullptr); // (3)!\n}\n
storeLargeObject
accepts an r-value reference, and we use std::move()
, thus we move the object and avoid the need to copy.std::unique_ptr
, so we need to move here.storeObject
, so it just holds a null pointer now.Generally the lowest level of requirement should be used e.g. passing Channel&
instead of std::shared_ptr<Channel>&
(aka ChannelPtr
) if possible.
All functions names are in camelCase
. Private member variables are in camelCase_
(note the underscore at the end). We don't use the get
prefix for getters. We mark functions as const
if applicable.
class NamedObject\n{\npublic:\n const QString &name() const; // (1)!\n void setName(const QString &name);\n bool hasLongName() const; // (2)!\n\n static void myStaticFunction(); // (3)!\n QString publicName;\n\nprivate:\n QString name_; // (4)!\n // QString name; (5)\n\n void myPrivateMethod(); // (6)!\n};\n\nvoid myFreeStandingFunction(); // (7)!\n
get
prefix.has
or is
prefix is okay._
suffix.name()
accessor._
suffix.(type)variable
.type(variable)
void example(float f, Base *b, const User &user, int p) {\n // DO\n int i = int(f); // (1)!\n Derived* derived = dynamic_cast<Derived*>(base); // (2)!\n if (derived != nullptr) // (3)!\n {\n // use derived\n }\n\n // BE CAREFUL\n const_cast<User &>(c).setName(\"foo\"); // (4)!\n float *pp = reinterpret_cast<float*>(&p); // (5)!\n\n // DON'T (6)\n int i = (int)f;\n Derived* derived = (Derived*)base;\n ((int &)c) = 123;\n float *pp = (float*)&p;\n}\n
Always use this
to refer to instance members to make it clear where we use either locals or members.
class Test\n{\n void testFunc(int a);\n int testInt_{};\n}\n\nTest::testFunc(int a)\n{\n // DO\n this->testInt_ += 2;\n this->testFunc();\n\n // DON'T\n testInt_ -= 123;\n testFunc(2);\n this->testFunc(testInt_/*(1)!*/ + 1);\n}\n
Keep the element on the stack if possible. If you need a pointer or have complex ownership you should use one of these classes:
std::unique_ptr
if the resource has a single owner.std::shared_ptr
if the resource has multiple owners.variable->deleteLater()
instead of delete variable
. This ensures that it will be deleted on the correct thread.std::unique_ptr<Type, DeleteLater>
with DeleteLater
from \"common/Common.hpp\". This will call deleteLater()
on the pointer once it goes out of scope or the object is destroyed.When running on Windows, Chatterino will automatically save information about a crash in a minidump.
Crashdumps are saved inside the Crashes/reports
folder in your Chatterino folder.
Minidumps contain the stacks of all threads, their state (registers), the exception associated with the crash, and some metadata about the CPU and the OS. If you are unsure if your crashdump contains sensitive information, ask a Chatterino developer on the Discord server.
There are several ways of analyzing crashes. To get started, you need to have a symbol (PDB) file for your installation. These files are unique per build meaning that you need to download the file (this is especially important when using nightly builds). For GitHub builds, you can find the PDB file in the release - it's zipped in an archive ending in .pdb.7z
. For simplicity, extract the .pdb
to the location of your chatterino.exe
.
For analyzing with a GUI, install WinDbg. After the installation, you should be able to open the crashdumps (.dmp
files) right from the Windows Explorer. By default, you won't get much information.
To add names to functions (symbols), open the settings (Home > Settings), go to Debugging Settings, and add the directory you extracted your symbol file to the Symbol path. If there's no srv*
entry, consider adding one - this will try to load symbols from servers for system libraries.
To add source-files, clone the repository and checkout the source-tree at the version of your executable. Then add this path to Source Path in the Debugging Settings.
Note: You might need to reload your window to have your changes be picked up.
Example Settings"},{"location":"Crash%20Analysis/#minidump-stackwalk","title":"minidump-stackwalk","text":"If you want to use the terminal or don't have a Windows machine, you can use minidump-stackwalk
. Install minidump-stackwalk
and dump_syms
with cargo (installation): cargo install <app>
.
First, you need to generate a symbol-store from the PDB file with dump_syms
:
dump_syms chatterino.exe -s <store-path> # (1)!\n
After you dumped the symbols, run:
minidump-stackwalk <path-to-crashdump> --symbols-path <store-path>\n
Since Chatterino has quite a few threads, the output will be long. Most of the time, you're interested in the first thread (GUI thread) since it's the crashing thread.
"},{"location":"Environment%20Variables/","title":"Environment Variables","text":"Below I have tried to list all environment variables that can be used to modify the behaviour of Chatterino. Used for things that I don't feel like fit in the settings system.
"},{"location":"Environment%20Variables/#chatterino2_recent_messages_url","title":"CHATTERINO2_RECENT_MESSAGES_URL","text":"Used to change the URL that Chatterino2 uses when trying to load historic Twitch chat messages (if the setting is enabled). Default value: https://recent-messages.robotty.de/api/v2/recent-messages/%1
(an open-source service written and currently run by @RAnders00 - visit the homepage for more details about the service) Arguments:
%1
= Name of the Twitch channelUsed to change the URL that Chatterino2 uses when trying to get link information to display in the tooltip on hover. Default value: https://braize.pajlada.com/chatterino/link_resolver/%1
Arguments:
%1
= Escaped URL the link resolver should resolveUsed to change the URL that Chatterino2 uses when trying to get emote set information Default value: https://braize.pajlada.com/chatterino/twitchemotes/set/%1/
Arguments:
%1
= Emote set IDString value used to change what Twitch chat server host to connect to. Default value: irc.chat.twitch.tv
Number value used to change what port to use when connecting to Twitch chat servers. Currently known valid ports for secure usage: 6697, 443. Currently known valid ports for non-secure usage (CHATTERINO2_TWITCH_SERVER_SECURE set to false): 6667, 80. Default value: 443
Bool value used to tell Chatterino whether to try to connect securely (secure irc) to the Twitch chat server. Default value: true
Used to set a proxy for network interactions of Chatterino. Both HTTP and SOCKS51 proxies are supported. The URL supports username and password authentication. Example: http://username:password@127.0.0.1:1080
or socks5://127.0.0.1
(defaults to port 1080
).
Used to enable/disable logging at run time. For example: QT_LOGGING_RULES=\"chatterino.*.debug=true\"
to enable debug logging in release builds. (It's on by default in debug builds). See Qt docs for more details.
Used to customize logging at run time. For example: QT_MESSAGE_PATTERN=\"%{time hh:mm:ss.zzz} %{category}: %{function} %{message}\"
enables a timestamp and function name in log messages. See Qt docs for more details.
When using a SOCKS5 proxy, WebSockets (Twitch PubSub, 7TV EventAPI, and BTTV EventSockets) are not proxied. Only IRC and HTTP requests are proxied.\u00a0\u21a9
We support Twitch's Chat Replies feature.
A reply can be executed by right-clicking a message, and selecting Reply to message
, or by opening an existing Reply Thread and sending your message there. Users who replied to your message, or messages sent in a reply thread you participated in, are highlighted and can be customized in the highlight setting Participated Reply Threads
.
Filters are a powerful tool to create your own custom, filtered channel splits. Filters allow you to selectively show messages that satisfy your own custom criteria: show subscribers' messages, moderator messages, channel point redemptions, new subscriptions, and more.
Looking for inspiration? Look at some example filters.
"},{"location":"Filters/#introduction-to-filters","title":"Introduction to Filters","text":"Filters can be applied to splits to provide a selective view of messages. Filters are created in the Settings page and are applied by opening the Split menu (three dots) and selecting \"Set filters\". Applied filters are saved when you close and open Chatterino.
Multiple filters can be applied to a Split. A message must pass all applied filters for it to be displayed.
Simple filters are available through the Channel Filter Creator dialog. Advanced filters take inspiration from many programming languages, and the full description of keywords and operators can be found below.
"},{"location":"Filters/#writing-your-own-filters","title":"Writing your own filters","text":"To begin writing your own filters, take a look at the available operators and variables below.
For most tasks involving the message content, you can make use of the contains
operator, or the matches
operator with a regular expression. Then, try to break your desired behavior into multiple conditions. Combine them like this:
condition1 && condition2
)condition1 || condition2
)!(condition)
Consider the following intention: \"Only show me messages that are from moderators and mention me\". We can break this filter into two individual conditions:
We can then write the corresponding filter parts:
author.badges contains \"moderator\"
message.content contains \"@my_name\"
Finally, because we want both of these conditions to be true, we combine them with the AND operator &&
and end up with this final filter:
(author.badges contains \"moderator\") && (message.content contains \"@my_name\")
If you already have a filter, you can use the Quick Add
button and paste your filter into the Filter
section.
Here is some terminology that you'll encounter in the rest of this document.
message.content
represents the text of a message+
can add two numbers, 1 + 1
or concatenate strings, \"a\" + \"b\"
message.content contains \"hello\"
hello
message.length < 40 || author.subbed
channel.name == \"somestreamer\" && author.badges contains \"moderator\"
somestreamer
AND are from users with a moderator badgeThis section is aimed at technical users who have experience with general purpose programming languages.
A filter must be a valid expression. An expression is comprised of conditions and values which are evaluated to a single True
or False
value to decide whether to filter a message. Evaluating to something other than True
or False
will lead to all messages being filtered out.
A value can be:
123
, 5
)\"hello\"
, \"this is a string\"
)author.name
, message.length
)r\"\\d\\d\\d\\d\"
){123, \"hello\", author.name}
)Regular expressions are similar to strings, but are denoted with an r
before the opening quotation mark (e.g. r\"something\"
). To make a regular expression case-insensitive, use ri
before the opening quotation mark (e.g. ri\"something\"
).
Literals:
Name Example Int123
, 5
String \"Hello there\"
, \"Escaped \\\" quote\"
RegEx r\"\\d\\d\\d\\d\"
, ri\"something.*\"
List {\"list item\", 123}
"},{"location":"Filters/#operators","title":"Operators","text":"Binary operators act on two values:
1 + 2
author.subbed && flags.highlighted
\"long sentence\" contains \"ten\"
Unary operators act on one value:
!author.subbed
The following operators are available:
Operator Description&&
Logical AND ||
Logical OR !
Negation ==
Equals !=
Not equals <
Less than <=
Less than or equal to >
Greater than >=
Greater than or equal to contains
String, List, or Map contains startswith
String or List starts with text or value, respectively endswith
String or List ends with text or value, respectively match
Match string with regular expression +
Add (or string concatenation) -
Subtract *
Multiply /
Divide (integer) %
Modulus Please read about the type rules to better understand the evaluation semantics for operators that take multiple data types.
"},{"location":"Filters/#variables","title":"Variables","text":"The following variables are available:
Variable Type Description Author User who sent the messageauthor.badges
List List of author's badges author.color
Color* Color code of author, or none author.name
String Display name of author author.no_color
Bool Whether the author has no color set (i.e. gray name) author.subbed
Bool Whether author is subscribed author.sub_length
Int How long author has been subscribed (or zero) Channel The channel where the message was sent channel.name
String Channel name channel.watching
Bool Whether the channel is being watched (requires Chatterino extension) channel.live
Bool Whether the channel is currently live Flags Message-specific flags flags.highlighted
Bool Whether the message is highlighted flags.reward_message
Bool Whether the message is a redeemed channel point reward message (except \"Highlight my Message\") flags.points_redeemed
Bool Whether the message was redeemed through the channel point reward \"Highlight my Message\" flags.sub_message
Bool Whether the message is a sub/resub/gift message flags.system_message
Bool Whether the message is a system message (i.e. timeout/ban/info) flags.first_message
Bool Whether the message is the author's first message in the channel flags.cheer_message
Bool Whether the message includes bits flags.whisper
Bool Whether the message is a whisper flags.reply
Bool Whether the message is a reply flags.automod
Bool Whether the message has automod information or actions Message Actual message sent message.content
String Message content message.length
Int Message length Reward Information about the channel point redemption of this message, if any reward.title
1 String Title of the redemption (e.g. Drink water!) reward.cost
1 Int Cost of the redemption (e.g. 500) reward.id
1 String ID of the redemption (e.g. 1ed437f5-9dc3-4510-8a3f-abcad67985e1) *Note: To compare a Color
, compare it to a color hex code string: author.color == \"#FF0000\"
The Chatterino filter language is typed, meaning that every value has a type and only specific combinations of types are allowed when using operators. Generally, you won't run in to issues. The type system exists to warn you about any mistakes that your filter contains.
"},{"location":"Filters/#type-rules","title":"Type Rules","text":"Operator Form Result Description+
Int + Int
Int
Adds two integers +
String + Any
String
Concatenates the first string with the second argument -
Int - Int
Int
Subtracts two integers *
Int * Int
Int
Multiplies two integers /
Int / Int
Int
Divides two integers, discarding the remainder %
Int % Int
Int
Computes the modulus of two integers &&
Bool && Bool
Bool
Logical AND of two booleans ||
Bool || Bool
Bool
Logical OR of two booleans ==
Any == Any
Bool
Equality comparison of any two values !=
Any != Any
Bool
Inequality comparison of any two values >
Int > Int
Bool
Greater than comparison of two integers >=
Int >= Int
Bool
Greater than or equal to comparison of two integers <
Int < Int
Bool
Less than comparison of two integers <=
Int <= Int
Bool
Less than or equal to comparison of two integers startswith
List startswith Any
Bool
Checks whether the list has the given value as its first value startswith
String startswith String
Bool
Checks whether the first string starts with the second string endswith
List endswith Any
Bool
Checks whether the list has the given value as its last value endswith
String endswith String
Bool
Checks whether the first string ends with the second string contains
List contains Any
Bool
Checks whether the list contains the given value contains
Map contains Any
Bool
Checks whether the map has the given value as a key contains
String contains String
Bool
Checks whether the first string contains the second string match
String match RegEx
Bool
Checks whether the string matches the given regular expression match
String match {RegEx, n : Int}
String
Returns the n
th matching capture group, or the empty string"},{"location":"Filters/#regular-expressions","title":"Regular Expressions","text":"Chatterino can match string variables to a regular expression, returning whether the expression matched or, optionally, the value of a capture group.
"},{"location":"Filters/#simple-matching","title":"Simple matching","text":"\"some string\" match r\"some regex\"
returns True
or False
.
For example: message.content match r\"\\d\\d\"
\"some string\" match {r\"some regex\", capture number}
returns False
if no match or the value of the nth captured group.
For example: message.content match {r\"(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)\", 3}
matches the year component of a date like 12/31/2020
.
(message.content match {r\"(\\d\\d)/(\\d\\d)/(\\d\\d\\d\\d)\", 3}) == \"2020\"
will filter only messages that contain a written date with 2020 as the year.
The order of operations in filters may not be exactly what you expect.
2 + 3 * 4
yields 20
, not 14
.a && b || c && d
is evaluated as (a && b) || (c && d)
a || b && c || d
is evaluated as a || (b && c) || d
Basically, if you're unsure about the order of operations, use extra parentheses.
Available since 2.5.1\u00a0\u21a9\u21a9\u21a9
Explain common words used in Chatterino.
"},{"location":"Glossary/#anatomy-of-a-chatterino-window","title":"Anatomy of a Chatterino window","text":"Term Description Split Includes the chat, input field and a split header Split Header Contains split title, moderation actions, viewer list, split menu button and add split button Split Menu Settings or actions for the specific split Tab Can contain multiple splits"},{"location":"Glossary/#moderation","title":"Moderation","text":"Term Description Moderation buttons Allow you to quickly delete messages, timeout users or execute custom commands. They can be configured in Settings > Moderation > Moderation buttons Moderation mode button Toggles whether Moderation buttons are shown Usercard Contains useful information about a user, action buttons as well as their recent messages. Can be opened by clicking someone's username in chat or by typing/usercard username
User Timeout Buttons Allow you time a user out from their Usercard. They can be configured in Settings > Moderation > User Timeout Buttons"},{"location":"Glossary/#replies","title":"Replies","text":"Term Description Reply Context Contains the message a user was replying to. Reply Thread Contains the history of replies to a message that Chatterino has loaded Reply Input The input box to send a reply. Available in both the normal Chatterino window, and the Reply Thread."},{"location":"Help/","title":"Help","text":"Having issues with Chatterino or need general assistance? Check the below troubleshooting below corresponding to your operating system for assistance!
Please search for your problem in the GitHub Issues. If there is no such issue, please create a new one. If you have more questions, feel free to join the Discord.
"},{"location":"Help/#basic-troubleshooting","title":"Basic troubleshooting","text":"Prior to starting on the below, you should first try the basic troubleshooting steps listed here. These steps can resolve a variety of issues:
choco install vcredist140
System Preferences
go to Security & Privacy [General Tab]
and select Open Anyway
or see this Apple support article. Chatterino extension issues should be posted here.
"},{"location":"Help/#chatterino-not-startingcrashing-upon-startup","title":"Chatterino not starting/Crashing upon startup","text":"Fresh Install
option in the installer.Unfortunately not. This is a limitation due to Twitch using internal APIs for channel points. This will however work with most chatbots, as they simply take you being connected to chat as \"watching the stream\".
"},{"location":"Help/#can-i-use-chatterino-as-my-chat-overlay-for-my-stream","title":"Can I use Chatterino as my chat overlay for my stream?","text":"You definitely can, but it's not recommended. We suggest using a service similar to KapChat.
"},{"location":"Help/#why-are-my-messages-being-sent-in-webchat-but-not-in-chatterino","title":"Why are my messages being sent in webchat, but not in Chatterino?","text":"There's a few things to cover here:
If all else fails, you may be having connection issues to Twitch or your network may be blocking the necessary IRC ports in order to connect.
"},{"location":"Help/#chatterino-is-repeatedly-disconnecting-from-twitch-chat","title":"Chatterino is repeatedly disconnecting from Twitch chat","text":"If you are having troubles with Chatterino repeatedly connecting/disconnecting, it is likely due to the large amount of channels you are connected to. The maximum channel limit is usually around the 100 mark, but may differ from user to user. Try closing splits in Chatterino in order to fix this.
"},{"location":"Help/#i-am-unable-to-send-whispers-from-chatterino","title":"I am unable to send whispers from Chatterino","text":"You may be unable to send a whisper via Chatterino for the following reasons:
"},{"location":"Help/#you-dont-have-a-verified-phone-number-attached-to-your-twitch-account","title":"You don't have a verified phone number attached to your Twitch account.","text":"Twitch requires users to have a verified Phone Number attached to their account to send whispers from Chatterino. NOTE:
A Verified Phone Number is NOT the same thing as Two-Factor Authentication. You can add a phone number to your account in Twitch Settings.
You need to be logged in to see emotes. Try hitting F5 once to manually refresh the emotes.
Chatterino only makes a connection to the necessary APIs to fetch these emotes, if you are still having issues fetching them, then your network may be blocking requests to those APIs.
"},{"location":"Help/#i-have-link-information-turned-on-but-am-unable-to-see-the-information-when-hovering-over-a-link","title":"I have link information turned on, but am unable to see the information when hovering over a link","text":"Donate \u20ac10 to fourtf here (can be done in multiple donations). You should get your badge automatically after about 5 minutes. Make sure to restart Chatterino if you can't see the badge. If you still can't see it, ask fourtf on Chatterino Discord for assistance.
"},{"location":"Help/#how-do-i-disable-the-supporter-badge","title":"How do I disable the supporter badge?","text":"Log in to the badge manager and click on Disable My Chatterino Badge.
"},{"location":"Help/#login-expired-error","title":"Login expired error","text":"If you're getting the Login expired for user <user>! Try adding your account again.
error, simply re-add your account and it will start working again.
This is not natively supported, but there is a workaround:
Always on top
in Chatterino.Popup
.Nightly is a \"developer release\" of Chatterino. It is released every time there's a new change added to source code. It includes some features that may not be available in the latest stable release.
"},{"location":"Help/#installation","title":"Installation","text":"chatterino-windows-x86-64.zip
Chatterino-x86_64.AppImage
chatterino-osx.dmg
Extract All
> Extract
(Override files if prompted). Open the newly extracted folder and create a shortcut for the chatterino.exe
file to the Desktop for easy access.chmod +x Chatterino-x86_64.AppImage && sudo mv Chatterino-x86_64.AppImage /usr/local/bin
Nightly ignores version checking and it will not attempt to update on its own. Because of that it will not notify you when a new stable update is available. To update, repeat steps above. If you want to switch back to stable release, download and install it from Chatterino's website.
"},{"location":"Help/#issues","title":"Issues","text":"Since nightly is a testing release, it may be a little unstable. If you find any bugs, make sure to report an issue on GitHub. Before opening an issue make sure you're on latest nightly (to check it, go to Settings > About and compare commit hash) and that there's no duplicate issue already open.
"},{"location":"Help/#i-see-white-borders-on-full-screen","title":"I see white borders on full screen","text":"This is a Windows issue, it can be mitigated by turning on Compatibility mode for Chatterino. Right click chatterino.exe
-> Properties -> Compatibility -> Enable \"Run this program in compatibility mode for:\" -> Select Windows 8 in the drop-down menu.
Twitch updated replies to add the functionally we needed to correct this, it was fixed in 5209e47 and the fixed version can be obtained by downloading the latest nightly build.
"},{"location":"Hotkeys/","title":"Hotkeys","text":""},{"location":"Hotkeys/#introduction-to-hotkeys","title":"Introduction to Hotkeys","text":"By default, Chatterino contains a set of default hotkeys. A hotkey can be described using five parameters:
Categories describe where in the app the hotkeys action takes place. For example:
An action simply describes what a hotkey does. For example:
TODO: Short blurb how more advanced keybindings work
"},{"location":"Hotkeys/#arguments","title":"Arguments","text":"Arguments describe the specifics of how the action will behave. For example:
in
, out
, or reset
) which tells Chatterino to either zoom in or zoom out.You can drag and drop images to Chatterino or paste them from clipboard to upload them to an external service.
By default, the image uploader is turned off. You can enable by checking the Chatterino Settings -> External Tools -> Image Uploader -> Enable image uploader
option and configuring per one of the below options.
Note to advanced users: This module sends multipart-form requests via POST method, so uploading via SFTP/FTP won't work. However, popular hosts like imgur.com and s-ul.eu are supported. Scroll down to see example configurations.
"},{"location":"Image%20Uploader/#configuration-explanation","title":"Configuration Explanation","text":"Row Description Request URL Link to an API endpoint, which is requested by Chatterino. Any needed URL parameters should be included here. Form field Name of a field, which contains image data. Extra headers Extra headers, that will be included in the request. Header name and value must be separated by colon (:
). Multiple headers need to be separated with semicolons (;
).Example: Authorization: supaKey ; NextHeader: value
. Image link Schema that tells where is the link in service's response. Leave empty if server's response is just the link itself. Refer to json properties by {property}
. Supports dot-notation, example: {property.anotherProperty}
. Deletion link Same as above."},{"location":"Image%20Uploader/#examples","title":"Examples","text":""},{"location":"Image%20Uploader/#inuulscom","title":"i.nuuls.com","text":"Row Description Request URL https://i.nuuls.com/upload
Form field attachment
Other fields empty.
"},{"location":"Image%20Uploader/#imgurcom","title":"imgur.com","text":"Row Description Request URLhttps://api.imgur.com/3/image
Form field image
Extra headers Authorization: Client-ID c898c0bb848ca39
Image link {data.link}
Deletion link https://imgur.com/delete/{data.deletehash}
You can also upload images to your imgur account by putting the following as Extra headers
:
Replace XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
with the token which you can obtain here.
Authorization: Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Replace XXXXXXXXXXXXXXX
with your API key from s-ul.eu. It can be found on your account's configuration page.
https://s-ul.eu/api/v1/upload?wizard=true&key=XXXXXXXXXXXXXXX
Form field file
Extra headers Image link {url}
Deletion link https://s-ul.eu/delete.php?file={filename}&key=XXXXXXXXXXXXXXX
"},{"location":"Image%20Uploader/#ifourtfcom","title":"i.fourtf.com","text":"This is not a hosted service, but rather a service that can be self-hosted. Click on the URL for more information. Replace XXXXXXXXXXXXXXX
with your Base64-encoded user and password
https://i.yourwebsite.com/upload
Form field file
Extra headers Authorization: Basic XXXXXXXXXXXXXXX
Image link Deletion link"},{"location":"Image%20Uploader/#kappalol","title":"kappa.lol","text":"Row Description Request URL https://kappa.lol/api/upload
Form field file
Extra headers Image link {link}
Deletion link {delete}
"},{"location":"Image%20Uploader/#unsupported-sites","title":"Unsupported sites","text":"catbox.moe
: It's not possible yet to upload to catbox.moe due to how their upload method is constructed.Link Previews make it easy to check what's behind a link without visiting the link in the browser. All links go through github.com/chatterino/api to protect your IP from any leaks.
"},{"location":"Link%20Previews/#privacy-policy-terms-of-service","title":"Privacy Policy & Terms of Service","text":"Enabling this feature means your client will send additional data to our API to power this feature. You should read the Privacy Policy and Terms of Service before enabling this feature. If you have any questions about this, please contact us through the GitHub repo.
"},{"location":"Link%20Previews/#enabling","title":"Enabling","text":"By default link previews are disabled. Turn them on under \"Link Previews\" in the settings. Optionally also turn on thumbnails in your preferred size for an even richer link experience.
"},{"location":"Link%20Previews/#supported-links","title":"Supported Links","text":"By default chatterino will use Open Graph tags to enrich tooltips. To enhance the tooltips even more, we have custom integrations for the following sites:
Chatterino contains a slew of features to assist moderators in moderating.
"},{"location":"Moderation/#chat-mode","title":"Chat Mode","text":"You can easily change the chat modes in Chatterino using the button on the streamer bar.
You can choose from: Emote only, Subscriber only, Slow mode, R9K mode and Followers only mode.
"},{"location":"Moderation/#logging","title":"Logging","text":"Moderators are able to log all the channels they are in using the logging feature.
"},{"location":"Moderation/#moderation-mode","title":"Moderation Mode","text":"Moderation mode is enabled by clicking in a channel that you moderate. Available variables are {user.name}
, {msg.id}
, {msg.text}
& {channel.name}
. Below is a list of examples that can be used:
/ban {user.name}
Unban a user /unban {user.name}
Timeout a user /timeout {user.name} 600
Delete a user's message /delete {msg.id}
pajbot2 report /w botname #{channel.name} !report {user.name} being rude
pajbot2 longreport /w botname #{channel.name} !longreport {user.name} being very rude
Open the user's usercard /user {user.name}
pajbot banphrase /w botname !add banphrase {msg.text}
"},{"location":"Moderation/#user-timeout-buttons","title":"User Timeout Buttons","text":"User timeout buttons are very useful while looking at a user's logs. All 8 buttons can be configured to various timeout lengths:
User timeout buttons look like this:
"},{"location":"Regex/","title":"Regex","text":"Regular expressions (or short regexes) are often used to check if a text matches a certain pattern. For example the regex ab?c
would match abc
or ac
, but not abbc
or 123
. In Chatterino, you can use them to highlight messages (and more) based on complex conditions.
You can try out your regex patterns on a website like regex101, using the PCRE2
flavor.
Basic patterns:
Pattern Matchesx?
nothing or x
x*
x
, repeated any number of times x+
x
, repeated any number of times but at least 1 ^
The start of the text $
The end of the text x|y
x
or y
You can group multiple statements with ()
:
asd?
asd
or as
(asd)?
asd
or nothing \\(asd\\)
(asd)
, literally You can also group multiple characters with []
:
[xyz]
x
, y
or z
[1-5a-f]
1
,2
,3
,4
,5
,a
,b
,c
,d
,e
,f
[^abc]
Anything, except a
, b
and c
[\\-]
-
, literally (escaped with \\
) \\[xyz\\]
[xyz]
, literally Special patterns:
Pattern Matches\\d
Digit characters (0-9) \\D
Non-digit characters \\w
Word characters (a-zA-Z0-9_) \\W
Non-word characters \\s
Spaces, tabs, etc. \\S
Not spaces, tabs, etc. \\b
Word boundaries (between \\w and \\W) \\B
Non-word boundaries"},{"location":"Search/","title":"Search","text":"Chatterino has a Search Popup which lets you quickly find messages in the chat. You can open it with the Ctrl+F
shortcut.
You can use several search filters (format filter:value
) to narrow down your search. value
can have multiple comma-separated entries (look at examples below). Surround value
in quotation marks to use whitespaces within it, useful for dealing with the regex filter. The ability to negate searches is also possible. (format !filter:value
)
from:<username>
- shows messages from certain usershas:<flags>
- shows messages containing specified elements. List of flags:link
- filters messages with linksin:<channel>
- shows messages that originate from certain channels, useful in #/mentions
channelis:<flags>
- shows certain types of messages. List of flags:deleted
or disabled
- shows deleted messagessub
or subscription
- shows subscription messagestimeout
or ban
- shows moderation messageshighlighted
- shows highlighted messagessystem
- shows system messages (grey text ones like: \"Now hosting username\", \"streamer is live\", etc.)first-msg
- shows a user's first message in the channelcheer-msg
- shows messages containing bitsredemption
- shows messages that cost the user Twitch channel pointsreply
- shows messages sent using the Twitch reply featureregex:<regex>
- shows messages matching a given regexbadge:<value>
- shows messages from users that have a given badgesubtier:<value>
- shows messages from users that are subscribed at a given tierfourtf
containing word merge
","text":"from:fourtf merge
pajbot
and zneix
that have links containing word chatterino
","text":"has:link from:pajbot,zneix chatterino
pajlada
and supinic
from user supibot
","text":"in:pajlada,supinic from:supibot
is:sub
vanish
","text":"is:deleted vanish
is:timeout
is:highlighted
regex:^gachi\\w*$
badge:no_video
subtier:3
!from:gazatu
!has:link
On Windows: %APPDATA%/Chatterino2
On Linux: $HOME/.local/share/chatterino
On Mac: $HOME/Library/Application Support/chatterino
Commands and Settings have a small backup mechanism that saves the older version in a file like commands.json.bkp-2 in case you want to return to older versions of the file.
Navigate to your Chatterino folder and remove corresponding folders.
This is usually a case because Chatterino is unable to save settings on your disk. To fix that, try following steps:
Fresh Install
option is checked.Beta Warning
Custom themes are not yet stable. There may be breaking changes in the future (see Migrations).
Chatterino supports custom-made themes since 2.5.1.
Custom themes are JSON files that are stored in the Themes
folder inside your Chatterino folder.
To create a theme, it's best to use one of the built-in themes as the starting point. You can find them in the resources/themes
folder inside the source-code. Copy one into the Themes
folder and restart Chatterino. When you open the settings and select a theme, you should see one prefixed with Custom:
. Make sure, you're familiar with the common words used in Chatterino.
Chatterino themes have a JSON schema that must match in order for the theme to be displayed correctly. Many editors support JSON schemas out of the box and warn you about invalid values and provide completions.
If you used one of the base themes, then the $schema
key inside the JSON is invalid, since its value is configured to work inside the Chatterino source-code. You should change the value of $schema
to https://github.com/Chatterino/chatterino2/raw/master/docs/ChatterinoTheme.schema.json
as shown below. If you want to pin the schema to a specific version, replace master
with your desired version (for example v2.4.4
).
{\n \"$schema\": \"https://github.com/Chatterino/chatterino2/raw/master/docs/ChatterinoTheme.schema.json\",\n // ...\n}\n
"},{"location":"Themes/#auto-reloading","title":"Auto Reloading","text":"When developing themes, you often want to reload your changes and see how they look. To aid you in doing that, Chatterino can automatically reload your theme. Use the /c2-theme-autoreload
command in any chat to toggle auto-reload.
Warning
Make sure to disable auto-reloading after you're done with your changes to reduce resource usage.
"},{"location":"Themes/#colors","title":"Colors","text":"Colors in themes can be specified in various ways. All values that expect a qt-color
accept one of the following values. Make sure you're using the schema to get editor feedback. Technically, the values are passed to QColor
which does the parsing.
A
, R
, G
, and B
are single hex digits (0-9, a-f, A-F).
#RGB
#RRGGBB
#AARRGGBB
This format is different from the CSS Color Moudle Level 4 <hex-color>
, where the alpha value is at the end.
#RRRGGGBBB
#RRRRGGGGBBBB
red
, mediumspringgreen
. Note that these color names are technically case-insensitive and accept spaces, but this isn't supported by the schema, which only accepts lower-case names.transparent
These are some alternate ways of creating your own custom themes:
doge41732
This section contains added, updated, and removed properties in a release, and commit for nightly versions.
"},{"location":"Third_party_services/","title":"Third party services","text":"Chatterino integrates with a bunch of third party services to provide extended functionality for you.
"},{"location":"Third_party_services/#betterttv","title":"BetterTTV","text":"For Twitch channels, we load emotes from BetterTTV.
BetterTTV provides global emotes that are available in every channel. These can be disabled with the \"Show BTTV global emotes\" setting.
BetterTTV provides channel-specific emotes. What emotes are loaded is up to the owner of the channel you're in. These can be disabled with the \"Show BTTV channel emotes\" setting.
"},{"location":"Third_party_services/#frankerfacez","title":"FrankerFaceZ","text":"For Twitch channels, we load emotes and badges from FrankerFaceZ.
FrankerFaceZ provides global emotes that are available in every channel. These can be disabled with the \"Show FFZ global emotes\" setting.
FrankerFaceZ provides channel-specific emotes. What emotes are loaded is up to the owner of the channel you're in. These can be disabled with the \"Show FFZ channel emotes\" setting.
Badges are for developers & supporters of FrankerFaceZ and will be displayed next to their username. These can be disabled with the \"FrankerFaceZ\" setting under Advanced -> Visible badges.
FrankerFaceZ allows supporters to upload custom moderator and VIP badges for their channel, these can be disabled with the \"Use custom FrankerFaceZ moderator badges\" and \"Use custom FrankerFaceZ VIP badges\" settings.
"},{"location":"Third_party_services/#7tv","title":"7TV","text":"For Twitch channels, we load emotes and badges from 7TV.
7TV provides global emotes that are available in every channel. These can be disabled with the \"Show 7TV global emotes\" setting.
7TV provides channel-specific emotes. What emotes are loaded is up to the owner of the channel you're in. These can be disabled with the \"Show 7TV channel emotes\" setting.
7TV provides a streaming Event API that posts live updates when emotes change in channels. These can be disabled with the \"Enable 7TV live emote updates\" setting.
7TV provides the ability to use unlisted emotes. By default, Chatterino will not display these emotes even if they're added to a Channel. You can modify this behaviour with the \"Show unlisted 7TV emotes\" setting.
Badges are for developers & supporters of 7TV and will be displayed next to their username. These can be disabled with the \"7TV\" setting under Advanced -> Visible badges.
"},{"location":"Third_party_services/#chatterino-api","title":"Chatterino API","text":""}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 5d16e99c..0aa88916 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,92 +2,92 @@