diff options
author | DeepBlueV7.X <nicolas.werner@hotmail.de> | 2024-03-02 00:44:12 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-02 00:44:12 +0000 |
commit | b076b5b0ce0cf29b973f3396a8166680b35ccd87 (patch) | |
tree | 74bc4b38892a3684143a7d8ef0ed6a1d1f753117 /src | |
parent | Fix binding loop warning (diff) | |
parent | Add a warning that glitching text can, shockingly, corrupt your message (diff) | |
download | nheko-b076b5b0ce0cf29b973f3396a8166680b35ccd87.tar.xz |
Merge pull request #1688 from Nheko-Reborn/glitchtext
Add a glitch text command
Diffstat (limited to 'src')
-rw-r--r-- | src/CommandCompleter.cpp | 12 | ||||
-rw-r--r-- | src/CommandCompleter.h | 2 | ||||
-rw-r--r-- | src/Utils.cpp | 59 | ||||
-rw-r--r-- | src/Utils.h | 6 | ||||
-rw-r--r-- | src/timeline/InputBar.cpp | 6 |
5 files changed, 85 insertions, 0 deletions
diff --git a/src/CommandCompleter.cpp b/src/CommandCompleter.cpp index ee666559..33e7ef2c 100644 --- a/src/CommandCompleter.cpp +++ b/src/CommandCompleter.cpp @@ -91,6 +91,10 @@ CommandCompleter::data(const QModelIndex &index, int role) const return QStringLiteral("/rainfall "); case Msgtype: return QStringLiteral("/msgtype "); + case Glitch: + return QStringLiteral("/glitch "); + case GradualGlitch: + return QStringLiteral("/gradualglitch "); case Goto: return QStringLiteral("/goto "); case ConvertToDm: @@ -170,6 +174,10 @@ CommandCompleter::data(const QModelIndex &index, int role) const return tr("/msgtype <msgtype> [message]"); case Goto: return tr("/goto <message reference>"); + case Glitch: + return tr("/glitch <message>"); + case GradualGlitch: + return tr("/gradualglitch <message>"); case ConvertToDm: return QStringLiteral("/converttodm"); case ConvertToRoom: @@ -245,6 +253,10 @@ CommandCompleter::data(const QModelIndex &index, int role) const return tr("Send a message with rain."); case Msgtype: return tr("Send a message with a custom message type."); + case Glitch: + return tr("Send a message with a glitch effect."); + case GradualGlitch: + return tr("Send a message that gradually glitches."); case Goto: return tr("Go to a specific message using an event id, index or matrix: link"); case ConvertToDm: diff --git a/src/CommandCompleter.h b/src/CommandCompleter.h index 35ce2b36..9dc18119 100644 --- a/src/CommandCompleter.h +++ b/src/CommandCompleter.h @@ -48,6 +48,8 @@ public: RainbowConfetti, Rainfall, Msgtype, + Glitch, + GradualGlitch, Goto, ConvertToDm, ConvertToRoom, diff --git a/src/Utils.cpp b/src/Utils.cpp index 8d372763..3151d017 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -16,6 +16,7 @@ #include <QGuiApplication> #include <QImageReader> #include <QProcessEnvironment> +#include <QRandomGenerator64> #include <QScreen> #include <QSettings> #include <QStringBuilder> @@ -2012,3 +2013,61 @@ utils::removeExpiredEvents() ApplyEventExpiration::next(std::move(asus)); } + +namespace { +static const QList<QChar> diacritics = []() { + QList<QChar> ret; + for (wchar_t c = u'\u0300'; c <= u'\u036f'; ++c) + ret.append(QChar(c)); + return ret; +}(); +} + +QString +utils::glitchText(const QString &text) +{ + QString result; + for (int i = 0; i < text.size(); ++i) { + result.append(text.at(i)); + if (QRandomGenerator64::global()->bounded(0, 100) >= 25) + result.append( + diacritics.at(QRandomGenerator64::global()->bounded(0, diacritics.size()))); + } + return result; +} + +QString +utils::graduallyGlitchText(const QString &text) +{ + QString result; + + const int noGlitch = text.size() * 0.5; + const int someGlitch = text.size() * 0.8; + const int lotsOfGlitch = text.size() * 0.95; + + for (int i = 0; i < text.size(); ++i) { + result.append(text.at(i)); + + if (i < noGlitch) // first 40% of text is normal + continue; + else if (i < someGlitch) // next 25% is progressively glitchier + { + if (QRandomGenerator64::global()->bounded(noGlitch, someGlitch) < + noGlitch + (i - noGlitch) * 0.05) + result.append( + diacritics.at(QRandomGenerator64::global()->bounded(0, diacritics.size()))); + } else if (i < lotsOfGlitch) { // oh no, it's spreading! + if (QRandomGenerator64::global()->bounded(someGlitch, lotsOfGlitch) < i) + result.append( + diacritics.at(QRandomGenerator64::global()->bounded(0, diacritics.size()))); + } else { // just give up, your computer is cursed now + do { + if (QRandomGenerator64::global()->bounded(text.size() / 5, text.size()) < i) + result.append( + diacritics.at(QRandomGenerator64::global()->bounded(0, diacritics.size()))); + } while (QRandomGenerator64::global()->bounded(0, 100) < 35); + } + } + + return result; +} diff --git a/src/Utils.h b/src/Utils.h index 7f844627..75438a7b 100644 --- a/src/Utils.h +++ b/src/Utils.h @@ -205,4 +205,10 @@ updateSpaceVias(); void removeExpiredEvents(); + +QString +glitchText(const QString &text); + +QString +graduallyGlitchText(const QString &text); } diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp index 03ae5658..62d38cf5 100644 --- a/src/timeline/InputBar.cpp +++ b/src/timeline/InputBar.cpp @@ -238,6 +238,8 @@ InputBar::updateTextContentProperties(const QString &t) QStringLiteral("rainbowconfetti"), QStringLiteral("rainfall"), QStringLiteral("msgtype"), + QStringLiteral("glitch"), + QStringLiteral("gradualglitch"), QStringLiteral("goto"), QStringLiteral("converttodm"), QStringLiteral("converttoroom"), @@ -918,6 +920,10 @@ InputBar::command(const QString &command, QString args) rainfall(args); } else if (command == QLatin1String("msgtype")) { customMsgtype(args.section(' ', 0, 0), args.section(' ', 1, -1)); + } else if (command == QLatin1String("glitch")) { + message(utils::glitchText(args)); + } else if (command == QLatin1String("gradualglitch")) { + message(utils::graduallyGlitchText(args)); } else if (command == QLatin1String("goto")) { // Goto has three different modes: // 1 - Going directly to a given event ID |