Commit Graph
100 Commits
Author SHA1 Message Date
NerixyzandGitHub 8f84483330 feat: improve memory usage of FFZ badges (#7126)
FFZ badges consume a decent amount of memory in Chatterino. Before this
PR, they consumed 18.4 MiB.

We can do two cheap optimizations that cut the use in half:
- Use [`QVarLengthArray`](https://doc.qt.io/qt-6/qvarlengtharray.html)
to store the badges for a user instead of `std::set`. `std::set` always
allocates, even if there's only one badge. Since most users only have
one, we create many small allocations. With `QVarLengthArray<T, N>`, `N`
elements are stored inline. This reduced the memory usage to 11.9 MiB.
- Use `boost::unordered_flat_map` instead of `std::unordered_map`.
Because of relaxed requirements for the Boost map, it doesn't need to
store as much auxiliary data. This reduced the memory usage to 9.3 MiB.

A further optimization could be the use of a
`boost::container::flat_multimap<std::string, int>`. This gets us to 4.6
MiB. I haven't measured the performance of this. We'd have to assume
that FFZ returns us unique users per badge. The comparison with
`QString` for the lookup can be done by comparing `QString <
QLatin1StringView` (as we know badge IDs are latin1).


Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-07-25 15:30:52 +00:00
NerixyzandGitHub 6de0516c66 fix(windows): deploy OpenSSL TLS plugin (#7125)
Since #7009, our Windows nightly builds were missing the OpenSSL TLS
plugin for Qt. Qt 6.8+ only deploys the OpenSSL plugin if it sees
`libcrypto.dll` or `libssl.dll`. However, our OpenSSL is named
`lib{ssl,crypto}-3-x64.dll`. `--force-openssl` will deploy the SSL
plugin regardless.

Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-07-22 14:49:52 +02:00
NerixyzandGitHub b2f1e12e62 tests: increase wait and timeout in OnceFlag.waitFor (#7121)
In hopes to not land a PR for #7116, this increases the wait + timeout
as described in
https://github.com/Chatterino/chatterino2/issues/7116#issuecomment-5015316981.

I think the issue is that macOS runners on GitHub Actions are so
incredibly slow sometimes that we get these weird timings. And if that's
the cause, the overhead (e.g. from switching tasks) should be constant.
Then, if we increase the wait and timeout, we also increase the accepted
jitter (timeout - wait) from 100ms to 1s. So if the lag we get is at
about 150ms, that is now accepted.

Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-07-20 16:59:09 +00:00
NerixyzandGitHub d853137820 feat(plugins): Add c2.DateTime (#7096)
This adds the `DateTime` API described in #7021.

Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-07-19 13:26:21 +00:00
NerixyzandGitHub 14b5c665a4 chore: Scale down pinned message banner (#7113)
I think the text in the pinned message banner is too large in relation
to the default UI font width, so I scaled it down.

Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
Parent-pr: 7014
2026-07-19 11:41:42 +00:00
NerixyzandGitHub 2ca4b28457 fix: Update pined message height if viewport resized (#7114)
If the split is not 100dp wide, the calculated message height can be
wrong. If the split is larger than 100dp and the message would wrap at
that size, the widget would be too tall. And vice versa for splits
smaller than 100dp.

We do calculate the height in our resize event, but we use the size of
our children. Their resize events are delivered after we're resized. So
we check if we need to resize after we show the widget. This does result
in a small flash where the content is sized incorrectly, but better than
it being incorrect the entire time.

Parent-pr: 7014
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-07-19 11:00:12 +00:00
NerixyzandGitHub bc772c5b2b chore(window-layout): cleanup loadFromJSON (#7089)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-07-12 10:45:52 +00:00
NerixyzandGitHub ad99ab8daa refactor: Use magic_enum for encoding channels (#7079)
Split from #6906.

This changes the en-/decoding of channels in the window layout to use
magic-enum for translating between enum and string.
This way, the names are consistent when en-/deconding. And more
importantly, when adding channel types, you should get compiler warnings
in switch statements for uncovered cases.


Tested-by: Mm2PL <mm2pl+gh@kotmisia.pl>
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-07-05 14:09:18 +00:00
NerixyzandGitHub dbfa071447 fix(channelview): Use source channel more often (#7085)
We have info about the channel that we're derived from in `ChannelView`,
but didn't use it for context menu items. This PR does that.

Closes #7082.

Tested-by: Mm2PL <mm2pl+gh@kotmisia.pl>
Reported-by: Mm2PL <mm2pl+gh@kotmisia.pl>
2026-07-05 13:19:16 +00:00
NerixyzandGitHub 23eefe3b77 chore: require 202211 for expected from std (#7054)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-07-04 12:40:37 +00:00
NerixyzandGitHub 305149a795 refactor(plugins): Use signals to update UI (#7030)
The plugin UI manually updated itself whenever the user changed the
state by clicking a button (e.g. enabling a plugin). This gets more
complicated when other parts of Chatterino can also load/toggle plugins.
To help with this, I added a signal for the current list of plugins. The
UI also reacts to changes to the enabled plugins (a setting).

Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-06-30 11:50:01 +00:00
NerixyzandGitHub b506d35eb2 feat: reverse search previously sent messages (#6622)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
2026-06-28 00:16:43 +02:00
3b2ad254b9 docs: Add section on AI tools (#6902)
This adds a small section on the use of AI tools/assistants to the
`CONTRIBUTING.md` in hopes that people read it.

Co-authored-by: fourtf <tf.four@gmail.com>
Co-authored-by: Mm2PL <mm2pl+gh@kotmisia.pl>
Co-authored-by: pajlada <rasmus.karlsson@pajlada.com>
2026-06-27 16:21:25 +00:00
d00b1ee920 refactor(plugins): Use QStringList for enabled plugins (#7035)
`QStringList` has two advantages over `std::vector<QString>` for
settings:
1. Cheap to copy (COW). Setting values need to be copied when they're
accessed, because they're behind a mutex.
2. Better helper functions (see changes).

Co-authored-by: pajlada <rasmus.karlsson@pajlada.com>
Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
2026-06-27 13:58:44 +00:00
NerixyzandGitHub 69f9216f40 refactor: remove dynamic casts to self from TwitchChannel (#7055)
`TwitchChannel` did a few `dynamic_cast`s to get from a weak pointer to
`Channel` back to `TwitchChannel` even though it knows that the pointer
is always to `TwitchChannel`. A similar case was lambdas capturing both
a weak pointer and a `this` pointer. The fix here is to use
`weakFromThis` instead of `weakOf`/`weak_from_this`, both of which
return a `weak_ptr<Channel>` instead of `weak_ptr<TwitchChannel>`,
because they're from the `enable_shared_from_this<Channel>`.

Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-06-27 11:06:29 +00:00
6d012b5894 chore: show settings directory in about page (#7042)
Co-authored-by: pajlada <rasmus.karlsson@pajlada.com>
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-06-12 09:47:59 +00:00
NerixyzandGitHub 7255c6566a refactor: Move split deserialization to WindowDescriptors (#6955)
This is split from #6906 to make it easier to review. The goal is to
move all (de)serialization to WindowDescriptors to make it easier to
change and interact with from the outside.

This removes the internal `loadNodes<T>` and uses `loadFromJSON` for
containers like the other structs, and it moves
`WindowManager::decodeChannel` to the descriptor.


Reviewed-by: mm2pl <mm2pl+gh@kotmisia.pl>
Parent-pr: #6906
2026-06-03 22:37:23 +00:00
NerixyzandGitHub 1c56fb147e feat: basic mod streak support (#7026)
This makes them render nicer in chat, but they do not have custom configuration.

Reported-by: JCRouzer29
Reported-by: sando
Reported-by: Wissididom
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-05-30 15:39:56 +02:00
NerixyzandGitHub 00ffa0e478 deps: remove dependency on Boost.Signals2 (#7018)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-05-28 15:59:44 +00:00
NerixyzandGitHub 47e4abf547 fix(plugins): explicitly use draft-07 schema (#7015)
Before, the schema would use the latest schema. 
We should specify that we only need the draft-07 schema like the
Chatterino themes. The newer drafts aren't well-supported. For example,
Visual Studio only recently added support for the 2019 and 2020 drafts
(not even sure if that's released yet).

Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-05-24 17:23:32 +02:00
11aca323a1 feat: Add /(un)pin (#7004)
This adds the `/pin` and `/unpin` commands as well as action in the
context menu of messages.

The `/pin` command can do the following:
- `/pin`: Show the currently pinned message. Intended to be temporary
   until we have the PubSub/EventSub topic for this.
- `/pin some message here`: Send a message and pin it for 20 minutes.
- `/pin -d none some message here` (or `/pin -d until-end msg`): Send a
   message and pin it until the stream ends.
- `/pin --id abcd123 -d 15m`: Pin a message with ID `abcd123` for 15
   min.
- `/pin -h` or `/pin --help`: Show usage.

`/unpin` either takes no arguments or the ID to unpin. When no arguments
are specified, it unpins the currently pinned message.

Having three layers of submenus in the channel view seems a bit weird.
But on the other hand, having multiple `Pin for x minutes` is also
weird.

Closes #5165

Co-authored-by: Mm2PL <mm2pl+gh@kotmisia.pl>
Reported-by: MattIPv4
Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-05-23 14:54:53 +00:00
NerixyzandGitHub ed7fe100c6 deps: remove direct dependency on Boost.Variant (#6997)
We compile with C++ 23 now and have compiled with 20 and 17 for a while.
These standards support `std::variant` which we use in several places. A
few older places still used `boost::variant`. `std::variant` supersedes
`boost::variant`. It doesn't require an extra dependency and (usually)
has built in support in debuggers.

I also removed includes for `boost/current_function` and
`boost/foreach`. We didn't use them. We still depend on Boost.Variant
through Boost.Signals2, though.

Reviewed-by: pajlada <rasmus.karlsson@pajlada.com
2026-05-13 21:04:12 +00:00
NerixyzandGitHub 5014843c71 ci: bump conan to 2.28.1 (#6988)
The GitHub runners will update to VS 2026, which wasn't supported by the old conan version.

Reviewed-by: pajlada
2026-05-10 16:33:01 +02:00
NerixyzandGitHub 103de42bdb docs(plugins): Add more info on Windows, Splits, and SplitContainers (#6949)
From
https://github.com/Chatterino/chatterino2/pull/6687#discussion_r3068317999,
this adds more documentation on splits and so on. It also adds a utility
to dump the layout to GraphViz which can be handy.

Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
Parent-pr: 6687
2026-04-26 15:02:53 +00:00
NerixyzandGitHub 3ab369982e fix: check for isAppAboutToQuit in more places (#6950)
When closing Chatterino with a popup window open, we go through the
procedure handing `QApplication::aboutToQuit`
[here](https://github.com/Chatterino/chatterino2/blob/8573688f3c3b5198f86d16f154789506b767023e/src/RunGui.cpp#L281-L290).
There, we call `app->stop()`, which clears all components. However, the
app instance from `getApp` or `tryGetApp` is still valid.

Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-04-26 14:00:39 +00:00
NerixyzandGitHub 490bfdac07 feat(plugins): add readonly window layout access (#6687)
This implements the second part for
https://github.com/Chatterino/chatterino2/issues/5978 - read-only access
to the window layout.

This allows plugins to query the open channels and how they're
presented.

Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-04-17 14:46:33 +00:00
NerixyzandGitHub d1ee7944db chore: remove references to temporaries in for loops (#6923)
Clang's
[`-Wrange-loop-analysis`](https://clang.llvm.org/docs/DiagnosticsReference.html#id890)
is useful to detect references in range for-loops. We have this quite a
lot when iterating over a `QJsonObject` or `QJsonArray`. They yield
`QJsonValue(Const)Ref`s. These are already a reference.

Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-04-13 19:52:29 +00:00
NerixyzandGitHub 9a477df037 deps: update crash-handler (#6914)
Updates the crash-handler to fix the submodule errors.

If you're having issues after this commit, run `git submodule sync --recursive` and `git submodule update --init --recursive`

Full changelog:
https://github.com/Chatterino/crash-handler/compare/c8cf62b64906f794ac84cb0c22ceb401f4ea1e8d...3d5061fb537b111f7b1f5bc249dbe16f53c1329b

Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-04-07 18:21:07 +00:00
NerixyzandGitHub a582c1efc3 plugins: add message signals (#6781)
This PR adds `Channel:on_message{_appended, _replaced, s_cleared}`. They
use the same functionality as the display name changed signal and
forward the respective signals in `Channel`.

**They're all synchronous.** This makes the implementation fairly
straight forward, but also a trivial stack overflow. Other than
Chatterino crashing, this shouldn't have any consequences, because the
OS will kill the process. Note that a plugin can already halt Chatterino
by executing an infinite loop, because plugins run in the GUI thread.

Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-04-05 11:02:17 +00:00
NerixyzandGitHub cbf7893a8e feat(plugins): Add images and image sets (#6792)
You can query them and on sets, you can change the images. Note that
sets are value types, so getting an image set in Lua will always refer
to a copy, not a reference.

Images are special, because plugin authors can specify a URL that
Chatterino will load if the image is shown. While the plugin can't see
the response, it still causes Chatterino to issue a request, so
_creating_ images will require the network permission.

Tested-by: Mm2PL <mm2pl+gh@kotmisia.pl>
Tested-by: pajlada <rasmus.karlsson@pajlada.com>
Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-04-04 23:37:40 +00:00
NerixyzandGitHub 4648742582 filters: remove context map (#6872)
This removes the `ContextMap` in favor of individual accessors. This
removes two issues: Slow construction for the map for every message and
lookup into that map.

Some benchmark results:
**Before (5df704af85)**
```
---------------------------------------------------------------------------------------------
Benchmark                                                   Time             CPU   Iterations
---------------------------------------------------------------------------------------------
BM_FilterMessages/nymn_modmessages                       3619 us         3606 us          195
BM_FilterMessages/nymn_mod_party                         3813 us         3846 us          195
BM_FilterMessages/nymn_len40_or_sub                      3591 us         3606 us          195
BM_FilterMessages/nymn_no_sub                            3549 us         3526 us          195
BM_FilterMessages/nymn_with_color                        3507 us         3523 us          204
BM_FilterMessages/nymn_complex_regex                     3965 us         3906 us          172
BM_FilterMessages/nymn_big_or                            3758 us         3753 us          179
BM_FilterMessages/nymn_with_color_and_edm_single         3701 us         3593 us          187
BM_FilterMessages/nymn_with_color_and_edm_separate       3591 us         3606 us          195
```
**After**
```
---------------------------------------------------------------------------------------------
Benchmark                                                   Time             CPU   Iterations
---------------------------------------------------------------------------------------------
BM_FilterMessages/nymn_modmessages                        159 us          160 us         4480
BM_FilterMessages/nymn_mod_party                          212 us          213 us         3446
BM_FilterMessages/nymn_len40_or_sub                      76.6 us         76.7 us         8960
BM_FilterMessages/nymn_no_sub                            48.3 us         48.7 us        14452
BM_FilterMessages/nymn_with_color                        47.2 us         47.6 us        14452
BM_FilterMessages/nymn_complex_regex                      442 us          449 us         1600
BM_FilterMessages/nymn_big_or                             159 us          160 us         4480
BM_FilterMessages/nymn_with_color_and_edm_single          132 us          132 us         4978
BM_FilterMessages/nymn_with_color_and_edm_separate        138 us          135 us         4978
```

We get a speed-up of about 100x (nymn_no_sub)–9x (nymn_complex_regex).

Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-04-04 11:42:59 +00:00
NerixyzandGitHub 4318864f32 cmake: set component for installed project files (#6890)
This sets `COMPONENT` for all installed files. This way `cmake --install
--component` can be used to select the desired component to install.
Without this, `install` will install the files with any component (i.e.
`cmake --install --component foobar` would install stuff without a
component set).

Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-04-04 11:36:10 +02:00
NerixyzandGitHub 82664f9035 vcpkg: require pkgconf for hunspell (#6894)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-04-04 11:31:44 +02:00
NerixyzandGitHub eec6ea9401 cmake: set CMP0207 to NEW (#6888)
We use `install(TARGETS ... RUNTIME_DEPENDENCIES ...)` in the executable
project. With CMake 4.3 and
[CMP0207](https://cmake.org/cmake/help/latest/policy/CMP0207.html),
CMake will normalize the paths that we filter. We already use `/` in one
place, so this won't change.

Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-03-30 19:46:08 +00:00
NerixyzandGitHub d995358063 eventsub: require clang>=21 for json code generation (#6882)
The JSON generation was broken with Clang 22, because the type names
didn't include the namespace (e.g. `std::string` → `string`). We need to
tell Clang to use the fully qualified name. This is possible with
`Type.get_fully_qualified_name` which was added in Clang 21.

This does have the consequence that more types are now fully qualified.

Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-03-29 17:15:30 +00:00
79bb3c47c0 dpi: don't force 96 dpi (#5802)
Co-authored-by: pajlada <rasmus.karlsson@pajlada.com>
2026-03-29 12:24:47 +00:00
NerixyzandGitHub 4660839379 fix: update message length when completing (#6856)
When the completer completes, we block all signals. However, we do want
to broadcast a text-changed signal. Since we can't unblock individual
signals, we unconditionally emit a signal after we unblock all signals.

This might come with some side-effects when the user uses certain combinations of settings. I'm merging this in with the hope that these concerns, if any real ones exist, pop up as issues.

Reported-by: 4rneee
Reviewed-by: Mm2PL
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-03-29 11:28:40 +00:00
NerixyzandGitHub 044c5f2d47 spellcheck: treat words separated by ' and - as one (#6821)
The following words should be treated as one:

- `don't`
- `doesn't`
- `wouldn't've` (My Hunspell dictionary doesn't like this, but it's a word)
- `follow-up` (#6789)

This is done by matching a word as `\p{L}+(?:['-]\p{L}+)*`. This ensures that `'` or `-` isn't matched at the start/end.

Reviewed-by: Arne <78976058+4rneee@users.noreply.github.com>
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
Parent-PR: https://github.com/chatterino/chatterino2/pull/6446
2026-03-28 16:06:25 +00:00
NerixyzandGitHub be7ffe83fc commands: add /debug-relaunch-with-console (#6799)
This windows-only command relaunches Chatterino with a new console and some logging rules. In the console, they can see all the logs and copy them for debugging purposes.

Reviewed-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
2026-03-28 14:48:17 +00:00
NerixyzandGitHub 6875063fe8 filters: Remove unused Type::Map (#6839)
In filters, we could never instantiate a `Map` (neither users nor the
context map), so the type was essentially unused. This PR removes it.

Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-03-28 11:57:12 +00:00
NerixyzandGitHub c895bd49f9 feat: update emoji data to Unicode 17.0 (#6471)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-03-21 12:30:26 +00:00
NerixyzandGitHub 9d8453bf38 chore(spellcheck): add option to toggle suggestions (#6751)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
Parent-PR: https://github.com/chatterino/chatterino2/pull/6446
2026-02-28 13:29:51 +00:00
NerixyzandGitHub a57422ba8a chore(filters): improve test coverage and add benchmarks (#6814) 2026-02-28 12:42:08 +00:00
NerixyzandGitHub 16a39fcbf3 fix(spellcheck): use input highlighter's word segmentation to find word (#6822)
We used to use `QTextCursor`'s definition of a word when right-clicking.
This doesn't necessarily align with ours (e.g.
https://github.com/Chatterino/chatterino2/pull/6821#issuecomment-3941244373).
Furthermore, we didn't consider the character after a word as part of
it. Since Qt does some rounding, it might determine that you clicked on
the character after a word if you clicked on the right side of it. With
this PR, that's fixed.

Here's a visualization of which characters we consider as part of a word
(separated by even/odd):

```
     ███     █████  ██████   ████
this is some text#I#write in here
█████   █████     ██      ███
```

Fixes #6819

Reported-by: pajlada <rasmus.karlsson@pajlada.com>
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
Parent-pr: https://github.com/chatterino/chatterino2/pull/6446
2026-02-28 12:02:25 +00:00
NerixyzandGitHub ab895e5d73 chore: display follower mode duration in hours or days if possible (#6812)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-02-28 11:19:17 +00:00
79e5d295d4 feat: Show restore dialog when settings fail to load (#6662)
Co-authored-by: pajlada <rasmus.karlsson@pajlada.com>
Tested-by: pajlada <rasmus.karlsson@pajlada.com>
Tested-by: Mm2PL <mm2pl+gh@kotmisia.pl>
Reported-by: w3bprinz
Reported-by: cqmpact
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
2026-02-23 16:44:48 +01:00
NerixyzandGitHub 9c965cce4a fix(liveupdates): bump connections when adding a client (#6806)
Reviewed-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
2026-02-21 11:06:34 +00:00
NerixyzandGitHub 17a001bce3 refactor(benchmark): move recent messages app/bench to helper (#6815)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-02-20 18:48:49 +00:00
NerixyzandGitHub c887461326 chore: add CHATTERINO_FORCE_LTO (#6816)
CMake's `check_ipo_supported` doesn't support all compilers. For
example, clang-cl isn't supported
(https://gitlab.kitware.com/cmake/cmake/-/issues/21635). CMake itself
supports LTO with clang-cl just fine, though. By enabling
`CHATTERINO_FORCE_LTO` and `CHATTERINO_LTO`, users of clang-cl can still
use LTO.
2026-02-20 18:11:01 +00:00
NerixyzandGitHub 09a6c3fd7a refactor(websockets): Balance IPv4 and IPv6 attempts (#6804)
Reviewed-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
2026-02-15 11:07:06 +00:00
NerixyzandGitHub a8edcdde62 fix(websockets): Close stream before attempting to connect again (#6805) 2026-02-14 11:51:40 +00:00
NerixyzandGitHub 57613cc2a4 fix: check for portable updater before running it (#6801)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-02-14 11:04:05 +00:00
NerixyzandGitHub 4a23d21865 fix(send-wait): use same style as message length (#6791) 2026-02-02 18:39:11 +01:00
NerixyzandGitHub 301417488f chore: move some Channel signals to TwitchChannel (#6787)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-01-31 15:33:32 +00:00
NerixyzandGitHub cebe7e415c chore: add tests for input highlighting (#6779)
Reviewed-by: Arne <78976058+4rneee@users.noreply.github.com>
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-01-31 09:18:43 +00:00
NerixyzandGitHub a869cd4bd1 feat(plugins): add display name change event to Channel (#6594)
Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
2026-01-29 18:25:39 +01:00
NerixyzandGitHub f2c4c63d59 fix(liveupdates): add subscription to backlog if failed (#6763)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-01-24 12:04:24 +00:00
NerixyzandGitHub 18b5c64d2d refactor: move PluginMeta to its own file (#6757)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-01-24 11:25:42 +00:00
NerixyzandGitHub d03e103403 feat: add split action to clear /watching (#6759)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-01-24 11:27:18 +01:00
NerixyzandGitHub a362af6a37 chore: remove unused reloadChannelAndSubscriberEmotes (#6756)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-01-21 09:10:52 +00:00
NerixyzandGitHub d21b3c6e38 feat(plugins): Added message read/update methods to the Channel API. (#6650)
This PR adds methods to read and update messages in a channel. Specifically, it adds:
 - message_snapshot
 - last_message
 - replace_message/replace_message_at
 - clear_messages
 - find_message_by_id
 - has_messages
 - count_messages


Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
2026-01-20 23:46:39 +00:00
NerixyzandGitHub 55d3a4eb0c deps: update miniaudio to 0.11.24 (#6754) 2026-01-19 21:17:45 +00:00
NerixyzandGitHub 282a96660f fix(http): Send multipart body for PUT (#6746) 2026-01-18 11:47:44 +00:00
NerixyzandGitHub 00c6905a46 fix: comparison of integers of different signs (#6749)
The `targetIndex` (`int`) was compared to `maxIndex` (`size_t`). This
generated a large warning, because it was in a lambda. Since we parse
`targetIndex`, we can parse it as a `size_t`.
2026-01-18 10:48:42 +00:00
NerixyzandGitHub 2d298e7e38 fix: remove some unused variables (#6748) 2026-01-17 20:31:33 +01:00
NerixyzandGitHub 31ef6eeddf chore: cleanup AccountController connections (#6735)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2026-01-11 20:57:55 +00:00
NerixyzandGitHub b9e2035518 feat: load local directories for spellchecking (#6730)
Reviewed-by: pajlada <rasmus.karlsson+github@pajlada.com>
2026-01-10 12:00:44 +00:00
NerixyzandGitHub 90373323ec refactor(linkparser): take string views (#6715)
Reviewed-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
2026-01-05 22:53:58 +00:00
NerixyzandGitHub b7b592098f refactor(emojis): use std::variant and QStringView (#6714) 2026-01-05 20:06:42 +00:00
NerixyzandGitHub 95bc67fea0 feat: spellcheck input (#6446)
Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
Reviewed-by: fourtf <tf.four@gmail.com>
2026-01-02 14:56:29 +00:00
nerixandGitHub beb6cede51 fix(eventsub): add timeout to close operation (#6645)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2025-12-30 15:24:00 +00:00
nerixandGitHub e2ba7dff03 feat(plugins): add debug.traceback (#6652)
Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
2025-12-28 12:03:43 +00:00
nerixandGitHub a6d7918f07 fix: get full snapshot for message timeouts (#6683)
Reviewed-by: pajlada <rasmus.karlsson+github@pajlada.com>
Reported-by: James Upjohn <jupjohn@jammeh.co.nz>
2025-12-27 13:31:37 +00:00
nerixandGitHub ab9c3fccb8 fix(plugins): add ifdef around accounts API and ci check (#6675) 2025-12-23 23:57:52 +01:00
7d4ea79376 refactor: move Twitch PubSub to use liveupdates (#6638)
Co-authored-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
2025-12-16 10:06:15 +00:00
nerixandGitHub f430466a5b chore(eventsub): reformat session.cpp (#6646)
Reviewed-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
2025-12-11 18:57:00 +00:00
nerixandGitHub 74b4674c6b feat(plugins): allow message introspection (#6353)
This allows users to introspect messages (i.e. look at the elements they're made up of).

Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
2025-12-07 14:52:59 +00:00
nerixandGitHub 0aff6fbe83 feat: show BTTV Pro badges (#6625)
Reviewed-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
2025-12-07 14:15:58 +00:00
nerixandGitHub 71d579fc58 ci: add clazy (#6623)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2025-12-06 11:59:41 +00:00
c67953d14f feat(plugins): minimal account API (#6554)
Co-authored-by: Mm2PL <mm2pl+gh@kotmisia.pl>
Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
2025-12-05 14:56:51 +00:00
nerixandGitHub ad646e1698 chore: disable llvm-prefer-static-over-anonymous-namespace (#6610)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2025-11-29 17:57:33 +00:00
nerixandGitHub 041674b7f6 refactor: simplify uses of getMessageSnapshot (#6607)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2025-11-29 11:40:06 +00:00
nerixandGitHub 30019b71aa refactor: remove LimitedQueueSnapshot (#6606)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2025-11-27 18:49:40 +00:00
nerixandGitHub c4dd5f43ce feat: add ability to limit message snapshot size (#6602)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2025-11-26 23:35:34 +01:00
nerixandGitHub b63739e792 feat(plugins): add JSON parsing/serialization (#6420)
Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2025-11-21 17:43:28 +01:00
nerixandGitHub 115428d7f4 test(plugins): check unwinding and version (#6586) 2025-11-17 17:29:07 +01:00
nerixandGitHub 485d03e659 fix(test): Set settings directory in Paths (#6584) 2025-11-16 23:39:41 +01:00
nerixandGitHub f355928078 fix(wayland): use system move (#6573)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2025-11-10 11:43:11 +00:00
nerixandGitHub 7f393e2401 refactor(liveupdates): use WebSocketPool over websocketpp (#6308)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2025-11-08 12:46:10 +00:00
nerixandGitHub 9a78bf974a fix: disable package registry export (#6569) 2025-11-07 17:53:51 +01:00
nerixandGitHub b2bccb68e0 fix: set stroke color when drawing restore button (#6565) 2025-11-05 16:51:01 +01:00
nerixandGitHub ac33af2ece fix(plugins): Log potential errors in HTTP request callbacks (#6452)
Reviewed-by: Mm2PL <mm2pl+gh@kotmisia.pl>
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2025-11-05 01:30:11 +00:00
nerixandGitHub 73e5a31708 chore: add mocks as header set if supported (#6561)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2025-11-02 21:55:34 +00:00
nerixandGitHub 072bc897a0 fix(websockets): add query to URL (#6141)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2025-11-02 15:07:58 +00:00
nerixandGitHub e4a4d812e3 refactor(splits): Store container nodes as shared pointers (#6435)
Reviewed-by: pajlada <rasmus.karlsson@pajlada.com>
2025-11-02 14:26:50 +00:00
nerixandGitHub f7bb4c79f2 fix: set windows.h definitions on WIN32 instead of MSVC (#6534) 2025-11-01 11:40:45 +00:00
nerixandGitHub 7172503527 fix: Access correct channel in search popup (#6539) 2025-10-25 17:33:39 +02:00
nerixandGitHub 7214c49e79 fix: Get rid of warnings on clang-cl (#6528) 2025-10-25 14:14:20 +00:00
nerixandGitHub 86217019da fix: set parent for settings dialog from account switcher (#6543) 2025-10-25 12:51:57 +00:00
nerixandGitHub e6285b29b5 fix: changelog typos (#6550) 2025-10-21 17:11:32 +00:00